# Trust

> What backs slotsmith: tests, coverage, integration suites, axe results and bundle sizes, measured at build, plus support, versioning and security policies.

The Trust page shows what backs slotsmith. Every number on it is measured when the site is built: passing tests, coverage per directory, integration suites for each design system, axe results for the demos, and bundle sizes. The support, versioning and security policies follow.

## Tests

The site's build starts by running the library's whole test suite. If one test fails, the build stops and prints the failure, and nothing is published.

1761 tests in 78 test files pass on version 1.10.0.

| Directory | Lines | Branches | Functions | Statements |
| --- | --- | --- | --- | --- |
| `src/autocomplete/` | 97.87% | 91.22% | 96.11% | 95.29% |
| `src/data-table/` | 93.02% | 81.38% | 93.68% | 90.09% |
| `src/date-picker/` | 98.17% | 92.62% | 99.49% | 96.80% |
| `src/file-uploader/` | 89.32% | 79.89% | 89.21% | 86.84% |
| `src/locale/` | 100.00% | 92.11% | 100.00% | 100.00% |
| `src/locales/` | 100.00% | 90.67% | 100.00% | 100.00% |
| `src/provider/` | 100.00% | 100.00% | 100.00% | 100.00% |
| `src/shared/` | 97.67% | 92.74% | 96.88% | 96.79% |
| All of src/ | 95.24% | 85.60% | 96.34% | 92.92% |

Percent of the source the test run executes, measured with V8 coverage. Test files are not counted. The total also counts the files at the top of src/.

Coverage is listed per directory, so a weaker area is visible instead of being averaged into the total.

## Integrations

