@godxjp/ui 18.5.0 → 18.7.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.
Files changed (101) hide show
  1. package/dist/components/charts/compact-bar-trend.d.ts +2 -1
  2. package/dist/components/charts/index.d.ts +4 -1
  3. package/dist/components/data-display/data-table.d.ts +25 -4
  4. package/dist/components/data-display/data-table.js +13 -2
  5. package/dist/components/data-display/empty-state.js +1 -1
  6. package/dist/components/data-display/index.d.ts +1 -1
  7. package/dist/components/data-display/list-row.d.ts +19 -0
  8. package/dist/components/data-display/list-row.js +2 -0
  9. package/dist/components/data-display/qr-code.d.ts +1 -1
  10. package/dist/components/data-display/table.d.ts +47 -2
  11. package/dist/components/data-display/table.js +29 -4
  12. package/dist/components/data-entry/command.d.ts +10 -10
  13. package/dist/components/data-entry/index.d.ts +1 -0
  14. package/dist/components/data-entry/input-otp.d.ts +1 -0
  15. package/dist/components/feedback/alert.d.ts +20 -2
  16. package/dist/components/feedback/alert.js +11 -1
  17. package/dist/components/feedback/dialog.d.ts +14 -1
  18. package/dist/components/feedback/dialog.js +4 -0
  19. package/dist/components/feedback/index.d.ts +3 -3
  20. package/dist/components/feedback/index.js +5 -1
  21. package/dist/components/general/logo.d.ts +7 -1
  22. package/dist/components/general/logo.js +1 -1
  23. package/dist/components/layout/app-shell.d.ts +1 -1
  24. package/dist/components/layout/app-shell.js +55 -46
  25. package/dist/components/layout/auth-account-summary.d.ts +5 -0
  26. package/dist/components/layout/auth-account-summary.js +31 -0
  27. package/dist/components/layout/auth-shell.d.ts +5 -2
  28. package/dist/components/layout/centered-shell.d.ts +1 -1
  29. package/dist/components/layout/centered-shell.js +28 -19
  30. package/dist/components/layout/error-surface.d.ts +35 -0
  31. package/dist/components/layout/error-surface.js +155 -0
  32. package/dist/components/layout/flex.d.ts +1 -1
  33. package/dist/components/layout/flex.js +4 -0
  34. package/dist/components/layout/index.d.ts +7 -0
  35. package/dist/components/layout/index.js +6 -0
  36. package/dist/components/layout/page-container.d.ts +1 -1
  37. package/dist/components/layout/page-container.js +23 -41
  38. package/dist/components/layout/page-header.d.ts +22 -0
  39. package/dist/components/layout/page-header.js +89 -0
  40. package/dist/components/navigation/filter-bar.d.ts +2 -2
  41. package/dist/components/navigation/filter-bar.js +44 -1
  42. package/dist/components/navigation/index.d.ts +1 -1
  43. package/dist/components/navigation/steps.js +38 -19
  44. package/dist/components/navigation/tabs.js +12 -3
  45. package/dist/components/ui/avatar.d.ts +2 -1
  46. package/dist/components/ui/avatar.js +2 -1
  47. package/dist/components/ui/input-otp.d.ts +4 -1
  48. package/dist/components/ui/input-otp.js +2 -1
  49. package/dist/components/ui/toggle-group.d.ts +7 -4
  50. package/dist/components/ui/toggle-group.js +32 -21
  51. package/dist/email/brand-mark.d.ts +21 -5
  52. package/dist/email/brand-mark.js +5 -0
  53. package/dist/email/color.d.ts +2 -1
  54. package/dist/email/geometry.d.ts +9 -1
  55. package/dist/email/geometry.js +1 -0
  56. package/dist/email/index.d.ts +6 -1
  57. package/dist/email/index.js +6 -0
  58. package/dist/email/inline-style.d.ts +7 -5
  59. package/dist/email/inline-style.js +5 -0
  60. package/dist/email/tokens.generated.d.ts +40 -20
  61. package/dist/email/tokens.generated.js +40 -20
  62. package/dist/email/urgency.d.ts +22 -0
  63. package/dist/email/urgency.js +14 -0
  64. package/dist/i18n/messages/en.json +26 -1
  65. package/dist/i18n/messages/ja.json +23 -1
  66. package/dist/i18n/messages/vi.json +23 -1
  67. package/dist/props/components/data-display.prop.d.ts +63 -1
  68. package/dist/props/components/data-entry.prop.d.ts +6 -0
  69. package/dist/props/components/feedback.prop.d.ts +6 -0
  70. package/dist/props/components/index.d.ts +1 -1
  71. package/dist/props/components/layout.prop.d.ts +244 -4
  72. package/dist/props/components/navigation.prop.d.ts +57 -1
  73. package/dist/props/registry.d.ts +205 -5
  74. package/dist/props/registry.js +270 -6
  75. package/dist/props/vocabulary/data.prop.d.ts +27 -0
  76. package/dist/props/vocabulary/index.d.ts +3 -3
  77. package/dist/props/vocabulary/interaction.prop.d.ts +19 -2
  78. package/dist/props/vocabulary/layout.prop.d.ts +41 -7
  79. package/dist/styles/alert-layout.css +36 -0
  80. package/dist/styles/control.css +28 -0
  81. package/dist/styles/data-display-layout.css +26 -0
  82. package/dist/styles/layout.css +212 -0
  83. package/dist/styles/logo-layout.css +42 -9
  84. package/dist/styles/navigation-layout.css +109 -0
  85. package/dist/styles/shell-layout.css +336 -0
  86. package/dist/styles/table-layout.css +164 -1
  87. package/dist/theme/dxs.canonical.css +5 -4
  88. package/dist/tokens/axes.css +4 -3
  89. package/dist/tokens/base.css +1 -0
  90. package/dist/tokens/components/data-display.css +13 -0
  91. package/dist/tokens/components/email.css +43 -16
  92. package/dist/tokens/components/error-surface.css +36 -0
  93. package/dist/tokens/components/feedback.css +20 -0
  94. package/dist/tokens/components/list-row.css +20 -0
  95. package/dist/tokens/components/logo.css +52 -10
  96. package/dist/tokens/components/navigation.css +41 -0
  97. package/dist/tokens/components/shell.css +109 -0
  98. package/dist/tokens/components/table.css +45 -0
  99. package/dist/tokens/foundation.css +26 -0
  100. package/dist/tokens/semantic/layout.css +38 -0
  101. package/package.json +8 -2
