@godxjp/ui 18.15.3 → 19.0.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/dist/app/date-format-labels.d.ts +1 -1
- package/dist/app/time-format-labels.d.ts +1 -1
- package/dist/components/data-display/badge.d.ts +1 -1
- package/dist/components/data-display/card.d.ts +4 -13
- package/dist/components/data-display/card.js +2 -15
- package/dist/components/data-display/data-table.d.ts +3 -8
- package/dist/components/data-display/data-table.js +106 -68
- package/dist/components/data-display/descriptions.js +34 -5
- package/dist/components/data-display/empty-state.js +1 -1
- package/dist/components/data-display/permission-matrix.js +7 -7
- package/dist/components/data-display/popover.js +2 -9
- package/dist/components/data-display/qr-code.d.ts +1 -1
- package/dist/components/data-display/scroll-area.d.ts +3 -1
- package/dist/components/data-display/scroll-area.js +150 -16
- package/dist/components/data-display/table.js +12 -3
- package/dist/components/data-entry/branch-scope-picker.js +4 -4
- package/dist/components/data-entry/calendar.js +15 -24
- package/dist/components/data-entry/cascader.js +67 -71
- package/dist/components/data-entry/checkbox.js +9 -1
- package/dist/components/data-entry/command.d.ts +6 -6
- package/dist/components/data-entry/date-picker.js +28 -15
- package/dist/components/data-entry/date-range-picker.js +10 -10
- package/dist/components/data-entry/form-field.js +7 -3
- package/dist/components/data-entry/index.d.ts +2 -1
- package/dist/components/data-entry/input.js +8 -19
- package/dist/components/data-entry/label.js +4 -2
- package/dist/components/data-entry/month-picker.js +16 -15
- package/dist/components/data-entry/month-range-picker.js +17 -16
- package/dist/components/data-entry/radio.js +6 -1
- package/dist/components/data-entry/search-select.js +29 -29
- package/dist/components/data-entry/select.js +15 -18
- package/dist/components/data-entry/switch.js +7 -1
- package/dist/components/data-entry/textarea.d.ts +56 -0
- package/dist/components/data-entry/textarea.js +103 -40
- package/dist/components/data-entry/time-picker.js +52 -52
- package/dist/components/data-entry/toggle-group.d.ts +1 -0
- package/dist/components/data-entry/toggle.d.ts +1 -1
- package/dist/components/data-entry/transfer.js +14 -15
- package/dist/components/data-entry/tree-select.js +16 -22
- package/dist/components/data-entry/upload-crop-dialog.js +4 -4
- package/dist/components/data-entry/upload.d.ts +1 -1
- package/dist/components/data-entry/upload.js +46 -46
- package/dist/components/feedback/alert.js +7 -14
- package/dist/components/feedback/dialog.d.ts +23 -32
- package/dist/components/feedback/dialog.js +16 -13
- package/dist/components/feedback/sheet.d.ts +1 -1
- package/dist/components/feedback/sheet.js +14 -14
- package/dist/components/feedback/skeleton.js +13 -10
- package/dist/components/feedback/sonner.d.ts +1 -1
- package/dist/components/feedback/sonner.js +17 -8
- package/dist/components/feedback/tooltip.js +1 -1
- package/dist/components/general/activity.d.ts +44 -0
- package/dist/components/general/activity.js +65 -0
- package/dist/components/general/button.d.ts +2 -2
- package/dist/components/general/button.js +11 -24
- package/dist/components/general/index.d.ts +2 -0
- package/dist/components/general/index.js +2 -0
- package/dist/components/layout/app-shell.js +5 -3
- package/dist/components/layout/auth-divider.d.ts +9 -2
- package/dist/components/layout/auth-divider.js +7 -11
- package/dist/components/layout/index.d.ts +1 -0
- package/dist/components/layout/page-container.d.ts +1 -1
- package/dist/components/layout/page-container.js +32 -20
- package/dist/components/layout/resizable.d.ts +12 -12
- package/dist/components/layout/separator.d.ts +1 -0
- package/dist/components/layout/service-role-panel.js +47 -42
- package/dist/components/layout/sidebar.js +13 -1
- package/dist/components/layout/split-pane.d.ts +12 -1
- package/dist/components/layout/split-pane.js +13 -4
- package/dist/components/navigation/app-setting-picker.js +5 -14
- package/dist/components/navigation/dropdown-menu.js +10 -16
- package/dist/components/navigation/menubar.d.ts +3 -6
- package/dist/components/navigation/pagination-utils.d.ts +15 -2
- package/dist/components/navigation/pagination-utils.js +27 -21
- package/dist/components/navigation/pagination.d.ts +4 -4
- package/dist/components/navigation/pagination.js +2 -2
- package/dist/components/navigation/steps.js +31 -67
- package/dist/components/navigation/tabs.js +17 -5
- package/dist/components/query/infinite-query-state.js +2 -2
- package/dist/components/ui/accordion.d.ts +1 -1
- package/dist/components/ui/avatar.d.ts +1 -1
- package/dist/components/ui/avatar.js +29 -10
- package/dist/components/ui/input-otp.d.ts +8 -6
- package/dist/components/ui/rating.js +1 -1
- package/dist/components/ui/separator.d.ts +27 -2
- package/dist/components/ui/separator.js +42 -11
- package/dist/components/ui/toggle-group.d.ts +15 -5
- package/dist/components/ui/toggle-group.js +43 -18
- package/dist/components/ui/toggle.d.ts +66 -5
- package/dist/components/ui/toggle.js +64 -9
- package/dist/i18n/messages/en.json +8 -0
- package/dist/i18n/messages/ja.json +8 -0
- package/dist/i18n/messages/vi.json +8 -0
- package/dist/lib/control-styles.d.ts +14 -0
- package/dist/lib/control-styles.js +2 -0
- package/dist/props/components/data-display.prop.d.ts +85 -3
- package/dist/props/components/data-entry.prop.d.ts +17 -0
- package/dist/props/components/general.prop.d.ts +52 -1
- package/dist/props/components/layout.prop.d.ts +137 -2
- package/dist/props/registry.d.ts +116 -5
- package/dist/props/registry.js +165 -4
- package/dist/props/vocabulary/index.d.ts +2 -2
- package/dist/props/vocabulary/interaction.prop.d.ts +15 -0
- package/dist/props/vocabulary/layout.prop.d.ts +8 -0
- package/dist/styles/alert-layout.css +69 -3
- package/dist/styles/badge-layout.css +2 -2
- package/dist/styles/base.css +6 -0
- package/dist/styles/card-layout.css +27 -7
- package/dist/styles/control.css +1150 -29
- package/dist/styles/data-display-layout.css +185 -11
- package/dist/styles/data-entry-layout.css +352 -1
- package/dist/styles/density.css +2 -2
- package/dist/styles/dialog-layout.css +203 -4
- package/dist/styles/focus-ring.css +155 -0
- package/dist/styles/form-layout.css +50 -5
- package/dist/styles/index.css +1 -0
- package/dist/styles/layout.css +412 -23
- package/dist/styles/motion.css +178 -0
- package/dist/styles/navigation-layout.css +398 -22
- package/dist/styles/shell-layout.css +137 -39
- package/dist/styles/table-layout.css +153 -22
- package/dist/styles/toggle.css +59 -0
- package/dist/tokens/base.css +5 -0
- package/dist/tokens/components/activity.css +64 -0
- package/dist/tokens/components/badge.css +7 -0
- package/dist/tokens/components/card.css +14 -10
- package/dist/tokens/components/chart.css +1 -1
- package/dist/tokens/components/control.css +358 -8
- package/dist/tokens/components/data-display.css +75 -0
- package/dist/tokens/components/data-entry.css +25 -0
- package/dist/tokens/components/descriptions.css +22 -0
- package/dist/tokens/components/feedback.css +143 -4
- package/dist/tokens/components/form.css +16 -0
- package/dist/tokens/components/legal-document.css +5 -1
- package/dist/tokens/components/navigation.css +109 -0
- package/dist/tokens/components/scroll-area.css +21 -0
- package/dist/tokens/components/separator.css +52 -0
- package/dist/tokens/components/shell.css +132 -20
- package/dist/tokens/components/table.css +52 -3
- package/dist/tokens/components/toggle.css +82 -0
- package/dist/tokens/components/upload.css +107 -0
- package/dist/tokens/foundation.css +171 -10
- package/dist/tokens/semantic/layout.css +120 -1
- package/package.json +84 -68
- package/scripts/ui-audit.mjs +51 -2
|
@@ -29,7 +29,28 @@
|
|
|
29
29
|
--destructive: 357 64% 44%; /* 茜 #b7282e */
|
|
30
30
|
--destructive-foreground: 60 33% 99%;
|
|
31
31
|
--border: 30 7% 83%; /* #d6d3d0 SmartHR BORDER */
|
|
32
|
-
|
|
32
|
+
/* CONTROL BOUNDARY role — deliberately NOT the same value as --border (gh#315).
|
|
33
|
+
*
|
|
34
|
+
* The two roles answer different questions and are held to different bars:
|
|
35
|
+
* · --border is DECORATIVE chrome — table rules, card edges, section dividers. WCAG 2.2
|
|
36
|
+
* SC 1.4.11 does not reach it (nothing about a divider is "required to identify a
|
|
37
|
+
* component or its state"), and darkening it would make the JP-dense table grid roar.
|
|
38
|
+
* It stays exactly where it is.
|
|
39
|
+
* · --input is the boundary that IS the control — the 1px edge of Input, Textarea, Select,
|
|
40
|
+
* the outline Button, TagInput, the composite date field, the topbar search. `--input`
|
|
41
|
+
* also fills the Switch's unchecked track. A text field here has NO fill of its own
|
|
42
|
+
* (`background: hsl(var(--background))`) and NO shadow to speak of, so that edge is the
|
|
43
|
+
* only thing that says "you may type here". That is squarely SC 1.4.11's 3:1 minimum.
|
|
44
|
+
*
|
|
45
|
+
* They shipped sharing `30 7% 83%`, which measured 1.46:1 on --background/--card — the one
|
|
46
|
+
* live WCAG failure a full DXS Platform sweep turned up. 53% clears 3:1 with margin on every
|
|
47
|
+
* surface a control actually sits on, not just the plain page (the gh#299 lesson: a value that
|
|
48
|
+
* passes on a card and fails inside a filter bar is not a line anyone can defend):
|
|
49
|
+
* --background/--card/--popover 3.47:1 · --muted/--secondary 3.18:1 · zebra stripe 3.35:1 ·
|
|
50
|
+
* row hover 3.32:1. It also lifts the Switch's unchecked track from 1.46:1 to 3.47:1 against
|
|
51
|
+
* both the page and its own white thumb, so "off" is finally a visible state.
|
|
52
|
+
* Guarded by src/tokens/__tests__/input-boundary-contrast.test.ts. */
|
|
53
|
+
--input: 30 7% 53%; /* #90877f — control boundary, ≥3:1 (WCAG 2.2 SC 1.4.11) */
|
|
33
54
|
--ring: 204 100% 39%;
|
|
34
55
|
--success: 146 40% 58%; /* 若竹 #68be8d */
|
|
35
56
|
--success-foreground: 60 33% 99%;
|
|
@@ -161,7 +182,16 @@
|
|
|
161
182
|
* rule reads it with the live-role fallback `hsl(var(--focus-ring-color, var(--ring)))`, so the
|
|
162
183
|
* default re-resolves at the element that paints the ring while an explicit override still wins. */
|
|
163
184
|
--focus-ring-color: initial; /* default = the live --ring role */
|
|
164
|
-
--focus-ring-width:
|
|
185
|
+
--focus-ring-width: var(--stroke-md);
|
|
186
|
+
/* Alpha of the ring fill. Exists so a component that needs a SOFTER ring
|
|
187
|
+
* (a filled toggle, tinted shell chrome) tunes one knob instead of writing
|
|
188
|
+
* its own `hsl(... / 0.35)` — which is how four incompatible ring shapes
|
|
189
|
+
* appeared before the single-source rule in styles/focus-ring.css. */
|
|
190
|
+
--focus-ring-opacity: 1;
|
|
191
|
+
/* Gap between element and ring, for the OUTLINE form only (a star, a dot, a
|
|
192
|
+
* heading anchor — marks where a radius-hugging shadow would touch the
|
|
193
|
+
* glyph). The shadow form ignores it by construction. */
|
|
194
|
+
--focus-ring-offset: 0px;
|
|
165
195
|
/* Ring headroom for clipped chrome (`overflow-clip-margin` on the topbar family, gh#291).
|
|
166
196
|
* MUST stay a plain length consumed via a bare var(): Chromium rejects any calc() in
|
|
167
197
|
* overflow-clip-margin at parse time (even calc(2 * 2px)), silently dropping the
|
|
@@ -308,6 +338,114 @@
|
|
|
308
338
|
--space-10: calc(2.5rem * var(--scaling));
|
|
309
339
|
--space-12: calc(3rem * var(--scaling));
|
|
310
340
|
|
|
341
|
+
/* ── ICON SIZE — the geometric axis that had a vocabulary but no name (gh#326).
|
|
342
|
+
*
|
|
343
|
+
* 28 component tokens were declaring raw numbers, and between them they only ever used NINE
|
|
344
|
+
* values. The scale was already there; nobody had written it down. These nine names ARE that
|
|
345
|
+
* list — naming an existing vocabulary, not inventing a new one.
|
|
346
|
+
*
|
|
347
|
+
* A FIXED LIST, NOT A RATIO. Unlike --font-size-* there is no `base * ratio^n` here, and that
|
|
348
|
+
* is deliberate: 14/16 = 0.875 but 20/16 = 1.25, so no single ratio generates these steps.
|
|
349
|
+
* Type can sit between pixels because hinting and antialiasing carry it; a 1px-stroke glyph
|
|
350
|
+
* cannot — half a pixel of icon is a blurred icon. So every step is a whole pixel at the 16px
|
|
351
|
+
* root, and a service retunes a STEP rather than a ratio.
|
|
352
|
+
*
|
|
353
|
+
* NOT SCALED HERE. --scaling is applied by the tokens that opt IN
|
|
354
|
+
* (`calc(var(--icon-size-md) * var(--scaling))`, as --control-icon-size does), so the scale
|
|
355
|
+
* itself stays the crisp whole-pixel list. Density is a per-token decision, not a property of
|
|
356
|
+
* the vocabulary.
|
|
357
|
+
*
|
|
358
|
+
* TIER 1 / TIER 2 — where the boundary sits. These nine steps are tier 1: the value appears in
|
|
359
|
+
* more than one place, so it earns a name and a service retunes it once. A value that appears
|
|
360
|
+
* in exactly ONE place (the 6px status dot) is tier 2 and does NOT belong on the scale — set
|
|
361
|
+
* that component's own `--*-icon-size` / `--*-glyph-size` token at the call site instead
|
|
362
|
+
* (`style={{ "--menu-icon-size": "6px" }}` or a `[data-…]`-scoped rule in the app theme). An
|
|
363
|
+
* inline custom property wins by inheritance proximity, so tier 2 needs no `!important`, no
|
|
364
|
+
* `:root` override and no fork. Every icon rule in src/styles reads its token through `var()`
|
|
365
|
+
* with no literal fallback, which is what keeps that route open — see docs/TOKENS.md. */
|
|
366
|
+
--icon-size-2xs: 0.625rem; /* 10px */
|
|
367
|
+
--icon-size-xs: 0.75rem; /* 12px */
|
|
368
|
+
--icon-size-sm: 0.875rem; /* 14px */
|
|
369
|
+
--icon-size-md: 1rem; /* 16px — the default icon step */
|
|
370
|
+
--icon-size-lg: 1.25rem; /* 20px */
|
|
371
|
+
--icon-size-xl: 1.5rem; /* 24px */
|
|
372
|
+
--icon-size-2xl: 2.25rem; /* 36px */
|
|
373
|
+
--icon-size-3xl: 2.5rem; /* 40px */
|
|
374
|
+
--icon-size-4xl: 3rem; /* 48px */
|
|
375
|
+
|
|
376
|
+
/* ── STROKE — the thickness of a painted LINE (gh#324, the second axis to be named).
|
|
377
|
+
*
|
|
378
|
+
* gh#324 measured `width` at 91% raw and called it the worst axis in the system. It is not one
|
|
379
|
+
* axis. Three unrelated concerns wear the `-width` suffix: the thickness of a drawn line, the
|
|
380
|
+
* measure of a container (a dialog, a reading column, a sidebar), and the content width of a
|
|
381
|
+
* field (how wide a locale picker must be to hold its longest label). Only the FIRST is a
|
|
382
|
+
* vocabulary — see the verdict recorded in `scripts/token-scale-bypass-rules.mjs`.
|
|
383
|
+
*
|
|
384
|
+
* The vocabulary was already there and repeats hard: SIX values across ~20 tokens spanning
|
|
385
|
+
* borders, focus rings, accent rails, selected-state markers and presence strokes. Naming it is
|
|
386
|
+
* what lets a service retune line weight once — a hi-dpi theme that wants 1.5px hairlines, or a
|
|
387
|
+
* high-contrast theme that wants every emphasis stroke at 3px — instead of hunting 20 tokens.
|
|
388
|
+
*
|
|
389
|
+
* PIXELS, NOT REM, AND DELIBERATELY SO. A stroke is a DEVICE line: its job is to read as one
|
|
390
|
+
* crisp rule at any type size, so it must not grow when the root font-size does. Every token
|
|
391
|
+
* that moves onto this scale was already `px` for that reason; a `rem` thickness
|
|
392
|
+
* (`--slider-track-height: 0.375rem`) is a different decision and stays where it is.
|
|
393
|
+
*
|
|
394
|
+
* NOT SCALED. `--scaling` is a DENSITY knob — it tightens the spacing rhythm, and a 1px divider
|
|
395
|
+
* that became 0.92px under compact density would blur, not tighten. No token on this axis
|
|
396
|
+
* multiplies by it today and none should.
|
|
397
|
+
*
|
|
398
|
+
* `--stroke-hairline` sits BELOW `--stroke-sm` rather than being called `xs`, because 1px is
|
|
399
|
+
* not really a step: it is the device hairline, the one thickness a service retunes the
|
|
400
|
+
* EXISTENCE of rather than the value (cardinal rule #44). The scale-bypass guard exempts a bare
|
|
401
|
+
* `1px` for the same reason. Naming it anyway gives the retune-the-value route to the themes
|
|
402
|
+
* that want it.
|
|
403
|
+
*
|
|
404
|
+
* TIER 2 — a thickness that appears in exactly one place does not belong here. Set that
|
|
405
|
+
* component's own `--*-border-width` / `--*-ring-width` token at the call site or in the app
|
|
406
|
+
* theme; every stroke rule in src/styles reads its token through `var()`. */
|
|
407
|
+
--stroke-hairline: 1px; /* every resting border, divider and rule */
|
|
408
|
+
--stroke-sm: 1.5px;
|
|
409
|
+
--stroke-md: 2px; /* the emphasis stroke — focus rings, selected markers */
|
|
410
|
+
--stroke-lg: 3px;
|
|
411
|
+
--stroke-xl: 4px;
|
|
412
|
+
--stroke-2xl: 6px;
|
|
413
|
+
|
|
414
|
+
/* ── BAND HEIGHT — the vertical extent of a horizontal band that content is centred in
|
|
415
|
+
* (gh#324, the third axis to be named).
|
|
416
|
+
*
|
|
417
|
+
* Same split as `width`: `height` is TWO concerns wearing one suffix. A control, a table row, a
|
|
418
|
+
* menu item, a sidebar nav row and the app-shell top bar are all the same decision — how tall
|
|
419
|
+
* is the band this content sits in — and they share ONE vocabulary of seven values, each of
|
|
420
|
+
* which is declared by two to five tokens. A chart plot's height, a transfer pane's min-height
|
|
421
|
+
* and a select popover's max-height are the OTHER concern: container measures, chosen per
|
|
422
|
+
* surface, with almost no repeated value between them. Those are tier 2 and stay literal.
|
|
423
|
+
*
|
|
424
|
+
* gh#324's fourth case is the whole argument: `PageContainer`'s chrome band had no height token
|
|
425
|
+
* while `AppShell`'s bar did, so nothing could be aligned to it. The two were never conceived
|
|
426
|
+
* as members of one axis, because the axis had no name.
|
|
427
|
+
*
|
|
428
|
+
* WHY THIS IS NOT `--control-height-*`. The control tier is a RUNTIME LADDER: `--control-height`
|
|
429
|
+
* multiplies by `--scaling`, `-sm`/`-lg`/`-xs` step off it, and `@media (pointer: coarse)` lifts
|
|
430
|
+
* the whole ladder to the 44px tap floor. This scale is the STATIC vocabulary that the ladder is
|
|
431
|
+
* anchored on — `--control-height-default: var(--band-height-md)` — exactly as `--font-size-base`
|
|
432
|
+
* anchors the type scale. Do NOT point a band token at `--control-height-*` to "reuse a step":
|
|
433
|
+
* that silently enrols it in density AND in the coarse-pointer growth, which is a geometry
|
|
434
|
+
* change, not a rename. `--table-row-height-default` is `var(--band-height-md)` and NOT
|
|
435
|
+
* `var(--control-height-default)` for precisely that reason.
|
|
436
|
+
*
|
|
437
|
+
* NOT SCALED HERE, for the gh#328 reason: whether a band breathes with density is a per-token
|
|
438
|
+
* decision made long ago. `--control-height` opts in (`calc(… * var(--scaling))`);
|
|
439
|
+
* `--app-shell-bar-height` deliberately does not. Baking `--scaling` into the scale would flip
|
|
440
|
+
* every one of them at once. */
|
|
441
|
+
--band-height-xs: 1.5rem; /* 24px */
|
|
442
|
+
--band-height-sm: 1.75rem; /* 28px */
|
|
443
|
+
--band-height-md: 2rem; /* 32px — the default control/row band */
|
|
444
|
+
--band-height-lg: 2.25rem; /* 36px */
|
|
445
|
+
--band-height-xl: 2.75rem; /* 44px — the WCAG 2.2 AA touch floor (rule #24) */
|
|
446
|
+
--band-height-2xl: 3rem; /* 48px */
|
|
447
|
+
--band-height-3xl: 3.5rem; /* 56px */
|
|
448
|
+
|
|
311
449
|
/* Golden ratio scale */
|
|
312
450
|
--ratio-phi: 1.6180339887;
|
|
313
451
|
--phi-unit: var(--space-4);
|
|
@@ -338,13 +476,15 @@
|
|
|
338
476
|
--space-12: 3rem;
|
|
339
477
|
--radius: 0.375rem;
|
|
340
478
|
--control-height: var(--control-height-default);
|
|
341
|
-
/* baseline tier values (2rem ∓ step)
|
|
342
|
-
* guard happy and avoids re-deriving from the (baked) active
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
--control-height-
|
|
346
|
-
--control-
|
|
347
|
-
--control-
|
|
479
|
+
/* baseline tier values (2rem ∓ step) read straight off the band scale — keeps the
|
|
480
|
+
* control-sizing guard happy and avoids re-deriving from the (baked) active
|
|
481
|
+
* --control-height. Scale steps rather than literals since gh#324, so a service that
|
|
482
|
+
* retunes --band-height-* retunes the scale-fixed chrome with everything else. */
|
|
483
|
+
--control-height-sm: var(--band-height-sm);
|
|
484
|
+
--control-height-lg: var(--band-height-lg);
|
|
485
|
+
--control-height-xs: var(--band-height-xs);
|
|
486
|
+
--control-icon-size: var(--icon-size-md);
|
|
487
|
+
--control-icon-size-sm: var(--icon-size-sm);
|
|
348
488
|
--control-padding-x: var(--space-3);
|
|
349
489
|
--control-gap: var(--space-2);
|
|
350
490
|
--control-gap-sm: var(--space-1);
|
|
@@ -388,6 +528,21 @@
|
|
|
388
528
|
/* One step of the Reveal stagger ladder — `<Reveal delay={n}>` waits n × this before entering,
|
|
389
529
|
* so a column of reveals cascades. Read instead of a literal `.04s`/`.09s` per-item delay. */
|
|
390
530
|
--reveal-stagger-step: 60ms;
|
|
531
|
+
|
|
532
|
+
/* AMBIENT/LOOPING motion (gh#313) — the cycle member of the motion tier. `--duration-fast|base|
|
|
533
|
+
* slow` time a TRANSITION (something moves from A to B and stops); a loop needs an INTERVAL, so
|
|
534
|
+
* every ambient affordance in the product breathes at one rate. `Activity` reads these; the
|
|
535
|
+
* remaining Activity knobs (geometry / colour) live in tokens/components/activity.css.
|
|
536
|
+
* NOTE these two are Activity-scoped but live HERE, beside `--reveal-*`, because the motion tier
|
|
537
|
+
* is where timing belongs and because component-token names must carry a geometry/colour
|
|
538
|
+
* property word (`check-token-tiers`) — there is none for a duration. */
|
|
539
|
+
--duration-loop: 1400ms;
|
|
540
|
+
/* Per-component override (#45): a service tunes its typing rhythm without moving every loop. */
|
|
541
|
+
--activity-interval: var(--duration-loop);
|
|
542
|
+
/* Offset between the three `dots` marks — the loop counterpart to `--reveal-stagger-step`,
|
|
543
|
+
* named to match. In RTL the dots reverse with the row, so the cascade follows the reading
|
|
544
|
+
* direction with no extra rule. */
|
|
545
|
+
--activity-stagger-step: 160ms;
|
|
391
546
|
}
|
|
392
547
|
|
|
393
548
|
.dark,
|
|
@@ -416,7 +571,13 @@
|
|
|
416
571
|
--destructive: 357 55% 48%;
|
|
417
572
|
--destructive-foreground: 0 0% 100%;
|
|
418
573
|
--border: 45 6% 22%;
|
|
419
|
-
|
|
574
|
+
/* Control boundary (dark) — recomputed on the dark spine, not merely lightened by eye
|
|
575
|
+
* (gh#315). The dark pair shared `45 6% 22%`, which sat at 1.55:1 on --background and 1.43:1
|
|
576
|
+
* on the --card/--popover surface where dialogs put their fields. 47% gives
|
|
577
|
+
* --background 4.22:1 · --card/--popover 3.88:1 · --muted/--secondary 3.17:1 · zebra 3.81:1 ·
|
|
578
|
+
* hover 3.71:1. --border stays at 22%: dividers are decorative and a dark grid at 47% would
|
|
579
|
+
* read as a wireframe. See the light block above for the full reasoning. */
|
|
580
|
+
--input: 45 6% 47%; /* #7f7b71 — control boundary, ≥3:1 (WCAG 2.2 SC 1.4.11) */
|
|
420
581
|
--ring: 204 90% 60%;
|
|
421
582
|
--success: 146 45% 55%;
|
|
422
583
|
--success-foreground: 48 9% 9%;
|
|
@@ -18,6 +18,13 @@
|
|
|
18
18
|
--space-inline-md: var(--space-3); /* 12px */
|
|
19
19
|
--space-inline-lg: var(--space-4); /* 16px */
|
|
20
20
|
|
|
21
|
+
/* OVERLAY STACKING — one system-level layer for every portaled surface (rule #44/#45).
|
|
22
|
+
* Tooltip, Popover, Select, DropdownMenu and Sheet all hard-coded `z-50` independently, so a
|
|
23
|
+
* host app that mounts @godxjp/ui under its own stacking context (a sticky masthead, a
|
|
24
|
+
* third-party chat widget) had to fight five separate literals. Stacking is a SYSTEM decision,
|
|
25
|
+
* not a per-primitive one: a service raises every overlay together by setting this once. */
|
|
26
|
+
--overlay-z-index: 50;
|
|
27
|
+
|
|
21
28
|
/* Master-detail geometry. Consumers choose a semantic rail preset; they never author grid tracks. */
|
|
22
29
|
--master-detail-rail-compact: 18.75rem; /* 300px */
|
|
23
30
|
--master-detail-rail-standard: 20rem; /* 320px */
|
|
@@ -69,10 +76,62 @@
|
|
|
69
76
|
* `--page-header-divider: 1px solid hsl(var(--border));` */
|
|
70
77
|
--page-header-divider: none;
|
|
71
78
|
|
|
79
|
+
/* PageContainer `toolbar` — the fixed chrome band between the header and the (scrolling) body.
|
|
80
|
+
* ALL THREE knobs are quiet by default (rule #44):
|
|
81
|
+
* background — `transparent`, i.e. the band shows the page ground exactly as it did before
|
|
82
|
+
* the knob existed. It is bound at `:root` and NOT `initial`, unlike the
|
|
83
|
+
* divider below, because the default is a plain CSS keyword rather than
|
|
84
|
+
* another role token: there is nothing for a scoped [data-tenant]/.dark
|
|
85
|
+
* override to re-resolve, so the `initial` + call-site-fallback dance would
|
|
86
|
+
* buy nothing and only hide the default from anyone reading this file. A
|
|
87
|
+
* service that wants the band to read as its own surface — the design that
|
|
88
|
+
* asked for this knob puts a chat channel's workflow rail on the card ground —
|
|
89
|
+
* sets `--page-toolbar-background: hsl(var(--card));` ONCE in its theme. Never
|
|
90
|
+
* `className="bg-card"` at the call site: that is hand-laid page chrome, it
|
|
91
|
+
* paints only under `variant="flush"` gutters correctly by accident, and it
|
|
92
|
+
* cannot be re-themed per tenant.
|
|
93
|
+
* pad-block 0 — the band's ONLY breathing room, and the only one it should ever have. The
|
|
94
|
+
* band is chrome, so it sits FLUSH against the header above and the body
|
|
95
|
+
* below (src/styles/layout.css cancels the container's --page-band-gap from
|
|
96
|
+
* the band itself); there is deliberately no outside space to tune, because a
|
|
97
|
+
* ruled, painted band floating in a void divides nothing. A service that opts
|
|
98
|
+
* into the background or the divider gives the band its inset HERE
|
|
99
|
+
* (`--page-toolbar-pad-block: var(--space-2)`) instead of padding the strip at
|
|
100
|
+
* the call site. Still 0 by default: a transparent band is not a surface and
|
|
101
|
+
* has no inside to breathe, and under `fill` every pixel of it comes straight
|
|
102
|
+
* off the scroll viewport the slot exists to protect.
|
|
103
|
+
* divider — declared `initial` so the CALL SITE can fall back to --page-header-divider
|
|
104
|
+
* (`var(--page-toolbar-divider, var(--page-header-divider))`). One theme
|
|
105
|
+
* declaration therefore rules the whole page chrome consistently, and a
|
|
106
|
+
* scoped [data-tenant]/.dark override of the header divider still reaches the
|
|
107
|
+
* band — a `:root` binding would freeze it at the :root value
|
|
108
|
+
* (docs/TOKENS.md · "Role-mirror knobs MUST be `initial`"). Set
|
|
109
|
+
* `--page-toolbar-divider: none` to silence just this band. */
|
|
110
|
+
--page-toolbar-background: transparent;
|
|
111
|
+
--page-toolbar-pad-block: 0px;
|
|
112
|
+
--page-toolbar-divider: initial;
|
|
113
|
+
|
|
114
|
+
/* Top rule of the PageContainer `footer` — the third page chrome band, brought onto the same
|
|
115
|
+
* contract as the header and the toolbar (its rule used to be a hard literal in layout.css, so
|
|
116
|
+
* a page could not turn it off at all). Declared `initial` like the toolbar's, so the CALL SITE
|
|
117
|
+
* resolves it as `var(--page-footer-divider, 1px solid hsl(var(--border)))` and a scoped
|
|
118
|
+
* [data-tenant]/.dark override still reaches it (docs/TOKENS.md · "Role-mirror knobs MUST be
|
|
119
|
+
* `initial`").
|
|
120
|
+
*
|
|
121
|
+
* It is the ONE chrome knob whose default is a RULE rather than silence, and deliberately so:
|
|
122
|
+
* `footer` is the shared slot a form's Save/Cancel bar lands in, where the line separating the
|
|
123
|
+
* actions from the page content is the behaviour every existing page already depends on. The
|
|
124
|
+
* old literal is the fallback verbatim, so unset is byte-identical. A page whose footer content
|
|
125
|
+
* already carries its own frame — a chat composer is a bordered Card — silences the duplicate
|
|
126
|
+
* with `--page-footer-divider: none`. */
|
|
127
|
+
--page-footer-divider: initial;
|
|
128
|
+
|
|
72
129
|
/* Bottom inset of the page header, sized so title→body distance (this pad + the
|
|
73
130
|
* --space-section-active container gap) EQUALS the page's top padding — the title
|
|
74
131
|
* band reads vertically balanced (24 above / 24 below by default), instead of the
|
|
75
|
-
* old fixed 16px pad that left 24 above vs 32 below.
|
|
132
|
+
* old fixed 16px pad that left 24 above vs 32 below. A page that passes a `toolbar`
|
|
133
|
+
* measures title→BAND instead (this pad alone, the gap being cancelled): the band is
|
|
134
|
+
* chrome attached to the header, not the next section down. */
|
|
76
135
|
--page-header-pad-bottom: calc(var(--space-page-active-y) - var(--space-section-active));
|
|
77
136
|
|
|
78
137
|
/* Inline measure of the header `extra` region while the page header is in `responsive-inline`
|
|
@@ -119,6 +178,66 @@
|
|
|
119
178
|
--page-subtitle-font-size: var(--font-size-base);
|
|
120
179
|
--page-subtitle-font-size-compact: var(--font-size-sm);
|
|
121
180
|
|
|
181
|
+
/* PageContainer `headerScale="chrome"` — the title step for a page whose top row IS CHROME
|
|
182
|
+
* rather than a document title: a chat channel name, a mail subject line, an IDE tab. It is a
|
|
183
|
+
* SEPARATE knob from the two above on purpose: those are ONE document title at two viewport
|
|
184
|
+
* sizes (a responsive step), while this is a different KIND of page and holds at every width.
|
|
185
|
+
* `--heading-h3` (= --font-size-base, 14px) is the body step, which is the point — the row
|
|
186
|
+
* reads as a label ON the surface, not as the page's headline, and the header band collapses
|
|
187
|
+
* from the measured 61px to ~40px once it stops carrying a 20px h1. Quiet by default: a page
|
|
188
|
+
* that never passes `headerScale` never reads this token (rule #44). */
|
|
189
|
+
--page-title-font-size-chrome: var(--heading-h3);
|
|
190
|
+
|
|
191
|
+
/* The SUBTITLE step of the same fact. Measured against the reference chat screen, the chrome
|
|
192
|
+
* title and the chrome subtitle were rendering at the SAME step (both --font-size-base), which
|
|
193
|
+
* is not a hierarchy — a channel name and the channel's purpose line read as one undifferentiated
|
|
194
|
+
* block. The design puts the purpose line two steps down (`Text size="2xs"`), and the size is
|
|
195
|
+
* what carries the LINE BOX: at 14px/1.7 the subtitle line is 23.8px tall, at 11px/1.7 it is
|
|
196
|
+
* 18.9px, so the whole header band loses ~5px it was spending on a caption. `--font-size-2xs`
|
|
197
|
+
* (ratio⁻², ≈11px) is that step, and it is the same golden scale the title step reads — never a
|
|
198
|
+
* literal. Quiet by default: a page that never passes `headerScale` never resolves it (#44). */
|
|
199
|
+
--page-subtitle-font-size-chrome: var(--font-size-2xs);
|
|
200
|
+
|
|
201
|
+
/* The page's TOP inset under `headerScale="chrome"`, the second half of the same fact: chrome
|
|
202
|
+
* sits on the frame's edge. A document page opens with --space-page-active-y (24px, 16px below
|
|
203
|
+
* the 720px step) because a title needs air above it; a chat channel head, a mail subject bar or
|
|
204
|
+
* an IDE tab strip is the frame itself, and 24px of margin above it reads as a page floating
|
|
205
|
+
* inside its own shell — measured on a consumer chat screen as 24px lost off the top of the
|
|
206
|
+
* transcript viewport, against a design whose channel head starts at y=0. 0 is therefore the
|
|
207
|
+
* quiet default (rule #44), and it is a knob rather than a literal so a service whose grid wants
|
|
208
|
+
* its chrome inset (`--page-pad-block-start-chrome: var(--space-2)`) retunes it once instead of
|
|
209
|
+
* forking the page shell. Read ONLY when the prop is passed, so no document page resolves it. */
|
|
210
|
+
--page-pad-block-start-chrome: 0px;
|
|
211
|
+
|
|
212
|
+
/* The BAND HEIGHT of the same fact (gh#331). A document header is content-height by definition —
|
|
213
|
+
* a title is as tall as the title is. A chrome band is the opposite: it is furniture, and
|
|
214
|
+
* furniture has a height that things centre INTO. `AppShell` has had `--app-shell-bar-height`
|
|
215
|
+
* for exactly that since it shipped; `PageContainer` had no equivalent, so a `headerScale="chrome"`
|
|
216
|
+
* band's vertical centre drifted with its own copy — measured in Chromium on
|
|
217
|
+
* /isolate/layout-page-container, 42.02px with an `extra` control and 40.38px without, i.e. the
|
|
218
|
+
* centre moves 0.8px for a change of content and there is no value a service can aim at.
|
|
219
|
+
*
|
|
220
|
+
* WHO OWNS THE BAND-HEIGHT AXIS (the question gh#331 defers to gh#330). `--app-shell-bar-height`
|
|
221
|
+
* does: it is the system's one declared chrome-band height, and `--centered-shell-bar-height`
|
|
222
|
+
* already reads it. A service that wants its page chrome to sit on the shell bar's band writes
|
|
223
|
+
* ONE line — `--page-header-min-block-size-chrome: var(--app-shell-bar-height)` — and the two
|
|
224
|
+
* bands are on one axis for good.
|
|
225
|
+
*
|
|
226
|
+
* It is NOT that value by DEFAULT, and the reason is not timidity: a `PageContainer` with a
|
|
227
|
+
* chrome header is not necessarily inside an `AppShell` (the canonical chat composition renders
|
|
228
|
+
* one inside a bordered region, a SplitPane pane, a Card), and a band that is not trying to line
|
|
229
|
+
* up with a bar has no business inheriting that bar's height. `auto` is the quiet state (rule
|
|
230
|
+
* #44): no floor, content-height, byte-identical to every page rendered before this token
|
|
231
|
+
* existed — document AND chrome.
|
|
232
|
+
*
|
|
233
|
+
* A MIN, never a fixed height: a taller `extra` (an `lg` control, a wrapped JA/VI channel name)
|
|
234
|
+
* must still fit rather than overflow its own band. The header centres its content in whatever
|
|
235
|
+
* band it ends up with — see `justify-content` in styles/layout.css — so raising this knob
|
|
236
|
+
* centres, it does not top-pack. The header's own `--page-header-pad-bottom` lives INSIDE the
|
|
237
|
+
* band (border-box); under the canonical chrome composition (`variant="ghost"`) that pad is 0
|
|
238
|
+
* and the centring is exact. */
|
|
239
|
+
--page-header-min-block-size-chrome: auto;
|
|
240
|
+
|
|
122
241
|
/* Section "chrome" padding — the SHARED inset for header / body / footer of every overlay-ish
|
|
123
242
|
* surface (Dialog · Sheet · Drawer · Card). One global knob: a service sets these once instead of
|
|
124
243
|
* per-component. Vertical is tightened (16 vs the old 24) and density-aware (see density.css);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@godxjp/ui",
|
|
3
|
-
"version": "
|
|
4
|
-
"godxUiMcp": "
|
|
3
|
+
"version": "19.0.0",
|
|
4
|
+
"godxUiMcp": "19.0.0",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -299,8 +299,9 @@
|
|
|
299
299
|
}
|
|
300
300
|
},
|
|
301
301
|
"scripts": {
|
|
302
|
-
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
303
|
-
"typecheck:
|
|
302
|
+
"typecheck": "node node_modules/typescript-7/bin/tsc --noEmit -p tsconfig.json",
|
|
303
|
+
"typecheck:ts6": "tsc --noEmit -p tsconfig.json",
|
|
304
|
+
"typecheck:docs": "node node_modules/typescript-7/bin/tsc --noEmit -p tsconfig.docs.json",
|
|
304
305
|
"lint": "eslint .",
|
|
305
306
|
"lint:fix": "eslint . --fix",
|
|
306
307
|
"format": "prettier --check .",
|
|
@@ -318,6 +319,7 @@
|
|
|
318
319
|
"check:frame-coverage-ledger": "node scripts/gen-frame-coverage-ledger.mjs --check && node scripts/check-frame-coverage-ledger.mjs",
|
|
319
320
|
"check:screen-reader-evidence": "node scripts/check-screen-reader-evidence.mjs",
|
|
320
321
|
"check:voiceover-capture": "node scripts/check-voiceover-capture.mjs",
|
|
322
|
+
"capture:voiceover": "node scripts/capture-voiceover-evidence.mjs",
|
|
321
323
|
"check:data-entry-frame-runtime": "node scripts/check-data-entry-frame-runtime.mjs",
|
|
322
324
|
"check:data-entry-owner-source": "node scripts/check-data-entry-owner-source.mjs",
|
|
323
325
|
"check:data-entry-touch-aria": "node scripts/check-data-entry-touch-aria.mjs",
|
|
@@ -331,9 +333,13 @@
|
|
|
331
333
|
"check:final-touch-rtl": "node scripts/check-final-touch-rtl.mjs",
|
|
332
334
|
"check:frame-runtime": "pnpm check:data-entry-frame-runtime && pnpm check:data-entry-touch-aria && pnpm check:layout-nav-frames && pnpm check:provider-feedback-query-runtime && pnpm check:layout-nav-closure && pnpm check:final-touch-rtl && pnpm check:data-table-pagination-wrap && pnpm check:button-icon-xs",
|
|
333
335
|
"pretest": "pnpm check:frame-coverage",
|
|
334
|
-
"verify": "pnpm typecheck && pnpm lint && pnpm format && pnpm build && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-token-sync && pnpm check:email-token-sync && pnpm check:mcp-lockstep && pnpm check:mcp-sync && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:frame-coverage && pnpm test",
|
|
335
|
-
"verify:static": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-token-sync && pnpm check:email-token-sync && pnpm check:mcp-lockstep && pnpm check:mcp-sync && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:mcp-prop-sync && pnpm check:contrast && pnpm check:visual-audit && pnpm test",
|
|
336
|
+
"verify": "pnpm typecheck && pnpm lint && pnpm format && pnpm build && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-token-sync && pnpm check:email-token-sync && pnpm check:mcp-lockstep && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:frame-coverage && pnpm test",
|
|
337
|
+
"verify:static": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-token-sync && pnpm check:email-token-sync && pnpm check:mcp-lockstep && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:mcp-prop-sync && pnpm check:contrast && pnpm check:visual-audit && pnpm test",
|
|
338
|
+
"verify:ci": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-token-sync && pnpm check:email-token-sync && pnpm check:mcp-lockstep && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:mcp-prop-sync && pnpm test",
|
|
339
|
+
"verify:ci:static": "pnpm build && pnpm check:packed-public-contract && pnpm typecheck && pnpm typecheck:docs && pnpm lint && pnpm preview:build && pnpm check:example-imports && pnpm check:core-isolation && pnpm check:no-consumer-coupling && pnpm check:use-client && pnpm check:prop-vocabulary && pnpm check:token-tiers && pnpm check:token-scale-bypass && pnpm check:dist-tokens-resolve && pnpm check:no-hardcoded-geometry && pnpm check:no-hardcoded-css-values && pnpm check:no-inline-magic-numbers && pnpm check:no-tailwind-class-assertions && pnpm check:control-sizing && pnpm check:rtl && pnpm check:typography && pnpm check:mcp-token-sync && pnpm check:email-token-sync && pnpm check:mcp-lockstep && pnpm check:mcp-sync && pnpm check:doc-prop-existence && pnpm check:mcp-catalog-coverage && pnpm check:mcp-orphans && pnpm check:mcp-pattern-imports && pnpm check:audit-sync && pnpm check:mcp-prop-sync",
|
|
340
|
+
"verify:browser": "pnpm check:contrast && pnpm check:visual-audit",
|
|
336
341
|
"verify:release": "pnpm verify:static && pnpm check:frame-contracts && pnpm check:frame-coverage && pnpm check:frame-axe",
|
|
342
|
+
"verify:publish-tree": "pnpm build && pnpm check:packed-public-contract && pnpm check:use-client && pnpm check:dist-tokens-resolve && pnpm check:mcp-lockstep",
|
|
337
343
|
"check:mcp-lockstep": "node scripts/check-release-lockstep.mjs",
|
|
338
344
|
"check:release-plan": "node scripts/check-release-command-plan.mjs",
|
|
339
345
|
"check:packed-public-contract": "node scripts/check-packed-public-contract.mjs",
|
|
@@ -342,11 +348,18 @@
|
|
|
342
348
|
"check:mcp-catalog-coverage": "node scripts/check-mcp-catalog-coverage.mjs",
|
|
343
349
|
"check:mcp-orphans": "node scripts/check-mcp-orphans.mjs",
|
|
344
350
|
"check:mcp-prop-sync": "node scripts/check-mcp-prop-sync.mjs",
|
|
351
|
+
"check:doc-prop-existence": "node scripts/check-doc-prop-existence.mjs",
|
|
345
352
|
"gen:component-api-manifest": "node scripts/gen-component-api-manifest.mjs",
|
|
346
353
|
"check:component-api-manifest": "node scripts/gen-component-api-manifest.mjs --check",
|
|
347
354
|
"audit:component-cases": "node scripts/check-component-case-evidence.mjs",
|
|
348
355
|
"check:prop-vocabulary": "node scripts/check-prop-vocabulary.mjs",
|
|
349
356
|
"check:token-tiers": "node scripts/check-token-tiers.mjs",
|
|
357
|
+
"check:token-scale-bypass": "node scripts/check-token-scale-bypass.mjs",
|
|
358
|
+
"check:dist-tokens-resolve": "node scripts/check-dist-tokens-resolve.mjs",
|
|
359
|
+
"check:no-hardcoded-geometry": "node scripts/check-no-hardcoded-geometry.mjs",
|
|
360
|
+
"check:no-hardcoded-css-values": "node scripts/check-no-hardcoded-css-values.mjs",
|
|
361
|
+
"check:no-inline-magic-numbers": "node scripts/check-no-inline-magic-numbers.mjs",
|
|
362
|
+
"check:no-tailwind-class-assertions": "node scripts/check-no-tailwind-class-assertions.mjs",
|
|
350
363
|
"check:control-sizing": "node scripts/check-control-sizing.mjs",
|
|
351
364
|
"check:rtl": "node scripts/check-rtl.mjs",
|
|
352
365
|
"check:typography": "node scripts/check-typography.mjs",
|
|
@@ -358,7 +371,9 @@
|
|
|
358
371
|
"check:no-consumer-coupling": "node scripts/check-no-consumer-coupling.mjs",
|
|
359
372
|
"release": "node scripts/release.mjs",
|
|
360
373
|
"preview": "node preview/scripts/kill-port.mjs && vite --config preview/vite.config.ts --port 6008 --strictPort",
|
|
361
|
-
"preview:build": "vite build --config preview/vite.config.ts",
|
|
374
|
+
"preview:build": "vite build --config preview/vite.config.ts && node scripts/gen-registry.mjs",
|
|
375
|
+
"gen:registry": "node scripts/gen-registry.mjs",
|
|
376
|
+
"check:registry": "node scripts/gen-registry.mjs --check",
|
|
362
377
|
"docs:sync-primitives": "node preview/scripts/sync-primitive-docs.mjs && prettier --write \"docs/primitives/**/*.tsx\"",
|
|
363
378
|
"audit": "node scripts/ui-audit.mjs",
|
|
364
379
|
"audit:examples": "node scripts/ui-audit.mjs docs",
|
|
@@ -405,89 +420,90 @@
|
|
|
405
420
|
},
|
|
406
421
|
"dependencies": {
|
|
407
422
|
"@date-fns/tz": "^1.5.0",
|
|
408
|
-
"@fontsource/m-plus-2": "^5.
|
|
409
|
-
"@fontsource/noto-sans-jp": "^5.
|
|
410
|
-
"@radix-ui/react-accordion": "^1.2.
|
|
411
|
-
"@radix-ui/react-alert-dialog": "^1.1.
|
|
412
|
-
"@radix-ui/react-aspect-ratio": "^1.1.
|
|
413
|
-
"@radix-ui/react-avatar": "^1.2.
|
|
414
|
-
"@radix-ui/react-checkbox": "^1.3.
|
|
415
|
-
"@radix-ui/react-collapsible": "^1.1.
|
|
416
|
-
"@radix-ui/react-context": "^1.2.
|
|
417
|
-
"@radix-ui/react-context-menu": "^2.3.
|
|
418
|
-
"@radix-ui/react-dialog": "^1.1.
|
|
419
|
-
"@radix-ui/react-dropdown-menu": "^2.1.
|
|
420
|
-
"@radix-ui/react-hover-card": "^1.1.
|
|
421
|
-
"@radix-ui/react-label": "^2.1.
|
|
422
|
-
"@radix-ui/react-menubar": "^1.1.
|
|
423
|
-
"@radix-ui/react-navigation-menu": "^1.2.
|
|
424
|
-
"@radix-ui/react-popover": "^1.1.
|
|
425
|
-
"@radix-ui/react-radio-group": "^1.4.
|
|
426
|
-
"@radix-ui/react-scroll-area": "^1.2.
|
|
427
|
-
"@radix-ui/react-select": "^2.3.
|
|
428
|
-
"@radix-ui/react-separator": "^1.1.
|
|
429
|
-
"@radix-ui/react-slider": "^1.4.
|
|
430
|
-
"@radix-ui/react-slot": "^1.3.
|
|
431
|
-
"@radix-ui/react-switch": "^1.3.
|
|
432
|
-
"@radix-ui/react-tabs": "^1.1.
|
|
433
|
-
"@radix-ui/react-toggle": "^1.1.
|
|
434
|
-
"@radix-ui/react-toggle-group": "^1.1.
|
|
435
|
-
"@radix-ui/react-tooltip": "^1.2.
|
|
436
|
-
"@tanstack/react-table": "^
|
|
423
|
+
"@fontsource/m-plus-2": "^5.3.0",
|
|
424
|
+
"@fontsource/noto-sans-jp": "^5.3.0",
|
|
425
|
+
"@radix-ui/react-accordion": "^1.2.20",
|
|
426
|
+
"@radix-ui/react-alert-dialog": "^1.1.23",
|
|
427
|
+
"@radix-ui/react-aspect-ratio": "^1.1.15",
|
|
428
|
+
"@radix-ui/react-avatar": "^1.2.6",
|
|
429
|
+
"@radix-ui/react-checkbox": "^1.3.11",
|
|
430
|
+
"@radix-ui/react-collapsible": "^1.1.20",
|
|
431
|
+
"@radix-ui/react-context": "^1.2.2",
|
|
432
|
+
"@radix-ui/react-context-menu": "^2.3.7",
|
|
433
|
+
"@radix-ui/react-dialog": "^1.1.23",
|
|
434
|
+
"@radix-ui/react-dropdown-menu": "^2.1.24",
|
|
435
|
+
"@radix-ui/react-hover-card": "^1.1.23",
|
|
436
|
+
"@radix-ui/react-label": "^2.1.15",
|
|
437
|
+
"@radix-ui/react-menubar": "^1.1.24",
|
|
438
|
+
"@radix-ui/react-navigation-menu": "^1.2.22",
|
|
439
|
+
"@radix-ui/react-popover": "^1.1.23",
|
|
440
|
+
"@radix-ui/react-radio-group": "^1.4.7",
|
|
441
|
+
"@radix-ui/react-scroll-area": "^1.2.18",
|
|
442
|
+
"@radix-ui/react-select": "^2.3.7",
|
|
443
|
+
"@radix-ui/react-separator": "^1.1.15",
|
|
444
|
+
"@radix-ui/react-slider": "^1.4.7",
|
|
445
|
+
"@radix-ui/react-slot": "^1.3.3",
|
|
446
|
+
"@radix-ui/react-switch": "^1.3.7",
|
|
447
|
+
"@radix-ui/react-tabs": "^1.1.21",
|
|
448
|
+
"@radix-ui/react-toggle": "^1.1.18",
|
|
449
|
+
"@radix-ui/react-toggle-group": "^1.1.19",
|
|
450
|
+
"@radix-ui/react-tooltip": "^1.2.16",
|
|
451
|
+
"@tanstack/react-table": "^9.2.4",
|
|
437
452
|
"class-variance-authority": "^0.7.1",
|
|
438
453
|
"clsx": "^2.1.1",
|
|
439
454
|
"cmdk": "^1.1.1",
|
|
440
455
|
"date-fns": "^4.1.0",
|
|
441
456
|
"embla-carousel-react": "^8.6.0",
|
|
442
|
-
"input-otp": "^1.
|
|
443
|
-
"lucide-react": "^1.
|
|
457
|
+
"input-otp": "^1.5.0",
|
|
458
|
+
"lucide-react": "^1.37.0",
|
|
444
459
|
"qrcode.react": "4.2.0",
|
|
445
460
|
"react-day-picker": "^10.0.1",
|
|
446
|
-
"react-resizable-panels": "^4.12.
|
|
447
|
-
"sonner": "^2.0.
|
|
461
|
+
"react-resizable-panels": "^4.12.3",
|
|
462
|
+
"sonner": "^2.0.8",
|
|
448
463
|
"tailwind-merge": "^3.5.0",
|
|
449
464
|
"tailwindcss-animate": "^1.0.7",
|
|
450
465
|
"vaul": "^1.1.2"
|
|
451
466
|
},
|
|
452
467
|
"devDependencies": {
|
|
453
|
-
"@axe-core/playwright": "^4.
|
|
454
|
-
"@eslint/js": "^
|
|
455
|
-
"@hookform/resolvers": "^5.
|
|
468
|
+
"@axe-core/playwright": "^4.13.0",
|
|
469
|
+
"@eslint/js": "^10.0.1",
|
|
470
|
+
"@hookform/resolvers": "^5.9.1",
|
|
456
471
|
"@tailwindcss/vite": "^4.3.3",
|
|
457
|
-
"@tanstack/react-query": "^5.
|
|
458
|
-
"@testing-library/jest-dom": "^
|
|
459
|
-
"@testing-library/react": "^16.3.
|
|
460
|
-
"@testing-library/user-event": "^14.6.
|
|
461
|
-
"@types/node": "^
|
|
472
|
+
"@tanstack/react-query": "^5.102.8",
|
|
473
|
+
"@testing-library/jest-dom": "^7.0.1",
|
|
474
|
+
"@testing-library/react": "^16.3.3",
|
|
475
|
+
"@testing-library/user-event": "^14.6.6",
|
|
476
|
+
"@types/node": "^26.4.0",
|
|
462
477
|
"@types/pngjs": "^6.0.5",
|
|
463
|
-
"@types/react": "^19.2.
|
|
464
|
-
"@types/react-dom": "^19.2.
|
|
465
|
-
"@vitejs/plugin-react": "^6.
|
|
466
|
-
"@vitest/coverage-v8": "^4.1.
|
|
467
|
-
"axe-core": "^4.
|
|
468
|
-
"eslint": "^9.
|
|
478
|
+
"@types/react": "^19.2.18",
|
|
479
|
+
"@types/react-dom": "^19.2.5",
|
|
480
|
+
"@vitejs/plugin-react": "^6.1.1",
|
|
481
|
+
"@vitest/coverage-v8": "^4.1.11",
|
|
482
|
+
"axe-core": "^4.13.0",
|
|
483
|
+
"eslint": "^10.9.1",
|
|
469
484
|
"eslint-plugin-react": "^7.37.5",
|
|
470
485
|
"eslint-plugin-react-hooks": "^7.1.1",
|
|
471
|
-
"globals": "^
|
|
472
|
-
"jsdom": "^
|
|
486
|
+
"globals": "^17.11.0",
|
|
487
|
+
"jsdom": "^30.0.1",
|
|
473
488
|
"jsqr": "^1.4.0",
|
|
474
|
-
"playwright": "^1.
|
|
489
|
+
"playwright": "^1.62.1",
|
|
475
490
|
"pngjs": "^7.0.0",
|
|
476
|
-
"prettier": "^3.9.
|
|
477
|
-
"prettier-plugin-tailwindcss": "^0.
|
|
478
|
-
"react": "^19.2.
|
|
479
|
-
"react-dom": "^19.2.
|
|
480
|
-
"react-hook-form": "^7.
|
|
481
|
-
"react-router-dom": "^7.18.
|
|
482
|
-
"recharts": "^3.
|
|
491
|
+
"prettier": "^3.9.6",
|
|
492
|
+
"prettier-plugin-tailwindcss": "^0.8.1",
|
|
493
|
+
"react": "^19.2.8",
|
|
494
|
+
"react-dom": "^19.2.8",
|
|
495
|
+
"react-hook-form": "^7.86.0",
|
|
496
|
+
"react-router-dom": "^7.18.3",
|
|
497
|
+
"recharts": "^3.10.1",
|
|
483
498
|
"tailwindcss": "^4.3.3",
|
|
484
499
|
"tsup": "^8.5.1",
|
|
485
500
|
"typescript": "^6.0.3",
|
|
486
|
-
"typescript-
|
|
487
|
-
"
|
|
488
|
-
"
|
|
501
|
+
"typescript-7": "npm:typescript@7.0.2",
|
|
502
|
+
"typescript-eslint": "^8.68.0",
|
|
503
|
+
"vite": "^8.2.2",
|
|
504
|
+
"vitest": "^4.1.11",
|
|
489
505
|
"vitest-axe": "1.0.0-pre.5",
|
|
490
|
-
"zod": "^4.4
|
|
506
|
+
"zod": "^4.5.4"
|
|
491
507
|
},
|
|
492
508
|
"bin": {
|
|
493
509
|
"godxjp-ui": "scripts/cli.mjs"
|