@godxjp/ui 28.8.0 → 28.9.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 (49) hide show
  1. package/dist/contracts/measurement.json +1 -1
  2. package/dist/lib/variants.js +4 -1
  3. package/dist/props/vocabulary/layout.prop.d.ts +1 -1
  4. package/dist/styles/base.css +47 -14
  5. package/dist/styles/card-layout.css +2 -2
  6. package/dist/styles/chart-layout.css +6 -6
  7. package/dist/styles/control.css +10 -4
  8. package/dist/styles/data-display-layout.css +20 -5
  9. package/dist/styles/density.css +2 -0
  10. package/dist/styles/dialog-layout.css +4 -1
  11. package/dist/styles/focus-ring.css +4 -1
  12. package/dist/styles/layout.css +13 -3
  13. package/dist/styles/shell-layout.css +25 -21
  14. package/dist/styles/text-layout.css +94 -23
  15. package/dist/tokens/components/activity.css +13 -4
  16. package/dist/tokens/components/attachments.css +1 -1
  17. package/dist/tokens/components/badge.css +1 -1
  18. package/dist/tokens/components/card.css +28 -7
  19. package/dist/tokens/components/chart.css +4 -1
  20. package/dist/tokens/components/chat-composer.css +4 -1
  21. package/dist/tokens/components/control.css +69 -30
  22. package/dist/tokens/components/conversations.css +4 -1
  23. package/dist/tokens/components/data-display.css +42 -15
  24. package/dist/tokens/components/data-entry.css +8 -2
  25. package/dist/tokens/components/descriptions.css +1 -1
  26. package/dist/tokens/components/feedback.css +8 -5
  27. package/dist/tokens/components/float-button.css +8 -2
  28. package/dist/tokens/components/legal-document.css +12 -3
  29. package/dist/tokens/components/logo.css +15 -6
  30. package/dist/tokens/components/mega-menu.css +14 -5
  31. package/dist/tokens/components/navigation.css +37 -13
  32. package/dist/tokens/components/segmented.css +4 -1
  33. package/dist/tokens/components/separator.css +4 -1
  34. package/dist/tokens/components/shell.css +96 -31
  35. package/dist/tokens/components/table.css +11 -5
  36. package/dist/tokens/components/thought-chain.css +4 -1
  37. package/dist/tokens/components/toggle.css +4 -1
  38. package/dist/tokens/components/tree.css +1 -1
  39. package/dist/tokens/components/upload.css +21 -9
  40. package/dist/tokens/foundation.css +24 -30
  41. package/dist/tokens/semantic/layout.css +19 -5
  42. package/docs/TOKENS.md +16 -1
  43. package/docs/showcase/case4-login.tsx +10 -2
  44. package/docs/showcase/case5-shift-calendar.tsx +1 -1
  45. package/docs/showcase/case6-agency-handy.tsx +6 -6
  46. package/docs/showcase/futurelastic-web.tsx +7 -9
  47. package/docs/showcase/marketing-page.tsx +13 -13
  48. package/docs/showcase/table-expandable-rows.tsx +4 -1
  49. package/package.json +4 -3