@@ -54,6 +54,15 @@
54
54
  --sidebar-brand-mark-size: 1.375rem;
55
55
  --sidebar-nav-item-height: 2rem;
56
56
  --sidebar-nav-item-font-size: 0.8125rem;
57
+ /* Line box of the nav LABEL, not the row (gh#254): `.sb-label` clips, so its line box is its clip
58
+ * box, and the row's `line-height: 1` shears descenders and Vietnamese tone marks. Keep >= 1.2. */
59
+ --sidebar-nav-item-line-height: 1.5;
60
+ /* Same gh#254 trap, two more clipping boxes. `.ui-auth-account-email` and the truncating last
61
+ * child of `.ui-topbar-start` both clip (`overflow: hidden`/`clip` + `text-overflow: ellipsis`),
62
+ * so their line box IS their clip box — inheriting a tight value shears descenders and Vietnamese
63
+ * tone marks exactly as the sidebar label did. Keep >= 1.2. */
64
+ --auth-account-summary-email-line-height: 1.5;
65
+ --topbar-start-truncate-line-height: 1.5;
57
66
  --sidebar-nav-icon-size: 1rem;
58
67
  --sidebar-nav-item-gap: 0.625rem;
59
68
  --sidebar-nav-item-padding-x: 0.625rem;
@@ -72,6 +81,11 @@
72
81
  --topbar-height: auto;
73
82
  --topbar-inset: 0px;
74
83
  --topbar-gap: var(--space-2);
84
+ /* At compact desktop/tablet widths the docked sidebar leaves too little inline room for three
85
+ * intrinsically-sized clusters. The package hides the optional center slot before it can cover
86
+ * the breadcrumb/title or end utilities. Consumers may opt back into another display strategy
87
+ * (for example `flex`) once their center content has its own compact presentation. */
88
+ --topbar-center-compact-display: none;
75
89
  --org-switcher-trigger-height: 2.75rem;
