@abuzareal/contour-ui 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/COMBOBOX.md +87 -0
- package/CONTRACTS.md +17 -17
- package/DOCS.md +80 -0
- package/FOUNDATION.md +35 -0
- package/GETTING-STARTED.md +63 -0
- package/NEXTJS.md +3 -1
- package/PUBLIC-API.md +174 -164
- package/README.md +7 -5
- package/RECIPES.md +43 -0
- package/RELEASING.md +2 -2
- package/SIZE.md +9 -3
- package/dist/components/ui/Combobox.d.ts +325 -0
- package/dist/components/ui/Combobox.js +120 -0
- package/dist/components/ui/Combobox.types.d.ts +46 -0
- package/dist/components/ui/Combobox.types.js +1 -0
- package/dist/components/ui/DataTable.js +5 -4
- package/dist/components/ui/Field.js +1 -1
- package/dist/components/ui/FloatingPortal.js +2 -40
- package/dist/components/ui/FloatingScope.d.ts +9 -0
- package/dist/components/ui/FloatingScope.js +43 -0
- package/dist/components/ui/Table.d.ts +20 -0
- package/dist/components/ui/Table.js +9 -0
- package/dist/hooks/useComboboxAnchor.d.ts +17 -0
- package/dist/hooks/useComboboxAnchor.js +61 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/kit/data-display.css +6 -0
- package/dist/kit/forms.css +34 -0
- package/dist/lib/componentClasses.js +1 -1
- package/dist/scoped/kit/data-display.css +6 -0
- package/dist/scoped/kit/forms.css +34 -0
- package/examples/optional/LazyScene.tsx +78 -0
- package/examples/optional/OptionalSmoothScroll.tsx +25 -0
- package/examples/optional/SmoothScrollOwner.tsx +7 -0
- package/examples/optional/optional.css +25 -0
- package/examples/recipes/AsyncProjectPicker.tsx +82 -0
- package/examples/recipes/DeleteProjectConfirmation.tsx +97 -0
- package/examples/recipes/InputCompositions.tsx +49 -0
- package/examples/recipes/RemoteRecordsTable.tsx +256 -0
- package/examples/recipes/useRemoteResource.ts +81 -0
- package/examples/reproduction/README.md +9 -0
- package/examples/reproduction/index.html +14 -0
- package/examples/reproduction/package.json +27 -0
- package/examples/reproduction/src/main.tsx +33 -0
- package/examples/reproduction/src/style.css +19 -0
- package/examples/reproduction/tsconfig.json +18 -0
- package/examples/reproduction/vite.config.ts +19 -0
- package/examples/starters/next/README.md +18 -0
- package/examples/starters/next/app/Demo.tsx +65 -0
- package/examples/starters/next/app/layout.tsx +25 -0
- package/examples/starters/next/app/next-page/page.tsx +9 -0
- package/examples/starters/next/app/page.tsx +11 -0
- package/examples/starters/next/app/style.css +19 -0
- package/examples/starters/next/next-env.d.ts +2 -0
- package/examples/starters/next/next.config.mjs +1 -0
- package/examples/starters/next/package.json +27 -0
- package/examples/starters/next/proxy.ts +16 -0
- package/examples/starters/next/tsconfig.json +30 -0
- package/examples/starters/vite/README.md +16 -0
- package/examples/starters/vite/index.html +14 -0
- package/examples/starters/vite/package.json +27 -0
- package/examples/starters/vite/src/main.tsx +81 -0
- package/examples/starters/vite/src/style.css +19 -0
- package/examples/starters/vite/tsconfig.json +18 -0
- package/examples/starters/vite/vite.config.ts +19 -0
- package/package.json +19 -4
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@ Use it when you want this visual style with typed controls, feedback, navigation
|
|
|
6
6
|
|
|
7
7
|
[Live catalogue](https://contour.abuzr.in/) · [npm package](https://www.npmjs.com/package/@abuzareal/contour-ui) · [Maintainer](https://github.com/abuzareal)
|
|
8
8
|
|
|
9
|
-
This source checkout targets **0.
|
|
9
|
+
This source checkout targets **0.6.0**. Package publication and application upgrades are separate; check the npm registry for release availability and each application's manifest for its installed version. Catalogue examples include application patterns as well as package components. Check the exports below before treating an example as an importable component.
|
|
10
10
|
|
|
11
11
|
[Public API and maturity register](PUBLIC-API.md) · [Architecture, scope and compatibility](CONTRACTS.md)
|
|
12
12
|
|
|
@@ -16,12 +16,14 @@ Version 0.4.0 adds native named/external form submission and controlled/default/
|
|
|
16
16
|
|
|
17
17
|
Version 0.5 adds topmost overlay dismissal, hoverable hints, collision-aware body/modal portals, scoped/prefixed CSS and themes, local labels/formatters, selective style entries and measured size gates. Floating UI DOM is a new runtime positioning dependency. Default portal DOM placement changes ancestor selectors; see [overlay migration](OVERLAYS.md), [styling and embedding](STYLING.md) and [measured costs](SIZE.md). Legacy styles/imports remain available. This is an early 0.x release, not a 1.0 milestone.
|
|
18
18
|
|
|
19
|
+
Version 0.6 adds a single-select [Combobox](COMBOBOX.md) backed by pinned Base UI, a semantic [Table and application recipes](RECIPES.md), public standalone Vite/Next starters, CSP setup and a minimal reproduction. [Start here](GETTING-STARTED.md); [foundation decision and measured dependency cost](FOUNDATION.md); [documentation coverage](DOCS.md). DataTable retains local scalar sorting. Async requests, deletion and remote table state stay application-owned. The private catalogue and independent consumers are not upgraded by this release.
|
|
20
|
+
|
|
19
21
|
## Install
|
|
20
22
|
|
|
21
23
|
Use an existing React application with a bundler that resolves package CSS imports. Contour ships ESM and TypeScript declarations. The package declares Node.js 22 or newer; repository tooling uses Vite 8, which needs Node.js 22.12+ or 24+.
|
|
22
24
|
|
|
23
25
|
```sh
|
|
24
|
-
npm install @abuzareal/contour-ui@0.
|
|
26
|
+
npm install @abuzareal/contour-ui@0.6.0 --save-exact
|
|
25
27
|
```
|
|
26
28
|
|
|
27
29
|
Your app must provide matching `react` and `react-dom` versions: **18.3.1 or React 19**. The compatibility script covers 18.3.1, 19.0.0, and 19.3.0; it doesn't establish support for every framework or React Server Component setup. Put interactive components inside a client boundary when your framework requires one.
|
|
@@ -121,9 +123,9 @@ For theme selection before first paint, inject `themeBootstrapScript` from `@abu
|
|
|
121
123
|
| Area | Public exports |
|
|
122
124
|
| --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
123
125
|
| Actions | `Button`, `IconButton`, `ExternalLink`, `SegmentedControl`, `ThemeToggle` |
|
|
124
|
-
| Forms | `Field`, `TextField`, `TextArea`, `SelectField`, `Checkbox`, `RadioGroup`, `Switch`, `Slider`
|
|
126
|
+
| Forms | `Field`, `TextField`, `TextArea`, `SelectField`, `Combobox`, `Checkbox`, `RadioGroup`, `Switch`, `Slider` |
|
|
125
127
|
| Navigation | `Tabs`, `Breadcrumbs`, `Pagination`, `Stepper`, `DropdownMenu` |
|
|
126
|
-
| Data and layout | `Avatar`, `Badge`, `Card`, `DataTable`, `Disclosure`, `Divider`, `EmptyState`, `Kbd`, `SectionLabel`, `Stat`, `Tag`, `Timeline`
|
|
128
|
+
| Data and layout | `Avatar`, `Badge`, `Card`, `DataTable`, `Table`, `Disclosure`, `Divider`, `EmptyState`, `Kbd`, `SectionLabel`, `Stat`, `Tag`, `Timeline` |
|
|
127
129
|
| Feedback | `Alert`, `ProgressBar`, `Skeleton`, `Spinner`, `ToastProvider`, `useToast` |
|
|
128
130
|
| Motion and identity | `BrandMark`, `CountUp`, `DepthButton`, `FlipCard`, `Magnetic`, `Marquee`, `Reveal`, `RevealHeading`, `ScrollProgress`, `TiltCard`, `GitHubIcon`, `LinkedInIcon` |
|
|
129
131
|
| Overlays and scene fallback | `Dialog`, `Popover`, `Tooltip`, `SceneBoundary` |
|
|
@@ -178,7 +180,7 @@ Give scenes a sized container and a usable static fallback. `SceneBoundary` hide
|
|
|
178
180
|
**0.2.0** adds native field refs, controlled tabs and popover/menu open state, menu keyboard improvements, native reset synchronization, Three.js lifecycle fixes and a tested Next.js App Router integration. Existing uncontrolled defaults and React 18/19 support remain. `fonts-latin.css`, introduced in 0.1.2, now uses packaged relative font URLs for webpack resolution. `CHANGELOG.md` is included in the package archive and [npm's Code view](https://www.npmjs.com/package/@abuzareal/contour-ui?activeTab=code); it contains the upgrade details for each version.
|
|
179
181
|
|
|
180
182
|
```sh
|
|
181
|
-
npm install @abuzareal/contour-ui@0.
|
|
183
|
+
npm install @abuzareal/contour-ui@0.6.0 --save-exact
|
|
182
184
|
```
|
|
183
185
|
|
|
184
186
|
Commit your manifest and lockfile, run your application's checks, and review both themes, dialogs, forms, and motion before deploying. Version 0.1.1 includes a document scroll lock for dialogs and drawers. Review any app-level lock before removing it, including nested dialogs and short screens. Package publication doesn't update deployed consumers automatically.
|
package/RECIPES.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Application recipes — 0.6.0
|
|
2
|
+
|
|
3
|
+
The source linked here is the code copied, compiled and exercised by the package checks. These files are application code, not additional exports. Import components directly from the public package; copy only the recipe needed. There are no live services or fabricated successful operations. [Source at this release](https://github.com/abuzareal/contour-ui/tree/v0.6.0/examples/recipes).
|
|
4
|
+
|
|
5
|
+
## Async single-select
|
|
6
|
+
|
|
7
|
+
Copy [AsyncProjectPicker.tsx](examples/recipes/AsyncProjectPicker.tsx) and [useRemoteResource.ts](examples/recipes/useRemoteResource.ts). Supply a stable searchProjects(query, signal) function, normally defined outside render or with useCallback. It must validate response IDs/labels, reject malformed data, bound results, and map denied requests to RecipeServiceError("permission"). The component retains one selected record separately from current results. It aborts obsolete work and ignores a response even if the transport ignores abort. Debounce, authentication, caching and data updates are application policies.
|
|
8
|
+
|
|
9
|
+
The controlled selection and text query are independent; typed text never becomes a project ID. Filtering/reordering preserves identity. Loading, no matches, permission failure, service failure and retry are explicit. A failed or stale response cannot replace a newer selection. Use the native name/form/value contracts from [Combobox](COMBOBOX.md); parent form reset should reset the application's controlled selected/query state when required. No hidden network request is made by the library.
|
|
10
|
+
|
|
11
|
+
## Destructive confirmation
|
|
12
|
+
|
|
13
|
+
Copy [DeleteProjectConfirmation.tsx](examples/recipes/DeleteProjectConfirmation.tsx). It composes the existing native **Dialog**; no new AlertDialog export is added. This confirmation is a user-initiated decision with clear consequences, not an urgent unsolicited alert. The title names the project, the description states irreversible consequences, “Keep project” receives initial focus and “Permanently delete project” is explicit. The trigger regains focus after dismissal while it remains connected.
|
|
14
|
+
|
|
15
|
+
The deleteProject(id, signal) function performs the real server operation; resolving it means the server confirmed success. A disabled pending action prevents duplicate submissions; an immediate ref also guards repeated activation before rendering. A rejected operation keeps the dialog open with a persistent error and an explicit retry action. The example does not announce success until the operation resolves. Target identity keys the interaction, so changing projects or unmounting invalidates the old request.
|
|
16
|
+
|
|
17
|
+
Escape, backdrop, close and “Keep project” cancel waiting and dismiss, including while pending. Abort cannot guarantee a server rollback; the pending message says the server may still complete. Cancelled or obsolete requests cannot invoke onDeleted or close a later confirmation. The application must reconcile server state before retrying an uncertain outcome and implement authorization/idempotency at its server boundary. Use a different explicit contract if a product must prohibit cancellation during a critical phase. Dialog semantics, keyboard containment and return are inherited from the released Dialog; physical assistive-technology verification is separate.
|
|
18
|
+
|
|
19
|
+
## Tables: local versus remote
|
|
20
|
+
|
|
21
|
+
**DataTable** is deliberately small: `Row extends Record<string, string | number>`, caption, columns and a stable rowKey. Local sorting compares string/number values or column.compare; render formats a cell but does not remove the row constraint. Use immutable stable IDs, not array indexes or translated labels. DataTable has no remote sorting/filtering/pagination, selection, bulk actions, virtualization, editing or adjustable density.
|
|
22
|
+
|
|
23
|
+
**Table** is a new semantic presentation primitive for application-owned native thead/tbody/tr/th/td markup. It accepts native table attributes/events, forwards ref to HTMLTableElement, requires a string caption and children, hides the caption visually by default (`showCaption=false`) and offers native scrollProps/ref for the existing focusable scroll region. It owns one caption; do not supply a second caption in children. Use scope, headers, aria-sort and text equivalents according to the data. It adds no sorting engine, ARIA grid keyboard model or layout algorithm. Overflow is horizontally scrollable. Use data-display.css or scoped.css; contour-table-scroll/contour-data-table and semantic typography/border tokens supply the shared styling.
|
|
24
|
+
|
|
25
|
+
Copy [RemoteRecordsTable.tsx](examples/recipes/RemoteRecordsTable.tsx) and useRemoteResource.ts. Install **@tanstack/react-table@9.3.1** and **@tanstack/react-store@0.11.2** as your application's direct dependencies; neither is a Contour runtime dependency. This recipe uses v9 useTable/tableFeatures/FlexRender and controlled application state, not the older v8 useReactTable API. [Official v9 state guide](https://tanstack.com/table/latest/docs/framework/react/guide/table-state), [migration guide](https://tanstack.com/table/latest/docs/framework/react/guide/migrating).
|
|
26
|
+
|
|
27
|
+
loadRecords(query, signal) must perform the requested filter, sorting and pagination remotely. Validate parsed JSON with parseRecordsPage and validate/whitelist query fields at the server; never interpolate arbitrary column IDs into SQL. Only name/owner columns exist in this example. Return rows, filtered total and unfilteredTotal consistently. Name/id/owner are demo record fields, not a prescribed business model.
|
|
28
|
+
|
|
29
|
+
The app controls query, resets the page when filter/sort changes, ignores obsolete responses, retains and **labels** the previous successful snapshot on loading/service failure, and hides old rows after permission failure. Headers describe the displayed snapshot; pending controls request new data rather than locally sorting old rows. A table caption, native headers, stable row/cell IDs and status text preserve semantics. Loading, empty database, no filter matches, missing page, denied/service error and retry are distinct. Pagination is disabled while the requested result is unresolved or failed. Changes to dataset totals may require “First page”; they do not masquerade as an empty database.
|
|
30
|
+
|
|
31
|
+
Selection/bulk actions, density, virtualization, pinned columns and enterprise grid behavior are explicitly unsupported in this bounded recipe. If required, define stable selection across pages, permissions, indeterminate/select-all scope, destructive bulk outcomes and keyboard behavior before enabling engine features. Use a mature grid for grid behavior; do not add role=grid to this table without its keyboard contract. Styling is not evidence of a complete enterprise grid.
|
|
32
|
+
|
|
33
|
+
## Input and typography decisions
|
|
34
|
+
|
|
35
|
+
[InputCompositions.tsx](examples/recipes/InputCompositions.tsx) demonstrates existing TextField leadingIcon/trailing slots and native form identity. Decorative icons/units use aria-hidden; meaningful units belong in the label/hint. Interactive trailing content needs its own accessible name, button type and focus style; keep long content responsive. No new prefix/suffix API is needed for the demonstrated cases.
|
|
36
|
+
|
|
37
|
+
A native type=number field is sufficient for the bounded integer seat quantity. There is no recorded adopter requirement for a new locale-aware NumberField. Decimal/group separators, transient minus/decimal input, locale parsing/formatting, range/step, currency precision and serialization need a separate demand/contract gate. Financial amounts must not inherit a binary-floating point money model from a generic input. The conditional NumberField remains deferred.
|
|
38
|
+
|
|
39
|
+
The optional **password visibility recipe** keeps the same input mounted, name and current-password autocomplete stable, and a named aria-pressed toggle. Focus returns to the input after toggling; no value is copied, transformed or logged. Real password-manager/browser compatibility remains app/device verification. A standalone library PasswordInput is unnecessary without a stronger reusable requirement.
|
|
40
|
+
|
|
41
|
+
Use native p/span and h1–h6 with [typography tokens](STYLING.md). Heading level follows the document outline; size/weight are CSS choices. No Text/Heading wrappers are added without an independent semantic/variant contract. These explicit scope decisions do not complete deferred NumberField, full grid, calendar or other optional features.
|
|
42
|
+
|
|
43
|
+
[Report Table/recipes 0.6.0](https://github.com/abuzareal/contour-ui/issues/new?template=bug_report.yml&title=Table%20recipes%200.6.0%3A%20&component=Table%20recipes&version=0.6.0); [standalone reproduction](examples/reproduction). See [public API](PUBLIC-API.md) for exact types, [styling](STYLING.md) and [onboarding](GETTING-STARTED.md). Release source links become available with the published tag.
|
package/RELEASING.md
CHANGED
|
@@ -9,10 +9,10 @@ Use [the public contract and compatibility policy](CONTRACTS.md#change-deprecati
|
|
|
9
9
|
1. Obtain maintainer authorization to publish; validation alone is not authorization.
|
|
10
10
|
2. Select an unused registry version and update package.json, its lockfile and release notes. Never reuse an existing registry version; a locally verified archive does not make it publishable under an already released version. Use a reviewed release commit on main and a matching `vVERSION` tag. The hosted workflow checks the tag version and that its source is an ancestor of origin/main. It cannot publish from a pull request.
|
|
11
11
|
3. Run `npm ci --ignore-scripts`; install Chromium once with `npx playwright install chromium`. Use Node 22.12+ or 24+.
|
|
12
|
-
4. Set `CONTOUR_RELEASE_DIR` to a temporary directory and run `npm run verify:release`. It runs validate once, packs one archive, tests that archive in clean React 18/19 core and optional consumers plus the pinned Next App Router fixtures, checks public API/generated styles and production size budgets, audits dependencies, and writes `verified-archive.json` with its SHA-256. Core consumers must have no Three.js or
|
|
12
|
+
4. Set `CONTOUR_RELEASE_DIR` to a temporary directory and run `npm run verify:release`. It runs validate once, packs one archive, tests that archive in clean React 18/19 core and optional consumers plus the pinned Next App Router fixtures, checks public API/documentation/generated styles and production size budgets, audits dependencies, and writes `verified-archive.json` with its SHA-256. Core consumers must have no Three.js, Lenis, RHF, TanStack Table or optional date peers installed. Copied adoption recipes run on React 18/19; standalone Vite/Next/reproduction folders run from that archive with their exact versions and production CSP. Review failures and advisories instead of bypassing gates.
|
|
13
13
|
5. Inspect the archive contents, verify its checksum against `verified-archive.json`, and publish that exact path using `npm publish /absolute/path/to/archive.tgz --ignore-scripts --access public`. `--ignore-scripts` is appropriate here because that exact archive has already passed the release gates; it is not permission to publish an unchecked package. Source `npm publish` retains a prepublishOnly guard. The hosted workflow verifies the checksum again and publishes the archive with provenance, avoiding duplicate source gates.
|
|
14
14
|
6. The owner completes npm authentication/2FA personally. Never put tokens, OTPs or credentials in this repository or logs. Prefer configured trusted publishing and short-lived identity over persistent tokens.
|
|
15
|
-
7. Verify registry version, tarball/integrity and publication date; install that exact registry version in each affected consumer, commit its manifest/lockfile, and run its required checks before deployment. Do not substitute a local link or source copy for release validation.
|
|
15
|
+
7. Verify registry version, tarball/integrity and publication date; install that exact registry version in each affected consumer, commit its manifest/lockfile, and run its required checks before deployment. Before closing the starter publication gate, run `CONTOUR_STARTER_REGISTRY=1 npm run test:starters` to verify clean published-package installs; the prepublish archive run alone does not satisfy that gate. Do not substitute a local link or source copy for release validation.
|
|
16
16
|
|
|
17
17
|
The tag workflow is configured for a public repository on main. Configuration does not prove that its npm trusted-publisher relationship is active; check npm/GitHub settings before relying on it. Publication requires authorization even when CI passes.
|
|
18
18
|
|
package/SIZE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Package and application size
|
|
2
2
|
|
|
3
|
-
A package archive, installed dependencies and a browser download are different costs. Contour does not claim to be zero-dependency or the lightest library. `scripts/measure-size.mjs` builds public-import Button, settings-form and
|
|
3
|
+
A package archive, installed dependencies and a browser download are different costs. Contour does not claim to be zero-dependency or the lightest library. `scripts/measure-size.mjs` builds public-import Button, settings-form, table and Combobox journeys in Vite and pinned Next App Router/webpack, loads fresh browser pages, and writes a JSON report. An additional Button-with-ArrowRight fixture measures the incremental selected-icon journey; it is not an isolated icon-function byte count.
|
|
4
4
|
|
|
5
5
|
```sh
|
|
6
6
|
npm run build
|
|
@@ -8,7 +8,7 @@ CONTOUR_SIZE_OUTPUT=/absolute/path/sizes.json npm run measure:size
|
|
|
8
8
|
CONTOUR_SIZE_OUTPUT=/absolute/path/check.json npm run check:size
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
Set `CONTOUR_ARCHIVE` to the already packed candidate to reuse it. Fixtures install React/React DOM 19.3.0; Next uses 16.4.0, and Vite/Chromium/Node versions are recorded from the running tools. The report names package/source commit/dirty state, archive checksum/files/compressed/unpacked bytes, the fresh dependency lock hash, resolved dependency versions, fixtures, exclusions, raw/gzip file sizes and actual Resource Timing transfers. These are reproducible fixtures, not latency or production-site benchmarks. No React/framework externals are removed from the application totals. Next shared JS is the intersection of actually fetched URLs across the
|
|
11
|
+
Set `CONTOUR_ARCHIVE` to the already packed candidate to reuse it. Fixtures install React/React DOM 19.3.0; Next uses 16.4.0, and Vite/Chromium/Node versions are recorded from the running tools. The report names package/source commit/dirty state, archive checksum/files/compressed/unpacked bytes, the fresh dependency lock hash, resolved dependency versions, fixtures, exclusions, raw/gzip file sizes and actual Resource Timing transfers. These are reproducible fixtures, not latency or production-site benchmarks. No React/framework externals are removed from the application totals. Next shared JS is the intersection of actually fetched URLs across the measured fresh routes; route-specific JS is listed separately. Server build output is excluded from client bytes.
|
|
12
12
|
|
|
13
13
|
Raw minified JS/CSS is reported per actual fetched file and by fixture. Gzip level 9 is reported **per file**, never summed and advertised as an application gzip total. Network transfer, encoded body and decoded body measurements are kept separately, including document/RSC resources. CSS/font requests, archive size and library dependency-closure installed file bytes are separate categories. Install counts exclude Next/Vite/development tooling and record React peers separately. Optional Three.js, Lenis and RHF are absent from core fixtures.
|
|
14
14
|
|
|
@@ -23,7 +23,7 @@ The 13 October Vite comparison used identical React 19.3.0 journeys against 0.4.
|
|
|
23
23
|
| actions.css | Button/IconButton/DepthButton, SegmentedControl, Magnetic, ThemeToggle; required loading Spinner styles |
|
|
24
24
|
| forms.css | Field/TextField/TextArea/SelectField, Checkbox/RadioGroup/Switch/Slider |
|
|
25
25
|
| navigation.css | Tabs, Breadcrumbs, Pagination, Stepper |
|
|
26
|
-
| data-display.css | Card/Avatar/Badge/Tag/Stat, DataTable/Timeline and value-display patterns
|
|
26
|
+
| data-display.css | Card/Avatar/Badge/Tag/Stat, Table/DataTable/Timeline and value-display patterns |
|
|
27
27
|
| feedback.css | Alert, ToastProvider, ProgressBar, Spinner, Skeleton, EmptyState |
|
|
28
28
|
| overlays.css | Tooltip, Popover, DropdownMenu, Dialog/drawers |
|
|
29
29
|
| effects.css | TiltCard/FlipCard/Marquee and CSS effects |
|
|
@@ -43,3 +43,9 @@ Three.js/Lenis stay optional peers behind their entries. Core imports do not ins
|
|
|
43
43
|
## Regression policy
|
|
44
44
|
|
|
45
45
|
`scripts/size-baseline.json` records the actual measured baseline and budgets. The gate allows 10% plus 1,024 bytes on raw fetched JS/CSS totals for deliberate review and chunk/minifier drift, and requires zero font requests in system-font fixtures. Update a baseline only after reviewing a real report and explaining intentional growth; do not automatically ratchet it to pass. Source/package/dependency changes can alter results even with the same components. Release verification and CI use the same packed archive and run this gate. The library-only samples from earlier research are not substituted for these application measurements.
|
|
46
|
+
|
|
47
|
+
## 0.6 Combobox measurement
|
|
48
|
+
|
|
49
|
+
On 14 October 2026, an initial 0.6.0 candidate used the same production fixtures to measure the new Combobox journey with React 19.3.0, Vite 8.3.2, Next 16.4.0/webpack, Node 26.10.0 and Chromium 153. A fresh Vite page fetched 365,549 raw JS bytes; selective forms/actions CSS fetched 24,729 bytes (aggregate 47,625). The Next Combobox route fetched 593,605 raw client JS bytes and 46,807 CSS bytes, including framework/shared assets. These are dated candidate measurements, not immutable final-archive byte counts. The release gate remeasures its exact archive. These whole-application fixtures are not an isolated component size or an upstream bundle-size badge. Per-file gzip and actual Resource Timing are retained in the report; independent gzip files are not advertised as an additive component total.
|
|
50
|
+
|
|
51
|
+
Every previous journey stays within its existing budget. Initial Combobox budgets are added separately under the same 10% plus 1,024-byte policy; old budgets are not reset to the new measurements. The root Button fixture remains 227,291 raw Vite JS bytes with zero font requests; importing one component does not require downloading the Combobox route's full client code. All runtime dependencies still install with the package. Base UI adds installed files and an unstyled interaction dependency; see FOUNDATION.md for the identical-host comparison and its limitations. Its optional date/time peers are absent from core consumers. TanStack Table/Store and RHF are recipe dependencies only.
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
export type { ComboboxOption, ComboboxProps } from "./Combobox.types.js";
|
|
2
|
+
import type { ComboboxOption } from "./Combobox.types.js";
|
|
3
|
+
/** Searchable allowed-value selection. The forwarded ref targets the visible input. */
|
|
4
|
+
declare const Combobox: import("react").ForwardRefExoticComponent<import("../../hooks/useFloatingPanel.js").FloatingOptions & {
|
|
5
|
+
label: string;
|
|
6
|
+
options: readonly ComboboxOption[];
|
|
7
|
+
filteredOptions?: readonly ComboboxOption[];
|
|
8
|
+
value?: string | null;
|
|
9
|
+
defaultValue?: string | null;
|
|
10
|
+
onValueChange?: (value: string | null) => void;
|
|
11
|
+
inputValue?: string;
|
|
12
|
+
defaultInputValue?: string;
|
|
13
|
+
onInputValueChange?: (query: string) => void;
|
|
14
|
+
open?: boolean;
|
|
15
|
+
defaultOpen?: boolean;
|
|
16
|
+
onOpenChange?: (open: boolean) => void;
|
|
17
|
+
id?: string;
|
|
18
|
+
name?: string;
|
|
19
|
+
form?: string;
|
|
20
|
+
required?: boolean;
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
readOnly?: boolean;
|
|
23
|
+
hint?: string;
|
|
24
|
+
error?: string;
|
|
25
|
+
hideLabel?: boolean;
|
|
26
|
+
loading?: boolean;
|
|
27
|
+
searchError?: string;
|
|
28
|
+
onRetry?: () => void;
|
|
29
|
+
loadingText?: string;
|
|
30
|
+
emptyText?: string;
|
|
31
|
+
retryLabel?: string;
|
|
32
|
+
triggerLabel?: string;
|
|
33
|
+
missingValueText?: string;
|
|
34
|
+
inputProps?: {
|
|
35
|
+
[x: `data-${string}`]: string | number | boolean | undefined;
|
|
36
|
+
title?: string | undefined | undefined;
|
|
37
|
+
ref?: ((instance: HTMLInputElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<HTMLInputElement> | null | undefined;
|
|
38
|
+
suppressHydrationWarning?: boolean | undefined | undefined;
|
|
39
|
+
className?: string | undefined | undefined;
|
|
40
|
+
color?: string | undefined | undefined;
|
|
41
|
+
height?: number | string | undefined | undefined;
|
|
42
|
+
lang?: string | undefined | undefined;
|
|
43
|
+
max?: number | string | undefined | undefined;
|
|
44
|
+
min?: number | string | undefined | undefined;
|
|
45
|
+
style?: import("react").CSSProperties | undefined;
|
|
46
|
+
width?: number | string | undefined | undefined;
|
|
47
|
+
role?: import("react").AriaRole | undefined;
|
|
48
|
+
tabIndex?: number | undefined | undefined;
|
|
49
|
+
"aria-activedescendant"?: string | undefined | undefined;
|
|
50
|
+
"aria-atomic"?: (boolean | "true" | "false") | undefined;
|
|
51
|
+
"aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined | undefined;
|
|
52
|
+
"aria-braillelabel"?: string | undefined | undefined;
|
|
53
|
+
"aria-brailleroledescription"?: string | undefined | undefined;
|
|
54
|
+
"aria-busy"?: (boolean | "true" | "false") | undefined;
|
|
55
|
+
"aria-checked"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
|
|
56
|
+
"aria-colcount"?: number | undefined | undefined;
|
|
57
|
+
"aria-colindex"?: number | undefined | undefined;
|
|
58
|
+
"aria-colindextext"?: string | undefined | undefined;
|
|
59
|
+
"aria-colspan"?: number | undefined | undefined;
|
|
60
|
+
"aria-controls"?: string | undefined | undefined;
|
|
61
|
+
"aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined | undefined;
|
|
62
|
+
"aria-describedby"?: string | undefined | undefined;
|
|
63
|
+
"aria-description"?: string | undefined | undefined;
|
|
64
|
+
"aria-details"?: string | undefined | undefined;
|
|
65
|
+
"aria-disabled"?: (boolean | "true" | "false") | undefined;
|
|
66
|
+
"aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined | undefined;
|
|
67
|
+
"aria-errormessage"?: string | undefined | undefined;
|
|
68
|
+
"aria-expanded"?: (boolean | "true" | "false") | undefined;
|
|
69
|
+
"aria-flowto"?: string | undefined | undefined;
|
|
70
|
+
"aria-grabbed"?: (boolean | "true" | "false") | undefined;
|
|
71
|
+
"aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined | undefined;
|
|
72
|
+
"aria-hidden"?: (boolean | "true" | "false") | undefined;
|
|
73
|
+
"aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined | undefined;
|
|
74
|
+
"aria-keyshortcuts"?: string | undefined | undefined;
|
|
75
|
+
"aria-label"?: string | undefined | undefined;
|
|
76
|
+
"aria-labelledby"?: string | undefined | undefined;
|
|
77
|
+
"aria-level"?: number | undefined | undefined;
|
|
78
|
+
"aria-live"?: "off" | "assertive" | "polite" | undefined | undefined;
|
|
79
|
+
"aria-modal"?: (boolean | "true" | "false") | undefined;
|
|
80
|
+
"aria-multiline"?: (boolean | "true" | "false") | undefined;
|
|
81
|
+
"aria-multiselectable"?: (boolean | "true" | "false") | undefined;
|
|
82
|
+
"aria-orientation"?: "horizontal" | "vertical" | undefined | undefined;
|
|
83
|
+
"aria-owns"?: string | undefined | undefined;
|
|
84
|
+
"aria-placeholder"?: string | undefined | undefined;
|
|
85
|
+
"aria-posinset"?: number | undefined | undefined;
|
|
86
|
+
"aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined | undefined;
|
|
87
|
+
"aria-readonly"?: (boolean | "true" | "false") | undefined;
|
|
88
|
+
"aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined | undefined;
|
|
89
|
+
"aria-required"?: (boolean | "true" | "false") | undefined;
|
|
90
|
+
"aria-roledescription"?: string | undefined | undefined;
|
|
91
|
+
"aria-rowcount"?: number | undefined | undefined;
|
|
92
|
+
"aria-rowindex"?: number | undefined | undefined;
|
|
93
|
+
"aria-rowindextext"?: string | undefined | undefined;
|
|
94
|
+
"aria-rowspan"?: number | undefined | undefined;
|
|
95
|
+
"aria-selected"?: (boolean | "true" | "false") | undefined;
|
|
96
|
+
"aria-setsize"?: number | undefined | undefined;
|
|
97
|
+
"aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined | undefined;
|
|
98
|
+
"aria-valuemax"?: number | undefined | undefined;
|
|
99
|
+
"aria-valuemin"?: number | undefined | undefined;
|
|
100
|
+
"aria-valuenow"?: number | undefined | undefined;
|
|
101
|
+
"aria-valuetext"?: string | undefined | undefined;
|
|
102
|
+
onCopy?: import("react").ClipboardEventHandler<HTMLInputElement> | undefined;
|
|
103
|
+
onCopyCapture?: import("react").ClipboardEventHandler<HTMLInputElement> | undefined;
|
|
104
|
+
onCut?: import("react").ClipboardEventHandler<HTMLInputElement> | undefined;
|
|
105
|
+
onCutCapture?: import("react").ClipboardEventHandler<HTMLInputElement> | undefined;
|
|
106
|
+
onPaste?: import("react").ClipboardEventHandler<HTMLInputElement> | undefined;
|
|
107
|
+
onPasteCapture?: import("react").ClipboardEventHandler<HTMLInputElement> | undefined;
|
|
108
|
+
onCompositionEnd?: import("react").CompositionEventHandler<HTMLInputElement> | undefined;
|
|
109
|
+
onCompositionEndCapture?: import("react").CompositionEventHandler<HTMLInputElement> | undefined;
|
|
110
|
+
onCompositionStart?: import("react").CompositionEventHandler<HTMLInputElement> | undefined;
|
|
111
|
+
onCompositionStartCapture?: import("react").CompositionEventHandler<HTMLInputElement> | undefined;
|
|
112
|
+
onCompositionUpdate?: import("react").CompositionEventHandler<HTMLInputElement> | undefined;
|
|
113
|
+
onCompositionUpdateCapture?: import("react").CompositionEventHandler<HTMLInputElement> | undefined;
|
|
114
|
+
onFocus?: import("react").FocusEventHandler<HTMLInputElement> | undefined;
|
|
115
|
+
onFocusCapture?: import("react").FocusEventHandler<HTMLInputElement> | undefined;
|
|
116
|
+
onBlur?: import("react").FocusEventHandler<HTMLInputElement> | undefined;
|
|
117
|
+
onBlurCapture?: import("react").FocusEventHandler<HTMLInputElement> | undefined;
|
|
118
|
+
onChange?: import("react").ChangeEventHandler<HTMLInputElement> | undefined;
|
|
119
|
+
onChangeCapture?: import("react").FormEventHandler<HTMLInputElement> | undefined;
|
|
120
|
+
onBeforeInput?: import("react").InputEventHandler<HTMLInputElement> | undefined;
|
|
121
|
+
onBeforeInputCapture?: import("react").FormEventHandler<HTMLInputElement> | undefined;
|
|
122
|
+
onInput?: import("react").FormEventHandler<HTMLInputElement> | undefined;
|
|
123
|
+
onInputCapture?: import("react").FormEventHandler<HTMLInputElement> | undefined;
|
|
124
|
+
onReset?: import("react").FormEventHandler<HTMLInputElement> | undefined;
|
|
125
|
+
onResetCapture?: import("react").FormEventHandler<HTMLInputElement> | undefined;
|
|
126
|
+
onSubmit?: import("react").FormEventHandler<HTMLInputElement> | undefined;
|
|
127
|
+
onSubmitCapture?: import("react").FormEventHandler<HTMLInputElement> | undefined;
|
|
128
|
+
onInvalid?: import("react").FormEventHandler<HTMLInputElement> | undefined;
|
|
129
|
+
onInvalidCapture?: import("react").FormEventHandler<HTMLInputElement> | undefined;
|
|
130
|
+
onLoad?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
131
|
+
onLoadCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
132
|
+
onError?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
133
|
+
onErrorCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
134
|
+
onKeyDown?: import("react").KeyboardEventHandler<HTMLInputElement> | undefined;
|
|
135
|
+
onKeyDownCapture?: import("react").KeyboardEventHandler<HTMLInputElement> | undefined;
|
|
136
|
+
onKeyPress?: import("react").KeyboardEventHandler<HTMLInputElement> | undefined;
|
|
137
|
+
onKeyPressCapture?: import("react").KeyboardEventHandler<HTMLInputElement> | undefined;
|
|
138
|
+
onKeyUp?: import("react").KeyboardEventHandler<HTMLInputElement> | undefined;
|
|
139
|
+
onKeyUpCapture?: import("react").KeyboardEventHandler<HTMLInputElement> | undefined;
|
|
140
|
+
onAbort?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
141
|
+
onAbortCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
142
|
+
onCanPlay?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
143
|
+
onCanPlayCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
144
|
+
onCanPlayThrough?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
145
|
+
onCanPlayThroughCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
146
|
+
onDurationChange?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
147
|
+
onDurationChangeCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
148
|
+
onEmptied?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
149
|
+
onEmptiedCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
150
|
+
onEncrypted?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
151
|
+
onEncryptedCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
152
|
+
onEnded?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
153
|
+
onEndedCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
154
|
+
onLoadedData?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
155
|
+
onLoadedDataCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
156
|
+
onLoadedMetadata?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
157
|
+
onLoadedMetadataCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
158
|
+
onLoadStart?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
159
|
+
onLoadStartCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
160
|
+
onPause?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
161
|
+
onPauseCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
162
|
+
onPlay?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
163
|
+
onPlayCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
164
|
+
onPlaying?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
165
|
+
onPlayingCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
166
|
+
onProgress?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
167
|
+
onProgressCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
168
|
+
onRateChange?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
169
|
+
onRateChangeCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
170
|
+
onSeeked?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
171
|
+
onSeekedCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
172
|
+
onSeeking?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
173
|
+
onSeekingCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
174
|
+
onStalled?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
175
|
+
onStalledCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
176
|
+
onSuspend?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
177
|
+
onSuspendCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
178
|
+
onTimeUpdate?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
179
|
+
onTimeUpdateCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
180
|
+
onVolumeChange?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
181
|
+
onVolumeChangeCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
182
|
+
onWaiting?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
183
|
+
onWaitingCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
184
|
+
onAuxClick?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
185
|
+
onAuxClickCapture?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
186
|
+
onClick?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
187
|
+
onClickCapture?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
188
|
+
onContextMenu?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
189
|
+
onContextMenuCapture?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
190
|
+
onDoubleClick?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
191
|
+
onDoubleClickCapture?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
192
|
+
onDrag?: import("react").DragEventHandler<HTMLInputElement> | undefined;
|
|
193
|
+
onDragCapture?: import("react").DragEventHandler<HTMLInputElement> | undefined;
|
|
194
|
+
onDragEnd?: import("react").DragEventHandler<HTMLInputElement> | undefined;
|
|
195
|
+
onDragEndCapture?: import("react").DragEventHandler<HTMLInputElement> | undefined;
|
|
196
|
+
onDragEnter?: import("react").DragEventHandler<HTMLInputElement> | undefined;
|
|
197
|
+
onDragEnterCapture?: import("react").DragEventHandler<HTMLInputElement> | undefined;
|
|
198
|
+
onDragExit?: import("react").DragEventHandler<HTMLInputElement> | undefined;
|
|
199
|
+
onDragExitCapture?: import("react").DragEventHandler<HTMLInputElement> | undefined;
|
|
200
|
+
onDragLeave?: import("react").DragEventHandler<HTMLInputElement> | undefined;
|
|
201
|
+
onDragLeaveCapture?: import("react").DragEventHandler<HTMLInputElement> | undefined;
|
|
202
|
+
onDragOver?: import("react").DragEventHandler<HTMLInputElement> | undefined;
|
|
203
|
+
onDragOverCapture?: import("react").DragEventHandler<HTMLInputElement> | undefined;
|
|
204
|
+
onDragStart?: import("react").DragEventHandler<HTMLInputElement> | undefined;
|
|
205
|
+
onDragStartCapture?: import("react").DragEventHandler<HTMLInputElement> | undefined;
|
|
206
|
+
onDrop?: import("react").DragEventHandler<HTMLInputElement> | undefined;
|
|
207
|
+
onDropCapture?: import("react").DragEventHandler<HTMLInputElement> | undefined;
|
|
208
|
+
onMouseDown?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
209
|
+
onMouseDownCapture?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
210
|
+
onMouseEnter?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
211
|
+
onMouseLeave?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
212
|
+
onMouseMove?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
213
|
+
onMouseMoveCapture?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
214
|
+
onMouseOut?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
215
|
+
onMouseOutCapture?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
216
|
+
onMouseOver?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
217
|
+
onMouseOverCapture?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
218
|
+
onMouseUp?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
219
|
+
onMouseUpCapture?: import("react").MouseEventHandler<HTMLInputElement> | undefined;
|
|
220
|
+
onSelect?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
221
|
+
onSelectCapture?: import("react").ReactEventHandler<HTMLInputElement> | undefined;
|
|
222
|
+
onTouchCancel?: import("react").TouchEventHandler<HTMLInputElement> | undefined;
|
|
223
|
+
onTouchCancelCapture?: import("react").TouchEventHandler<HTMLInputElement> | undefined;
|
|
224
|
+
onTouchEnd?: import("react").TouchEventHandler<HTMLInputElement> | undefined;
|
|
225
|
+
onTouchEndCapture?: import("react").TouchEventHandler<HTMLInputElement> | undefined;
|
|
226
|
+
onTouchMove?: import("react").TouchEventHandler<HTMLInputElement> | undefined;
|
|
227
|
+
onTouchMoveCapture?: import("react").TouchEventHandler<HTMLInputElement> | undefined;
|
|
228
|
+
onTouchStart?: import("react").TouchEventHandler<HTMLInputElement> | undefined;
|
|
229
|
+
onTouchStartCapture?: import("react").TouchEventHandler<HTMLInputElement> | undefined;
|
|
230
|
+
onPointerDown?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
|
|
231
|
+
onPointerDownCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
|
|
232
|
+
onPointerMove?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
|
|
233
|
+
onPointerMoveCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
|
|
234
|
+
onPointerUp?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
|
|
235
|
+
onPointerUpCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
|
|
236
|
+
onPointerCancel?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
|
|
237
|
+
onPointerCancelCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
|
|
238
|
+
onPointerEnter?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
|
|
239
|
+
onPointerLeave?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
|
|
240
|
+
onPointerOver?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
|
|
241
|
+
onPointerOverCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
|
|
242
|
+
onPointerOut?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
|
|
243
|
+
onPointerOutCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
|
|
244
|
+
onGotPointerCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
|
|
245
|
+
onGotPointerCaptureCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
|
|
246
|
+
onLostPointerCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
|
|
247
|
+
onLostPointerCaptureCapture?: import("react").PointerEventHandler<HTMLInputElement> | undefined;
|
|
248
|
+
onScroll?: import("react").UIEventHandler<HTMLInputElement> | undefined;
|
|
249
|
+
onScrollCapture?: import("react").UIEventHandler<HTMLInputElement> | undefined;
|
|
250
|
+
onWheel?: import("react").WheelEventHandler<HTMLInputElement> | undefined;
|
|
251
|
+
onWheelCapture?: import("react").WheelEventHandler<HTMLInputElement> | undefined;
|
|
252
|
+
onAnimationStart?: import("react").AnimationEventHandler<HTMLInputElement> | undefined;
|
|
253
|
+
onAnimationStartCapture?: import("react").AnimationEventHandler<HTMLInputElement> | undefined;
|
|
254
|
+
onAnimationEnd?: import("react").AnimationEventHandler<HTMLInputElement> | undefined;
|
|
255
|
+
onAnimationEndCapture?: import("react").AnimationEventHandler<HTMLInputElement> | undefined;
|
|
256
|
+
onAnimationIteration?: import("react").AnimationEventHandler<HTMLInputElement> | undefined;
|
|
257
|
+
onAnimationIterationCapture?: import("react").AnimationEventHandler<HTMLInputElement> | undefined;
|
|
258
|
+
onTransitionEnd?: import("react").TransitionEventHandler<HTMLInputElement> | undefined;
|
|
259
|
+
onTransitionEndCapture?: import("react").TransitionEventHandler<HTMLInputElement> | undefined;
|
|
260
|
+
key?: import("react").Key | null | undefined;
|
|
261
|
+
size?: number | undefined | undefined;
|
|
262
|
+
list?: string | undefined | undefined;
|
|
263
|
+
src?: string | undefined | undefined;
|
|
264
|
+
alt?: string | undefined | undefined;
|
|
265
|
+
step?: number | string | undefined | undefined;
|
|
266
|
+
formAction?: string | undefined;
|
|
267
|
+
formEncType?: string | undefined | undefined;
|
|
268
|
+
formMethod?: string | undefined | undefined;
|
|
269
|
+
formNoValidate?: boolean | undefined | undefined;
|
|
270
|
+
formTarget?: string | undefined | undefined;
|
|
271
|
+
defaultChecked?: boolean | undefined | undefined;
|
|
272
|
+
suppressContentEditableWarning?: boolean | undefined | undefined;
|
|
273
|
+
accessKey?: string | undefined | undefined;
|
|
274
|
+
autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {}) | undefined;
|
|
275
|
+
autoFocus?: boolean | undefined | undefined;
|
|
276
|
+
contentEditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
|
|
277
|
+
contextMenu?: string | undefined | undefined;
|
|
278
|
+
dir?: string | undefined | undefined;
|
|
279
|
+
draggable?: (boolean | "true" | "false") | undefined;
|
|
280
|
+
enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
|
|
281
|
+
hidden?: boolean | undefined | undefined;
|
|
282
|
+
nonce?: string | undefined | undefined;
|
|
283
|
+
slot?: string | undefined | undefined;
|
|
284
|
+
spellCheck?: (boolean | "true" | "false") | undefined;
|
|
285
|
+
translate?: "yes" | "no" | undefined | undefined;
|
|
286
|
+
radioGroup?: string | undefined | undefined;
|
|
287
|
+
about?: string | undefined | undefined;
|
|
288
|
+
content?: string | undefined | undefined;
|
|
289
|
+
datatype?: string | undefined | undefined;
|
|
290
|
+
inlist?: any;
|
|
291
|
+
prefix?: string | undefined | undefined;
|
|
292
|
+
property?: string | undefined | undefined;
|
|
293
|
+
rel?: string | undefined | undefined;
|
|
294
|
+
resource?: string | undefined | undefined;
|
|
295
|
+
rev?: string | undefined | undefined;
|
|
296
|
+
typeof?: string | undefined | undefined;
|
|
297
|
+
vocab?: string | undefined | undefined;
|
|
298
|
+
autoCorrect?: string | undefined | undefined;
|
|
299
|
+
autoSave?: string | undefined | undefined;
|
|
300
|
+
itemProp?: string | undefined | undefined;
|
|
301
|
+
itemScope?: boolean | undefined | undefined;
|
|
302
|
+
itemType?: string | undefined | undefined;
|
|
303
|
+
itemID?: string | undefined | undefined;
|
|
304
|
+
itemRef?: string | undefined | undefined;
|
|
305
|
+
results?: number | undefined | undefined;
|
|
306
|
+
security?: string | undefined | undefined;
|
|
307
|
+
unselectable?: "on" | "off" | undefined | undefined;
|
|
308
|
+
inputMode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined | undefined;
|
|
309
|
+
is?: string | undefined | undefined;
|
|
310
|
+
exportparts?: string | undefined | undefined;
|
|
311
|
+
part?: string | undefined | undefined;
|
|
312
|
+
accept?: string | undefined | undefined;
|
|
313
|
+
autoComplete?: import("react").HTMLInputAutoCompleteAttribute | undefined;
|
|
314
|
+
capture?: boolean | "user" | "environment" | undefined | undefined;
|
|
315
|
+
checked?: boolean | undefined | undefined;
|
|
316
|
+
maxLength?: number | undefined | undefined;
|
|
317
|
+
minLength?: number | undefined | undefined;
|
|
318
|
+
multiple?: boolean | undefined | undefined;
|
|
319
|
+
pattern?: string | undefined | undefined;
|
|
320
|
+
placeholder?: string | undefined | undefined;
|
|
321
|
+
};
|
|
322
|
+
popupProps?: import("../../lib/componentProps.js").NativePartProps<"div">;
|
|
323
|
+
rootProps?: import("../../lib/componentProps.js").NativePartProps<"div">;
|
|
324
|
+
} & import("react").RefAttributes<HTMLInputElement>>;
|
|
325
|
+
export default Combobox;
|