@godxjp/ui 13.17.4 → 14.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.
Files changed (60) hide show
  1. package/dist/components/charts/area-chart.d.ts +8 -0
  2. package/dist/components/charts/area-chart.js +8 -0
  3. package/dist/components/charts/bar-chart.d.ts +8 -0
  4. package/dist/components/charts/bar-chart.js +8 -0
  5. package/dist/components/charts/chart-cartesian.d.ts +31 -0
  6. package/dist/components/charts/chart-cartesian.js +178 -0
  7. package/dist/components/charts/chart-frame.d.ts +44 -0
  8. package/dist/components/charts/chart-frame.js +72 -0
  9. package/dist/components/charts/chart-summary.d.ts +21 -0
  10. package/dist/components/charts/chart-summary.js +23 -0
  11. package/dist/components/charts/index.d.ts +16 -0
  12. package/dist/components/charts/index.js +12 -0
  13. package/dist/components/charts/line-chart.d.ts +8 -0
  14. package/dist/components/charts/line-chart.js +8 -0
  15. package/dist/components/charts/pie-chart.d.ts +8 -0
  16. package/dist/components/charts/pie-chart.js +73 -0
  17. package/dist/components/data-display/index.d.ts +2 -0
  18. package/dist/components/data-display/index.js +2 -0
  19. package/dist/components/data-display/list-row.d.ts +24 -0
  20. package/dist/components/data-display/list-row.js +31 -0
  21. package/dist/components/data-entry/command.d.ts +10 -10
  22. package/dist/components/data-entry/transfer.js +1 -1
  23. package/dist/components/general/button.d.ts +1 -0
  24. package/dist/components/general/button.js +3 -0
  25. package/dist/components/general/index.d.ts +2 -0
  26. package/dist/components/general/index.js +4 -1
  27. package/dist/components/general/logo.d.ts +28 -0
  28. package/dist/components/general/logo.js +45 -0
  29. package/dist/components/layout/index.d.ts +1 -1
  30. package/dist/components/layout/sidebar.js +32 -24
  31. package/dist/components/layout/topbar.d.ts +19 -2
  32. package/dist/components/layout/topbar.js +7 -128
  33. package/dist/i18n/messages/en.json +5 -0
  34. package/dist/i18n/messages/ja.json +5 -0
  35. package/dist/i18n/messages/vi.json +5 -0
  36. package/dist/props/components/charts.prop.d.ts +89 -0
  37. package/dist/props/components/charts.prop.js +0 -0
  38. package/dist/props/components/general.prop.d.ts +5 -0
  39. package/dist/props/components/index.d.ts +2 -1
  40. package/dist/props/components/layout.prop.d.ts +16 -33
  41. package/dist/props/registry.d.ts +170 -11
  42. package/dist/props/registry.js +112 -11
  43. package/dist/styles/chart-layout.css +37 -0
  44. package/dist/styles/data-display-layout.css +38 -0
  45. package/dist/styles/index.css +1 -0
  46. package/dist/styles/shell-layout.css +39 -0
  47. package/dist/styles/text-layout.css +3 -0
  48. package/dist/tokens/base.css +2 -0
  49. package/dist/tokens/components/list-row.css +9 -0
  50. package/dist/tokens/components/logo.css +11 -0
  51. package/dist/tokens/foundation.css +13 -0
  52. package/package.json +42 -7
  53. package/scripts/_agent-setup.mjs +145 -0
  54. package/scripts/audit-hook.mjs +66 -0
  55. package/scripts/cli.mjs +26 -0
  56. package/scripts/init-agent-kit.mjs +52 -0
  57. package/scripts/postinstall.mjs +31 -0
  58. package/scripts/ui-audit.mjs +165 -3
  59. package/scripts/visual-audit-rules.mjs +119 -0
  60. package/scripts/visual-audit.mjs +261 -0
@@ -103,37 +103,20 @@ export type SidebarProp = {
103
103
  renderItem?: (item: SidebarItemData) => ReactNode;
104
104
  footer?: ReactNode;
105
105
  };