An integration suite renders a component with every slot replaced by a design system's real parts, then uses it the way a person would: by mouse and by keyboard. The adapters these suites test are the ones each component's Adapters page shows live, for example [the data table's](https://slotsmith.dev/ar/components/data-table/adapters/).

Every suite uses a shared harness that fails the test when React logs a warning or an error, such as a prop that should not reach the DOM.

20 integration suites with 259 tests, for 5 libraries.

### shadcn/ui

- Autocomplete, 17 tests
  - shadcn/ui renders option groups with the library's parts
  - shadcn/ui opens the list in the library's own popover, portaled out of the control
  - shadcn/ui shows no error style on a valid trigger
  - shadcn/ui shows the library's error style on an invalid trigger
  - shadcn/ui searches from the library's input inside the trigger
  - shadcn/ui opens from the toggle and picks with the pointer, keeping focus in the input
  - shadcn/ui puts the tags before the input and removes the last on Backspace
  - shadcn/ui marks the input invalid and shows the library's error style on the field
  - shadcn/ui shows no error style on a valid field
  - shadcn/ui renders the popup with shadcn's parts
  - shadcn/ui picks a value from a command item and shows it on the trigger
  - shadcn/ui toggles several values and renders them as Badges
  - shadcn/ui refuses a disabled option
  - shadcn/ui picks with the keyboard through the command input
  - shadcn/ui shows the empty row when the search matches nothing
  - shadcn/ui retries from the error state
  - never submits a surrounding form from its buttons
- Data table, 18 tests
  - shadcn/ui (editorial layout) renders with shadcn's table primitives
  - shadcn/ui (editorial layout) keeps shadcn's classes while adding the table's
  - shadcn/ui (editorial layout) sorts from the header
  - shadcn/ui (editorial layout) selects with radix checkboxes and marks rows for data-[state=selected]
  - shadcn/ui (editorial layout) paginates with editorial-style numbered pages
  - shadcn/ui (editorial layout) marks the current page with aria-current and shadcn's default Button variant
  - shadcn/ui (editorial layout) uses shadcn's Select for the rows per page
  - shadcn/ui (editorial layout) changes the page size with the radix select (keyboard)
  - shadcn/ui (editorial layout) shows shadcn skeletons while loading
  - shadcn/ui (editorial layout) shows the empty placeholder across every column
  - shadcn/ui (editorial layout) takes every word from the labels
  - shadcn/ui (editorial layout) shows a custom empty label, and nothing else, in the empty state
  - shadcn/ui (editorial layout) retries from the error state
  - shadcn/ui (editorial layout) reorders rows by keyboard with a ghost icon Button drag handle
  - shadcn/ui (editorial layout) never submits a surrounding form from its drag handle
  - shadcn/ui (editorial layout) takes all four adapters from the provider and changes the page size by keyboard
  - shadcn/ui (editorial layout) skins the table's built-in page-size select when only the autocomplete adapter is at the provider
  - shadcn/ui (editorial layout) edits as a spreadsheet with the skin's editor, checkbox and fill handle
- Date picker, 10 tests
  - shadcn/ui shows the library's error style on an invalid trigger
  - shadcn/ui keeps the same day focused when Enter picks it, and the arrows keep moving
  - shadcn/ui keeps the range end focused when a click picks it
  - shadcn/ui types a date into the library's field, and opens the calendar from its button
  - shadcn/ui renders the calendar with shadcn's classes on the same DOM nodes
  - shadcn/ui picks a date and shows it on the trigger
  - shadcn/ui moves through the grid with the keyboard
  - shadcn/ui picks a range and previews it on the way
  - shadcn/ui refuses a blocked day
  - shadcn/ui toggles several dates
- File uploader, 6 tests
  - shadcn/ui renders the drop zone with shadcn's parts
  - shadcn/ui adds a picked file as a file item with an Avatar thumbnail
  - shadcn/ui shows progress on the Progress primitive while uploading
  - shadcn/ui removes a file from a ghost icon Button
  - shadcn/ui shows a rejection in a polite Alert led by an icon, and dismisses it
  - shadcn/ui never submits a surrounding form from its buttons

### MUI

- Autocomplete, 17 tests
  - MUI v7 opens the list in the library's own popover, portaled out of the control
  - MUI v7 shows no error style on a valid trigger
  - MUI v7 shows the library's error style on an invalid trigger
  - MUI v7 searches from the library's input inside the trigger
  - MUI v7 opens from the toggle and picks with the pointer, keeping focus in the input
  - MUI v7 puts the tags before the input and removes the last on Backspace
  - MUI v7 marks the input invalid and shows the library's error style on the field
  - MUI v7 shows no error style on a valid field
  - MUI v7 renders option groups with the library's parts
  - MUI v7 renders the popup with MUI's primitives
  - MUI v7 shows the input's error for an aria-invalid given as a string
  - MUI v7 picks a value from a MenuItem and shows it on the trigger
  - MUI v7 toggles several values and renders them as Chips
  - MUI v7 refuses a disabled option
  - MUI v7 picks with the keyboard through InputBase
  - MUI v7 shows the empty state when the search matches nothing
  - MUI v7 retries from the error state
- Data table, 17 tests
  - MUI v7 (CMS admin panel) renders with MUI's table components
  - MUI v7 (CMS admin panel) pads the cells like MUI's small table at the small size, and stripes every other row
  - MUI v7 (CMS admin panel) keeps MUI's own padding at the default size, with no stripes unless asked
  - MUI v7 (CMS admin panel) sorts from the header
  - MUI v7 (CMS admin panel) selects with MUI checkboxes and marks the row Mui-selected
  - MUI v7 (CMS admin panel) paginates with MUI's Pagination
  - MUI v7 (CMS admin panel) changes the page size with TablePagination's select
  - MUI v7 (CMS admin panel) shows one CircularProgress while loading, like a CMS admin panel
  - MUI v7 (CMS admin panel) shows the empty message across every column
  - MUI v7 (CMS admin panel) retries from the error state
  - MUI v7 (CMS admin panel) works in RTL with the arSA locale, like a CMS admin panel
  - MUI v7 (CMS admin panel) reorders rows by keyboard with an IconButton drag handle
  - MUI v7 (CMS admin panel) lifts a row on pointer down and disables a lone row’s handle
  - MUI v7 (CMS admin panel) moves a sub-row among its siblings by keyboard in a tree table
  - MUI v7 (CMS admin panel) takes all four adapters from the provider and changes the page size by keyboard
  - MUI v7 (CMS admin panel) skins the table's built-in page-size select when only the autocomplete adapter is at the provider
  - MUI v7 (CMS admin panel) edits as a spreadsheet with the skin's editor, checkbox and fill handle
- Date picker, 11 tests
  - MUI v7 shows the library's error style on an invalid trigger
  - MUI v7 keeps the same day focused when Enter picks it, and the arrows keep moving
  - MUI v7 keeps the range end focused when a click picks it
  - MUI v7 types a date into the library's field, and opens the calendar from its button
  - MUI v7 renders the calendar with MUI's primitives
  - MUI v7 picks a date from an IconButton and shows it on the trigger
  - MUI v7 moves through the grid with the keyboard
  - MUI v7 applies a range preset from a Chip
  - MUI v7 refuses a blocked day but keeps it focusable
  - MUI v7 changes the month from the native Select
  - MUI v7 clears from an IconButton without opening
- File uploader, 5 tests
  - MUI v7 renders the drop zone with MUI's primitives
  - MUI v7 adds a picked file as a ListItem with an Avatar thumbnail
  - MUI v7 shows progress on a LinearProgress while uploading
  - MUI v7 removes a file from an IconButton action
  - MUI v7 shows a rejection in an Alert and dismisses it

### Chakra UI

- Autocomplete, 16 tests
  - Chakra UI v3 renders option groups with the library's parts
  - Chakra UI v3 opens the list in the library's own popover, portaled out of the control
  - Chakra UI v3 shows no error style on a valid trigger
  - Chakra UI v3 shows the library's error style on an invalid trigger
  - Chakra UI v3 searches from the library's input inside the trigger
  - Chakra UI v3 opens from the toggle and picks with the pointer, keeping focus in the input
  - Chakra UI v3 puts the tags before the input and removes the last on Backspace
  - Chakra UI v3 marks the input invalid and shows the library's error style on the field
  - Chakra UI v3 shows no error style on a valid field
  - Chakra UI v3 renders the popup with Chakra's parts
  - Chakra UI v3 picks a value from a List.Item and shows it on the trigger
  - Chakra UI v3 toggles several values and renders them as Tags
  - Chakra UI v3 refuses a disabled option
  - Chakra UI v3 picks with the keyboard through Chakra's Input
  - Chakra UI v3 shows Chakra's EmptyState when the search matches nothing
  - Chakra UI v3 retries from the error state
- Data table, 13 tests
  - Chakra UI v3 (dense admin table) renders with Chakra's table parts
  - Chakra UI v3 (dense admin table) sorts from the header
  - Chakra UI v3 (dense admin table) selects with Chakra checkboxes
  - Chakra UI v3 (dense admin table) paginates with Chakra's Pagination
  - Chakra UI v3 (dense admin table) changes the page size with NativeSelect
  - Chakra UI v3 (dense admin table) can show one spinner while loading, like a dense admin table
  - Chakra UI v3 (dense admin table) shows Chakra's EmptyState
  - Chakra UI v3 (dense admin table) takes the empty message and the page-size name from the labels
  - Chakra UI v3 (dense admin table) retries from the error state
  - Chakra UI v3 (dense admin table) reorders rows by keyboard with an IconButton drag handle
  - Chakra UI v3 (dense admin table) takes all four adapters from the provider and changes the page size from the focused select
  - Chakra UI v3 (dense admin table) skins the table's built-in page-size select when only the autocomplete adapter is at the provider
  - Chakra UI v3 (dense admin table) edits as a spreadsheet with the skin's editor, checkbox and fill handle
- Date picker, 10 tests
  - Chakra UI v3 shows the library's error style on an invalid trigger
  - Chakra UI v3 keeps the same day focused when Enter picks it, and the arrows keep moving
  - Chakra UI v3 keeps the range end focused when a click picks it
  - Chakra UI v3 types a date into the library's field, and opens the calendar from its button
  - Chakra UI v3 renders the calendar with Chakra's parts
  - Chakra UI v3 picks a date and shows it on the trigger
  - Chakra UI v3 moves through the grid with the keyboard
  - Chakra UI v3 changes the year from the NativeSelect
  - Chakra UI v3 applies a preset from a Button
  - Chakra UI v3 refuses a blocked day
- File uploader, 5 tests
  - Chakra UI v3 renders the drop zone with Chakra's parts
  - Chakra UI v3 adds a picked file as a List.Item with an Avatar thumbnail
  - Chakra UI v3 shows progress on Progress.Root while uploading
  - Chakra UI v3 removes a file from an IconButton action
  - Chakra UI v3 shows a rejection in an Alert and dismisses it

### Ant Design

- Autocomplete, 18 tests
  - Ant Design v6 renders option groups with the library's parts
  - Ant Design v6 opens the list in the library's own popover, portaled out of the control
  - Ant Design v6 shows no error style on a valid trigger
  - Ant Design v6 shows the library's error style on an invalid trigger
  - Ant Design v6 searches from the library's input inside the trigger
  - Ant Design v6 opens from the toggle and picks with the pointer, keeping focus in the input
  - Ant Design v6 puts the tags before the input and removes the last on Backspace
  - Ant Design v6 marks the input invalid and shows the library's error style on the field
  - Ant Design v6 shows no error style on a valid field
  - Ant Design v6 renders the popup with Ant's primitives and tokens
  - Ant Design v6 merges a caller's style into the search box instead of replacing it
  - Ant Design v6 picks a value and shows it on the trigger
  - Ant Design v6 toggles several values and renders them as Tags
  - Ant Design v6 refuses a disabled option
  - Ant Design v6 picks with the keyboard through Ant's Input
  - Ant Design v6 shows Ant's Empty when the search matches nothing
  - Ant Design v6 retries from the error state
  - Ant Design v6 clears from an Ant Button without opening
- Data table, 19 tests
  - Ant Design v6 (admin panel) paints the table with the theme's tokens
  - Ant Design v6 (admin panel) pads the cells like Ant's small table at the small size, and stripes every other row
  - Ant Design v6 (admin panel) pads the cells like Ant's default table at the default size, with no stripes unless asked
  - Ant Design v6 (admin panel) puts the ConfigProvider's CSP nonce on its sheet
  - Ant Design v6 (admin panel) sorts from an Ant Button in the header
  - Ant Design v6 (admin panel) selects with Ant checkboxes and tints the selected row
  - Ant Design v6 (admin panel) paginates with Ant Buttons
  - Ant Design v6 (admin panel) changes the page size with a Segmented control
  - Ant Design v6 (admin panel) shows Ant skeletons while loading
  - Ant Design v6 (admin panel) shows Ant's Empty across every column
  - Ant Design v6 (admin panel) retries from the error state
  - Ant Design v6 (admin panel) works in RTL with the ar_EG locale, with the page arrows turned round
  - Ant Design v6 (admin panel) expands a tree row from an Ant Button
  - Ant Design v6 (admin panel) reorders rows by keyboard with a HolderOutlined drag handle
  - Ant Design v6 (admin panel) lifts a row on pointer down and disables a lone row’s handle
  - Ant Design v6 (admin panel) moves a sub-row among its siblings by keyboard in a tree table
  - Ant Design v6 (admin panel) takes all four adapters from the provider and changes the page size by keyboard
  - Ant Design v6 (admin panel) skins the table's built-in page-size select when only the autocomplete adapter is at the provider
  - Ant Design v6 (admin panel) edits as a spreadsheet with the skin's editor, checkbox and fill handle
- Date picker, 12 tests
  - Ant Design v6 shows the library's error style on an invalid trigger
  - Ant Design v6 keeps the same day focused when Enter picks it, and the arrows keep moving
  - Ant Design v6 keeps the range end focused when a click picks it
  - Ant Design v6 types a date into the library's field, and opens the calendar from its button
  - Ant Design v6 renders the calendar with Ant's primitives
  - Ant Design v6 picks a date from a Button and shows it on the trigger
  - Ant Design v6 moves through the grid with the keyboard
  - Ant Design v6 applies a range preset from a Button and bands the range
  - Ant Design v6 refuses a blocked day but keeps it focusable
  - Ant Design v6 changes the month from Ant's Select, whose menu stays inside the calendar
  - Ant Design v6 clears from a Button without opening
  - Ant Design v6 points the month arrows the way an RTL page reads
- File uploader, 6 tests
  - Ant Design v6 renders the drop zone like Ant's dragger, with an Ant Button
  - Ant Design v6 marks the drop zone while a file is over it
  - Ant Design v6 adds a picked file as a row with an Avatar thumbnail
  - Ant Design v6 shows progress on Ant's Progress while uploading
  - Ant Design v6 removes a file from a Button action
  - Ant Design v6 shows a rejection in an Alert and dismisses it

### Radix Themes

- Autocomplete, 19 tests
  - Radix Themes v3 renders option groups with the library's parts
  - Radix Themes v3 opens the list in the library's own popover, portaled out of the control
  - Radix Themes v3 shows no error style on a valid trigger
  - Radix Themes v3 shows the library's error style on an invalid trigger
  - Radix Themes v3 searches from the library's input inside the trigger
  - Radix Themes v3 opens from the toggle and picks with the pointer, keeping focus in the input
  - Radix Themes v3 puts the tags before the input and removes the last on Backspace
  - Radix Themes v3 marks the input invalid and shows the library's error style on the field
  - Radix Themes v3 shows no error style on a valid field
  - Radix Themes v3 renders the popup with Radix primitives and variables
  - Radix Themes v3 picks a value and shows it on the trigger
  - Radix Themes v3 toggles several values and renders them as Badges
  - Radix Themes v3 refuses a disabled option
  - Radix Themes v3 picks with the keyboard through Radix's TextField
  - Radix Themes v3 shows the empty message when the search matches nothing
  - Radix Themes v3 shows a Spinner while loading
  - Radix Themes v3 retries from the error state
  - Radix Themes v3 clears from an IconButton without opening
  - Radix Themes v3 never submits a surrounding form from its buttons
- Data table, 19 tests
  - Radix Themes v3 borrows only Table.Root selectors that Radix's stylesheet still has
  - Radix Themes v3 renders with Radix Themes' table parts
  - Radix Themes v3 sorts from a ghost Button in the header, the active arrow in the accent colour
  - Radix Themes v3 selects with Radix checkboxes, mapping indeterminate both ways, and tints the selected row
  - Radix Themes v3 paginates with Radix IconButtons
  - Radix Themes v3 changes the page size with a SegmentedControl
  - Radix Themes v3 shows Radix skeletons while loading
  - Radix Themes v3 shows the empty message across every column
  - Radix Themes v3 retries from the error state
  - Radix Themes v3 works in RTL, with the arrows turned round
  - Radix Themes v3 keeps the arrows as drawn left to right
  - Radix Themes v3 expands a tree row from an IconButton
  - Radix Themes v3 reorders rows by keyboard with a DragHandleDots2Icon drag handle
  - Radix Themes v3 lifts a row on pointer down and disables a lone row’s handle
  - Radix Themes v3 moves a sub-row among its siblings by keyboard in a tree table
  - Radix Themes v3 never submits a surrounding form from its buttons
  - Radix Themes v3 takes all four adapters from the provider and changes the page size by keyboard
  - Radix Themes v3 skins the table's built-in page-size select when only the autocomplete adapter is at the provider
  - Radix Themes v3 edits as a spreadsheet with the skin's editor, checkbox and fill handle
- Date picker, 13 tests
  - Radix Themes v3 shows the library's error style on an invalid trigger
  - Radix Themes v3 keeps the same day focused when Enter picks it, and the arrows keep moving
  - Radix Themes v3 keeps the range end focused when a click picks it
  - Radix Themes v3 types a date into the library's field, and opens the calendar from its button
  - Radix Themes v3 renders the calendar with Radix primitives
  - Radix Themes v3 picks a date from a Button and shows it on the trigger
  - Radix Themes v3 moves through the grid with the keyboard
  - Radix Themes v3 applies a range preset from a Button and bands the range
  - Radix Themes v3 refuses a blocked day but keeps it focusable
  - Radix Themes v3 changes the month from Radix's Select, whose menu stays inside the calendar
  - Radix Themes v3 clears from an IconButton without opening
  - Radix Themes v3 points the month arrows the way an RTL page reads
  - Radix Themes v3 never submits a surrounding form from its buttons
- File uploader, 8 tests
  - Radix Themes v3 renders a dashed drop zone with a Radix Button
  - Radix Themes v3 marks the drop zone while a file is over it
  - Radix Themes v3 adds a picked file as a row with its preview
  - Radix Themes v3 shows a file icon in an Avatar for a file that is not an image
  - Radix Themes v3 shows progress on Radix's Progress while uploading
  - Radix Themes v3 removes a file from an IconButton action
  - Radix Themes v3 shows a rejection in a Callout and dismisses it
  - Radix Themes v3 never submits a surrounding form from its buttons

Open a suite to read what it tests.

## Tree-shaking

An app that imports one component should ship only that component. One test file bundles the published output the way an application's bundler does and fails if anything else gets in. Its test titles say what it proves:

61 tests in `src/__tests__/bundle.test.ts`

- what an application actually bundles
  - drops everything but Autocomplete from a main-entry import
  - drops everything but DataTable from a main-entry import
  - drops everything but DatePicker from a main-entry import
  - drops everything but FileUploader from a main-entry import
  - drops the component bodies when only useAutocomplete is imported
  - drops the component bodies when only useDatePicker is imported
  - keeps everything an application does import
  - isolates Autocomplete behind its own entry point
  - isolates DataTable behind its own entry point
  - isolates DatePicker behind its own entry point
  - isolates FileUploader behind its own entry point
  - keeps the row reorder handle out of an app that imports only Autocomplete
  - ships the row reorder handle with the table
  - bundles the autocomplete, and nothing else, with VirtualDataTable
  - shares the popup and state hooks between entries instead of copying them
  - gives CommonJS consumers a way to import Autocomplete alone
  - gives CommonJS consumers a way to import DatePicker alone
  - keeps the autocomplete out of the uploader's CommonJS entry

- the stylesheets
  - ships the whole set
  - ships Autocomplete's styles on their own
  - ships DataTable's styles on their own
  - ships DatePicker's styles on their own
  - ships FileUploader's styles on their own
  - ships the autocomplete's rules once in the whole set

- locales
  - keeps every pack out of a component's bundle
  - keeps every component out of a pack's bundle
  - keeps the provider free of components and packs
  - ships the packs without a client directive, so they import anywhere

- the provider entry point
  - keeps components and packs out of slotsmith/provider
  - keeps components out of slotsmith/provider when its components prop is used
  - ships dist/provider.js with the client directive
  - gives the same SlotsmithProvider whether imported from slotsmith/provider or slotsmith/locale

- the declarations an app without the optional peers loads
  - keeps the optional peers out of provider/index.d.ts
  - keeps the optional peers out of locale/index.d.ts
  - keeps the optional peers out of locales/ar-EG.d.ts
  - keeps the optional peers out of locales/ar-IQ.d.ts
  - keeps the optional peers out of locales/ar-SA.d.ts
  - keeps the optional peers out of locales/ar.d.ts
  - keeps the optional peers out of locales/de.d.ts
  - keeps the optional peers out of locales/es.d.ts
  - keeps the optional peers out of locales/fa.d.ts
  - keeps the optional peers out of locales/fr.d.ts
  - keeps the optional peers out of locales/he.d.ts
  - keeps the optional peers out of locales/hi.d.ts
  - keeps the optional peers out of locales/id.d.ts
  - keeps the optional peers out of locales/it.d.ts
  - keeps the optional peers out of locales/ja.d.ts
  - keeps the optional peers out of locales/ko.d.ts
  - keeps the optional peers out of locales/pt-BR.d.ts
  - keeps the optional peers out of locales/ru.d.ts
  - keeps the optional peers out of locales/tr.d.ts
  - keeps the optional peers out of locales/zh-CN.d.ts
  - keeps the optional peers out of autocomplete/index.d.ts
  - keeps the optional peers out of date-picker/index.d.ts
  - keeps the optional peers out of file-uploader/index.d.ts
  - resolves every import of index.d.ts to a declaration
  - resolves every import of virtual.d.ts to a declaration
  - resolves every import of data-table/index.d.ts to a declaration
  - still finds the table engine behind the table's own entry, so the walk is real

- the declarations under Node's own resolution
  - names the extension of every relative import in the ES module declarations
  - gives every declaration a CommonJS twin that names the .cjs files

## Accessibility

axe-core runs in Chromium on every fallback demo of this site, on the English and the Arabic pages, each time the site is built and verified. It checks the WCAG A and AA rules. A finding fails the build, unless it is a known issue in the library's own parts; those are listed with their reason, not hidden.

The results table, one row per fallback demo, is on the page: https://slotsmith.dev/ar/trust/#accessibility

The demos show the parts exactly as they ship. Each component's overview describes its keyboard and screen reader behaviour, for example [the data table's](https://slotsmith.dev/ar/components/data-table/#accessibility).

## Sizes

| JavaScript entry | Minified | Minified + gzipped |
| --- | --- | --- |
| `slotsmith` | 157.8 KB | 54.9 KB |
| `slotsmith/data-table` | 111.2 KB | 38.5 KB |
| `slotsmith/autocomplete` | 31.9 KB | 11.8 KB |
| `slotsmith/date-picker` | 29.9 KB | 11.4 KB |
| `slotsmith/file-uploader` | 20.2 KB | 7.8 KB |

Measured: each entry bundled on its own with esbuild, minified, then gzipped. React, React DOM and the other peer dependencies are excluded. 1 KB is 1000 bytes.

| Stylesheet | Minified | Minified + gzipped |
| --- | --- | --- |
| `slotsmith/styles.css` | 34.6 KB | 6.3 KB |
| `slotsmith/autocomplete.css` | 7.8 KB | 1.9 KB |
| `slotsmith/data-table.css` | 19.6 KB | 4.1 KB |
| `slotsmith/date-picker.css` | 8.9 KB | 1.9 KB |
| `slotsmith/file-uploader.css` | 6.2 KB | 1.6 KB |

Measured: each stylesheet minified with esbuild, then gzipped. styles.css holds all four components' styles.

Importing one component from the main entry drops the others, as the [tree-shaking test](https://slotsmith.dev/ar/trust/#tree-shaking) checks, so an app pays for the entries it uses.

## Support

slotsmith targets the last two versions of Chrome, Edge, Firefox and Safari. It needs ES2022, `Intl` and `IntersectionObserver`. The tests run in jsdom, and the checks of this site run in Chromium; Firefox and Safari are not part of an automated run. It works with React 18 and React 19. `slotsmith-ai` runs on Node 20 or later.

The table shows what the packages themselves declare:

| Item | Declared |
| --- | --- |
| React, peer range of slotsmith | `>=18` |
| Node, for slotsmith-ai | `>=20` |
| License | `ISC` |
| Version these numbers were measured on | `1.10.0` |
| Release line that gets security fixes | `1.10.x` |

## License

slotsmith and `slotsmith-ai` are published under the ISC license, a short permissive license: you may use, copy, change and distribute the code, in commercial work too, as long as the copyright notice and the license text stay with it. The full text is in [LICENSE](https://github.com/tmzm/slotsmith/blob/master/LICENSE) at the root of the repository, and each npm package ships a copy. The [support table](https://slotsmith.dev/ar/trust/#support) shows the license each package declares.

## Versioning

slotsmith follows semantic versioning. A breaking change ships only in a major version. Before an API is removed, it is marked `@deprecated` in the types, which editors show as a warning, and it keeps working for at least one minor version. `slotsmith-ai` shares its major and minor version with `slotsmith`.

## Security

The security policy is [SECURITY.md](https://github.com/tmzm/slotsmith/blob/master/SECURITY.md) in the repository. Report a vulnerability privately, through a [GitHub security advisory on the slotsmith repository](https://github.com/tmzm/slotsmith/security/advisories/new). Please do not open a public issue for it. You get a first answer within seven days. Fixes go into the latest minor version, shown as the release line in the [support table](https://slotsmith.dev/ar/trust/#support). Reports about how the components render content you pass them, such as option labels and file names, and about the `slotsmith-ai` MCP server and CLI, are in scope.

## Changelog

The [changelog](https://slotsmith.dev/ar/changelog/) lists what changed in each release.