76
90
  --org-switcher-trigger-padding-x: var(--space-2);
77
91
  --org-switcher-avatar-size: 1.75rem;
@@ -144,6 +158,24 @@
144
158
  * (quiet, rule #44) so an existing single-card consumer is untouched; presets opt in. */
145
159
  --auth-shell-card-stack-gap: 0px;
146
160
 
161
+ /* Login preset (gh#237) — canonical SCR-001 anchors at 1440x900, 1024x900 and 390x844.
162
+ * The 112px identity slot is deliberately taller than a two-line real requester. Identity
163
+ * content aligns to the slot end, so missing/one-line/two-line requester data changes only the
164
+ * empty space above it, never the card or footer position. The flow starts at y=231 desktop and
165
+ * y=221 mobile: 231/221 + 112 + 20 gap = card y=363/353. Literal artboard lengths belong here,
166
+ * not in a consumer selector, and do not drift with --scaling. */
167
+ --auth-shell-login-card-max-width: 22.5rem;
168
+ --auth-shell-login-flow-offset-block: 14.4375rem;
169
+ --auth-shell-login-flow-offset-block-mobile: 13.8125rem;
170
+ --auth-shell-login-main-padding-inline: 1rem;
171
+ --auth-shell-login-main-padding-inline-mobile: 0.9375rem;
172
+ --auth-shell-login-main-padding-block-end: 1rem;
173
+ --auth-shell-login-identity-slot-block-size: 7rem;
174
+ --auth-shell-login-card-stack-gap: 1.25rem;
175
+ --auth-shell-login-card-padding-block-compact: calc(
176
+ var(--auth-shell-compact-card-inset) + var(--control-border-width) + var(--control-border-width)
177
+ );
178
+
147
179
  /* Device-authorization preset — 380px card measure, 15px block · 5px inline mobile gutter
148
180
  * (at a 390px viewport the card is x=5px, width=380px). */
149
181
  --auth-shell-device-card-max-width: 23.75rem;
@@ -169,6 +201,43 @@
169
201
  --auth-shell-recovery-main-padding: 1rem;
170
202
  --auth-shell-recovery-main-padding-mobile: 0.9375rem;
171
203
 
204
+ /* Registration preset (gh#256) — the canonical sign-up measure. Two things make it structurally
205
+ * different from every preset above, and both are the reason it could not be expressed by
206
+ * re-using `login`:
207
+ *
208
+ * 1. LONG-FORM SCROLLING. A registration card is the tallest surface in the hosted-identity set
209
+ * (name · email · password · confirm · strength meter · consent · submit · provider row), and
210
+ * a vertically CENTRED tall card clips its own top on a short viewport — the top overflows
211
+ * above the scroll origin and becomes unreachable. So the column is start-aligned and the
212
+ * block-start inset becomes ordinary page padding the user can scroll past.
213
+ * 2. FOOTER CLEARANCE. The legal/consent footer must never be flush against the submit button
214
+ * at the end of a long scroll, so the block-end inset is a knob of its own rather than
215
+ * mirroring the block-start one.
216
+ *
217
+ * The 360px form measure and the 15px mobile inline gutter match the canonical Login flow exactly
218
+ * (22.5rem card, x=15 at 390 ⇒ width=360), so a user moving sign-in → sign-up on a phone never
219
+ * sees the surface jump. */
220
+ --auth-shell-registration-card-max-width: 22.5rem;
221
+ /* Block-start offsets are DERIVED from the canonical SCR-002 artboard, not chosen: the card
222
+ * anchors at y=284 (1440x900) and y=274 (390x844), and the column is
223
+ * card y = padding-block-start + identity slot + stack gap
224
+ * so 284 - 112 - 20 = 152px (9.5rem) and 274 - 112 - 20 = 142px (8.875rem). Like every canonical
225
+ * screen in this family the page passes NO brand bar (the mark lives INSIDE the column as
226
+ * AuthIdentity), so `main` starts at the viewport top and the offset is the whole anchor. */
227
+ --auth-shell-registration-main-padding-block-start: 9.5rem;
228
+ --auth-shell-registration-main-padding-block-start-mobile: 8.875rem;
229
+ --auth-shell-registration-main-padding-inline: 1rem;
230
+ --auth-shell-registration-main-padding-inline-mobile: 0.9375rem;
231
+ /* Footer clearance — the gap the legal footer keeps below the end of a long form. */
232
+ --auth-shell-registration-main-padding-block-end: 3rem;
233
+ --auth-shell-registration-main-padding-block-end-mobile: 2rem;
234
+ --auth-shell-registration-card-stack-gap: 1.25rem;
235
+ /* Fixed identity track, the same 112px `login` proved (gh#237). Without it the card anchor moves
236
+ * with the title/requester line count — measured here at 82.69px for one wrapped requester — so
237
+ * the canonical y above would hold for exactly one copy length and drift for every other. The
238
+ * slot absorbs absent / one-line / two-line identity content instead. */
239
+ --auth-shell-registration-identity-slot-block-size: 7rem;
240
+
172
241
  /* Labelled auth divider geometry. */
173
242
  --auth-shell-divider-gap: 0.625rem;
174
243
  --auth-shell-divider-label-font-size: 0.6875rem;
@@ -178,6 +247,13 @@
178
247
  --auth-requester-gap: 0.375rem;
179
248
  --auth-requester-icon-size: 1rem;
180
249
  --auth-requester-glyph-size: 0.625rem;
250
+ --auth-account-summary-min-height: var(--control-height-comfortable);
251
+ --auth-account-summary-gap: var(--space-2);
252
+ --auth-account-summary-padding: var(--space-1) var(--space-2);
253
+ --auth-account-summary-identity-min-width: 12rem;
254
+ --auth-account-summary-avatar-size: var(--control-height-sm);
255
+ --auth-account-summary-avatar-glyph-size: var(--control-icon-size-sm);
256
+ --auth-account-summary-email-font-size: var(--font-size-sm);
181
257
  --auth-footer-content-gap: 0.375rem;
182
258
  --auth-footer-text-font-size: 0.6875rem;
183
259
  --auth-stack-gap: var(--space-3);
@@ -203,3 +279,36 @@
203
279
  --centered-shell-width-md: 46rem;
204
280
  --centered-shell-width-lg: 64rem;
205
281
  }