106
- /** @see Topbar */
107
- export type TopbarProductProp = {
108
- name: string;
109
- color?: string;
110
- };
111
- /** @see Topbar */
112
- export type TopbarProjectProp = {
113
- name: string;
114
- };
115
- /** @see Topbar */
116
- export type TopbarProp = {
117
- product: TopbarProductProp;
118
- project?: TopbarProjectProp | null;
119
- /** Dropdown content for the product chip — renders a `DropdownMenuContent`. Turns the chip
120
- * into a switcher (e.g. an active-entity picker) instead of firing `onProductOpen`. */
121
- productMenu?: ReactNode;
122
- /** Dropdown content for the project chip. When neither `project` nor `projectMenu` is set the
123
- * project chip is hidden (no dead "Pick project" placeholder). */
124
- projectMenu?: ReactNode;
125
- onProductOpen?: () => void;
126
- onProjectOpen?: () => void;
127
- onSearchOpen?: () => void;
128
- onTweaksOpen?: () => void;
129
- collapsed?: boolean;
130
- onToggleCollapsed?: () => void;
131
- rightSlot?: ReactNode;
132
- unread?: boolean;
133
- /** Accessible placeholder when project is intentionally unset but a project chip is rendered. */
134
- projectPlaceholder?: string;
135
- /** Search-bar placeholder text — defaults to the i18n `layout.topbar.searchPlaceholder`. */
136
- searchPlaceholder?: string;
137
- onNotificationsOpen?: () => void;
138
- user?: ReactNode;
106
+ /**
107
+ * @see Topbar — a PURE SLOT bar (no baked chrome). The library only positions three clusters; the
108
+ * CONSUMER decides what goes in each (brand `Logo`, sidebar toggle, nav, a search trigger, settings
109
+ * pickers like `AppSettingPicker`, a notification button, a user menu). The shell never forces a
110
+ * product switcher, a search box, or a language picker — those are the consumer's components,
111
+ * configured via THEIR own props and dropped into a slot.
112
+ */
113
+ export type TopbarProp = Omit<React.HTMLAttributes<HTMLDivElement>, "children"> & {
114
+ /** Inline-start cluster — typically the sidebar toggle + brand `Logo` + primary nav. */
115
+ start?: ReactNode;
116
+ /** Center cluster optional (e.g. a search trigger or a page/entity switcher). */
117
+ center?: ReactNode;
118
+ /** Inline-end cluster — settings pickers, notifications, the user menu. */
119
+ end?: ReactNode;
120
+ /** Escape hatch render fully custom bar content instead of the three slots. */
121
+ children?: ReactNode;
139
122
  };
@@ -453,20 +453,10 @@ export declare const COMPONENT_PROP_REGISTRY: {
453
453
  readonly file: "components/layout.prop.ts";
454
454
  readonly vocabulary: readonly ["IdProp", "OnValueChangeProp", "ChildrenProp"];
455
455
  };
456
- readonly TopbarProductProp: {
457
- readonly group: "layout";
458
- readonly file: "components/layout.prop.ts";
459
- readonly vocabulary: readonly ["LabelProp"];
460
- };
461
- readonly TopbarProjectProp: {
462
- readonly group: "layout";
463
- readonly file: "components/layout.prop.ts";
464
- readonly vocabulary: readonly ["LabelProp"];
465
- };
466
456
  readonly TopbarProp: {
467
457
  readonly group: "layout";
468
458
  readonly file: "components/layout.prop.ts";
469
- readonly vocabulary: readonly ["ChildrenProp", "OnOpenChangeProp", "OnValueChangeProp"];
459
+ readonly vocabulary: readonly ["ChildrenProp"];
470
460
  };
471
461
  readonly ButtonProp: {
472
462
  readonly group: "general";
@@ -690,6 +680,175 @@ export declare const COMPONENT_PROP_REGISTRY: {
690
680
  readonly file: "components/data-display.prop.ts";
691
681
  readonly vocabulary: readonly ["ColumnDefProp", "DensityProp", "SortStateProp", "SelectedIdsProp"];
692
682
  };
683
+ readonly ChartSeriesProp: {
684
+ readonly group: "data-display";
685
+ readonly file: "components/charts.prop.ts";
686
+ readonly vocabulary: readonly ["LabelProp", {
687
+ readonly field: "dataKey";
688
+ readonly local: true;
689
+ readonly reason: "Accessor key into each datum for this series.";
690
+ }, {
691
+ readonly field: "color";
692
+ readonly local: true;
693
+ readonly reason: "Per-series colour override (defaults to --chart-N).";
694
+ }];
695
+ };
696
+ readonly LineChartProp: {
697
+ readonly group: "data-display";
698
+ readonly file: "components/charts.prop.ts";
699
+ readonly vocabulary: readonly ["LabelProp", "DescriptionProp", "SizeProp", "EmptyMessageProp", "ClassNameProp", "IdProp", {
700
+ readonly field: "data";
701
+ readonly local: true;
702
+ readonly reason: "Chart row data (category + value per series).";
703
+ }, {
704
+ readonly field: "series";
705
+ readonly local: true;
706
+ readonly reason: "Plotted series descriptors.";
707
+ }, {
708
+ readonly field: "categoryKey";
709
+ readonly local: true;
710
+ readonly reason: "Accessor key for the x-axis category.";
711
+ }, {
712
+ readonly field: "height";
713
+ readonly local: true;
714
+ readonly reason: "Explicit canvas height px (overrides size tier).";
715
+ }, {
716
+ readonly field: "showLegend";
717
+ readonly local: true;
718
+ readonly reason: "Chart-specific legend toggle.";
719
+ }, {
720
+ readonly field: "showGrid";
721
+ readonly local: true;
722
+ readonly reason: "Chart-specific grid toggle.";
723
+ }, {
724
+ readonly field: "numberFormat";
725
+ readonly local: true;
726
+ readonly reason: "Intl.NumberFormat options for ticks/tooltips.";
727
+ }, {
728
+ readonly field: "curved";
729
+ readonly local: true;
730
+ readonly reason: "Smooth (monotone) line rendering.";
731
+ }];
732
+ };
733
+ readonly BarChartProp: {
734
+ readonly group: "data-display";
735
+ readonly file: "components/charts.prop.ts";
736
+ readonly vocabulary: readonly ["LabelProp", "DescriptionProp", "SizeProp", "EmptyMessageProp", "ClassNameProp", "IdProp", {
737
+ readonly field: "data";
738
+ readonly local: true;
739
+ readonly reason: "Chart row data (category + value per series).";
740
+ }, {
741
+ readonly field: "series";
742
+ readonly local: true;
743
+ readonly reason: "Plotted series descriptors.";
744
+ }, {
745
+ readonly field: "categoryKey";
746
+ readonly local: true;
747
+ readonly reason: "Accessor key for the category axis.";
748
+ }, {
749
+ readonly field: "height";
750
+ readonly local: true;
751
+ readonly reason: "Explicit canvas height px (overrides size tier).";
752
+ }, {
753
+ readonly field: "showLegend";
754
+ readonly local: true;
755
+ readonly reason: "Chart-specific legend toggle.";
756
+ }, {
757
+ readonly field: "showGrid";
758
+ readonly local: true;
759
+ readonly reason: "Chart-specific grid toggle.";
760
+ }, {
761
+ readonly field: "numberFormat";
762
+ readonly local: true;
763
+ readonly reason: "Intl.NumberFormat options for ticks/tooltips.";
764
+ }, {
765
+ readonly field: "stacked";
766
+ readonly local: true;
767
+ readonly reason: "Stack series into one bar.";
768
+ }, {
769
+ readonly field: "horizontal";
770
+ readonly local: true;
771
+ readonly reason: "Category axis on the left.";
772
+ }];
773
+ };
774
+ readonly AreaChartProp: {
775
+ readonly group: "data-display";
776
+ readonly file: "components/charts.prop.ts";
777
+ readonly vocabulary: readonly ["LabelProp", "DescriptionProp", "SizeProp", "EmptyMessageProp", "ClassNameProp", "IdProp", {
778
+ readonly field: "data";
779
+ readonly local: true;
780
+ readonly reason: "Chart row data (category + value per series).";
781
+ }, {
782
+ readonly field: "series";
783
+ readonly local: true;
784
+ readonly reason: "Plotted series descriptors.";
785
+ }, {
786
+ readonly field: "categoryKey";
787
+ readonly local: true;
788
+ readonly reason: "Accessor key for the x-axis category.";
789
+ }, {
790
+ readonly field: "height";
791
+ readonly local: true;
792
+ readonly reason: "Explicit canvas height px (overrides size tier).";
793
+ }, {
794
+ readonly field: "showLegend";
795
+ readonly local: true;
796
+ readonly reason: "Chart-specific legend toggle.";
797
+ }, {
798
+ readonly field: "showGrid";
799
+ readonly local: true;
800
+ readonly reason: "Chart-specific grid toggle.";
801
+ }, {
802
+ readonly field: "numberFormat";
803
+ readonly local: true;
804
+ readonly reason: "Intl.NumberFormat options for ticks/tooltips.";
805
+ }, {
806
+ readonly field: "stacked";
807
+ readonly local: true;
808
+ readonly reason: "Stack series areas.";
809
+ }, {
810
+ readonly field: "curved";
811
+ readonly local: true;
812
+ readonly reason: "Smooth (monotone) area rendering.";
813
+ }];
814
+ };
815
+ readonly PieChartProp: {
816
+ readonly group: "data-display";
817
+ readonly file: "components/charts.prop.ts";
818
+ readonly vocabulary: readonly ["LabelProp", "DescriptionProp", "SizeProp", "EmptyMessageProp", "ClassNameProp", "IdProp", {
819
+ readonly field: "data";
820
+ readonly local: true;
821
+ readonly reason: "Chart row data (one slice per row).";
822
+ }, {
823
+ readonly field: "dataKey";
824
+ readonly local: true;
825
+ readonly reason: "Accessor key for the slice value.";
826
+ }, {
827
+ readonly field: "nameKey";
828
+ readonly local: true;
829
+ readonly reason: "Accessor key for the slice category label.";
830
+ }, {
831
+ readonly field: "colors";
832
+ readonly local: true;
833
+ readonly reason: "Per-slice colour overrides (defaults to --chart-N).";
834
+ }, {
835
+ readonly field: "height";
836
+ readonly local: true;
837
+ readonly reason: "Explicit canvas height px (overrides size tier).";
838
+ }, {
839
+ readonly field: "showLegend";
840
+ readonly local: true;
841
+ readonly reason: "Chart-specific legend toggle.";
842
+ }, {
843
+ readonly field: "numberFormat";
844
+ readonly local: true;
845
+ readonly reason: "Intl.NumberFormat options for tooltips.";
846
+ }, {
847
+ readonly field: "donut";
848
+ readonly local: true;
849
+ readonly reason: "Hollow-centre donut rendering.";
850
+ }];
851
+ };
693
852
  readonly AlertDialogProp: {
694
853
  readonly group: "feedback";
695
854
  readonly file: "components/feedback.prop.ts";
@@ -431,20 +431,10 @@ const COMPONENT_PROP_REGISTRY = {
431
431
  file: "components/layout.prop.ts",
432
432
  vocabulary: ["IdProp", "OnValueChangeProp", "ChildrenProp"]
433
433
  },
434
- TopbarProductProp: {
435
- group: "layout",
436
- file: "components/layout.prop.ts",
437
- vocabulary: ["LabelProp"]
438
- },
439
- TopbarProjectProp: {
440
- group: "layout",
441
- file: "components/layout.prop.ts",
442
- vocabulary: ["LabelProp"]
443
- },
444
434
  TopbarProp: {
445
435
  group: "layout",
446
436
  file: "components/layout.prop.ts",
447
- vocabulary: ["ChildrenProp", "OnOpenChangeProp", "OnValueChangeProp"]
437
+ vocabulary: ["ChildrenProp"]
448
438
  },
449
439
  ButtonProp: {
450
440
  group: "general",
@@ -732,6 +722,117 @@ const COMPONENT_PROP_REGISTRY = {
732
722
  file: "components/data-display.prop.ts",
733
723
  vocabulary: ["ColumnDefProp", "DensityProp", "SortStateProp", "SelectedIdsProp"]
734
724
  },
725
+ ChartSeriesProp: {
726
+ group: "data-display",
727
+ file: "components/charts.prop.ts",
728
+ vocabulary: [
729
+ "LabelProp",
730
+ { field: "dataKey", local: true, reason: "Accessor key into each datum for this series." },
731
+ {
732
+ field: "color",
733
+ local: true,
734
+ reason: "Per-series colour override (defaults to --chart-N)."
735
+ }
736
+ ]
737
+ },
738
+ LineChartProp: {
739
+ group: "data-display",
740
+ file: "components/charts.prop.ts",
741
+ vocabulary: [
742
+ "LabelProp",
743
+ "DescriptionProp",
744
+ "SizeProp",
745
+ "EmptyMessageProp",
746
+ "ClassNameProp",
747
+ "IdProp",
748
+ { field: "data", local: true, reason: "Chart row data (category + value per series)." },
749
+ { field: "series", local: true, reason: "Plotted series descriptors." },
750
+ { field: "categoryKey", local: true, reason: "Accessor key for the x-axis category." },
751
+ { field: "height", local: true, reason: "Explicit canvas height px (overrides size tier)." },
752
+ { field: "showLegend", local: true, reason: "Chart-specific legend toggle." },
753
+ { field: "showGrid", local: true, reason: "Chart-specific grid toggle." },
754
+ {
755
+ field: "numberFormat",
756
+ local: true,
757
+ reason: "Intl.NumberFormat options for ticks/tooltips."
758
+ },
759
+ { field: "curved", local: true, reason: "Smooth (monotone) line rendering." }
760
+ ]
761
+ },
762
+ BarChartProp: {
763
+ group: "data-display",
764
+ file: "components/charts.prop.ts",
765
+ vocabulary: [
766
+ "LabelProp",
767
+ "DescriptionProp",
768
+ "SizeProp",
769
+ "EmptyMessageProp",
770
+ "ClassNameProp",
771
+ "IdProp",
772
+ { field: "data", local: true, reason: "Chart row data (category + value per series)." },
773
+ { field: "series", local: true, reason: "Plotted series descriptors." },
774
+ { field: "categoryKey", local: true, reason: "Accessor key for the category axis." },
775
+ { field: "height", local: true, reason: "Explicit canvas height px (overrides size tier)." },
776
+ { field: "showLegend", local: true, reason: "Chart-specific legend toggle." },
777
+ { field: "showGrid", local: true, reason: "Chart-specific grid toggle." },
778
+ {
779
+ field: "numberFormat",
780
+ local: true,
781
+ reason: "Intl.NumberFormat options for ticks/tooltips."
782
+ },
783
+ { field: "stacked", local: true, reason: "Stack series into one bar." },
784
+ { field: "horizontal", local: true, reason: "Category axis on the left." }
785
+ ]
786
+ },
787
+ AreaChartProp: {
788
+ group: "data-display",
789
+ file: "components/charts.prop.ts",
790
+ vocabulary: [
791
+ "LabelProp",
792
+ "DescriptionProp",
793
+ "SizeProp",
794
+ "EmptyMessageProp",
795
+ "ClassNameProp",
796
+ "IdProp",
797
+ { field: "data", local: true, reason: "Chart row data (category + value per series)." },
798
+ { field: "series", local: true, reason: "Plotted series descriptors." },
799
+ { field: "categoryKey", local: true, reason: "Accessor key for the x-axis category." },
800
+ { field: "height", local: true, reason: "Explicit canvas height px (overrides size tier)." },
801
+ { field: "showLegend", local: true, reason: "Chart-specific legend toggle." },
802
+ { field: "showGrid", local: true, reason: "Chart-specific grid toggle." },
803
+ {
804
+ field: "numberFormat",
805
+ local: true,
806
+ reason: "Intl.NumberFormat options for ticks/tooltips."
807
+ },
808
+ { field: "stacked", local: true, reason: "Stack series areas." },
809
+ { field: "curved", local: true, reason: "Smooth (monotone) area rendering." }
810
+ ]
811
+ },
812
+ PieChartProp: {
813
+ group: "data-display",
814
+ file: "components/charts.prop.ts",
815
+ vocabulary: [
816
+ "LabelProp",
817
+ "DescriptionProp",
818
+ "SizeProp",
819
+ "EmptyMessageProp",
820
+ "ClassNameProp",
821
+ "IdProp",
822
+ { field: "data", local: true, reason: "Chart row data (one slice per row)." },
823
+ { field: "dataKey", local: true, reason: "Accessor key for the slice value." },
824
+ { field: "nameKey", local: true, reason: "Accessor key for the slice category label." },
825
+ {
826
+ field: "colors",
827
+ local: true,
828
+ reason: "Per-slice colour overrides (defaults to --chart-N)."
829
+ },
830
+ { field: "height", local: true, reason: "Explicit canvas height px (overrides size tier)." },
831
+ { field: "showLegend", local: true, reason: "Chart-specific legend toggle." },
832
+ { field: "numberFormat", local: true, reason: "Intl.NumberFormat options for tooltips." },
833
+ { field: "donut", local: true, reason: "Hollow-centre donut rendering." }
834
+ ]
835
+ },
735
836
  AlertDialogProp: {
736
837
  group: "feedback",
737
838
  file: "components/feedback.prop.ts",
@@ -0,0 +1,37 @@
1
+ /* Chart layout — the accessible figure chrome for `@godxjp/ui/charts`.
2
+ * Colours come from the foundation `--chart-1..6` + semantic tokens; recharts
3
+ * draws the SVG itself. Logical properties only (RTL-safe). */
4
+
5
+ .ui-chart {
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: var(--space-stack-sm);
9
+ margin: 0;
10
+ inline-size: 100%;
11
+ }
12
+
13
+ .ui-chart-title {
14
+ font-size: var(--font-size-sm);
15
+ font-weight: var(--font-weight-medium);
16
+ color: hsl(var(--foreground));
17
+ }
18
+
19
+ .ui-chart-canvas {
20
+ inline-size: 100%;
21
+ }
22
+
23
+ /* recharts legend/axis text inherits the design typography + muted tone. */
24
+ .ui-chart .recharts-text,
25
+ .ui-chart .recharts-legend-item-text {
26
+ font-size: var(--font-size-xs);
27
+ fill: hsl(var(--muted-foreground));
28
+ color: hsl(var(--muted-foreground));
29
+ }
30
+
31
+ .ui-chart .recharts-default-tooltip {
32
+ border-radius: var(--radius);
33
+ border: 1px solid hsl(var(--border)) !important;
34
+ background: hsl(var(--popover)) !important;
35
+ color: hsl(var(--popover-foreground));
36
+ font-size: var(--font-size-xs);
37
+ }
@@ -426,3 +426,41 @@
426
426
  .ui-carousel[data-orientation="vertical"] .ui-carousel-next {
427
427
  bottom: var(--space-2);
428
428
  }
429
+
430
+ @layer components {
431
+ /* ListRow — single-line entity row (leading · title/description · trailing) for short lists
432
+ * inside a flush CardContent. Rows separate with a quiet divider; the last row leaves the
433
+ * Card border to close the list. Logical properties throughout (RTL-safe). */
434
+ [data-slot="list-row"] {
435
+ display: flex;
436
+ align-items: center;
437
+ gap: var(--list-row-gap);
438
+ padding: var(--list-row-padding-y) var(--list-row-padding-x);
439
+ }
440
+ [data-slot="list-row"][data-align="start"] {
441
+ align-items: flex-start;
442
+ }
443
+ [data-slot="list-row"]:not(:last-child) {
444
+ border-block-end: var(--list-row-border);
445
+ }
446
+ [data-slot="list-row-leading"] {
447
+ display: inline-flex;
448
+ flex-shrink: 0;
449
+ align-items: center;
450
+ justify-content: center;
451
+ color: hsl(var(--muted-foreground));
452
+ }
453
+ [data-slot="list-row-body"] {
454
+ display: flex;
455
+ min-width: 0;
456
+ flex: 1 1 auto;
457
+ flex-direction: column;
458
+ }
459
+ [data-slot="list-row-trailing"] {
460
+ display: inline-flex;
461
+ flex-shrink: 0;
462
+ align-items: center;
463
+ gap: var(--space-2);
464
+ margin-inline-start: auto;
465
+ }
466
+ }
@@ -44,6 +44,7 @@
44
44
  @import "./data-entry-layout.css";
45
45
  @import "./form-layout.css";
46
46
  @import "./navigation-layout.css";
47
+ @import "./chart-layout.css";
47
48
 
48
49
  @theme {
49
50
  --color-background: hsl(var(--background));
@@ -151,6 +151,13 @@
151
151
  background: hsl(var(--accent));
152
152
  }
153
153
 
154
+ /* Non-interactive brand header — no click target, so no pointer/hover affordance and no caret. */
155
+ .sb-product-static,
156
+ .sb-product-static:hover {
157
+ cursor: default;
158
+ background: transparent;
159
+ }
160
+
154
161
  .sb-logo-mark {
155
162
  display: grid;
156
163
  width: 1.75rem;
@@ -491,6 +498,30 @@
491
498
  gap: 2px;
492
499
  }
493
500
 
501
+ /* Topbar — a pure slot bar. start (inline-start) · center (grows, centered) · end (inline-end).
502
+ * The library owns ONLY this positioning; every control inside is the consumer's to compose. */
503
+ .ui-topbar {
504
+ display: flex;
505
+ width: 100%;
506
+ align-items: center;
507
+ gap: var(--space-2);
508
+ }
509
+ .ui-topbar-start,
510
+ .ui-topbar-center,
511
+ .ui-topbar-end {
512
+ display: flex;
513
+ min-width: 0;
514
+ align-items: center;
515
+ gap: var(--space-2);
516
+ }
517
+ .ui-topbar-center {
518
+ flex: 1 1 auto;
519
+ justify-content: center;
520
+ }
521
+ .ui-topbar-end {
522
+ margin-inline-start: auto;
523
+ }
524
+
494
525
  .tb-chip {
495
526
  display: inline-flex;
496
527
  max-width: 15rem;
@@ -520,6 +551,14 @@
520
551
  color: hsl(var(--muted-foreground));
521
552
  }
522
553
 
554
+ /* Non-interactive brand chip — no menu/handler, so no pointer/hover affordance and no caret. */
555
+ .tb-chip-static,
556
+ .tb-chip-static:hover {
557
+ border-color: transparent;
558
+ background: transparent;
559
+ cursor: default;
560
+ }
561
+
523
562
  .tb-chip-icon {
524
563
  display: grid;
525
564
  width: 1.125rem;
@@ -98,6 +98,9 @@
98
98
  overflow: hidden;
99
99
  text-overflow: ellipsis;
100
100
  white-space: nowrap;
101
+ /* min-width:0 lets a truncating Text shrink inside a flex row WITHOUT the consumer
102
+ * having to add `min-w-0` — the documented flex-truncate idiom (issue #114). */
103
+ min-width: 0;
101
104
  }
102
105
  [data-slot="text"][data-tabular] {
103
106
  font-variant-numeric: tabular-nums;
@@ -14,5 +14,7 @@
14
14
  @import "./components/badge.css";
15
15
  @import "./components/navigation.css";
16
16
  @import "./components/data-display.css";
17
+ @import "./components/list-row.css";
18
+ @import "./components/logo.css";
17
19
  @import "./components/data-entry.css";
18
20
  @import "./components/shell.css";
@@ -0,0 +1,9 @@
1
+ /* ListRow component tokens — a single-line entity row for short lists inside a Card
2
+ * (sessions / API tokens / linked accounts / passkeys …). Sits in a flush CardContent;
3
+ * rows separate with a quiet divider (#44 — chrome defaults to the calm semantic border). */
4
+ :root {
5
+ --list-row-padding-y: var(--space-3);
6
+ --list-row-padding-x: var(--space-4);
7
+ --list-row-gap: var(--space-3);
8
+ --list-row-border: 1px solid hsl(var(--border));
9
+ }
@@ -0,0 +1,11 @@
1
+ /* Logo (brand mark) component tokens. Box size and corner radius are knobs (#45) so a service can
2
+ * match its own grid without forking the mark; brand fill follows --primary. The `size` prop picks
3
+ * the step; a service retunes the steps globally here. (Not a --control-height tier — the mark is
4
+ * decorative, not a density-aware interactive control.) */
5
+ :root {
6
+ --logo-size: 2rem; /* md */
7
+ --logo-size-xs: 1.5rem;
8
+ --logo-size-sm: 1.75rem;
9
+ --logo-size-lg: 2.5rem;
10
+ --logo-radius: var(--radius);
11
+ }
@@ -234,6 +234,19 @@
234
234
  --space-chrome-y: var(--space-4);
235
235
  --space-chrome-gap: var(--space-2);
236
236
  --field-label-gap: var(--space-2);
237
+
238
+ /* Motion — the primitive tier for animation, so enter/transition timing reads a token
239
+ * instead of a literal 0.5s / cubic-bezier(...) / translateY(10px) (cardinal rule #2).
240
+ * dxs-kintai keeps motion LOW: short durations, a calm decelerate curve, a small reveal shift.
241
+ * Consumers honour prefers-reduced-motion at the call site. */
242
+ --duration-fast: 150ms;
243
+ --duration-base: 250ms;
244
+ --duration-slow: 500ms;
245
+ --ease-standard: cubic-bezier(0.2, 0, 0, 1);
246
+ --ease-emphasized: cubic-bezier(0.32, 0.72, 0, 1);
247
+ --ease-decelerate: cubic-bezier(0, 0, 0, 1);
248
+ --ease-accelerate: cubic-bezier(0.3, 0, 1, 1);
249
+ --reveal-distance: 10px;
237
250
  }
238
251
 
239
252
  .dark,