react-virtuoso Documentation

The most powerful virtual list component for React

6,347 stars TypeScript TypeScript 1 file ยท ~12,996 tokens #chat#component-library#feed#hacktoberfest#react#virtual#virtualizedlist
RAW Doc

File: README.md

React Virtuoso

The most complete React virtualization rendering family of components.

Get Started

sh
npm install react-virtuoso
jsx import * as react from 'react' import * as reactdom from 'react-dom'
import { 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 exposes groupCounts: 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 itemContent property, the component requires an additional groupContent property,
    which renders the group header. The groupContent callback 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.

tsx live
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:

tsx
<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.

tsx live
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:

tsx
<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.

tsx live
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:

tsx
<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?

Variable-sized items work automatically without manual measurements or hard-coded heights. Lists, grids, tables, chat interfaces, and masonry layouts in one library. Smooth scrolling with thousands of items through virtualized rendering. Built-in support for endless scrolling, load on demand, and initial scroll location. Commercial VirtuosoMessageList component built specifically for human/AI conversations.

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

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:

text
/plugin marketplace add petyosi/react-virtuoso
/plugin install virtuoso-skills@virtuoso

Codex

bash
codex plugin marketplace add petyosi/react-virtuoso --ref main --sparse .agents/plugins --sparse plugins/virtuoso-skills
codex plugin add virtuoso-skills@virtuoso

Cursor, OpenCode, and other agents

Use the Agent Skills CLI against the virtuoso-dev/skills mirror:

bash
npx skills add virtuoso-dev/skills --skill '*'

Or install individual skills:

bash
npx skills add virtuoso-dev/skills --skill react-virtuoso

How 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

bash
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:

text
.
โ”œโ”€โ”€ public/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ assets/
โ”‚   โ”œโ”€โ”€ content/
โ”‚   โ”‚   โ””โ”€โ”€ docs/
โ”‚   โ””โ”€โ”€ content.config.ts
โ”œโ”€โ”€ astro.config.mjs
โ”œโ”€โ”€ package.json
โ””โ”€โ”€ tsconfig.json

Starlight 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

bash
npm install @virtuoso.dev/reactive-engine-core @virtuoso.dev/reactive-engine-storage

Quick Example

ts
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