282
+
283
+ /* CenteredShell · public-landing preset (gh#252) — the token-owned geometry of a PUBLIC marketing
284
+ * / product landing page: one content measure shared by header, main column and footer, the
285
+ * section rhythm between page sections, the flat (chrome-quiet) card presentation and the hero
286
+ * heading tier. Every value is a service-themeable knob (rule #45): a landing composition is a
287
+ * COMPOSITION of real primitives (docs/COMPOSITION-VS-COMPONENT.md — Hero/Navbar/Footer FAIL the
288
+ * Framework-Component Test), so the consumer must never own geometry or a media query. These
289
+ * knobs are read ONLY under `.ui-centered-shell[data-preset="public-landing"]`, so the default
290
+ * shell — which emits no `data-preset` at all — is byte-identical to before. */
291
+ :root {
292
+ --centered-shell-landing-max-width: 67.5rem; /* 1080px — header/main/footer share ONE measure */
293
+ --centered-shell-landing-inset-inline: var(--space-6); /* 24px page gutter ≥ 40rem */
294
+ --centered-shell-landing-inset-inline-compact: var(--space-4); /* 16px page gutter < 40rem */
295
+ --centered-shell-landing-main-padding-block: var(--space-10); /* 40px */
296
+ --centered-shell-landing-main-padding-block-compact: var(--space-6); /* 24px */
297
+ --centered-shell-landing-section-gap: var(--space-10); /* rhythm BETWEEN page sections */
298
+ --centered-shell-landing-section-gap-compact: var(--space-6);
299
+ --centered-shell-landing-footer-padding-block: var(--space-8);
300
+ /* Chrome is a token, default quiet (rule #44): a landing surface is FLAT — no card elevation —
301
+ * so a service opts back IN with `--centered-shell-landing-card-shadow: var(--card-shadow)`. */
302
+ --centered-shell-landing-card-shadow: none;
303
+ /* Hero heading tier. The preset re-points `--heading-h1` (same mechanism as
304
+ * `.ui-auth-shell` → `--auth-shell-heading-size`), so a hero title is a real `Heading level={1}`
305
+ * and never a consumer font-size. */
306
+ --centered-shell-landing-heading-size: var(--font-size-display);
307
+ --centered-shell-landing-heading-size-compact: var(--font-size-3xl);
308
+ /* Role-mirror knob — MUST stay `initial`, with the role default at the CALL SITE
309
+ * (`var(--centered-shell-landing-background, var(--background))`), so a scoped
310
+ * `[data-tenant]` / `.dark` override of `--background` still reaches it (docs/TOKENS.md ·
311
+ * "Role-mirror knobs MUST be `initial`"). Documented default = hsl(var(--background)) — a public
312
+ * page is the plain page canvas, not the app's `--muted` chrome. */
313
+ --centered-shell-landing-background: initial;
314
+ }
@@ -7,6 +7,29 @@
7
7
  --table-row-height: calc(var(--table-row-height-default) * var(--scaling));
