@jini-ai/ui-kit 0.0.0-stage → 0.1.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/LICENSE +201 -0
- package/README.md +150 -2
- package/dist/attrs.d.ts +18 -0
- package/dist/attrs.js +2 -0
- package/dist/confirm.d.ts +42 -0
- package/dist/confirm.js +41 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +5 -0
- package/dist/kit.spec.d.ts +491 -0
- package/dist/kit.spec.js +40 -0
- package/dist/needs.d.ts +24 -0
- package/dist/needs.js +29 -0
- package/dist/react/Kit.hooks.d.ts +39 -0
- package/dist/react/Kit.hooks.js +87 -0
- package/dist/react/KitProvider.d.ts +13 -0
- package/dist/react/KitProvider.js +15 -0
- package/dist/react/confirm/ConfirmDialog.d.ts +3 -0
- package/dist/react/confirm/ConfirmDialog.hooks.d.ts +7 -0
- package/dist/react/confirm/ConfirmDialog.hooks.js +101 -0
- package/dist/react/confirm/ConfirmDialog.js +8 -0
- package/dist/react/confirm/guard.d.ts +7 -0
- package/dist/react/confirm/guard.js +54 -0
- package/dist/react/context.d.ts +9 -0
- package/dist/react/context.js +24 -0
- package/dist/react/facade.d.ts +37 -0
- package/dist/react/facade.js +36 -0
- package/dist/react/index.d.ts +8 -0
- package/dist/react/index.js +7 -0
- package/dist/react/kit.d.ts +35 -0
- package/dist/react/kit.js +44 -0
- package/dist/react/native/Controls.d.ts +13 -0
- package/dist/react/native/Controls.hooks.d.ts +164 -0
- package/dist/react/native/Controls.hooks.js +69 -0
- package/dist/react/native/Controls.js +49 -0
- package/dist/react/native/Dialog.d.ts +4 -0
- package/dist/react/native/Dialog.hooks.d.ts +60 -0
- package/dist/react/native/Dialog.hooks.js +56 -0
- package/dist/react/native/Dialog.js +13 -0
- package/dist/react/native/Navigation.d.ts +5 -0
- package/dist/react/native/Navigation.hooks.d.ts +96 -0
- package/dist/react/native/Navigation.hooks.js +110 -0
- package/dist/react/native/Navigation.js +15 -0
- package/dist/react/native/index.d.ts +3 -0
- package/dist/react/native/index.js +9 -0
- package/dist/react/testing/driver.d.ts +27 -0
- package/dist/react/testing/driver.js +102 -0
- package/dist/react/testing/index.d.ts +5 -0
- package/dist/react/testing/index.js +3 -0
- package/dist/react/types.d.ts +210 -0
- package/dist/react/types.js +2 -0
- package/dist/testing/scenarios.d.ts +31 -0
- package/dist/testing/scenarios.js +28 -0
- package/dist/toast.d.ts +34 -0
- package/dist/toast.js +52 -0
- package/docs/decisions/DR-001.md +32 -0
- package/docs/spec/api.spec.md +98 -0
- package/docs/spec/behavior.spec.md +49 -0
- package/docs/spec/errors.spec.md +41 -0
- package/docs/spec/state.spec.md +45 -0
- package/docs/spec/ui.spec.md +49 -0
- package/package.json +95 -3
- package/src/react/native/styles.css +4 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
Spec ID: SPEC-JINI-UI-KIT-BEHAVIOR
|
|
2
|
+
Version: 1.0.0
|
|
3
|
+
Last Edited: 2026-10-03
|
|
4
|
+
Hash: sha256:782897964f3356bc26f737eaa2be50dcd68cd3258d8a7802990211ae09e79cb5
|
|
5
|
+
spec_mode: implementation_spec
|
|
6
|
+
|
|
7
|
+
# UI-kit behavior
|
|
8
|
+
|
|
9
|
+
## Resolution and requirements
|
|
10
|
+
|
|
11
|
+
Every implemented component resolves to an injected override or its native default. Missing providers use native defaults. Partial kit creation ignores explicit undefined and preserves defaults. Strict kit creation requires all 16 components. Extension carries forward base overrides; unrelated components keep their native implementation. Requirements validate contract compatibility and implemented status before rendering provider children.
|
|
12
|
+
|
|
13
|
+
Duplicate package copies share the actual React context object through `Symbol.for('@jini-ai/ui-kit/react/context@1')` on globalThis. Development version skew produces a warning. The host supplies a compatible React runtime.
|
|
14
|
+
|
|
15
|
+
## Attrs and controls
|
|
16
|
+
|
|
17
|
+
Opaque attrs are forwarded to the declared focus target, preserving host agent metadata, labels, and part identity. Core control state still governs disabled/value behavior. Button pending or disabled suppresses presses. Text and checked controls are controlled and notify changes through their supplied ports. Select preserves native select semantics through an HTMLSelectElement; a custom adapter may keep a synchronized native select.
|
|
18
|
+
|
|
19
|
+
Tabs use roving tab focus, skip disabled tabs, and implement left/right/Home/End navigation with labelled panels. Menu uses enabled items for up/down/Home/End navigation; Escape restores trigger focus, Tab closes, and pointer interaction outside closes. Tooltip opens on focus/hover, closes on blur/leave/Escape, and associates its content with the trigger. Notices and toasts expose status/alert roles according to tone. Spinners have an accessible loading label.
|
|
20
|
+
|
|
21
|
+
## Dialog and confirmation
|
|
22
|
+
|
|
23
|
+
Native Dialog opens with showModal where supported, associates its title, and restores the connected opener when closed. The non-browser fallback sets an open attribute. Pending Dialog blocks close button, native cancel, and backdrop dismissal.
|
|
24
|
+
|
|
25
|
+
Confirmation safety is framework-free. Each invocation reads current policy; stale callbacks cannot bypass a subsequent pending/open update. Confirmation sets executing synchronously before invoking the action, preventing duplicate calls in the same render frame. While executing or pending, confirmation and all dismissal reasons are refused. Closed confirmation refuses actions. Agent confirmation is refused when agentMayConfirm is false.
|
|
26
|
+
|
|
27
|
+
The React facade supplies guarded handlers and prop bags to the chosen view. Default actions use the host's Button override. Cancel receives initial focus. Cancel labels communicate that no action occurs. Confirmation's accessible label includes action, title, and consequence. Danger defaults to "cannot be undone"; warning defaults to "changes access, but is reversible"; a supplied consequence replaces the default. Human-only confirmation withholds its agent handle while leaving human action available.
|
|
28
|
+
|
|
29
|
+
A rejected async action shows the facade's errorLabel or a generic retry message. Execution clears in finally; the host retains control of open state and closing after success.
|
|
30
|
+
|
|
31
|
+
## Development guard
|
|
32
|
+
|
|
33
|
+
When a ConfirmDialog or Button override is used, the development guard inspects committed DOM after effects: frame presence/overlay ownership, alertdialog and title semantics, visible focusable action parts, forwarded attrs, pending disabled state, cancel-first focus, human-only agent metadata, and consequence label. Violations are recorded and logged. Default fallback marks ConfirmDialog failed and renders the native frame with native actions, so a broken Button override cannot break the fallback again. Warn mode retains the override; off mode bypasses checks and fallback. Checks are not run in production.
|
|
34
|
+
|
|
35
|
+
The guard observes the mounted implementation; a shape-compatible TypeScript component is insufficient evidence of conformance. jsdom cannot prove top-layer, layout, or native browser focus trapping.
|
|
36
|
+
|
|
37
|
+
## Overlays and toast lifetime
|
|
38
|
+
|
|
39
|
+
A provider uses its supplied overlayContainer or creates an owned body child and removes it on unmount. Dialog, ConfirmDialog, and ToastRegion render into the resolved overlay. Before a container exists, Overlay renders inline.
|
|
40
|
+
|
|
41
|
+
A toast service owns a queue, stable snapshots between updates, subscribers, and dismissal timers. Pushing an existing id replaces its prior message/timer. The default duration is 5000 ms; zero or negative duration disables auto-dismissal. Dismissal removes the message and timer. Disposal cancels all timers, clears messages, emits the cleared snapshot, then clears listeners. Services never share a global queue. Providers dispose only services they created. Hosts mount ToastRegion explicitly.
|
|
42
|
+
|
|
43
|
+
## Conformance evidence
|
|
44
|
+
|
|
45
|
+
Conformance scenarios are data with a React driver. Default execution skips tagged browser-only cases and reports those skips. This behavior contract does not claim that tests or a browser runner passed; delivery evidence must name actual commands/results separately.
|
|
46
|
+
|
|
47
|
+
## Handoff
|
|
48
|
+
|
|
49
|
+
Inputs: root controller/toast rules and React/native implementation. Output: v1 resolution, safety, navigation, overlay, and lifetime behavior. Risks: custom library adapters and browser modal behavior require host/browser validation. Next assignee: consumer migration owner, then browser validation owner.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
Spec ID: SPEC-JINI-UI-KIT-ERRORS
|
|
2
|
+
Version: 1.0.0
|
|
3
|
+
Last Edited: 2026-10-03
|
|
4
|
+
Hash: sha256:5bd54392775eefa59554cb54e724b629ab7e60bcbc33c44b4317d4de01786fd9
|
|
5
|
+
spec_mode: implementation_spec
|
|
6
|
+
|
|
7
|
+
# UI-kit errors and refusals
|
|
8
|
+
|
|
9
|
+
## Configuration errors
|
|
10
|
+
|
|
11
|
+
`KitConfigError` extends Error, sets name `KitConfigError`, code `KIT_CONFIG`, and retains readonly string issues. Its message begins `Invalid UI kit:` and joins issues with semicolons.
|
|
12
|
+
|
|
13
|
+
| Trigger | Outcome |
|
|
14
|
+
|---|---|
|
|
15
|
+
| Incompatible contract or unsupported range syntax | KitConfigError from assertKitContract/needs/factories/provider requirement validation |
|
|
16
|
+
| Planned or unknown required component | KitConfigError from needs or provider requirement validation |
|
|
17
|
+
| Override value is neither a function nor a recognized React exotic component | KitConfigError from createKit |
|
|
18
|
+
| Strict kit misses an implemented component | Compile-time error for typed callers; KitConfigError at runtime |
|
|
19
|
+
| useToast without a provider service | KitConfigError |
|
|
20
|
+
| ToastRegion without a supplied or provider service | KitConfigError |
|
|
21
|
+
| push after toast disposal | Error with message `Toast service is disposed` |
|
|
22
|
+
| Default React conformance driver without DOM | Error with message `React conformance requires a DOM environment` |
|
|
23
|
+
| includeBrowser with default React driver | Error with message `Browser cases require a real browser driver` |
|
|
24
|
+
|
|
25
|
+
Factory validation checks component shape at a coarse level; it does not prove mounted behavior. This is why conformance scenarios and the development confirmation guard exist.
|
|
26
|
+
|
|
27
|
+
## Action refusals and callback failures
|
|
28
|
+
|
|
29
|
+
A blocked confirmation or dismissal returns false and invokes no action callback. Pending, executing, and closed states fail closed. Agent confirmation additionally requires agentMayConfirm permission. These are policy refusals, not thrown errors.
|
|
30
|
+
|
|
31
|
+
The pure controller propagates an onConfirm rejection while releasing its executing latch in finally. The React facade catches that rejection, renders errorLabel or `The action failed. Please try again.`, and releases React pending state while mounted. The host owns remediation and retries. The pure dismissal path invokes the onCancel port directly; a thrown callback error propagates.
|
|
32
|
+
|
|
33
|
+
## Guard diagnostics
|
|
34
|
+
|
|
35
|
+
Mounted confirmation violations append a component/reasons record to the kit and log a conformance error. Default guard fallback replaces the confirmation frame and actions with native implementations. Warn retains the faulty view while recording diagnostics. Off suppresses guard inspection and replacement. Development version skew emits console.warn; it does not silently create a separate provider context.
|
|
36
|
+
|
|
37
|
+
No guard mode changes server-side authorization or action-port permissions. Runtime diagnostics do not represent a production security boundary.
|
|
38
|
+
|
|
39
|
+
## Handoff
|
|
40
|
+
|
|
41
|
+
Inputs: needs.ts, toast.ts, pure confirmation controller, React confirmation hooks/guard/context. Output: actual throw/refusal/diagnostic surface. Risk: host port exceptions outside the facade remain host responsibilities. Next assignee: consumer integration owner.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
Spec ID: SPEC-JINI-UI-KIT-STATE
|
|
2
|
+
Version: 1.0.0
|
|
3
|
+
Last Edited: 2026-10-03
|
|
4
|
+
Hash: sha256:da582ff8b4eb325d546c0abf1bc4e497612350cc83a39ed6cf9f527ab9e12c73
|
|
5
|
+
spec_mode: implementation_spec
|
|
6
|
+
|
|
7
|
+
# UI-kit state and ownership
|
|
8
|
+
|
|
9
|
+
## Contract and kit state
|
|
10
|
+
|
|
11
|
+
The const spec is the source for implemented component names and parts. Contract 1.0.0 is independent of package 0.1.0. Component maps, overrides, and top-level kit objects are frozen. Each ResolvedKit retains mutable violations and failed-component collections for diagnostics. describeKit copies violation reasons into its report.
|
|
12
|
+
|
|
13
|
+
The global context slot stores one React context and the set of observed package versions for contract major 1. Providers supply per-tree kit/agent/overlay/toast/cancel-label/guard values. Absent providers use native component defaults without an available toast service.
|
|
14
|
+
|
|
15
|
+
## Confirmation transition model
|
|
16
|
+
|
|
17
|
+
| Current policy/state | Request | Result |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| Closed | Confirm/dismiss | Refused |
|
|
20
|
+
| Open, ready | Dismiss any reason | Invoke cancel and return true |
|
|
21
|
+
| Open, ready | Confirm human | Set executing; invoke action; release in finally |
|
|
22
|
+
| Open, ready, agentMayConfirm false | Confirm agent | Refused |
|
|
23
|
+
| Open, pending | Confirm/dismiss | Refused |
|
|
24
|
+
| Executing | Confirm/dismiss | Refused |
|
|
25
|
+
| Action rejects | React facade completion | Error visible, execution released |
|
|
26
|
+
|
|
27
|
+
The pure controller stores only the executing latch; current policy arrives through read on every request. The React layer stores execution/error presentation and keeps the latest props in a ref. Public open/pending props remain host-owned. The controller does not close a dialog after success or mutate host policy.
|
|
28
|
+
|
|
29
|
+
Opening captures the opener and focuses cancel. Closing attempts focus restoration to a still-connected opener. A development violation records kit diagnostic state; fallback chooses native frame/actions on rerender. Off mode ignores failed-kit fallback state.
|
|
30
|
+
|
|
31
|
+
## Local navigation
|
|
32
|
+
|
|
33
|
+
Tabs selected value is host-owned; the native implementation derives its active enabled item and notifies value changes. Menu and Tooltip open state is local to each mounted component. Text/checked controls are controlled by their host values and change ports.
|
|
34
|
+
|
|
35
|
+
## Toast state
|
|
36
|
+
|
|
37
|
+
Each service owns immutable message snapshots, listeners, timers, sequence ids, and disposed state. Push/remove emits changes; a same-id push replaces the existing message. The injected scheduler owns timing. dispose clears owned timers and messages; future push throws. A provider-created service follows provider lifetime. Injected services follow host lifetime, including disposal.
|
|
38
|
+
|
|
39
|
+
## Overlay ownership
|
|
40
|
+
|
|
41
|
+
A supplied overlay node is host-owned and never removed by the provider. A generated overlay node is provider-owned and removed on cleanup. Provider overlay state starts null unless supplied; portal rendering becomes available after mounting. Root operations require no DOM.
|
|
42
|
+
|
|
43
|
+
## Handoff
|
|
44
|
+
|
|
45
|
+
Inputs: root state rules, kit/context/provider/confirmation/navigation hooks. Output: state ownership and transitions. Risks: hosts must synchronize controlled values and manage injected service/container lifetimes. Next assignee: consumer migration owner.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
Spec ID: SPEC-JINI-UI-KIT-UI
|
|
2
|
+
Version: 1.0.0
|
|
3
|
+
Last Edited: 2026-10-03
|
|
4
|
+
Hash: sha256:d216284ad80f3e37d8d728888a5edece24bbf0c4a64bc8567518e5b05f683be4
|
|
5
|
+
spec_mode: implementation_spec
|
|
6
|
+
|
|
7
|
+
# UI-kit UI contract
|
|
8
|
+
|
|
9
|
+
## Implemented surface and focus targets
|
|
10
|
+
|
|
11
|
+
| Component | Required target and semantics |
|
|
12
|
+
|---|---|
|
|
13
|
+
| Button, IconButton | Button; disabled/pending blocks action; IconButton has accessible label |
|
|
14
|
+
| TextField | Labelled input with controlled value |
|
|
15
|
+
| TextArea | Labelled textarea with controlled value |
|
|
16
|
+
| Select | Labelled HTMLSelectElement, visible or synchronized in an adapter |
|
|
17
|
+
| Checkbox | Labelled checkbox input |
|
|
18
|
+
| Switch | Labelled checkbox input with switch role |
|
|
19
|
+
| Dialog | Titled dialog; close action; pending blocks dismissal; opener restoration |
|
|
20
|
+
| ConfirmDialog | Alertdialog; initial cancel focus; guarded actions; consequence label |
|
|
21
|
+
| Tabs | Active tab receives attrs; tablist/tab/labelled panel semantics and roving focus |
|
|
22
|
+
| Menu | Trigger receives attrs; menu/menuitem semantics and roving focus |
|
|
23
|
+
| Toast | Status or alert root; optional dismiss button; ToastRegion is a polite live region |
|
|
24
|
+
| Tooltip | Focusable trigger receives attrs and described-by association |
|
|
25
|
+
| Notice | Status or alert root |
|
|
26
|
+
| Spinner | Labelled status root |
|
|
27
|
+
| Badge | Text root |
|
|
28
|
+
|
|
29
|
+
Opaque attrs must reach the documented target, not a decorative wrapper. They can carry data-agent-* and aria-* metadata. Structural attrs and state remain semantically correct when native implementations add ids, values, roles, disabled, variant, or state attributes. Ref forwarding is required for native control targets and cancel-first confirmation focus.
|
|
30
|
+
|
|
31
|
+
## Parts and styling
|
|
32
|
+
|
|
33
|
+
kitSpec.parts and kitParts are the canonical part inventory. Native CSS is opt-in through `@jini-ai/ui-kit/react/native/styles.css`, scoped under `@layer jini.kit`, and keyed on data-jini-part. It does not reset the host page. Variables include --jini-kit-fg, --jini-kit-bg, --jini-kit-danger, --jini-kit-warning, and --jini-kit-focus. Native buttons emit data-jini-variant and data-jini-state; tones select message variants. Spinner motion respects prefers-reduced-motion.
|
|
34
|
+
|
|
35
|
+
Confirmation parts are confirm.dialog, confirm.title, confirm.body, confirm.actions, confirm.cancel, confirm.confirm. Both actions must remain visible and operable when ready; both must expose disabled state while pending. Cancel comes first. A human-only confirm target publishes no agent metadata. Overrides receive guarded controller bags and must preserve their labels/attrs/ref/handlers. Every component, including ConfirmDialog, is replaceable.
|
|
36
|
+
|
|
37
|
+
## Overlay and browser limits
|
|
38
|
+
|
|
39
|
+
Dialog and confirmation frames live in the resolved overlay container. Native dialogs use browser showModal when available. ToastRegion portals into the overlay and must be explicitly mounted by the host. Tooltip and Menu are local in-tree composites in v1.
|
|
40
|
+
|
|
41
|
+
The current browser-only scenario data tags native Escape and modal initial focus. The default React driver reports these skipped; includeBrowser requires an external real browser driver. Native dialog top-layer behavior, actual focus trapping, and geometry need further browser validation. Source-level semantics and jsdom results are not evidence of browser accessibility completion; no Playwright coverage is claimed in these docs.
|
|
42
|
+
|
|
43
|
+
## Planned components
|
|
44
|
+
|
|
45
|
+
Link, Icon, RadioGroup, Field, Card, Table, Popover, Combobox, Stack, Grid, ShellLayout, Sidebar, NavItem, PageHeader, Section, EmptyState, and OverlayHost are planned entries only. Their parts and behavior are not yet contracted. The existing Overlay utility and provider overlay root do not implement a planned OverlayHost component. Vue/Angular adapters, UI-library adapters, and motif loading remain deferred.
|
|
46
|
+
|
|
47
|
+
## Handoff
|
|
48
|
+
|
|
49
|
+
Inputs: kit.spec.ts, native component hooks/markup/CSS, confirmation guard and provider. Output: v1 semantics, parts, customization obligations, browser limitations. Risk: replacement libraries must be verified against conformance and real browsers. Next assignee: adapter or consumer migration owner.
|
package/package.json
CHANGED
|
@@ -1,6 +1,98 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jini-ai/ui-kit",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Framework-free UI contract, injected React facades and native defaults.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/AINSEP/Jini.git",
|
|
9
|
+
"directory": "packages/ui-kit"
|
|
10
|
+
},
|
|
11
|
+
"jini": {
|
|
12
|
+
"domain": "ui",
|
|
13
|
+
"kind": "state",
|
|
14
|
+
"runtime": "universal",
|
|
15
|
+
"entries": {
|
|
16
|
+
".": "universal",
|
|
17
|
+
"./react": "browser",
|
|
18
|
+
"./react/native": "browser",
|
|
19
|
+
"./react/native/styles.css": "browser",
|
|
20
|
+
"./react/testing": "browser"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"type": "module",
|
|
24
|
+
"sideEffects": [
|
|
25
|
+
"**/*.css"
|
|
26
|
+
],
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"import": "./dist/index.js",
|
|
31
|
+
"default": "./dist/index.js"
|
|
32
|
+
},
|
|
33
|
+
"./react": {
|
|
34
|
+
"types": "./dist/react/index.d.ts",
|
|
35
|
+
"import": "./dist/react/index.js",
|
|
36
|
+
"default": "./dist/react/index.js"
|
|
37
|
+
},
|
|
38
|
+
"./react/native": {
|
|
39
|
+
"types": "./dist/react/native/index.d.ts",
|
|
40
|
+
"import": "./dist/react/native/index.js",
|
|
41
|
+
"default": "./dist/react/native/index.js"
|
|
42
|
+
},
|
|
43
|
+
"./react/native/styles.css": "./src/react/native/styles.css",
|
|
44
|
+
"./react/testing": {
|
|
45
|
+
"types": "./dist/react/testing/index.d.ts",
|
|
46
|
+
"import": "./dist/react/testing/index.js",
|
|
47
|
+
"default": "./dist/react/testing/index.js"
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"files": [
|
|
51
|
+
"dist",
|
|
52
|
+
"src/react/native/styles.css",
|
|
53
|
+
"README.md",
|
|
54
|
+
"docs",
|
|
55
|
+
"LICENSE",
|
|
56
|
+
"!dist/**/__tests__/**",
|
|
57
|
+
"!dist/**/*.test.*",
|
|
58
|
+
"!dist/**/*.typecheck.*"
|
|
59
|
+
],
|
|
60
|
+
"publishConfig": {
|
|
61
|
+
"access": "public",
|
|
62
|
+
"registry": "https://registry.npmjs.org"
|
|
63
|
+
},
|
|
64
|
+
"peerDependencies": {
|
|
65
|
+
"react": "^18.3.0 || ^19.0.0",
|
|
66
|
+
"react-dom": "^18.3.0 || ^19.0.0",
|
|
67
|
+
"vue": "^3.5.0"
|
|
68
|
+
},
|
|
69
|
+
"peerDependenciesMeta": {
|
|
70
|
+
"react": {
|
|
71
|
+
"optional": true
|
|
72
|
+
},
|
|
73
|
+
"react-dom": {
|
|
74
|
+
"optional": true
|
|
75
|
+
},
|
|
76
|
+
"vue": {
|
|
77
|
+
"optional": true
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"devDependencies": {
|
|
81
|
+
"@types/node": "^24.0.0",
|
|
82
|
+
"@types/react": "^19.2.0",
|
|
83
|
+
"@types/react-dom": "^19.2.0",
|
|
84
|
+
"@testing-library/react": "^16.3.0",
|
|
85
|
+
"jsdom": "^25.0.1",
|
|
86
|
+
"react": "^19.2.0",
|
|
87
|
+
"react-dom": "^19.2.0",
|
|
88
|
+
"vue": "^3.5.0",
|
|
89
|
+
"vitest": "^2.1.0",
|
|
90
|
+
"typescript": "^5.6.0"
|
|
91
|
+
},
|
|
92
|
+
"scripts": {
|
|
93
|
+
"build": "tsc -p tsconfig.build.json",
|
|
94
|
+
"typecheck": "tsc --noEmit",
|
|
95
|
+
"test": "vitest run",
|
|
96
|
+
"test:headless": "pnpm run build && node scripts/headless-smoke.mjs"
|
|
97
|
+
}
|
|
6
98
|
}
|