@godxjp/ui 19.3.1 → 19.4.1

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 (128) hide show
  1. package/dist/components/data-display/badge.d.ts +9 -1
  2. package/dist/components/data-display/badge.js +3 -2
  3. package/dist/components/data-display/index.d.ts +2 -0
  4. package/dist/components/data-display/index.js +2 -0
  5. package/dist/components/data-display/popover.d.ts +13 -1
  6. package/dist/components/data-display/popover.js +3 -1
  7. package/dist/components/data-display/table.d.ts +19 -2
  8. package/dist/components/data-display/table.js +4 -1
  9. package/dist/components/data-display/timeline-grid.d.ts +18 -0
  10. package/dist/components/data-display/timeline-grid.js +222 -0
  11. package/dist/components/data-entry/cascader.js +4 -6
  12. package/dist/components/data-entry/checkbox.js +1 -1
  13. package/dist/components/data-entry/search-select.js +5 -7
  14. package/dist/components/data-entry/select.js +32 -28
  15. package/dist/components/data-entry/tree-select.js +4 -6
  16. package/dist/components/general/inert-background.d.ts +5 -0
  17. package/dist/components/general/inert-background.js +48 -0
  18. package/dist/components/layout/auth-shell.d.ts +4 -2
  19. package/dist/components/layout/auth-shell.js +7 -1
  20. package/dist/components/layout/centered-shell.d.ts +2 -2
  21. package/dist/components/layout/flex.d.ts +1 -1
  22. package/dist/components/layout/flex.js +2 -1
  23. package/dist/components/layout/index.d.ts +3 -0
  24. package/dist/components/layout/index.js +2 -0
  25. package/dist/components/layout/mobile-shell.d.ts +21 -0
  26. package/dist/components/layout/mobile-shell.js +43 -0
  27. package/dist/components/layout/sidebar-link.d.ts +1 -1
  28. package/dist/components/navigation/context-menu.js +13 -9
  29. package/dist/components/navigation/dropdown-menu.js +17 -13
  30. package/dist/inertia/index.d.ts +1 -1
  31. package/dist/lib/variants.d.ts +3 -3
  32. package/dist/lib/variants.js +1 -0
  33. package/dist/props/components/data-display.prop.d.ts +65 -0
  34. package/dist/props/components/data-entry.prop.d.ts +1 -1
  35. package/dist/props/components/layout.prop.d.ts +93 -6
  36. package/dist/props/registry.d.ts +109 -2
  37. package/dist/props/registry.js +143 -0
  38. package/dist/props/vocabulary/data.prop.d.ts +6 -0
  39. package/dist/props/vocabulary/index.d.ts +3 -3
  40. package/dist/props/vocabulary/layout.prop.d.ts +17 -2
  41. package/dist/props/vocabulary/shared.prop.d.ts +7 -0
  42. package/dist/styles/control.css +18 -1
  43. package/dist/styles/data-display-layout.css +167 -0
  44. package/dist/styles/layout.css +7 -0
  45. package/dist/styles/shell-layout.css +148 -0
  46. package/dist/styles/table-layout.css +23 -4
  47. package/dist/tokens/components/control.css +1 -0
  48. package/dist/tokens/components/data-display.css +20 -0
  49. package/dist/tokens/components/shell.css +22 -0
  50. package/dist/tokens/components/table.css +2 -0
  51. package/docs/FRAME-A11Y-CI.md +99 -17
  52. package/docs/FRAME-COVERAGE-REPORT.md +4 -2
  53. package/docs/SPACING.md +19 -6
  54. package/docs/charts/compact-bar-trend.tsx +5 -6
  55. package/docs/data-display/avatar.tsx +7 -9
  56. package/docs/data-display/badge.tsx +1 -1
  57. package/docs/data-display/card/index.tsx +6 -4
  58. package/docs/data-display/data-table/examples/approval-queue.tsx +1 -1
  59. package/docs/data-display/data-table/index.tsx +1 -1
  60. package/docs/data-display/permission-matrix.tsx +2 -2
  61. package/docs/data-display/popover.tsx +4 -1
  62. package/docs/data-display/scroll-area.tsx +1 -1
  63. package/docs/data-display/table.tsx +1 -1
  64. package/docs/data-display/timeline-grid.tsx +119 -0
  65. package/docs/data-entry/branch-scope-picker.tsx +1 -1
  66. package/docs/data-entry/date-picker.tsx +2 -1
  67. package/docs/data-entry/form-field/index.tsx +2 -2
  68. package/docs/data-entry/input-otp.tsx +1 -1
  69. package/docs/data-entry/select-matrix.tsx +2 -1
  70. package/docs/data-entry/select.tsx +3 -1
  71. package/docs/data-entry/textarea.tsx +1 -1
  72. package/docs/data-entry/toggle-count.tsx +1 -1
  73. package/docs/feedback/alert.tsx +1 -1
  74. package/docs/feedback/banner.tsx +1 -1
  75. package/docs/feedback/dialog.tsx +2 -1
  76. package/docs/feedback/sheet.tsx +2 -1
  77. package/docs/foundation/email-tokens.tsx +1 -1
  78. package/docs/general/activity.tsx +1 -1
  79. package/docs/layout/app-shell.tsx +4 -4
  80. package/docs/layout/auth-account-summary.tsx +1 -1
  81. package/docs/layout/auth-recovery/examples/mobile-390.tsx +1 -1
  82. package/docs/layout/auth-recovery/examples/password-recovery.tsx +0 -2
  83. package/docs/layout/auth-shell-context.tsx +1 -1
  84. package/docs/layout/auth-shell-device.tsx +2 -2
  85. package/docs/layout/auth-shell-registration.tsx +1 -1
  86. package/docs/layout/auth-shell.tsx +1 -1
  87. package/docs/layout/master-detail.tsx +2 -2
  88. package/docs/layout/mobile-shell.tsx +101 -0
  89. package/docs/layout/page-container.tsx +6 -6
  90. package/docs/layout/responsive-grid.tsx +5 -5
  91. package/docs/layout/separator.tsx +2 -2
  92. package/docs/layout/service-role-panel.tsx +1 -1
  93. package/docs/layout/sidebar.tsx +9 -9
  94. package/docs/layout/split-pane.tsx +5 -6
  95. package/docs/layout/topbar.tsx +2 -8
  96. package/docs/navigation/context-menu.tsx +6 -1
  97. package/docs/navigation/dropdown-menu.tsx +2 -1
  98. package/docs/navigation/filter-bar.tsx +2 -2
  99. package/docs/navigation/pagination.tsx +2 -2
  100. package/docs/navigation/steps.tsx +1 -1
  101. package/docs/navigation/tabs.tsx +3 -3
  102. package/docs/showcase/acme-portal.tsx +11 -12
  103. package/docs/showcase/acme-website.tsx +7 -7
  104. package/docs/showcase/case1-warehouse-dashboard.tsx +11 -12
  105. package/docs/showcase/case2-employee-me.tsx +10 -16
  106. package/docs/showcase/case4-login.tsx +144 -156
  107. package/docs/showcase/case5-shift-calendar.tsx +181 -280
  108. package/docs/showcase/case6-agency-handy.tsx +446 -443
  109. package/docs/showcase/futurelastic-web.tsx +9 -8
  110. package/docs/showcase/org-switcher.tsx +18 -11
  111. package/docs/showcase/permission-matrix.tsx +13 -13
  112. package/docs/showcase/public-landing.tsx +1 -1
  113. package/docs/showcase/settings-account-sections.tsx +4 -4
  114. package/docs/showcase/settings-security-mfa.tsx +3 -3
  115. package/docs/showcase/table-approval-queue.tsx +1 -1
  116. package/docs/showcase/table-bulk-actions.tsx +49 -52
  117. package/docs/showcase/table-conditional-format.tsx +1 -1
  118. package/docs/showcase/table-crud-list.tsx +1 -1
  119. package/docs/showcase/table-expandable-rows.tsx +101 -98
  120. package/docs/showcase/table-filter-chips.tsx +78 -66
  121. package/docs/showcase/table-footer-totals.tsx +23 -19
  122. package/docs/showcase/table-grouped-subtotals.tsx +7 -4
  123. package/docs/showcase/table-master-detail.tsx +13 -15
  124. package/docs/showcase/table-states.tsx +34 -29
  125. package/docs/showcase/table-sticky-columns.tsx +3 -2
  126. package/docs/showcase/table-tree-rows.tsx +22 -15
  127. package/docs/showcase/table-view-tabs.tsx +12 -14
  128. package/package.json +7 -6