8
8
  --table-cell-padding-y: var(--space-2);
9
9
  --table-cell-space-x: var(--control-padding-x);
10
+ /* Pagination footer inset (gh#236). The footer ships as a SELF-CONTAINED slot and is commonly
11
+ * placed in a flush container (`<Card><CardContent flush><DataTable/>`), where no ancestor
12
+ * supplies padding — so it owns its own on BOTH axes instead of declaring block-start only.
13
+ * Block default = the previous single `padding-top` value, now on both block edges (breathing
14
+ * room above the footer and before the container's closing border). Inline default = the cell
15
+ * inline padding, so the "rows per page" label sits on the same optical axis as the first
16
+ * column's text. A service retunes either axis to its own grid (#45).
17
+ * Both are declared `initial` so the defaults re-resolve at the CALL SITE: --space-stack-sm and
18
+ * --table-cell-space-x are density-scaled and re-declared inside a `.ui-density-*` subtree, and a
19
+ * :root binding would freeze the footer at the :root density (docs/TOKENS.md — the :root freeze
20
+ * rule). Defaults = var(--space-stack-sm) block · var(--table-cell-space-x) inline. */
21
+ --table-pagination-padding-y: initial;
22
+ --table-pagination-padding-x: initial;
23
+ /* DataTable surface — narrow-viewport legibility FLOOR (gh#253). Below the `sm` viewport step a
24
+ * multi-column admin grid whose columns are `white-space: nowrap` would otherwise be crushed, so
25
+ * the bordered surface keeps a minimum inline size and `.ui-data-table-scroll` scrolls instead.
26
+ * This shipped as a hard-coded `min-w-[640px]` utility on the surface element, which left a
27
+ * service that wants a narrower (or no) floor with no route but forking the component (#45).
28
+ * Default = the previous literal, in px so the floor releases at EXACTLY the same width as the
29
+ * px-based `sm` media query that clears it (a rem value would drift under a non-16px root and
30
+ * re-introduce the scroll between the two thresholds). Set `0` to opt out entirely — which is
31
+ * what `preset="action-collection"` does, because there the priority measures own the width. */
32
+ --table-surface-min-inline-size: 640px;
10
33
  --table-head-font-size: var(--font-size-xs);
11
34
  /* Header band — its OWN bg + fg knobs (decoupled from --secondary). Declared `initial` so the
12
35
  * default re-resolves to the LIVE --muted / --muted-foreground roles at the call site: a :root
@@ -24,3 +47,25 @@
24
47
  --table-row-hover-background: initial;
25
48
  --table-row-selected-background: initial;
26
49
  }
50
+
51
+ /* Table · action-collection preset (gh#253) — the canonical dense approval / action queue.
52
+ * Column PRIORITY measures replace the desktop intrinsic widths (a nowrap free-text column is
53
+ * what makes a five-column queue wider than its card and forces a horizontal scroll). Nothing
54
+ * here is read unless `preset="action-collection"` is set, so every existing table is untouched.
55
+ * Percentages so the ratio holds at any card width; the action affordance is an absolute measure
56
+ * because it must never be squeezed below its touch target. */
57
+ :root {
58
+ --table-action-collection-primary-width: 18%; /* requester / subject */
59
+ --table-action-collection-secondary-width: 22%; /* target / resource */
60
+ --table-action-collection-meta-width: 12%; /* timestamps, ids — lowest priority */
61
+ --table-action-collection-actions-width: 3.5rem; /* row-action affordance, never clipped */
62
+ /* Compact tier, applied below the collapse step (the 390px acceptance frame). */
63
+ --table-action-collection-primary-width-compact: 24%;
64
+ --table-action-collection-secondary-width-compact: 22%;
65
+ --table-action-collection-meta-width-compact: 20%;
66
+ --table-action-collection-actions-width-compact: 2.75rem;
67
+ --table-action-collection-font-size-compact: var(--font-size-xs);
68
+ --table-action-collection-cell-space-x-compact: var(--space-2);
69
+ --table-action-collection-cell-padding-y-compact: var(--space-2);
70
+ --table-action-collection-row-height-compact: var(--table-row-height-compact);
71
+ }
@@ -31,6 +31,25 @@
31
31
  --attention: 25 99% 46%; /* 朱 #eb6101 */
