File: README.md
React Virtuoso
The most complete React virtualization rendering family of components.
- Variable sized items out of the box; no manual measurements or hard-coding item heights is necessary;
- Chat message list UI;
- Grouped mode with sticky headers;
- Responsive grid layout;
- Masonry layout;
- Table Support;
- Automatic handling of content resize;
- Custom Header, Footer, and empty list components;
- Pinned top items;
- Endless scrolling, press to load more;
- Initial top most item index;
- Scroll to index method.
Get Started
npm install react-virtuosoimport { Virtuoso } from 'react-virtuoso'
const App = () => {
return <Virtuoso style={{ height: '400px' }} totalCount={200} itemContent={(index) => Item {index}} />
}
ReactDOM.render(<App />, document.getElementById('root'))Documentation
For in-depth documentation and live examples of all supported features, check the documentation website.
Components
[Message List](https://virtuoso.dev/message-list)
The Virtuoso message list component is built specifically for human/chatbot conversations. In addition to the virtualized rendering, the component exposes an imperative data management API that gives you the necessary control over the scroll position when older messages are loaded, new messages arrive, and when the user submits a message. The scroll position can update instantly or with a smooth scroll animation.
[Grouped Mode](https://virtuoso.dev/react-virtuoso/grouped-virtuoso/grouped-by-first-letter)
The GroupedVirtuoso component is a variant of the flat Virtuoso component, with the following differences:
- Instead of
totalCount, the component exposesgroupCounts: number[]property, which specifies the amount of items in each group.
For example, passing[20, 30]will render two groups with 20 and 30 items each; - In addition the
itemContentproperty, the component requires an additionalgroupContentproperty,
which renders the group header. ThegroupContentcallback receives the zero-based group index as a parameter.
[Grid](https://virtuoso.dev/react-virtuoso/virtuoso-grid/grid-responsive-columns)
The VirtuosoGrid component displays same sized items in multiple columns.
The layout and item sizing is controlled through CSS class properties, which allows you to use media queries, min-width, percentage, etc.
[Masonry](https://virtuoso.dev/masonry)
The Masonry component renders columns from varying-height items, suitable for product listings, image galleries, etc.
[Table](https://virtuoso.dev/react-virtuoso/table-virtuoso/basic-table)
The TableVirtuoso component works just like Virtuoso, but with HTML tables.
It supports window scrolling, sticky headers, sticky columns, and works with Tanstack Table and MUI Table.
Works With Your UI Library
You can customize the markup up to your requirements - check the Material UI list demo.
Contributing
Contributions are welcome! Please see CONTRIBUTING.md for development setup, testing guidelines, and pull request process.
Sponsors
If you find Virtuoso valuable for your work, please consider sponsoring the project. Your support helps ensure continued development and maintenance.
Author
Petyo Ivanov @petyosi.
License
MIT License.
File: apps/virtuoso.dev/docs/guides/virtuoso/overscan.md
id: overscan title: Overscan and Pre-rendering sidebar_label: Overscan slug: /overscan/ sidebar_position: 150
React Virtuoso provides three props to control how many items are rendered outside the visible viewport. Each serves a different purpose:
| Prop | Unit | Best For |
|---|---|---|
increaseViewportBy |
Pixels | General pre-rendering, slow-loading content |
overscan |
Pixels | Reducing re-renders during scroll (chunked rendering) |
minOverscanItemCount |
Item count | Tall/dynamic items that may collapse or resize |
increaseViewportBy
Artificially increases the viewport size by the specified pixels, causing items to be rendered before they enter the visible area. This is equivalent to overscan in react-window.
import { Virtuoso } from 'react-virtuoso'
export default function App() {
return (
<Virtuoso
style={{ height: '100%' }}
totalCount={1000}
increaseViewportBy={200}
itemContent={(index) => Item {index}}
/>
)
}Use { top: number, bottom: number } to set different values for each direction:
<Virtuoso
increaseViewportBy={{ top: 100, bottom: 400 }}
// ...
/>overscan
Controls how the component "chunks" rendering on scroll. Instead of rendering one item at a time as they come into view, the component renders items in batches, reducing the number of re-renders.
import { Virtuoso } from 'react-virtuoso'
export default function App() {
return (
<Virtuoso
style={{ height: '100%' }}
totalCount={1000}
overscan={150}
itemContent={(index) => Item {index}}
/>
)
}Use { main: number, reverse: number } to set different values for the main scroll direction and reverse:
<Virtuoso
overscan={{ main: 200, reverse: 100 }}
// ...
/>minOverscanItemCount
Ensures a minimum number of items are always rendered before and after the visible viewport, regardless of their pixel size. This is particularly useful when:
- Items are very tall (taller than the viewport)
- Items can dynamically resize (e.g., collapsible content)
- You need to guarantee N items are pre-rendered
Unlike the pixel-based props, minOverscanItemCount guarantees item count rather than pixel distance.
import { Virtuoso } from 'react-virtuoso'
import { useState } from 'react'
export default function App() {
const [expanded, setExpanded] = useState(false)
return (
<Virtuoso
style={{ height: '100%' }}
totalCount={100}
minOverscanItemCount={5}
itemContent={(index) => (
Item {index}
{index === 0 && setExpanded(!expanded)}>{expanded ? 'Expand' : 'Collapse'}}
)}
/>
)
}Use { top: number, bottom: number } to set different values for each direction:
<Virtuoso
minOverscanItemCount={{ top: 2, bottom: 5 }}
// ...
/>When to Use Each
Use increaseViewportBy when:
- Content loads asynchronously and you want to start loading before items are visible
- You want a simple pixel-based buffer around the viewport
Use overscan when:
- You want to reduce the frequency of re-renders during scrolling
- Performance is critical and you want chunked/batched rendering
Use minOverscanItemCount when:
- Items are taller than the viewport
- Items can collapse or expand dramatically
- You need to guarantee a specific number of items are pre-rendered regardless of size
You can combine these props. For example, use increaseViewportBy for general pre-rendering and add minOverscanItemCount to handle edge cases with very tall items.
File: apps/virtuoso.dev/src/content/docs/index.mdx
title: React Virtuoso
template: splash
head:
- tag: title
content: React Virtuoso
import Hero from '@components/Hero.astro'
import MessageListHero from '@components/MessageListHero.astro'
import DataTableHero from '@components/DataTableHero.astro'
import FeatureCard from '@components/FeatureCard.astro'
import FeatureGrid from '@components/FeatureGrid.astro'
import ProductCard from '@components/ProductCard.astro'
Why Virtuoso?
Explore The Virtuoso Components
File: apps/virtuoso.dev/src/content/docs/message-list-eula.md
title: Virtuoso Message List End User License Agreement template: splash tableOfContents: false
IMPORTANT - please read this End-User License Agreement (EULA) carefully before installing or using the Software.
This EULA constitutes a legally binding agreement between you or the business and/or entity which you represent (Licensee) and Martiti 2 Ltd. (Licensor) for all Virtuoso products included in this distribution/installation and associated documentation (the Software).
By purchasing, installing, copying, or otherwise using the Software, you acknowledge that you have read this agreement and you agree to be bound by its terms and conditions. If you are representing a business and/or entity, you acknowledge that you have the legal authority to bind the business and/or entity you are representing to all the terms and conditions of this agreement.
If you do not agree to any of the terms and conditions of this agreement or if you do not have the legal authority to bind the business and/or entity you are representing to any of the terms and conditions of this agreement, DO NOT INSTALL, COPY, USE, EVALUATE, OR REPLICATE IN ANY MANNER, ANY PART, FILE OR PORTION OF THE SOFTWARE DEVELOPMENT PRODUCT(S).
1. Definitions
- "Martiti" means Martiti 2 Ltd, a legal entity located at 1618 Dechko Yordanov 36, Sofia, Bulgaria.
- "Site" means all websites operated by Martiti 2 Ltd, including but not limited to https://virtuoso.dev/.
- "Licensee" means the business and/or entity that you represent.
- "Licensor" means the creator and owner of the SOFTWARE: Martiti 2 Ltd.
- "Effective Date" means the date on which the agreement is made effective. This is the date of the purchase.
- "Software" means the copyrighted materials owned by the Licensor, subject to the terms of this agreement.
- "Licensed Developers" means the Licensee's (and any of its affiliates') employees, workers, and contractors who are authorized by the Licensee to develop software products that include the Software.
- "License Term" means the duration for which the license is valid, starting from the Effective Date, and ending after a minimum 12 months.
- A "production" environment is where the end-user can see, experience, and interact with the product.
2. License
2.1. License grant
In exchange for the fee owed under https://virtuoso.dev/pricing/, or as otherwise agreed, the Licensor hereby grants the Licensee and its subsidiaries and affiliate(s) (collectively "Affiliates") a license to install and use the Software.
The license granted to the Licensee and its Affiliates allows a worldwide, non-exclusive, non-transferable, sublicensable (subject to restrictions below), royalty-free license, commencing on the Effective Date.
The license allows the use of the latest version and all older versions released.
The specific details of the license granted depend on the 3. License model selected by Licensee. The access to software updates is governed by 7. Updates.
2.2. Deployment
The Licensee may sublicense the Software as a part of a larger work containing more than the Software under a limited license.
The Licensee shall ensure (and shall procure that its Affiliates shall ensure) that the terms of any sub-license are in writing and are substantially the same and as restrictive as the terms of this agreement (except that the sub-licensee shall not have the right to sublicense its rights).
At no time may the Licensee include any portion of the Software in any project that directly or indirectly competes with it.
For the avoidance of doubt, Licensee may not use the Software, or any portions thereof, for a project that can be described as a development toolkit or library, an application builder, a website builder, a user interface designer, or any project that is intended for use by developers or designers, or has a similar purpose or functionality, except with the express written agreement of Licensor.
2.3. Restrictions
The Licensee shall not sell, rent, lease, distribute, assign, transfer, or encumber rights to the Software.
2.4. License key
To help the Licensee to stay compliant with the terms of this agreement, the Software may require the installation of a license key. If a license key is required:
- (a) The Licensor will make available to the Licensee a valid license key.
- (b) The Software may raise warnings, based on the license key, when it detects that the current use of the Software by Licensee is not consistent with this agreement, for example, when using a version of the Software released after the license of Licensee has expired.
Please note that the license key does not cover every scenario, so possession of a valid license key does not by itself confer the right to use the Software.
2.5. Required quantity of licenses
The number of developers licensed must correspond to the maximum number of concurrent developers (in any continuous 24-hour period) contributing changes to the front-end code of the projects that use the Software.
For example, a developer using the Software indirectly through a wrapper library needs to be licensed, a developer working on the front-end code of a project that includes the Software but who doesn't use the Software directly needs to be licensed.
To define the previous terms more precisely:
(a) "front-end code" is code that is executed in a browser, JavaScript most of the time.
(b) "concurrent" is development work carried out during the same calendar day, regardless of timezone.
If the Licensee has not purchased sufficient licenses, Licensee will be required to purchase such licenses as required to comply with the terms of this agreement, at a price determined by Licensor, but not to exceed full price. Support will co-terminate with existing licenses.
2.6. Third party
The Licensee may allow its agents, contractors, and outsourcing service providers (each a "Permitted Third Party") to use the Software licensed to Licensee hereunder solely for Licensee's benefit in accordance with the terms of this agreement and Licensee is responsible for any such Permitted Third Party's compliance with this agreement in such use. Any breach by any Permitted Third Party of the terms of this agreement will be considered Licensee's breach.
3. License model
3.1. Annual license
3.1.1. Non-perpetual outside of production. All the developers contributing changes to the front-end code of a project that includes the Software need an active license. A license is active as long as it hasn't reached the end of the License Term. The Licensee doesn't need to renew its license if no developers work with the API and source code of the Software in any capacity (indirectly or directly).
3.2.2. Perpetual in production. The Licensee is allowed to perpetually use in a production environment any versions of the Software released before the end of the License Term.
4. Restriction on Modification and Extraction of Source Code
The Licensee acknowledges and agrees that the software product provided under this End User License Agreement (EULA) contains valuable trade secrets and proprietary information of the Licensor. The Licensee shall not, under any circumstances, attempt to modify, decompile, disassemble, reverse engineer, or otherwise alter the source code of the software product, in whole or in part, without prior written consent from the Licensor.
The Licensee shall not extract, copy, reproduce, or distribute any portion of the source code, including but not limited to algorithms, methods, techniques, or any other components of the software product, for any purpose other than the normal operation and use of the software product as intended by the Licensor.
Any unauthorized modification, extraction, or use of the source code shall constitute a material breach of this EULA and may result in immediate termination of the Licensee's rights under this agreement, as well as the pursuit of legal remedies by the Licensor, including but not limited to injunctive relief and monetary damages.
The restrictions set forth in this clause shall survive the termination or expiration of this EULA for any reason whatsoever.
5. Evaluation (trial) licenses
You are free to try the Software:
(a) for a limited period of 30 days starting from the first use of the Software in a non-production environment.
(b) for the development of code not intended for production (for example, the reproduction of a bug in a GitHub issue, doing a performance benchmark).
After the given trial period, you must license the Software if you continue to use it, whether in a production or non-production environment.
6. Payment
6.1. Agreement
The Licensee agrees to pay the license fee for the Software specified on the Site https://virtuoso.dev/pricing/ or its quote at the time Licensee entered this agreement.
6.2. Terms
The license fee is due by Licensee upon receipt of the Licensor's invoice. The Licensee must pay each valid invoice within 30 days of the date of the invoice unless otherwise agreed in writing between the parties. The payment must be made using an accepted payment method. The Licensor may charge the Licensee interest on all overdue payments at a rate of 1% per month (or the highest rate permitted by law, if lower). The Licensor agrees to pay the Licensor's cost of collecting any past-due amounts under this agreement, including but not limited to reasonable attorneys' fees. Unless the currency is expressly provided, all amounts are in United States Dollars.
6.3. Taxes
Unless expressly provided, all amounts are exclusive of value-added tax ("VAT") which, where chargeable by the Licensor, shall be payable by the Licensee at the rate and in the manner prescribed by law. All other taxes, duties, customs, or similar charges shall be the responsibility of the Licensee.
7. Updates
7.1. Maintenance
The Licensee will be eligible to receive all updates and upgrades for the Software during the License Term at no additional charge, starting from the Effective Date.
7.2. Renewal
The Licensee can optionally renew the license for an additional License Term (and any subsequent term thereafter) in order to actively continue development with the Software or to continue receiving updates and upgrades.
7.3. Discontinuation
Licensor reserves the right to discontinue the Software or any of its constituents, at any time by providing prior notice to the Licensee. However, Licensor shall continue to provide technical support in accordance with the terms of this agreement for any discontinued component.
8. Support
8.1. Initial support period
For any applicable period for which you have purchased support (the "Support Period"), the Licensee will be entitled to receive technical support for the Software. Unless otherwise specified, the Support Period starts from the Effective Date and is valid during the License Term.
8.2. Support renewal
Support is renewed in conjunction with any maintenance renewal.
9. Warranties
9.1. Legal power
Each party represents and warrants that it has the legal power and authority to enter into this agreement.
9.2. Intellectual property
The Licensor hereby represents and warrants that the Software does not and will not violate or infringe any third-party claims in regard to intellectual property, patents, trade secrets, and/or trademarks and that to the best of its knowledge no legal action has been taken against it for any infringement or violation of any third party intellectual property rights.
9.3. Logic integrity
The Licensor warrants that the Software shall not knowingly include: malware, viruses, trap doors, back doors, or other means or functions which will detrimentally interfere with or otherwise adversely affect Licensee's use of the Software or which will damage or destroy data or other property of Licensee.
9.4. Compliance with documentation
The Licensor warrants to Licensee that, for twelve (12) months after the Effective Date, the Software shall perform substantially in accordance with the documentation. Licensee's exclusive remedy, and Licensor's sole liability, with respect to any breach of this warranty, will be for Licensor to use commercially reasonable efforts to promptly correct the non-compliance (provided that Licensee notifies Licensor in writing within the warranty period and allow Licensor a reasonable cure period). If Licensor, at its discretion, reasonably determines that correction is not economically or technically feasible, Licensor may terminate Licensee license to the Software and provide Licensee a full refund of the fee paid to Licensor with respect to the Software.
We provide no warranty, however, for unstable features of the Software. A feature is considered unstable if exposed to Licensee:
- (a) through an API that includes "unstable" in its name
- (b) or in a package for which the version is not considered stable according to SemVer versioning models, e.g. alpha, beta, or other pre-releases
- (c) or documented as "experimental".
9.5. Warranties disclaimers
Except for the warranties expressly stated in the warranties section above, the Software is provided "as is", with all faults. The Licensor disclaims all warranties, express or implied, including, but not limited to, warranties of merchantability, fitness for a particular purpose, title, availability, error-free or uninterrupted operation, and any warranties arising from course of dealing, course of performance, or usage of trade to the extent that licensor may not as a matter of applicable law disclaim any implied warranty, the scope, and duration of such warranty will be the minimum permitted under applicable law.
10. Limitation of liability
10.1. To the maximum extent permitted by applicable law, in no event shall either party be liable for any special, incidental, indirect, or consequential damages whatsoever (including, without limitation, damages for loss of business profits, business interruption, loss of business information, or any other pecuniary loss) arising out of the use of or inability to use the Software or the provision of or failure to provide support, even if it has been advised of the possibility of such damages.
10.2. The Licensee understands that the Software may produce inaccurate results because of a failure or fault within the Software or failure by Licensee to properly use and or deploy the Software. Except for Licensor's obligations regarding 9.2 Intellectual property, Licensee assumes full and sole responsibility for any use of the Software and bears the entire risk for failures or faults within the Software.
10.3. Each party agrees that regardless of the cause of failure or fault or the form of any claim, EACH PARTY'S SOLE REMEDY AND SOLE OBLIGATION SHALL BE GOVERNED BY THIS AGREEMENT AND IN NO EVENT SHALL EITHER PARTY'S LIABILITY EXCEED THE PRICE PAID TO LICENSOR FOR THE SOFTWARE. This limited liability, as it relates to Licensor, is void if failure of the Software has resulted from accident, abuse, alteration, unauthorized use, or misapplication of the Software. The limitations and exclusions herein shall not apply to indemnification obligations hereunder.
11. Indemnification
11.1. Licensor's indemnification obligation
11.1.1. Intellectual property Infringement. Licensor will defend, indemnify and hold harmless Licensee from any claim of copyright, patent, trademark, trade secret, or other intellectual property right provided Licensee notifies Licensor in writing promptly upon notice of such claim and cooperates fully in the defense of such claim. Licensor shall, at its own expense, defend such claim, suit, or action, and Licensee shall have the right to participate in the defense at its own expense.
11.2. Licensee's indemnification obligation
11.2.1. Third-party. The Licensee hereby agrees to indemnify Martiti and its officers, directors, employees, agents, and representatives from each and every demand, claim, loss, liability, or damage of any kind, including actual attorney's fees, whether in tort or contract, that it or any of them may incur by reason of, or arising out of, any claim which is made by any third party with respect to any material breach or violation of this agreement by the Licensee.
12. Termination
12.1. Termination for breach
Either party may terminate this agreement by giving the other written notice if:
- (a) the other party materially breaches any term of this agreement and it is not possible to remedy that breach;
- (b) the other party materially breaches any term of this agreement and it is possible to remedy that breach, but the other party fails to do so within 30 days of this being requested in writing;
- (c) the other party suffers or undergoes an insolvency event or a bankruptcy event or debtor's relief proceeding or ceases to do business.
- (d) the other party is delayed in performing its obligations under this agreement for a period of 30 days or more.
For the purposes of this clause, in order for it to be possible to remedy a breach, it must be possible to take steps so as to put the other party into the same position which (save as to the date) it would have been in if the breach had never occurred.
12.2. Termination for convenience
The Licensee may terminate the agreement, for its convenience, at any time in which event Licensee will not be entitled to a refund or credit of unused fees (if any) pre-paid by Licensee for access to the Software.
12.3. Effect of termination
Upon termination of this agreement, Licensee's license to access and use the Software will terminate. The Licensee must immediately cease the use of the Software and destroy all copies of the Software in its possession (and require any permitted third parties to do the same).
12.4. Termination survival
Any provisions of this agreement containing licensing restrictions, warranties and warranty disclaimers, confidentiality obligations, limitations of liability and/or indemnity terms, and any term of this agreement which, by its nature, is intended to survive termination or expiration, will remain in effect following any termination or expiration of this agreement, as will Licensee's obligation to pay any fees accrued and owing to Licensor as of termination or expiration.
13 Governing Law
This Agreement shall be governed by the law of the Bulgaria applicable therein. You hereby irrevocably attorn and submit to the non-exclusive jurisdiction of the courts of Bulgaria therefrom. If any provision shall be considered unlawful, void or otherwise unenforceable, then that provision shall be deemed severable from this License and not affect the validity and enforceability of any other provisions.
14. Force majeure
Neither party will be liable for any delay or failure to take any action required under this agreement (except for payment) due to any cause beyond the reasonable control of Licensee or Licensor, as the case may be, including, but not limited to: unavailability or shortages of labor, materials, or equipment, failure or delay in the delivery of vendors and suppliers, fire, flood, earthquake, acts of war, terrorism, epidemic, pandemic, and civil disorders.
15. Refunds
The license fee isn't refundable even if Licensee or the Licensed Developers stop using the Software and/or stop using or accessing support and updates. Licensee can use the trial period to determine if the product fits the use case.
16. Personal data
16.1. The Privacy policy describes in detail how Martiti as a controller processes personal data on its customers and community.
16.2. All information Licensor collects from the Licensee is stored and maintained on servers utilizing reasonable and appropriate data security safeguards. Licensor does not lend, lease, sell, or market information it obtains from its customers or those who provide Licensor personally identifiable information. Licensor does not disclose purchase information or licensing information to third parties.
17. Confidentiality
17.1. Each party shall:
- (a) keep confidential all confidential information of the other party which it receives in connection with this agreement;
- (b) to use confidential information for the sole purpose of fulfilling this agreement unless otherwise agreed to in express writing by the parties;
However, confidential information shall not include information that:
(a) is generally known to the public at the time of disclosure;
(b) is legally received by receiving party from a third party, which third party is in rightful possession of confidential information,
(c) becomes generally known to the public subsequent to the time of such disclosure, but not as a result of disclosure by receiving party,
(d) prior to signing of this agreement, is already in the possession of receiving party; or
(e) is independently developed by the receiving party without use of or reference to the confidential information of the Disclosing Party, as demonstrated by the receiving party's written records.
17.2. Either party may disclose confidential information of the other party as required by governmental or judicial order, provided such party gives the other party prompt written notice prior to such disclosure (unless such prior notice is not permitted by applicable law) and complies with any protective order (or equivalent) imposed on such disclosure.
18. Miscellaneous
18.1. Notices
Notices must be clearly identified as Legal Notices and sent to [email protected].
Last update: March 30th, 2024.
File: apps/virtuoso.dev/src/content/docs/pricing.mdx
title: 'Pricing' tableOfContents: false template: splash
import Purchase from '../../components/Purchase.tsx'
FAQ
How many licenses do I need?
The number of licenses to the maximum number of concurrent front-end developers who contribute to a project that uses the package.
This also includes developers who work on the project part-time or as contractors. See more details in the message list licensing section.
What happens when I make a purchase?
You will receive a license key on the email you provide. You put the license key in the licenseKey prop of the VirtuosoMessageListLicense component and you are good to go.
What happens after my license expires?
The purchased license works indefinitely in production. If you want to continue active development using the component, you should update your subscription.
Can I try before I make a purchase decision?
Yes, you can use the package in development mode without a license for 30 days.
What is the guaranteed response time of the pro plan?
Within 2 business days, you are going to get a reply back from the authors of the package.
I have more questions
Reach out to [email protected].
File: apps/virtuoso.dev/src/content/docs/privacy-policy.md
title: Privacy Policy template: splash tableOfContents: false
Effective date: March 30th, 2024.
Introduction
This Privacy Policy sets forth the privacy practices of Martiti 2 Ltd. and its affiliates and subsidiaries (collectively, "Martiti 2") with respect to all Martiti 2 information, data, graphics, content, software applications (including, without limitation, mobile software and applications) (collectively, the "Software"); the Virtuoso website, located at virtuoso.dev, (the "Website"); and other products or services provided or otherwise made accessible on or through the Software or the Website. Collectively, the Software, the Website, and any other Martiti 2 services are hereinafter referred to as the "Service". In this Privacy Policy, "we", "us", "our" and other similar references mean Martiti 2 and "you" and "your" and other similar references mean any particular user of the Service. This Privacy Policy describes how Martiti 2 uses personal information of users collected through our Service ("Personal Information"). This policy applies (i) immediately to users who utilize the Service on or after the Effective Date and (ii) on the Effective Date to users who utilize the Service before the Effective Date. Any person who does not agree to be bound by this Privacy Policy should not utilize the Service. Each capitalized term not otherwise defined herein shall have the meaning set forth in Section 2. Please contact us if you have any questions or comments about our privacy practices or this Privacy Policy. You can reach us online at [email protected].
PLEASE READ THIS PRIVACY POLICY CAREFULLY. BY ACCESSING OR USING THE SERVICE, YOU ACKNOWLEDGE THAT YOU HAVE READ, UNDERSTOOD, AND AGREE TO BE BOUND TO ALL THE TERMS AND CONDITIONS OF THIS PRIVACY POLICY AND OUR TERMS OF USE. IF YOU DO NOT AGREE TO THESE TERMS AND CONDITIONS, PLEASE EXIT, AND DO NOT ACCESS OR USE, THE SERVICE.
Definitions
- "Contact Information" means (i) your name, (ii) your physical address, (iii) your email address and (iv) your telephone number.
- "Effective Date" means the date set forth at the beginning of this document.
- "Martiti 2 Affiliates" means any parent, subsidiary, member, officer, director, employee, or agent of Martiti 2 or any company under common control with Martiti 2.
- "Privacy Policy" means the set of policies set forth in this document.
- "Financial Account Information" means your credit card number, credit card expiration date and credit card verification code, all with respect to one or more credit cards that you have the lawful right to use, and your bank account number, bank account title, bank name, branch location and routing number, all with respect to one or more accounts that you have the lawful right to access; provided "Financial Account Information" does not include the last four digits of your credit card number, which we retain for purposes of verifying User Account and User Account Information.
- "Transaction Information" means all information related to transactions that you conduct on the Service and your interactions with the Service.
- "User Account" means an account permitting access to the Service, with which is associated a user name and password.
- "User Account Information" means information that identifies you to the Service, including your user name, password, internet protocol address, and MAC address.
- "User Content" means images, comments, and other materials that you post to the Service.
Types of Personal Information We Collect:
- Contact Information;
- Financial Account Information;
- Transaction Information;
- User Account Information; and
- User Content.
Mechanisms for Collection of Personal Information
Martiti 2 collects Personal Information (i) upon a user's creation of a User Account, (ii) upon logging into the Service, (iii) upon interactions with the Service, and (iv) upon uploading User Content to, or generating User Content on, the Service, and (v) when you communicate with Martiti 2 through the Service. When you access our Service, we may place small data files on your computer or other device known as "cookies". We use cookies to recognize you as a user of the Service. Cookies may remain on your device until you erase them or they expire. You are free to decline our cookies if your browser or browser add-on permits, but doing so may interfere with your use of the Service. You should refer to the help sections of your browser, browser extensions, or installed applications for instructions on blocking, deleting, or disabling cookies.
Purpose of Collection and Use of Personal Information
Martiti 2 uses Personal Information to:
- operate and improve the Service;
- target offers to users;
- administer the Service's facilities for communications among and between users and the public in general;
- evaluate eligibility of customers for certain offers, products or services;
- evaluate the types of offers, products or services that may be of interest to users;
- provide user support;
- communicate with users regarding support, security, technical issues, commerce, marketing, and transactions;
- facilitate marketing, advertising, surveys, contests, sweepstakes and promotions
- administer the Service, User Accounts and transactions with respect to User Accounts; and
- administer and carry out our obligations under contracts and to comply with the law.
- Disclosure of Personal Information
We may disclose your Personal Information to:
- Martiti 2 Affiliates, which may use the Personal Information for the purposes described in Section 5;
- service providers which act for us or provide services for us, such as for marketing or for the processing of payments, and as to such service providers their use of Personal Information is subject to our agreements with them and any applicable laws;
- vendors in connection with the investigation of possible fraud, or as part of legal proceedings affecting Martiti 2 or the vendor;
- any person or government agency in response to a subpoena;
- to a government agency in response to an investigation, regardless of whether or not a subpoena has been issued;
- any person to enforce our rights or protect our property; to protect the rights, property or safety of others, investigate fraud; and
- Martiti 2's employees and outside professionals (such as lawyers and accountants) for the purpose of auditing, compliance, and corporate governance.
Storage and Security
We believe the security of your information is a serious issue and we are committed to protecting the information we receive from you. We use commercially reasonable security measures to protect against the loss, misuse and alteration of your information under our control. Notwithstanding such measures, please be aware that no security measures are perfect or impenetrable, and we cannot guarantee the security of any information transmitted to or from the Service. We also are not responsible for the actions of any third parties that may receive any such information.
We may transfer your information to, or maintain it on, computers located outside of your state or country, in a location having laws that are less protective of your privacy.
We will retain Personal Information only as long as our business needs require. We will then destroy or render unreadable any such information upon disposal. We collect and process Financial Account Information from you using third party PCI-compliant service providers when you subscribe to the Service. We do not store Financial Account Information transmitted through the Service.
Email Policies
Martiti 2 reserves the right to send you e-mail relating to your account and to the Service. You cannot opt-out of receiving such e-mails, and you agree to receive them.
No Responsibility for Privacy Practices of Third Parties
This Privacy Policy applies only to the Service. It does not apply to sites that have linked or are redirected to or from the Service ("Third Party Sites"), regardless of whether or not such link or redirection is authorized by Martiti 2. Third Party Sites may have their own policies regarding privacy, or no policy at all. Martiti 2 is not responsible for Third Party Sites and you use them at your own risk.
Interactions With Others
The Service may contain areas where you may be able to publicly post information, communicate with others such as discussion boards or blogs, review goods, services vendors, and submit media content. Such use is subject to our Terms of Service, and may be viewed by the public at large. Any information, including Personal Information, that you post there will be public, and therefore anyone who accesses such postings will have the ability to read, collect and further disseminate such information.
Accessing and Correcting Personal Information
You may close an account, but Martiti 2 will nevertheless retain your Personal Information so as to protect the business interests of Martiti 2, Martiti 2 Affiliates, vendors and other users. Those interests include the completion of transactions, maintaining records for financial reporting purposes, complying with our legal obligations, resolving disputes, and enforcing agreements.
Changes to the Privacy Policy
Martiti 2 reserves the right to change this Privacy Policy. Such changes may be announced to you either by email or by the posting of the revised policy on the Service. You are responsible for reviewing both your own email and the Service to determine what is the then-current Privacy Policy.
File: apps/virtuoso.dev/src/content/docs/skills.mdx
title: 'Agent Skills' tableOfContents: false template: splash
The Virtuoso packages ship Agent Skills โ structured guidance that teaches coding agents how to use each package correctly. Instead of guessing from training data (and carrying over habits from other virtualization libraries), an agent with the skills installed knows the component selection rules, the measurement constraints, the common pitfalls, and has the full package documentation at hand as references.
Four skills are available:
| Skill | Covers |
|---|---|
react-virtuoso |
Virtualized lists, grids, and tables โ Virtuoso, GroupedVirtuoso, VirtuosoGrid, TableVirtuoso |
message-list |
Chat and AI conversation UIs โ VirtuosoMessageList |
data-table |
The virtualized data grid โ @virtuoso.dev/data-table |
reactive-engine |
The @virtuoso.dev/reactive-engine-* state management family |
Claude Code
Install the plugin from the repository marketplace:
/plugin marketplace add petyosi/react-virtuoso
/plugin install virtuoso-skills@virtuosoCodex
codex plugin marketplace add petyosi/react-virtuoso --ref main --sparse .agents/plugins --sparse plugins/virtuoso-skills
codex plugin add virtuoso-skills@virtuosoCursor, OpenCode, and other agents
Use the Agent Skills CLI against the virtuoso-dev/skills mirror:
npx skills add virtuoso-dev/skills --skill '*'Or install individual skills:
npx skills add virtuoso-dev/skills --skill react-virtuosoHow the skills are maintained
The skills are authored and versioned in the react-virtuoso monorepo next to the packages they describe. Each skill bundles the package documentation as references, regenerated on every change โ so the guidance ships from the same source, at the same time, as the code it documents. The virtuoso-dev/skills repository is a generated mirror for skill installers; report issues and contribute in the monorepo.
File: apps/virtuoso.dev/src/content/docs/terms-of-use.md
title: Terms of Use template: splash tableOfContents: false
Payment processing
Our order process is conducted by our online reseller Paddle.com. Paddle.com is the Merchant of Record for all our orders. Paddle provides all customer service inquiries and handles returns.
Restrictions
You are specifically restricted from all of the following
- publishing any Website material in any other media;
- selling, sub-licensing and/or otherwise commercializing any Website material;
- publicly performing and/or showing any Website material;
- using this Website in any way that is or may be damaging to this Website;
- using this Website in any way that impacts user access to this Website;
- using this Website contrary to applicable laws and regulations, or in any way may cause harm to the Website, or to any person or business entity;
- engaging in any data mining, data harvesting, data extracting or any other similar activity in relation to this Website;
- using this Website to engage in any advertising or marketing.
Certain areas of this Website are restricted from being access by you and Martiti 2 Ltd. may further restrict access by you to any areas of this Website, at any time, in absolute discretion. Any user ID and password you may have for this Website are confidential and you must maintain confidentiality as well.
Your Content
In these Website Standard Terms and Conditions, "Your Content" shall mean any audio, video text, images or other material you choose to display on this Website. By displaying Your Content, you grant Martiti 2 Ltd. a non-exclusive, worldwide irrevocable, sub licensable license to use, reproduce, adapt, publish, translate and distribute it in any and all media.
Your Content must be your own and must not be invading any third-party's rights. Martiti 2 Ltd. reserves the right to remove any of Your Content from this Website at any time without notice.
No warranties
This Website is provided "as is," with all faults, and Martiti 2 Ltd. express no representations or warranties, of any kind related to this Website or the materials contained on this Website. Also, nothing contained on this Website shall be interpreted as advising you.
Limitation of liability
In no event shall Martiti 2 Ltd., nor any of its officers, directors and employees, shall be held liable for anything arising out of or in any way connected with your use of this Website whether such liability is under contract. Martiti 2 Ltd, including its officers, directors and employees shall not be held liable for any indirect, consequential or special liability arising out of or in any way related to your use of this Website.
Indemnification
You hereby indemnify to the fullest extent Martiti 2 Ltd. from and against any and/or all liabilities, costs, demands, causes of action, damages and expenses arising in any way related to your breach of any of the provisions of these Terms.
Severability
If any provision of these Terms is found to be invalid under any applicable law, such provisions shall be deleted without affecting the remaining provisions herein.
Variation of Terms
Martiti 2 Ltd. is permitted to revise these Terms at any time as it sees fit, and by using this Website you are expected to review these Terms on a regular basis.
Assignment
The Martiti 2 Ltd. is allowed to assign, transfer, and subcontract its rights and/or obligations under these Terms without any notification. However, you are not allowed to assign, transfer, or subcontract any of your rights and/or obligations under these Terms.
Entire Agreement
These Terms constitute the entire agreement between Martiti 2 Ltd. and you in relation to your use of this Website, and supersede all prior agreements and understandings.
Governing Law & Jurisdiction
These Terms will be governed by and interpreted in accordance with the laws of the State of Bulgaria, and you submit to the non-exclusive jurisdiction of the state and federal courts located in Bulgaria for the resolution of any disputes.
File: apps/virtuoso.dev/README.md
Starlight Starter Kit: Basics
pnpm create astro@latest -- --template starlight๐งโ๐ Seasoned astronaut? Delete this file. Have fun!
๐ Project Structure
Inside of your Astro + Starlight project, you'll see the following folders and files:
.
โโโ public/
โโโ src/
โ โโโ assets/
โ โโโ content/
โ โ โโโ docs/
โ โโโ content.config.ts
โโโ astro.config.mjs
โโโ package.json
โโโ tsconfig.jsonStarlight looks for .md or .mdx files in the src/content/docs/ directory. Each file is exposed as a route based on its file name.
Images can be added to src/assets/ and embedded in Markdown with a relative link.
Static assets, like favicons, can be placed in the public/ directory.
๐ง Commands
All commands are run from the root of the project, from a terminal:
| Command | Action |
|---|---|
pnpm install |
Installs dependencies |
pnpm dev |
Starts local dev server at localhost:4321 |
pnpm build |
Build your production site to ./dist/ |
pnpm preview |
Preview your build locally, before deploying |
pnpm astro ... |
Run CLI commands like astro add, astro check |
pnpm astro -- --help |
Get help using the Astro CLI |
๐ Want to learn more?
Check out Starlightโs docs, read the Astro documentation, or jump into the Astro Discord server.
File: packages/virtuoso-skills/skills/reactive-engine/references/storage/README.md
Reactive Engine Storage
@virtuoso.dev/reactive-engine-storage persists @virtuoso.dev/reactive-engine-core cells in localStorage, sessionStorage, or cookies. A storage link hydrates the cell on engine startup and writes changes back as the cell updates.
Installation
npm install @virtuoso.dev/reactive-engine-core @virtuoso.dev/reactive-engine-storageQuick Example
import { Cell } from '@virtuoso.dev/reactive-engine-core'
import { linkCellToStorage } from '@virtuoso.dev/reactive-engine-storage'
const theme$ = Cell<'light' | 'dark'>('light')
linkCellToStorage(theme$, {
key: 'app-theme',
storageType: 'localStorage',
})License
MIT