@@ -114,6 +114,11 @@ export declare const VOCABULARY_REGISTRY: {
114
114
  readonly category: "shared";
115
115
  readonly description: "Radix asChild polymorphism";
116
116
  };
117
+ readonly FlushProp: {
118
+ readonly file: "vocabulary/shared.prop.ts";
119
+ readonly category: "shared";
120
+ readonly description: "Content owns its own inset — the container drops its padding so the child reaches the frame edge (CardContent/CardFooter flush, TableCell flush, PopoverContent flush)";
121
+ };
117
122
  readonly WidthProp: {
118
123
  readonly file: "vocabulary/shared.prop.ts";
119
124
  readonly category: "shared";
@@ -209,6 +214,11 @@ export declare const VOCABULARY_REGISTRY: {
209
214
  readonly category: "layout";
210
215
  readonly description: "CenteredShell column block alignment — start (flowing page), center (system surface)";
211
216
  };
217
+ readonly MobileShellHeightProp: {
218
+ readonly file: "vocabulary/layout.prop.ts";
219
+ readonly category: "layout";
220
+ readonly description: "MobileShell block-size contract — viewport (100dvh root, the real app) | fill (fills a bounded parent, e.g. a device-frame preview)";
221
+ };
212
222
  readonly CenteredShellPresetProp: {
213
223
  readonly file: "vocabulary/layout.prop.ts";
214
224
  readonly category: "layout";
@@ -224,6 +234,11 @@ export declare const VOCABULARY_REGISTRY: {
224
234
  readonly category: "data";
225
235
  readonly description: "Table column priority for the action-collection preset — primary | secondary | meta | actions (unset = takes the remaining space)";
226
236
  };
237
+ readonly TableCellIndentProp: {
238
+ readonly file: "vocabulary/data.prop.ts";
239
+ readonly category: "data";
240
+ readonly description: "TableCell hierarchy depth — indent = --table-cell-space-x + depth x --table-cell-indent-space-step (tree rows, grouped detail rows)";
241
+ };
227
242
  readonly ErrorSurfaceModeProp: {
228
243
  readonly file: "vocabulary/layout.prop.ts";
229
244
  readonly category: "layout";
@@ -540,6 +555,10 @@ export declare const COMPONENT_PROP_REGISTRY: {
540
555
  readonly group: "layout";
541
556
  readonly file: "components/layout.prop.ts";
542
557
  readonly vocabulary: readonly [{
558
+ readonly field: "as";
559
+ readonly local: true;
560
+ readonly reason: "Closed tag seam (div | span) so a Flex stays valid HTML inside a phrasing-only parent such as the <button> a TabsTrigger renders — same shape as ListRow's `as` (gh#354).";
561
+ }, {
543
562
  readonly field: "direction";
544
563
  readonly local: true;
545
564
  readonly reason: "Flex-specific axis control.";
@@ -648,7 +667,28 @@ export declare const COMPONENT_PROP_REGISTRY: {
648
667
  readonly field: "density";
649
668
  readonly local: true;
650
669
  readonly reason: "Auth-specific vertical-density scope for card descendants.";
651
- }, "AuthShellPresetProp"];
670
+ }, {
671
+ readonly field: "measure";
672
+ readonly local: true;
673
+ readonly reason: "Auth-shell content-slot measure; wide is the split brand-panel login.";
674
+ }, "ActionProp", "AuthShellPresetProp"];
675
+ };
676
+ readonly MobileShellProp: {
677
+ readonly group: "layout";
678
+ readonly file: "components/layout.prop.ts";
679
+ readonly vocabulary: readonly ["ChildrenProp", "ClassNameProp", "ActionProp", "MobileShellHeightProp", {
680
+ readonly field: "header";
681
+ readonly local: true;
682
+ readonly reason: "MobileShell app-bar band — the screen title row; it absorbs the top safe-area inset when no statusBar precedes it.";
683
+ }, {
684
+ readonly field: "statusBar";
685
+ readonly local: true;
686
+ readonly reason: "MobileShell OS status-bar band — standalone/PWA chrome or a device-frame preview; owns the top safe-area inset.";
687
+ }, {
688
+ readonly field: "tabBar";
689
+ readonly local: true;
690
+ readonly reason: "MobileShell bottom navigation band — tiling equal-width destinations; owns the home-indicator inset.";
691
+ }];
652
692
  };
653
693
  readonly SeparatorProp: {
654
694
  readonly group: "layout";
@@ -1160,7 +1200,11 @@ export declare const COMPONENT_PROP_REGISTRY: {
1160
1200
  readonly BadgeProp: {
1161
1201
  readonly group: "data-display";
1162
1202
  readonly file: "components/data-display.prop.ts";
1163
- readonly vocabulary: readonly ["BadgeVariantProp", "ShapeProp", "ToneProp", "ChildrenProp", "ClassNameProp", {
1203
+ readonly vocabulary: readonly [{
1204
+ readonly field: "as";
1205
+ readonly local: true;
1206
+ readonly reason: "Closed tag seam (div | span) so a chip stays valid HTML inside a phrasing-only parent such as the <button> a TabsTrigger renders — same shape as ListRow's `as` (gh#354).";
1207
+ }, "BadgeVariantProp", "ShapeProp", "ToneProp", "ChildrenProp", "ClassNameProp", {
1164
1208
  readonly field: "color";
1165
1209
  readonly local: true;
1166
1210
  readonly reason: "The entity's OWN colour as a CSS colour string — DATA a person picked in a settings screen (a status, an issue type, a tag), a third axis beside `variant` (structure) and `tone` (meaning). No vocabulary type fits: ToneProp is the closed semantic set, and this value is open by definition. Washed into --badge-tint-surface rather than filled, because no foreground clears WCAG AA against every colour a picker can produce.";
@@ -1725,6 +1769,69 @@ export declare const COMPONENT_PROP_REGISTRY: {
1725
1769
  readonly file: "components/data-display/timeline.tsx";
1726
1770
  readonly vocabulary: readonly ["ClassNameProp"];
1727
1771
  };
1772
+ readonly TimelineGridColumnProp: {
1773
+ readonly group: "data-display";
1774
+ readonly file: "components/data-display.prop.ts";
1775
+ readonly vocabulary: readonly ["IdProp", "LabelProp", "DescriptionProp", {
1776
+ readonly field: "current";
1777
+ readonly local: true;
1778
+ readonly reason: "Marks the column as now/today — it carries the tint and hosts the grid's now marker.";
1779
+ }];
1780
+ };
1781
+ readonly TimelineGridEventProp: {
1782
+ readonly group: "data-display";
1783
+ readonly file: "components/data-display.prop.ts";
1784
+ readonly vocabulary: readonly ["IdProp", "TitleProp", "DescriptionProp", {
1785
+ readonly field: "columnId";
1786
+ readonly local: true;
1787
+ readonly reason: "Id of the column the event belongs to (see TimelineGridColumnProp.id).";
1788
+ }, {
1789
+ readonly field: "start";
1790
+ readonly local: true;
1791
+ readonly reason: 'Start clock time in the column\'s own day, "HH:MM" — no date, no timezone.';
1792
+ }, {
1793
+ readonly field: "end";
1794
+ readonly local: true;
1795
+ readonly reason: 'End clock time, "HH:MM"; at or before start means the event continues into the next day.';
1796
+ }, {
1797
+ readonly field: "color";
1798
+ readonly local: true;
1799
+ readonly reason: "The record's own colour, washed into the block exactly like Badge `color` — decorative, never the only signal.";
1800
+ }];
1801
+ };
1802
+ readonly TimelineGridProp: {
1803
+ readonly group: "data-display";
1804
+ readonly file: "components/data-display.prop.ts";
1805
+ readonly vocabulary: readonly ["LabelProp", "ClassNameProp", "IdProp", {
1806
+ readonly field: "columns";
1807
+ readonly local: true;
1808
+ readonly reason: "Consumer-supplied columns in render order (see TimelineGridColumnProp).";
1809
+ }, {
1810
+ readonly field: "events";
1811
+ readonly local: true;
1812
+ readonly reason: "Consumer-supplied events (see TimelineGridEventProp).";
1813
+ }, {
1814
+ readonly field: "start";
1815
+ readonly local: true;
1816
+ readonly reason: 'First clock time on the axis, "HH:MM"; defaults to the earliest event on the hour so a block can only fall outside a PINNED axis.';
1817
+ }, {
1818
+ readonly field: "end";
1819
+ readonly local: true;
1820
+ readonly reason: 'Last clock time on the axis, "HH:MM"; defaults to the latest event on the hour.';
1821
+ }, {
1822
+ readonly field: "interval";
1823
+ readonly local: true;
1824
+ readonly reason: "Hours between hour rules and axis labels (default 1).";
1825
+ }, {
1826
+ readonly field: "now";
1827
+ readonly local: true;
1828
+ readonly reason: 'Current clock time, "HH:MM" — draws the now marker in the columns marked current.';
1829
+ }, {
1830
+ readonly field: "onEventSelect";
1831
+ readonly local: true;
1832
+ readonly reason: "Block click handler carrying the event; its presence turns every block into a real button.";
1833
+ }];
1834
+ };
1728
1835
  readonly TreeListProp: {
1729
1836
  readonly group: "data-display";
1730
1837
  readonly file: "components/data-display/tree-list.tsx";
@@ -110,6 +110,11 @@ const VOCABULARY_REGISTRY = {
110
110
  category: "shared",
111
111
  description: "Radix asChild polymorphism"
112
112
  },
113
+ FlushProp: {
114
+ file: "vocabulary/shared.prop.ts",
115
+ category: "shared",
116
+ description: "Content owns its own inset \u2014 the container drops its padding so the child reaches the frame edge (CardContent/CardFooter flush, TableCell flush, PopoverContent flush)"
117
+ },
113
118
  WidthProp: {
114
119
  file: "vocabulary/shared.prop.ts",
115
120
  category: "shared",
@@ -207,6 +212,11 @@ const VOCABULARY_REGISTRY = {
207
212
  category: "layout",
208
213
  description: "CenteredShell column block alignment \u2014 start (flowing page), center (system surface)"
209
214
  },
215
+ MobileShellHeightProp: {
216
+ file: "vocabulary/layout.prop.ts",
217
+ category: "layout",
218
+ description: "MobileShell block-size contract \u2014 viewport (100dvh root, the real app) | fill (fills a bounded parent, e.g. a device-frame preview)"
219
+ },
210
220
  CenteredShellPresetProp: {
211
221
  file: "vocabulary/layout.prop.ts",
212
222
  category: "layout",
@@ -222,6 +232,11 @@ const VOCABULARY_REGISTRY = {
222
232
  category: "data",
223
233
  description: "Table column priority for the action-collection preset \u2014 primary | secondary | meta | actions (unset = takes the remaining space)"
224
234
  },
235
+ TableCellIndentProp: {
236
+ file: "vocabulary/data.prop.ts",
237
+ category: "data",
238
+ description: "TableCell hierarchy depth \u2014 indent = --table-cell-space-x + depth x --table-cell-indent-space-step (tree rows, grouped detail rows)"
239
+ },
225
240
  ErrorSurfaceModeProp: {
226
241
  file: "vocabulary/layout.prop.ts",
227
242
  category: "layout",
@@ -546,6 +561,11 @@ const COMPONENT_PROP_REGISTRY = {
546
561
  group: "layout",
547
562
  file: "components/layout.prop.ts",
548
563
  vocabulary: [
564
+ {
565
+ field: "as",
566
+ local: true,
567
+ reason: "Closed tag seam (div | span) so a Flex stays valid HTML inside a phrasing-only parent such as the <button> a TabsTrigger renders \u2014 same shape as ListRow's `as` (gh#354)."
568
+ },
549
569
  { field: "direction", local: true, reason: "Flex-specific axis control." },
550
570
  "GapProp",
551
571
  { field: "align", local: true, reason: "Flex-specific align-items keyword subset." },
@@ -656,9 +676,40 @@ const COMPONENT_PROP_REGISTRY = {
656
676
  local: true,
657
677
  reason: "Auth-specific vertical-density scope for card descendants."
658
678
  },
679
+ {
680
+ field: "measure",
681
+ local: true,
682
+ reason: "Auth-shell content-slot measure; wide is the split brand-panel login."
683
+ },
684
+ "ActionProp",
659
685
  "AuthShellPresetProp"
660
686
  ]
661
687
  },
688
+ MobileShellProp: {
689
+ group: "layout",
690
+ file: "components/layout.prop.ts",
691
+ vocabulary: [
692
+ "ChildrenProp",
693
+ "ClassNameProp",
694
+ "ActionProp",
695
+ "MobileShellHeightProp",
696
+ {
697
+ field: "header",
698
+ local: true,
699
+ reason: "MobileShell app-bar band \u2014 the screen title row; it absorbs the top safe-area inset when no statusBar precedes it."
700
+ },
701
+ {
702
+ field: "statusBar",
703
+ local: true,
704
+ reason: "MobileShell OS status-bar band \u2014 standalone/PWA chrome or a device-frame preview; owns the top safe-area inset."
705
+ },
706
+ {
707
+ field: "tabBar",
708
+ local: true,
709
+ reason: "MobileShell bottom navigation band \u2014 tiling equal-width destinations; owns the home-indicator inset."
710
+ }
711
+ ]
712
+ },
662
713
  SeparatorProp: {
663
714
  group: "layout",
664
715
  file: "components/layout.prop.ts",
@@ -1346,6 +1397,11 @@ const COMPONENT_PROP_REGISTRY = {
1346
1397
  group: "data-display",
1347
1398
  file: "components/data-display.prop.ts",
1348
1399
  vocabulary: [
1400
+ {
1401
+ field: "as",
1402
+ local: true,
1403
+ reason: "Closed tag seam (div | span) so a chip stays valid HTML inside a phrasing-only parent such as the <button> a TabsTrigger renders \u2014 same shape as ListRow's `as` (gh#354)."
1404
+ },
1349
1405
  "BadgeVariantProp",
1350
1406
  "ShapeProp",
1351
1407
  "ToneProp",
@@ -1916,6 +1972,93 @@ const COMPONENT_PROP_REGISTRY = {
1916
1972
  file: "components/data-display/timeline.tsx",
1917
1973
  vocabulary: ["ClassNameProp"]
1918
1974
  },
1975
+ TimelineGridColumnProp: {
1976
+ group: "data-display",
1977
+ file: "components/data-display.prop.ts",
1978
+ vocabulary: [
1979
+ "IdProp",
1980
+ "LabelProp",
1981
+ "DescriptionProp",
1982
+ {
1983
+ field: "current",
1984
+ local: true,
1985
+ reason: "Marks the column as now/today \u2014 it carries the tint and hosts the grid's now marker."
1986
+ }
1987
+ ]
1988
+ },
1989
+ TimelineGridEventProp: {
1990
+ group: "data-display",
1991
+ file: "components/data-display.prop.ts",
1992
+ vocabulary: [
1993
+ "IdProp",
1994
+ "TitleProp",
1995
+ "DescriptionProp",
1996
+ {
1997
+ field: "columnId",
1998
+ local: true,
1999
+ reason: "Id of the column the event belongs to (see TimelineGridColumnProp.id)."
2000
+ },
2001
+ {
2002
+ field: "start",
2003
+ local: true,
2004
+ reason: `Start clock time in the column's own day, "HH:MM" \u2014 no date, no timezone.`
2005
+ },
2006
+ {
2007
+ field: "end",
2008
+ local: true,
2009
+ reason: 'End clock time, "HH:MM"; at or before start means the event continues into the next day.'
2010
+ },
2011
+ {
2012
+ field: "color",
2013
+ local: true,
2014
+ reason: "The record's own colour, washed into the block exactly like Badge `color` \u2014 decorative, never the only signal."
2015
+ }
2016
+ ]
2017
+ },
2018
+ TimelineGridProp: {
2019
+ group: "data-display",
2020
+ file: "components/data-display.prop.ts",
2021
+ vocabulary: [
2022
+ "LabelProp",
2023
+ "ClassNameProp",
2024
+ "IdProp",
2025
+ {
2026
+ field: "columns",
2027
+ local: true,
2028
+ reason: "Consumer-supplied columns in render order (see TimelineGridColumnProp)."
2029
+ },
2030
+ {
2031
+ field: "events",
2032
+ local: true,
2033
+ reason: "Consumer-supplied events (see TimelineGridEventProp)."
2034
+ },
2035
+ {
2036
+ field: "start",
2037
+ local: true,
2038
+ reason: 'First clock time on the axis, "HH:MM"; defaults to the earliest event on the hour so a block can only fall outside a PINNED axis.'
2039
+ },
2040
+ {
2041
+ field: "end",
2042
+ local: true,
2043
+ reason: 'Last clock time on the axis, "HH:MM"; defaults to the latest event on the hour.'
2044
+ },
2045
+ {
2046
+ field: "interval",
2047
+ local: true,
2048
+ reason: "Hours between hour rules and axis labels (default 1)."
2049
+ },
2050
+ {
2051
+ field: "now",
2052
+ local: true,
2053
+ reason: 'Current clock time, "HH:MM" \u2014 draws the now marker in the columns marked current.'
2054
+ },
2055
+ {
2056
+ field: "onEventSelect",
2057
+ local: true,
2058
+ reason: "Block click handler carrying the event; its presence turns every block into a real button."
2059
+ }
2060
+ ]
2061
+ },
1919
2062
  TreeListProp: {
1920
2063
  group: "data-display",
1921
2064
  file: "components/data-display/tree-list.tsx",
@@ -87,3 +87,9 @@ export type TablePresetProp = "default" | "action-collection" | "stacked-record-
87
87
  * is reserved first so it can never be pushed outside the viewport.
88
88
  */
89
89
  export type TableColumnPriorityProp = "primary" | "secondary" | "meta" | "actions";
90
+ /**
91
+ * Hierarchy depth a table cell renders at. `0` sits on the column's own text axis and every
92
+ * further level adds one `--table-cell-indent-space-step`, so a tree row or a grouped detail row
93
+ * expresses its level instead of hand-rolling `style={{ paddingInlineStart }}` at the call site.
94
+ */
95
+ export type TableCellIndentProp = number;
@@ -1,7 +1,7 @@
1
1
  /** Barrel — all vocabulary prop types. */
2
- export type { ClassNameProp, ChildrenProp, IdProp, OpenProp, DefaultOpenProp, OnOpenChangeProp, HandlerProp, PendingProp, RequiredProp, DisabledProp, LabelProp, HelperProp, ErrorProp, ErrorBagProp, PlaceholderProp, NameProp, ValueProp, DefaultValueProp, OnValueChangeProp, OnChangeProp, OnClickProp, AsChildProp, WidthProp, ControlWidthProp, } from "./shared.prop.js";
2
+ export type { ClassNameProp, ChildrenProp, IdProp, OpenProp, DefaultOpenProp, OnOpenChangeProp, HandlerProp, PendingProp, RequiredProp, DisabledProp, LabelProp, HelperProp, ErrorProp, ErrorBagProp, PlaceholderProp, NameProp, ValueProp, DefaultValueProp, OnValueChangeProp, OnChangeProp, OnClickProp, AsChildProp, FlushProp, WidthProp, ControlWidthProp, } from "./shared.prop.js";
3
3
  export type { TitleProp, SubtitleProp, StatusProp, DescriptionProp, ExtraProp, FooterProp, ActionProp, IconProp, ConfirmLabelProp, CancelLabelProp, ActionsProp, EmptyMessageProp, } from "./content.prop.js";
4
- export type { PageDensityProp, PageContainerVariantProp, CenteredShellWidthProp, CenteredShellAlignProp, CenteredShellPresetProp, ErrorSurfaceModeProp, ErrorSurfaceStatusProp, AuthShellPresetProp, OrientationProp, TableDensityProp, DensityProp, GapProp, } from "./layout.prop.js";
4
+ export type { PageDensityProp, PageContainerVariantProp, CenteredShellWidthProp, CenteredShellAlignProp, CenteredShellPresetProp, ErrorSurfaceModeProp, ErrorSurfaceStatusProp, AuthShellPresetProp, MobileShellHeightProp, OrientationProp, TableDensityProp, DensityProp, GapProp, } from "./layout.prop.js";
5
5
  export type { ButtonVariantProp, ButtonSizeProp, BadgeVariantProp, AppSettingPickerAppearanceProp, ShapeProp, AvatarShapeProp, TextSizeProp, TextToneProp, FontWeightProp, HeadingLevelProp, TextAlignProp, SizeProp, FormLayoutProp, DescriptionsLayoutProp, BreakpointProp, ConfirmVariantProp, ToneProp, AlertVariantProp, SortDirectionProp, ColumnAlignProp, SortStateProp, RevealDelayProp, ActivityVariantProp, ActivityAnnounceProp, } from "./interaction.prop.js";
6
6
  export type { BreadcrumbItemProp, BreadcrumbProp } from "./navigation.prop.js";
7
- export type { GetRowIdProp, OnRowClickProp, ColumnDefProp, TablePresetProp, TableColumnPriorityProp, SelectedIdsProp, OnSelectChangeProp, OnTableDensityChangeProp, OnSortChangeProp, OnSearchChangeProp, OnClearFiltersProp, HasActiveFiltersProp, StickyProp, } from "./data.prop.js";
7
+ export type { GetRowIdProp, OnRowClickProp, ColumnDefProp, TablePresetProp, TableColumnPriorityProp, TableCellIndentProp, SelectedIdsProp, OnSelectChangeProp, OnTableDensityChangeProp, OnSortChangeProp, OnSearchChangeProp, OnClearFiltersProp, HasActiveFiltersProp, StickyProp, } from "./data.prop.js";
@@ -17,6 +17,15 @@ export type CenteredShellWidthProp = "sm" | "md" | "lg";
17
17
  * maintenance notice) — the geometry stays package-owned, so no consumer `min-h-dvh` / flex CSS.
18
18
  */
19
19
  export type CenteredShellAlignProp = "start" | "center";
20
+ /**
21
+ * MobileShell block-size contract — WHERE the handheld shell gets its one-screen height, the one
22
+ * question a bounded shell cannot answer for itself.
23
+ * `"viewport"` (default) is the real app: the shell is exactly `100dvh`, the document never
24
+ * scrolls, and the chrome bands stay on screen while the URL bar collapses. `"fill"` fills a
25
+ * BOUNDED parent instead — a device-frame preview, or a phone view embedded in a wider page —
26
+ * where a viewport-tall root would overflow its frame. Nothing else differs between the two.
27
+ */
28
+ export type MobileShellHeightProp = "viewport" | "fill";
20
29
  /**
21
30
  * ErrorSurface shell contract — WHERE the exception surface lives, not how it looks.
22
31
  * `"application"` (403 / 404): the failure happened INSIDE the authenticated app, so the surface
@@ -43,8 +52,14 @@ export type ErrorSurfaceStatusProp = 400 | 403 | 404 | 500 | 503 | (number & {})
43
52
  * scroll origin, and the only preset with a footer-clearance knob of its own.
44
53
  */
45
54
  export type AuthShellPresetProp = "default" | "login" | "registration" | "device-authorization" | "context-selection" | "account-recovery";
46
- /** Shared gap between layout children; components may document subsets. */
47
- export type GapProp = "xs" | "sm" | "md" | "lg" | "xl";
55
+ /**
56
+ * Shared gap between layout children; components may document subsets.
57
+ * `"none"` is a DELIBERATE zero, not the absence of a value: two lines that read as ONE block —
58
+ * a name over its role, a weekday over its date, a tab bar with no seam between its triggers.
59
+ * Without it those stacks had to carry `gap="xs"`, which is a visual change forced by a missing
60
+ * step rather than by design.
61
+ */
62
+ export type GapProp = "none" | "xs" | "sm" | "md" | "lg" | "xl";
48
63
  /** DataTable row density subset. */
49
64
  export type TableDensityProp = Exclude<DensityProp, "default">;
50
65
  /**
@@ -50,6 +50,13 @@ export type OnChangeProp = React.ChangeEventHandler<HTMLInputElement>;
50
50
  export type OnClickProp = React.MouseEventHandler<HTMLButtonElement>;
51
51
  /** Radix/shadcn `asChild` polymorphism — render as child element. */
52
52
  export type AsChildProp = boolean;
53
+ /**
54
+ * The slot's CONTENT owns its own inset: the container drops its padding so the child reaches the
55
+ * frame edge — a full-bleed table inside a Card, an expanded detail panel inside a table cell, a
56
+ * Command list inside a Popover. It is the sanctioned replacement for the `p-0` utility a consumer
57
+ * would otherwise write at the call site.
58
+ */
59
+ export type FlushProp = boolean;
53
60
  /**
54
61
  * An explicit layout dimension (NOT the `SizeProp` control-height tier). A `number` is treated as
55
62
  * px; a `string` is any CSS length (`"32rem"`, `"90vw"`, `"50%"`).
@@ -368,7 +368,7 @@
368
368
  width: var(--checkbox-size);
369
369
  height: var(--checkbox-size);
370
370
  flex-shrink: 0;
371
- border: 1px solid hsl(var(--primary));
371
+ border: var(--checkbox-border-width) solid hsl(var(--primary));
372
372
  color: hsl(var(--primary));
373
373
  background: transparent;
374
374
  }
@@ -999,6 +999,23 @@
999
999
  --control-height: var(--control-height-sm);
1000
1000
  }
1001
1001
 
1002
+ .ui-control-trigger {
1003
+ cursor: pointer;
1004
+ }
1005
+
1006
+ .ui-control-trigger:disabled,
1007
+ .ui-control-trigger[data-disabled] {
1008
+ cursor: not-allowed;
1009
+ }
1010
+
1011
+ .ui-control[data-size="sm"] {
1012
+ --control-height: var(--control-height-sm);
1013
+ }
1014
+
1015
+ .ui-control[data-size="lg"] {
1016
+ --control-height: var(--control-height-lg);
1017
+ }
1018
+
1002
1019
  .ui-number-input[data-size="sm"] {
1003
1020
  --control-height: var(--control-height-sm);
1004
1021
  }
@@ -897,3 +897,170 @@
897
897
  border-block-start: var(--stroke-hairline) solid hsl(var(--border));
898
898
  }
899
899
  }
900
+
901
+ @layer components {
902
+ .ui-timeline-grid {
903
+ overflow-x: auto;
904
+ }
905
+
906
+ .ui-timeline-grid-frame {
907
+ display: grid;
908
+ grid-template-columns:
909
+ var(--timeline-grid-axis-width)
910
+ repeat(var(--timeline-grid-columns, 1), minmax(var(--timeline-grid-column-min-width), 1fr));
911
+ }
912
+
913
+ .ui-timeline-grid-corner {
914
+ border-block-end: 1px solid hsl(var(--border));
915
+ }
916
+
917
+ .ui-timeline-grid-head {
918
+ display: flex;
919
+ flex-direction: column;
920
+ align-items: center;
921
+ padding: var(--space-1);
922
+ border-block-end: 1px solid hsl(var(--border));
923
+ border-inline-start: 1px solid hsl(var(--border));
924
+ background: hsl(var(--secondary));
925
+ font-size: var(--timeline-grid-head-font-size);
926
+ font-weight: var(--font-weight-medium);
927
+ line-height: var(--line-height-tight);
928
+ text-align: center;
929
+ }
930
+
931
+ .ui-timeline-grid-head[data-current="true"] {
932
+ background: var(--timeline-grid-current-tint, hsl(var(--primary) / 0.08));
933
+ }
934
+
935
+ .ui-timeline-grid-head-description {
936
+ color: hsl(var(--muted-foreground));
937
+ font-size: var(--timeline-grid-axis-font-size);
938
+ font-weight: var(--font-weight-normal);
939
+ }
940
+
941
+ .ui-timeline-grid-axis,
942
+ .ui-timeline-grid-column {
943
+ position: relative;
944
+ block-size: calc(var(--timeline-grid-hour-height) * var(--timeline-grid-hours, 24));
945
+ }
946
+
947
+ .ui-timeline-grid-tick {
948
+ position: absolute;
949
+ inset-inline-end: var(--space-1);
950
+ inset-block-start: calc(var(--timeline-grid-hour-height) * var(--timeline-grid-tick-offset, 0));
951
+ color: hsl(var(--muted-foreground));
952
+ font-size: var(--timeline-grid-axis-font-size);
953
+ font-variant-numeric: tabular-nums;
954
+ line-height: 1;
955
+ transform: translateY(-50%);
956
+ white-space: nowrap;
957
+ }
958
+
959
+ .ui-timeline-grid-column {
960
+ margin: 0;
961
+ padding: 0;
962
+ border-inline-start: 1px solid hsl(var(--border));
963
+ background-image: repeating-linear-gradient(
964
+ to bottom,
965
+ var(--timeline-grid-line-color, hsl(var(--border))) 0 1px,
966
+ transparent 1px calc(var(--timeline-grid-hour-height) * var(--timeline-grid-interval, 1))
967
+ );
968
+ list-style: none;
969
+ }
970
+
971
+ .ui-timeline-grid-column[data-current="true"] {
972
+ background-color: var(--timeline-grid-current-tint, hsl(var(--primary) / 0.05));
973
+ }
974
+
975
+ .ui-timeline-grid-event {
976
+ position: absolute;
977
+ inset-block-start: calc(
978
+ var(--timeline-grid-hour-height) * var(--timeline-grid-event-offset, 0)
979
+ );
980
+ inset-inline-start: calc(
981
+ var(--timeline-grid-event-lane, 0) / var(--timeline-grid-event-lanes, 1) * 100%
982
+ );
983
+ box-sizing: border-box;
984
+ inline-size: calc(100% / var(--timeline-grid-event-lanes, 1));
985
+ block-size: calc(var(--timeline-grid-hour-height) * var(--timeline-grid-event-span, 0));
986
+ min-block-size: var(--timeline-grid-event-min-height);
987
+ padding-inline-end: var(--timeline-grid-event-gap);
988
+ padding-block-end: var(--timeline-grid-event-gap);
989
+ }
990
+
991
+ .ui-timeline-grid-event-body {
992
+ display: flex;
993
+ overflow: hidden;
994
+ box-sizing: border-box;
995
+ flex-direction: column;
996
+ inline-size: 100%;
997
+ block-size: 100%;
998
+ padding: var(--timeline-grid-event-space-inset);
999
+ border-inline-start: var(--timeline-grid-event-border-width) solid
1000
+ var(--timeline-grid-event-color, hsl(var(--primary)));
1001
+ border-radius: var(--timeline-grid-event-radius);
1002
+
1003
+ background-color: color-mix(
1004
+ in srgb,
1005
+ hsl(var(--background)),
1006
+ var(--timeline-grid-event-color, hsl(var(--primary))) 12%
1007
+ );
1008
+ color: hsl(var(--foreground));
1009
+ font-size: var(--timeline-grid-event-font-size);
1010
+ line-height: var(--line-height-tight);
1011
+ text-align: start;
1012
+ }
1013
+
1014
+ .ui-timeline-grid-event[data-clipped="start"] .ui-timeline-grid-event-body,
1015
+ .ui-timeline-grid-event[data-clipped="both"] .ui-timeline-grid-event-body {
1016
+ border-start-start-radius: 0;
1017
+ border-start-end-radius: 0;
1018
+ }
1019
+
1020
+ .ui-timeline-grid-event[data-clipped="end"] .ui-timeline-grid-event-body,
1021
+ .ui-timeline-grid-event[data-clipped="both"] .ui-timeline-grid-event-body {
1022
+ border-end-start-radius: 0;
1023
+ border-end-end-radius: 0;
1024
+ }
1025
+
1026
+ .ui-timeline-grid-event-time {
1027
+ color: var(--timeline-grid-event-muted-color);
1028
+ font-variant-numeric: tabular-nums;
1029
+ white-space: nowrap;
1030
+ }
1031
+
1032
+ .ui-timeline-grid-event-title {
1033
+ overflow: hidden;
1034
+ font-weight: var(--font-weight-medium);
1035
+ text-overflow: ellipsis;
1036
+ white-space: nowrap;
1037
+ }
1038
+
1039
+ .ui-timeline-grid-event-description {
1040
+ overflow: hidden;
1041
+ color: var(--timeline-grid-event-muted-color);
1042
+ text-overflow: ellipsis;
1043
+ white-space: nowrap;
1044
+ }
1045
+
1046
+ button.ui-timeline-grid-event-body {
1047
+ cursor: pointer;
1048
+ }
1049
+
1050
+ button.ui-timeline-grid-event-body:hover {
1051
+ background-color: color-mix(
1052
+ in srgb,
1053
+ hsl(var(--background)),
1054
+ var(--timeline-grid-event-color, hsl(var(--primary))) 20%
1055
+ );
1056
+ }
1057
+
1058
+ .ui-timeline-grid-now {
1059
+ position: absolute;
1060
+ inset-inline: 0;
1061
+ inset-block-start: calc(var(--timeline-grid-hour-height) * var(--timeline-grid-now-offset, 0));
1062
+ block-size: var(--timeline-grid-now-width);
1063
+ background: var(--timeline-grid-now-color, hsl(var(--destructive)));
1064
+ pointer-events: none;
1065
+ }
1066
+ }
@@ -158,6 +158,10 @@
158
158
  justify-content: space-evenly;
159
159
  }
160
160
 
161
+ .ui-flex-gap-none {
162
+ gap: 0;
163
+ }
164
+
161
165
  .ui-flex-gap-xs {
162
166
  gap: var(--space-stack-xs);
163
167
  }
@@ -238,6 +242,9 @@
238
242
  grid-template-columns: minmax(0, 1fr);
239
243
  }
240
244
 
245
+ .ui-responsive-grid[data-gap="none"] {
246
+ gap: 0;
247
+ }
241
248
  .ui-responsive-grid[data-gap="xs"] {
242
249
  gap: var(--space-stack-xs);
243
250
  }