32
32
  --attention-foreground: 60 33% 99%;
33
33
 
34
+ /* IDENTITY role — the canonical GoDX emerald. This is the PRODUCT MARK colour (Logo `mark="godx"`
35
+ * / `tone="success"`, its wordmark, the email brand capsule), and it is deliberately THREE-WAY
36
+ * distinct:
37
+ * · from --primary — a service re-theming its action colour must never recolour the mark;
38
+ * · from --success — 若竹 #68be8d is the STATUS green (badges, progress, "saved" text) and
39
+ * stays exactly as it is. The mark previously borrowed it, which rendered
40
+ * the identity at #69bf8e instead of the canonical emerald — ΔE76 ≈ 17.5,
41
+ * a plainly wrong brand colour (gh#250/#214);
42
+ * · from --text-brand / --color-brand — those are the BLUE brand-numeral TEXT slot and the
43
+ * Tailwind `text-brand` utility it feeds; unrelated, and not renamed here.
44
+ * Canonical value: oklch(0.595 0.137 162.94) = #009766, "kept distinct from SmartHR primary".
45
+ * The triplet is carried at one decimal so hsl() lands on that exact hex (an integer 160 100% 30%
46
+ * would drift to #009966). Dark lifts lightness only — same hue, same full chroma — so the mark
47
+ * stays the same emerald while clearing AA against the dark spine.
48
+ * There is no Tailwind `bg-brand` utility on purpose: `--color-brand` is already taken by
49
+ * --text-brand, so identity surfaces read `hsl(var(--brand))` directly in component CSS. */
50
+ --brand: 160.5 100% 29.6%; /* 翠 GoDX emerald #009766 */
51
+ --brand-foreground: 60 33% 99%;
52
+
34
53
  /* Extended text hierarchy (beyond --foreground / --muted-foreground) — themeable per service.
35
54
  * Roles primitives bake in today: caption/meta, disabled, inline link, brand numerals. */
36
55
  --text-tertiary: 44 5% 55%; /* lighter than muted-foreground — captions / meta */
@@ -380,6 +399,13 @@
380
399
  --attention: 25 95% 56%;
381
400
  --attention-foreground: 48 9% 9%;
382
401
 
402
+ /* IDENTITY (dark) — the SAME canonical emerald hue/chroma, lifted 29.6% → 36% lightness so the
403
+ * mark reads off the warm near-black spine (#00b87c: 6.9:1 on --background, 6.3:1 on --card;
404
+ * the unlifted #009766 sat at 4.4:1 on the card). The on-fill glyph flips dark, exactly like
405
+ * --success-foreground does. */
406
+ --brand: 160.5 100% 36%; /* #00b87c */
407
+ --brand-foreground: 48 9% 9%;
408
+
383
409
  /* Extended text hierarchy + interaction ramp (dark) */
384
410
  --text-tertiary: 44 6% 56%;
385
411
  --text-disabled: 45 6% 40%;
@@ -83,6 +83,34 @@
83
83
  * page moves. 11rem = 176px, i.e. the control ends flush with the compact page gutter. */
84
84
  --page-header-extra-measure: 11rem; /* 176px */
85
85
 