@@ -368,7 +368,7 @@ function TabBar({ active, onChange }: { active: string; onChange: (id: string) =
368
368
  onClick={() => onChange(t.id)}
369
369
  aria-current={isActive ? "page" : undefined}
370
370
  className={
371
- "h-full flex-col rounded-none text-[length:var(--font-size-2xs)] font-medium " +
371
+ "text-[length:var(--font-size-2xs, calc(var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio)))] h-full flex-col rounded-none font-medium " +
372
372
  (isActive ? "text-primary" : "text-muted-foreground")
373
373
  }
374
374
  >
@@ -637,7 +637,7 @@ function InboundTab({
637
637
  <ToggleGroupItem
638
638
  key={f.id}
639
639
  value={f.id}
640
- className="h-9 shrink-0 rounded-full text-[length:var(--font-size-xs)] whitespace-nowrap"
640
+ className="text-[length:var(--font-size-xs, calc(var(--font-size-base) / var(--font-size-ratio)))] h-9 shrink-0 rounded-full whitespace-nowrap"
641
641
  // The library's OWN counter pill, not a `Text` at 70% opacity (gh#643). The
642
642
  // hand-rolled one measured 2.15:1 on the selected chip's --primary fill, because
643
643
  // `opacity-70` blends whatever ink it inherits back towards the fill underneath it —
@@ -852,19 +852,19 @@ function OutboundTab({ seg, setSeg }: { seg: string; setSeg: (v: string) => void
852
852
  <ResponsiveGrid columns={3} gap="xs">
853
853
  <ToggleGroupItem
854
854
  value="seal"
855
- className="h-9 rounded-xl text-[length:var(--font-size-xs)] whitespace-nowrap"
855
+ className="text-[length:var(--font-size-xs, calc(var(--font-size-base) / var(--font-size-ratio)))] h-9 rounded-xl whitespace-nowrap"
856
856
  >
857
857
  Chờ niêm phong
858
858
  </ToggleGroupItem>
859
859
  <ToggleGroupItem
860
860
  value="handoff"
861
- className="h-9 rounded-xl text-[length:var(--font-size-xs)] whitespace-nowrap"
861
+ className="text-[length:var(--font-size-xs, calc(var(--font-size-base) / var(--font-size-ratio)))] h-9 rounded-xl whitespace-nowrap"
862
862
  >
863
863
  Chờ bàn giao
864
864
  </ToggleGroupItem>
865
865
  <ToggleGroupItem
866
866
  value="done"
867
- className="h-9 rounded-xl text-[length:var(--font-size-xs)] whitespace-nowrap"
867
+ className="text-[length:var(--font-size-xs, calc(var(--font-size-base) / var(--font-size-ratio)))] h-9 rounded-xl whitespace-nowrap"
868
868
  >
869
869
  Đã bàn giao
870
870
  </ToggleGroupItem>
@@ -1018,7 +1018,7 @@ export default function AgencyHandyShowcase() {
1018
1018
  <ToggleGroupItem
1019
1019
  key={s}
1020
1020
  value={s}
1021
- className="size-7 rounded-md text-[length:var(--font-size-2xs)] uppercase"
1021
+ className="text-[length:var(--font-size-2xs, calc(var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio)))] size-7 rounded-md uppercase"
1022
1022
  title={s}
1023
1023
  >
1024
1024
  {s[0]}
@@ -55,16 +55,14 @@ const THEME = `
55
55
  --font-family-display: "Sora", system-ui, sans-serif;
56
56
  --font-family-body: "Be Vietnam Pro", system-ui, "Noto Sans JP", sans-serif;
57
57
  --font-family-sans: var(--font-family-body);
58
- /* 80px hero. --font-size-display is the display ramp's BASE KNOB, but overriding it HERE does
59
- not move the derived steps: --font-size-5xl is declared at :root as var(--font-size-display),
60
- so it computes on :root and merely INHERITS down — the freeze docs/TOKENS.md names, and the
61
- reason its role-mirror knobs are declared initial. The whole --font-size-* scale is built this way
62
- (--font-size-lg freezes on --font-size-base identically), so it is a systemic token-tier
63
- defect, not this ramp's, and not gh#826's to fix. Measured, not assumed: with only the line
64
- below, <Heading size="5xl"> painted 54px here, the :root value. Setting the STEP works,
65
- because this declaration is on an ancestor of the heading. */
58
+ /* 80px hero, from the display ramp's BASE KNOB alone (gh#834).
59
+ This used to need a second line — --font-size-5xl: 5rem — and the comment that stood here said
60
+ why: --font-size-5xl was declared at :root as var(--font-size-display), so it substituted on
61
+ <html> and this scope merely INHERITED the answer root had given. Heading size="5xl" painted
62
+ 54px with the display knob alone. The step is an initial knob now and the formula sits at the
63
+ call site, so one line moves the ramp: re-measured here at 80px, with 3xl/4xl following to
64
+ 48.83/62.5px. */
66
65
  --font-size-display: 5rem;
67
- --font-size-5xl: 5rem;
68
66
  /* The glass bar, opted into once (gh#831). acme-website.tsx hand-wrote the identical pair,
69
67
  which is why these are framework knobs now and not two literals on .fl-navbar. */
70
68
  --topbar-background-alpha: 80%;
@@ -34,12 +34,13 @@
34
34
  * objects because no PROP reaches them. Each one is a named gap, in the order a reader meets them:
35
35
  *
36
36
  * 1. THE SECTION BAND — `paddingBlock: var(--space-section-band | --space-section-hero)`.
37
- * gh#831 minted the tokens and nothing reads them. `Flex pad` / `ResponsiveGrid pad` take a
38
- * `GapProp`, whose numeric ladder stops at `12` (`--space-12`, 48px); `--space-20` (80px) and
39
- * `--space-24` (96px) are off the end of it, so the marketing rhythm is the one spacing a
40
- * layout primitive cannot state. It also has no compact step: `--space-section-hero` measures
41
- * 96px at 1440 AND at 320, where the package's own landing preset drops its band through
42
- * `--centered-shell-landing-main-padding-block-compact`.
37
+ * PARTLY CLOSED by gh#839: the numeric `GapProp` ladder now reaches the two band steps, so
38
+ * `pad={{ block: 20 }}` (80px) and `pad={{ block: 24 }}` (96px) state the rhythm through the
39
+ * public API. The bands below still use an inline `style` because each one ALSO needs the
40
+ * centred inner column (`SHELL`), and nothing owns "full-bleed outside, measured column
41
+ * inside" — that half of gh#839 is open. Neither step has a compact variant either:
42
+ * `--space-section-hero` measures 96px at 1440 and at 320, where the package's own landing
43
+ * preset drops its band via `--centered-shell-landing-main-padding-block-compact`.
43
44
  * 2. THE CENTRED COLUMN — `marginInline: auto` + `inlineSize: 100%` +
44
45
  * `maxInlineSize: var(--page-measure-wide)` + `paddingInline: var(--space-6)`, repeated at
45
46
  * every band. gh#831 minted `--page-measure-wide` and deliberately did not add
@@ -50,12 +51,11 @@
50
51
  * here (`docs/roadmap/website-components.md` §5.2 proposed `--affix-inset-block-start` and
51
52
  * `--affix-z-index`; neither shipped) and `Topbar` has no `sticky` prop.
52
53
  * 4. THE GLASS — `--topbar-background-alpha` / `--topbar-backdrop-blur-size` as inline custom
53
- * properties. They are `initial` by design, so a call site MUST set them, and that part is
54
- * correct. The blur is the gap: this library has no blur SCALE (no `--blur-*` tier), so the
55
- * only sources for a length are a raw literal or another component's private knob
56
- * (`--app-launcher-launchpad-backdrop-blur-size`). It reads `--space-2` here, which keeps the
57
- * literal count at zero by borrowing a token that means something else. A `--blur-sm|md|lg`
58
- * foundation tier would close it properly. Measured result: `blur(8px)`.
54
+ * properties. They are `initial` by design, so a call site MUST set them, and that is correct.
55
+ * This used to read `--space-2`, borrowing a token that means something else, because the
56
+ * library had no blur SCALE at all. gh#837 closed that: `--blur-sm|md|lg` now exists in
57
+ * `foundation.css`, deliberately NOT `--scaling`-multiplied, because a backdrop blur is an
58
+ * optical effect and compact density does not mean thinner glass. Measured: `blur(8px)`.
59
59
  * 5. THE HALO — `position: relative` / `overflow: hidden` on the band and `position: absolute` /
60
60
  * `inset: 0` on the `.ui-brand-glow` layer. This is the package's own idiom (both siblings
61
61
  * write `className="ui-brand-glow absolute inset-0"`), spelled as logical inline style so
@@ -189,7 +189,7 @@ const GLASS_BAR: CSSProperties = {
189
189
  package writes for CenteredShell's landing preset, so no page-local media query. */
190
190
  "--topbar-inset": "max(var(--space-6), calc((100% - var(--page-measure-wide)) / 2))",
191
191
  "--topbar-background-alpha": "85%",
192
- "--topbar-backdrop-blur-size": "var(--space-2)",
192
+ "--topbar-backdrop-blur-size": "var(--blur-md)",
193
193
  } as CSSProperties;
194
194
 
195
195
  /** Per-instance halo shaping — the four `--brand-glow-*` knobs, at the call site. */
@@ -299,7 +299,10 @@ function DetailPanel({ employee }: { employee: Employee }) {
299
299
  {/* Per-day breakdown — quiet nested list, real Card chrome */}
300
300
  <Card>
301
301
  <CardHeader>
302
- <CardTitle level={2} className="text-[length:var(--font-size-xs)]">
302
+ <CardTitle
303
+ level={2}
304
+ className="text-[length:var(--font-size-xs, calc(var(--font-size-base) / var(--font-size-ratio)))]"
305
+ >
303
306
  今週の打刻
304
307
  </CardTitle>
305
308
  <CardAction>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@godxjp/ui",
3
- "version": "28.8.0",
4
- "godxUiMcp": "28.8.0",
3
+ "version": "28.9.0",
4
+ "godxUiMcp": "28.9.0",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
@@ -421,7 +421,8 @@
421
421
  "gen:brand": "node scripts/gen-brand.mjs",
422
422
  "check:absorbed-names": "node scripts/check-absorbed-names.mjs",
423
423
  "check:frame-overflow": "node scripts/check-frame-overflow.mjs",
424
- "check:frame-token-wins": "node scripts/check-frame-token-wins.mjs"
424
+ "check:frame-token-wins": "node scripts/check-frame-token-wins.mjs",
425
+ "check:frame-token-scope": "node scripts/check-frame-token-scope.mjs"
425
426
  },
426
427
  "peerDependencies": {
427
428
  "@hookform/resolvers": "^5.2.0",