@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.
- package/dist/components/charts/compact-bar-trend.d.ts +2 -1
- package/dist/components/charts/index.d.ts +4 -1
- package/dist/components/data-display/data-table.d.ts +25 -4
- package/dist/components/data-display/data-table.js +13 -2
- package/dist/components/data-display/empty-state.js +1 -1
- package/dist/components/data-display/index.d.ts +1 -1
- package/dist/components/data-display/list-row.d.ts +19 -0
- package/dist/components/data-display/list-row.js +2 -0
- package/dist/components/data-display/qr-code.d.ts +1 -1
- package/dist/components/data-display/table.d.ts +47 -2
- package/dist/components/data-display/table.js +29 -4
- package/dist/components/data-entry/command.d.ts +10 -10
- package/dist/components/data-entry/index.d.ts +1 -0
- package/dist/components/data-entry/input-otp.d.ts +1 -0
- package/dist/components/feedback/alert.d.ts +20 -2
- package/dist/components/feedback/alert.js +11 -1
- package/dist/components/feedback/dialog.d.ts +14 -1
- package/dist/components/feedback/dialog.js +4 -0
- package/dist/components/feedback/index.d.ts +3 -3
- package/dist/components/feedback/index.js +5 -1
- package/dist/components/general/logo.d.ts +7 -1
- package/dist/components/general/logo.js +1 -1
- package/dist/components/layout/app-shell.d.ts +1 -1
- package/dist/components/layout/app-shell.js +55 -46
- package/dist/components/layout/auth-account-summary.d.ts +5 -0
- package/dist/components/layout/auth-account-summary.js +31 -0
- package/dist/components/layout/auth-shell.d.ts +5 -2
- package/dist/components/layout/centered-shell.d.ts +1 -1
- package/dist/components/layout/centered-shell.js +28 -19
- package/dist/components/layout/error-surface.d.ts +35 -0
- package/dist/components/layout/error-surface.js +155 -0
- package/dist/components/layout/flex.d.ts +1 -1
- package/dist/components/layout/flex.js +4 -0
- package/dist/components/layout/index.d.ts +7 -0
- package/dist/components/layout/index.js +6 -0
- package/dist/components/layout/page-container.d.ts +1 -1
- package/dist/components/layout/page-container.js +23 -41
- package/dist/components/layout/page-header.d.ts +22 -0
- package/dist/components/layout/page-header.js +89 -0
- package/dist/components/navigation/filter-bar.d.ts +2 -2
- package/dist/components/navigation/filter-bar.js +44 -1
- package/dist/components/navigation/index.d.ts +1 -1
- package/dist/components/navigation/steps.js +38 -19
- package/dist/components/navigation/tabs.js +12 -3
- package/dist/components/ui/avatar.d.ts +2 -1
- package/dist/components/ui/avatar.js +2 -1
- package/dist/components/ui/input-otp.d.ts +4 -1
- package/dist/components/ui/input-otp.js +2 -1
- package/dist/components/ui/toggle-group.d.ts +7 -4
- package/dist/components/ui/toggle-group.js +32 -21
- package/dist/email/brand-mark.d.ts +21 -5
- package/dist/email/brand-mark.js +5 -0
- package/dist/email/color.d.ts +2 -1
- package/dist/email/geometry.d.ts +9 -1
- package/dist/email/geometry.js +1 -0
- package/dist/email/index.d.ts +6 -1
- package/dist/email/index.js +6 -0
- package/dist/email/inline-style.d.ts +7 -5
- package/dist/email/inline-style.js +5 -0
- package/dist/email/tokens.generated.d.ts +40 -20
- package/dist/email/tokens.generated.js +40 -20
- package/dist/email/urgency.d.ts +22 -0
- package/dist/email/urgency.js +14 -0
- package/dist/i18n/messages/en.json +26 -1
- package/dist/i18n/messages/ja.json +23 -1
- package/dist/i18n/messages/vi.json +23 -1
- package/dist/props/components/data-display.prop.d.ts +63 -1
- package/dist/props/components/data-entry.prop.d.ts +6 -0
- package/dist/props/components/feedback.prop.d.ts +6 -0
- package/dist/props/components/index.d.ts +1 -1
- package/dist/props/components/layout.prop.d.ts +244 -4
- package/dist/props/components/navigation.prop.d.ts +57 -1
- package/dist/props/registry.d.ts +205 -5
- package/dist/props/registry.js +270 -6
- package/dist/props/vocabulary/data.prop.d.ts +27 -0
- package/dist/props/vocabulary/index.d.ts +3 -3
- package/dist/props/vocabulary/interaction.prop.d.ts +19 -2
- package/dist/props/vocabulary/layout.prop.d.ts +41 -7
- package/dist/styles/alert-layout.css +36 -0
- package/dist/styles/control.css +28 -0
- package/dist/styles/data-display-layout.css +26 -0
- package/dist/styles/layout.css +212 -0
- package/dist/styles/logo-layout.css +42 -9
- package/dist/styles/navigation-layout.css +109 -0
- package/dist/styles/shell-layout.css +336 -0
- package/dist/styles/table-layout.css +164 -1
- package/dist/theme/dxs.canonical.css +5 -4
- package/dist/tokens/axes.css +4 -3
- package/dist/tokens/base.css +1 -0
- package/dist/tokens/components/data-display.css +13 -0
- package/dist/tokens/components/email.css +43 -16
- package/dist/tokens/components/error-surface.css +36 -0
- package/dist/tokens/components/feedback.css +20 -0
- package/dist/tokens/components/list-row.css +20 -0
- package/dist/tokens/components/logo.css +52 -10
- package/dist/tokens/components/navigation.css +41 -0
- package/dist/tokens/components/shell.css +109 -0
- package/dist/tokens/components/table.css +45 -0
- package/dist/tokens/foundation.css +26 -0
- package/dist/tokens/semantic/layout.css +38 -0
- 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.
|
|
4
|
-
"godxUiMcp": "18.
|
|
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",
|