86
+ /* Inline gap between the `<h1>` and the PageHeader `meta` slot (a status Badge, a record ID) when
87
+ * they share the title band (gh#255). Only consumed when `meta` is passed — a header without it
88
+ * emits no band wrapper at all, so no existing page moves. */
89
+ --page-header-meta-gap: var(--space-inline-sm);
90
+
91
+ /* PageHeader `loading` placeholders (gh#255). The title/subtitle elements wear the shared
92
+ * `.ui-skeleton-block` skin, so they need only a MEASURE and a block size — a service retunes the
93
+ * pending band's proportions here instead of per page. */
94
+ --page-title-placeholder-measure: 14rem; /* 224px */
95
+ --page-title-placeholder-block-size: 1.5em;
96
+ --page-subtitle-placeholder-measure: 22rem; /* 352px */
97
+ --page-subtitle-placeholder-block-size: 1.25em;
98
+
99
+ /* Bounded page MEASURE (gh#245 / gh#247) — the shared inline cap applied to the page HEADER and
100
+ * BODY together, so the header `extra` action ends on the same edge as the body surface (the
101
+ * `variant="narrow"` complaint: it caps only `.ui-page-body`, leaving the header action out at
102
+ * the page edge). Selected by the semantic `measure` prop; `measure="default"` reads NEITHER
103
+ * token, so an existing page is untouched.
104
+ *
105
+ * These are OUTER measures: the page gutters (--space-page-active-x, 24px each side by default)
106
+ * live INSIDE the cap, so the VISIBLE surface is the measure minus both gutters:
107
+ * narrow 42rem = 672px → 624px visible surface (the historical variant="narrow" body width)
108
+ * medium 48rem = 768px → 720px visible surface (the canonical readable/feed measure)
109
+ * Below the cap nothing binds, so a 390px viewport stays fluid at the 16px compact gutter
110
+ * (358px surface). A service theme retunes both in ONE place; never a page-local max-width. */
111
+ --page-measure-narrow: 42rem; /* 672px outer → 624px surface */
112
+ --page-measure-medium: 48rem; /* 768px outer → 720px surface */
113
+
86
114
  /* Responsive page typography is independent from density. Density changes information spacing;
87
115
  * these tokens change only page chrome so mobile keeps readable body text and touch targets. */
88
116
  --page-title-font-size: var(--heading-h1);
@@ -104,3 +132,13 @@
104
132
  * whole system stays in sync (gh feedback: Descriptions was ~0px while FormField was 8px). */
105
133
  --field-label-gap: var(--space-2); /* 8px */
106
134
  }
135
+
136
+ /* Canonical admin collection composition. Services may retune these semantic knobs once. */
137
+ :root {
138
+ --admin-collection-control-height: var(--control-height-default);
139
+ --admin-collection-section-gap: var(--space-stack-md);
140
+ --admin-collection-toolbar-padding-y: 0px;
141
+ --admin-collection-search-measure: 20rem;
142
+ --admin-collection-table-row-height: var(--table-row-height-default);
143
+ --admin-collection-table-cell-padding-y: var(--space-1);
144
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@godxjp/ui",
3
- "version": "18.5.0",
4
- "godxUiMcp": "18.5.0",
3
+ "version": "18.7.0",
4
+ "godxUiMcp": "18.7.0",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@10.29.1",
7
7
  "pnpm": {
@@ -66,6 +66,10 @@
66
66
  "types": "./dist/components/charts/index.d.ts",
67
67
  "import": "./dist/components/charts/index.js"
68
68
  },
69
+ "./charts/compact-bar-trend": {
70
+ "types": "./dist/components/charts/compact-bar-trend.d.ts",
71
+ "import": "./dist/components/charts/compact-bar-trend.js"
72
+ },
69
73
  "./ui": {
70
74
  "types": "./dist/components/ui/index.d.ts",
71
75
  "import": "./dist/components/ui/index.js"
@@ -291,6 +295,8 @@
291
295
  "format": "prettier --check .",
292
296
  "format:fix": "prettier --write .",
293
297
  "test": "vitest run",
298
+ "test:visual:auth-login": "node scripts/auth-shell-login-visual.mjs",
299
+ "test:visual:topbar-collision": "node scripts/topbar-collision-visual.mjs",
294
300
  "test:watch": "vitest",
295
301
  "test:coverage": "vitest run --coverage",
296
302
  "check:example-imports": "node scripts/check-example-imports.mjs",