@godxjp/ui 33.22.2 → 33.24.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 (65) hide show
  1. package/DESIGN.md +1 -1
  2. package/README.md +4 -4
  3. package/agent/DESIGN.md +1 -1
  4. package/agent/START-HERE.md +7 -7
  5. package/agent/components/AgentBadge.json +43 -0
  6. package/agent/components/AppShell.json +6 -0
  7. package/agent/components/Avatar.json +7 -0
  8. package/agent/components/PageContainer.json +5 -0
  9. package/agent/components/PageErrorBoundary.json +48 -0
  10. package/agent/components/Toaster.json +1 -1
  11. package/agent/components/Toolbar.json +1 -1
  12. package/agent/components/Topbar.json +1 -1
  13. package/agent/components-index.json +10 -0
  14. package/agent/components.json +112 -3
  15. package/agent/index.json +7 -7
  16. package/agent/llms.txt +6 -6
  17. package/agent/tokens.json +84 -0
  18. package/dist/components/data-display/avatar.d.ts +1 -1
  19. package/dist/components/data-display/avatar.js +7 -1
  20. package/dist/components/data-display/badge.d.ts +11 -0
  21. package/dist/components/data-display/badge.js +20 -0
  22. package/dist/components/data-display/image.js +1 -1
  23. package/dist/components/data-display/index.d.ts +2 -2
  24. package/dist/components/data-display/index.js +2 -1
  25. package/dist/components/data-entry/record-picker.js +122 -98
  26. package/dist/components/data-entry/select.js +13 -3
  27. package/dist/components/layout/app-shell.d.ts +1 -1
  28. package/dist/components/layout/app-shell.js +3 -1
  29. package/dist/components/layout/index.d.ts +2 -0
  30. package/dist/components/layout/index.js +2 -0
  31. package/dist/components/layout/page-container.d.ts +1 -1
  32. package/dist/components/layout/page-container.js +6 -3
  33. package/dist/components/layout/page-error-boundary.d.ts +32 -0
  34. package/dist/components/layout/page-error-boundary.js +57 -0
  35. package/dist/components/layout/sidebar.d.ts +1 -1
  36. package/dist/components/layout/sidebar.js +100 -49
  37. package/dist/components/layout/topbar.js +108 -21
  38. package/dist/components/navigation/toolbar.js +2 -1
  39. package/dist/contracts/measurement.json +1 -1
  40. package/dist/i18n/messages/en.json +6 -0
  41. package/dist/i18n/messages/ja.json +6 -0
  42. package/dist/i18n/messages/vi.json +6 -0
  43. package/dist/props/components/data-display.prop.d.ts +27 -0
  44. package/dist/props/components/layout.prop.d.ts +45 -0
  45. package/dist/props/components/navigation.prop.d.ts +12 -1
  46. package/dist/props/registry.d.ts +50 -2
  47. package/dist/props/registry.js +72 -3
  48. package/dist/styles/alert-layout.css +4 -0
  49. package/dist/styles/badge-layout.css +14 -0
  50. package/dist/styles/data-display-layout.css +44 -0
  51. package/dist/styles/icon-layout.css +3 -0
  52. package/dist/styles/layers.json +22 -2
  53. package/dist/styles/layout.css +11 -0
  54. package/dist/styles/shell-layout.css +17 -1
  55. package/dist/styles/table-layout.css +1 -1
  56. package/dist/styles.css +1 -1
  57. package/dist/tokens/components/badge.css +3 -0
  58. package/dist/tokens/components/data-display.css +9 -0
  59. package/dist/tokens/components/shell.css +2 -0
  60. package/dist/tokens/foundation.css +8 -0
  61. package/docs/CONSUMER-RULES.md +1 -1
  62. package/package.json +2 -2
  63. package/scripts/consumer-rule.md +1 -1
  64. package/skills/godxjp-ui-navigation/SKILL.md +14 -9
  65. package/skills/godxjp-ui-navigation/references/principles.md +2 -2
@@ -2,7 +2,7 @@
2
2
  import type * as React from "react";
3
3
  import type { ReactNode } from "react";
4
4
  import type { AffixProp, AffixTargetProp, ResponsiveGridColumnsProp, SidebarLinkComponentProp } from "./layout.prop.js";
5
- import type { ActionsProp, ChildrenProp, ClassNameProp, DisabledProp, ErrorProp, HasActiveFiltersProp, IdProp, LabelProp, OnClearFiltersProp, OnOpenChangeProp, OpenProp, DefaultOpenProp, PendingProp, PlaceholderProp, StickyProp, TextAlignProp } from "../vocabulary/index.js";
5
+ import type { ActionsProp, AllowClearProp, ChildrenProp, ClassNameProp, DisabledProp, ErrorProp, HasActiveFiltersProp, IdProp, LabelProp, OnClearFiltersProp, OnOpenChangeProp, OpenProp, DefaultOpenProp, PendingProp, PlaceholderProp, RequiredProp, StickyProp, TextAlignProp } from "../vocabulary/index.js";
6
6
  import type { FormProp, SearchSelectOptionProp } from "./data-entry.prop.js";
7
7
  /**
8
8
  * Renders the canonical SearchInput as the FIRST control of the strip, with a token-owned
@@ -41,6 +41,17 @@ export type FilterBarFilterProp = {
41
41
  onSelectedChange?: (selected: string) => void;
42
42
  placeholder?: PlaceholderProp;
43
43
  disabled?: DisabledProp;
44
+ /**
45
+ * A SCOPE filter that is never empty — the branch, the month (gh#1495). The filter renders no
46
+ * ✕ and its control is `aria-required`; the bar's clear-all is still the consumer's `onClear`,
47
+ * which should leave a required filter at its value. Implies `allowClear={false}`.
48
+ */
49
+ required?: RequiredProp;
50
+ /**
51
+ * The per-filter ✕. Default `true`: a filter is optional by nature, "no filter" is its resting
52
+ * state. `false` hides it without marking the filter required (gh#1495).
53
+ */
54
+ allowClear?: AllowClearProp;
44
55
  };
45
56
  /**
46
57
  * Chips are pure consumer data — the lifecycle is: ADD by including the chip in `chips`, REMOVE
@@ -847,6 +847,10 @@ export declare const COMPONENT_PROP_REGISTRY: {
847
847
  readonly group: "layout";
848
848
  readonly file: "components/layout.prop.ts";
849
849
  readonly vocabulary: readonly ["TitleProp", "SubtitleProp", "StatusProp", "ExtraProp", "FooterProp", "BreadcrumbProp", "BreadcrumbCurrentItemProp", "DensityProp", "PageContainerVariantProp", {
850
+ readonly field: "help";
851
+ readonly local: true;
852
+ readonly reason: "The page's ONE Help control (gh#1494), at a fixed place: the last item at the header row's inline end, after the `extra` actions. A single node, not an ActionsProp list.";
853
+ }, {
850
854
  readonly field: "toolbar";
851
855
  readonly local: true;
852
856
  readonly reason: "FIXED chrome band between the page header and the scrolling body (filter strip, status bar, channel workflow rail). Distinct from ExtraProp (header actions, inside the title row) and FooterProp (action bar after the body): it is the only slot that stays OUT of the `fill` scroll viewport while sharing the header/body gutters and measure, so a consumer never hand-lays `position: sticky` page chrome.";
@@ -1133,7 +1137,11 @@ export declare const COMPONENT_PROP_REGISTRY: {
1133
1137
  readonly AppShellProp: {
1134
1138
  readonly group: "layout";
1135
1139
  readonly file: "components/layout.prop.ts";
1136
- readonly vocabulary: readonly ["ChildrenProp", "BreakpointProp", {
1140
+ readonly vocabulary: readonly ["ChildrenProp", {
1141
+ readonly field: "errorBoundary";
1142
+ readonly local: true;
1143
+ readonly reason: "Page-level error boundary around `children` (gh#1494): `true` (default) keeps the shell when a page throws, an object configures PageErrorBoundary, `false` opts out.";
1144
+ }, "BreakpointProp", {
1137
1145
  readonly field: "logoCompact";
1138
1146
  readonly local: true;
1139
1147
  readonly reason: "The brand node a narrow bar gets instead of `logo` — the consumer's own mark/viewBox, which a stylesheet cannot produce (gh#728).";
@@ -2452,6 +2460,32 @@ export declare const COMPONENT_PROP_REGISTRY: {
2452
2460
  readonly reason: "Slot for the host's cover controls (change / reposition / remove), laid out off the focal area — a ReactNode slot, not the ActionsProp item list.";
2453
2461
  }];
2454
2462
  };
2463
+ readonly PageErrorBoundaryFallbackProp: {
2464
+ readonly group: "layout";
2465
+ readonly file: "components/layout.prop.ts";
2466
+ readonly vocabulary: readonly [{
2467
+ readonly field: "fallback";
2468
+ readonly local: true;
2469
+ readonly reason: "Render-prop form of PageErrorBoundary `fallback`: `({ error, reset }) => node` (gh#1494).";
2470
+ }];
2471
+ };
2472
+ readonly PageErrorBoundaryProp: {
2473
+ readonly group: "layout";
2474
+ readonly file: "components/layout.prop.ts";
2475
+ readonly vocabulary: readonly ["ChildrenProp", {
2476
+ readonly field: "fallback";
2477
+ readonly local: true;
2478
+ readonly reason: "What replaces the page that threw — a node, or `({ error, reset }) => node`. Default: an application ErrorSurface with the kit's localized copy (gh#1494).";
2479
+ }, {
2480
+ readonly field: "resetKey";
2481
+ readonly local: true;
2482
+ readonly reason: "React error-boundary reset key (react-error-boundary's resetKeys, one value): a change draws the page again. The URL change already resets.";
2483
+ }, {
2484
+ readonly field: "onError";
2485
+ readonly local: true;
2486
+ readonly reason: "componentDidCatch reporter `(error, info)` for an error tracker.";
2487
+ }];
2488
+ };
2455
2489
  readonly ErrorSurfaceProp: {
2456
2490
  readonly group: "layout";
2457
2491
  readonly file: "components/layout.prop.ts";
@@ -3339,6 +3373,20 @@ export declare const COMPONENT_PROP_REGISTRY: {
3339
3373
  readonly file: "components/data-display.prop.ts";
3340
3374
  readonly vocabulary: readonly [];
3341
3375
  };
3376
+ readonly AvatarKindProp: {
3377
+ readonly group: "data-display";
3378
+ readonly file: "components/data-display.prop.ts";
3379
+ readonly vocabulary: readonly [];
3380
+ };
3381
+ readonly AgentBadgeProp: {
3382
+ readonly group: "data-display";
3383
+ readonly file: "components/data-display.prop.ts";
3384
+ readonly vocabulary: readonly [{
3385
+ readonly field: "as";
3386
+ readonly local: true;
3387
+ readonly reason: "Closed tag seam (div | span), the same one Badge carries, so the label stays valid HTML beside a name inside a link or a <button>.";
3388
+ }, "ChildrenProp", "ClassNameProp"];
3389
+ };
3342
3390
  readonly AvatarImageFitProp: {
3343
3391
  readonly group: "data-display";
3344
3392
  readonly file: "components/data-display.prop.ts";
@@ -4003,7 +4051,7 @@ export declare const COMPONENT_PROP_REGISTRY: {
4003
4051
  readonly FilterBarFilterProp: {
4004
4052
  readonly group: "navigation";
4005
4053
  readonly file: "components/navigation.prop.ts";
4006
- readonly vocabulary: readonly ["LabelProp", "PlaceholderProp", "DisabledProp"];
4054
+ readonly vocabulary: readonly ["LabelProp", "PlaceholderProp", "DisabledProp", "RequiredProp", "AllowClearProp"];
4007
4055
  };
4008
4056
  readonly FilterBarChipProp: {
4009
4057
  readonly group: "navigation";
@@ -861,6 +861,11 @@ const COMPONENT_PROP_REGISTRY = {
861
861
  "BreadcrumbCurrentItemProp",
862
862
  "DensityProp",
863
863
  "PageContainerVariantProp",
864
+ {
865
+ field: "help",
866
+ local: true,
867
+ reason: "The page's ONE Help control (gh#1494), at a fixed place: the last item at the header row's inline end, after the `extra` actions. A single node, not an ActionsProp list."
868
+ },
864
869
  {
865
870
  field: "toolbar",
866
871
  local: true,
@@ -1152,6 +1157,11 @@ const COMPONENT_PROP_REGISTRY = {
1152
1157
  file: "components/layout.prop.ts",
1153
1158
  vocabulary: [
1154
1159
  "ChildrenProp",
1160
+ {
1161
+ field: "errorBoundary",
1162
+ local: true,
1163
+ reason: "Page-level error boundary around `children` (gh#1494): `true` (default) keeps the shell when a page throws, an object configures PageErrorBoundary, `false` opts out."
1164
+ },
1155
1165
  "BreakpointProp",
1156
1166
  {
1157
1167
  field: "logoCompact",
@@ -1590,9 +1600,17 @@ const COMPONENT_PROP_REGISTRY = {
1590
1600
  { field: "variant", local: true, reason: "inset (site search) or inline (collection row)." },
1591
1601
  { field: "count", local: true, reason: "Live count at the end of the inline row." },
1592
1602
  { field: "debounce", local: true, reason: "Settle delay in ms, as SearchInput.debounce." },
1593
- { field: "suggestions", local: true, reason: "Grouped suggestion rows under the box (gh#1447)." },
1603
+ {
1604
+ field: "suggestions",
1605
+ local: true,
1606
+ reason: "Grouped suggestion rows under the box (gh#1447)."
1607
+ },
1594
1608
  { field: "suggestionsFooter", local: true, reason: "Last popup row linking to all results." },
1595
- { field: "suggestionsLabel", local: true, reason: "Accessible name of the suggestions listbox." },
1609
+ {
1610
+ field: "suggestionsLabel",
1611
+ local: true,
1612
+ reason: "Accessible name of the suggestions listbox."
1613
+ },
1596
1614
  {
1597
1615
  field: "onQueryChange",
1598
1616
  local: true,
@@ -2182,6 +2200,39 @@ const COMPONENT_PROP_REGISTRY = {
2182
2200
  }
2183
2201
  ]
2184
2202
  },
2203
+ PageErrorBoundaryFallbackProp: {
2204
+ group: "layout",
2205
+ file: "components/layout.prop.ts",
2206
+ vocabulary: [
2207
+ {
2208
+ field: "fallback",
2209
+ local: true,
2210
+ reason: "Render-prop form of PageErrorBoundary `fallback`: `({ error, reset }) => node` (gh#1494)."
2211
+ }
2212
+ ]
2213
+ },
2214
+ PageErrorBoundaryProp: {
2215
+ group: "layout",
2216
+ file: "components/layout.prop.ts",
2217
+ vocabulary: [
2218
+ "ChildrenProp",
2219
+ {
2220
+ field: "fallback",
2221
+ local: true,
2222
+ reason: "What replaces the page that threw \u2014 a node, or `({ error, reset }) => node`. Default: an application ErrorSurface with the kit's localized copy (gh#1494)."
2223
+ },
2224
+ {
2225
+ field: "resetKey",
2226
+ local: true,
2227
+ reason: "React error-boundary reset key (react-error-boundary's resetKeys, one value): a change draws the page again. The URL change already resets."
2228
+ },
2229
+ {
2230
+ field: "onError",
2231
+ local: true,
2232
+ reason: "componentDidCatch reporter `(error, info)` for an error tracker."
2233
+ }
2234
+ ]
2235
+ },
2185
2236
  ErrorSurfaceProp: {
2186
2237
  group: "layout",
2187
2238
  file: "components/layout.prop.ts",
@@ -3453,6 +3504,24 @@ const COMPONENT_PROP_REGISTRY = {
3453
3504
  file: "components/data-display.prop.ts",
3454
3505
  vocabulary: []
3455
3506
  },
3507
+ AvatarKindProp: {
3508
+ group: "data-display",
3509
+ file: "components/data-display.prop.ts",
3510
+ vocabulary: []
3511
+ },
3512
+ AgentBadgeProp: {
3513
+ group: "data-display",
3514
+ file: "components/data-display.prop.ts",
3515
+ vocabulary: [
3516
+ {
3517
+ field: "as",
3518
+ local: true,
3519
+ reason: "Closed tag seam (div | span), the same one Badge carries, so the label stays valid HTML beside a name inside a link or a <button>."
3520
+ },
3521
+ "ChildrenProp",
3522
+ "ClassNameProp"
3523
+ ]
3524
+ },
3456
3525
  AvatarImageFitProp: {
3457
3526
  group: "data-display",
3458
3527
  file: "components/data-display.prop.ts",
@@ -4180,7 +4249,7 @@ const COMPONENT_PROP_REGISTRY = {
4180
4249
  FilterBarFilterProp: {
4181
4250
  group: "navigation",
4182
4251
  file: "components/navigation.prop.ts",
4183
- vocabulary: ["LabelProp", "PlaceholderProp", "DisabledProp"]
4252
+ vocabulary: ["LabelProp", "PlaceholderProp", "DisabledProp", "RequiredProp", "AllowClearProp"]
4184
4253
  },
4185
4254
  FilterBarChipProp: {
4186
4255
  group: "navigation",
@@ -243,6 +243,10 @@
243
243
  visibility: hidden;
244
244
  }
245
245
 
246
+ :root:has(.ui-overlay-modal) [data-sonner-toaster] {
247
+ pointer-events: none;
248
+ }
249
+
246
250
  .ui-skeleton-block {
247
251
  border-radius: var(--skeleton-radius, var(--radius));
248
252
  background: var(--skeleton-background, hsl(var(--muted)));
@@ -94,4 +94,18 @@
94
94
  width: var(--badge-remove-icon-size);
95
95
  height: var(--badge-remove-icon-size);
96
96
  }
97
+
98
+ [data-slot="badge"][data-agent] {
99
+ border-color: hsl(var(--badge-agent-border, var(--agent)));
100
+ background-color: transparent;
101
+ color: hsl(var(--badge-agent-foreground, var(--text-agent)));
102
+ white-space: nowrap;
103
+ }
104
+
105
+ @media (forced-colors: active) {
106
+ [data-slot="badge"][data-agent] {
107
+ border-color: CanvasText;
108
+ color: CanvasText;
109
+ }
110
+ }
97
111
  }
@@ -159,6 +159,16 @@
159
159
  border-radius: inherit;
160
160
  }
161
161
 
162
+ .ui-avatar[data-kind="agent"] {
163
+ overflow: visible;
164
+ }
165
+
166
+ .ui-avatar[data-kind="agent"] > .ui-avatar-image,
167
+ .ui-avatar[data-kind="agent"] > .ui-avatar-fallback {
168
+ overflow: hidden;
169
+ border-radius: inherit;
170
+ }
171
+
162
172
  [data-slot="avatar-presence"] {
163
173
  position: absolute;
164
174
  inset-block-end: var(--avatar-presence-inset);
@@ -234,6 +244,40 @@
234
244
  }
235
245
  }
236
246
 
247
+ [data-slot="avatar-agent"] {
248
+ position: absolute;
249
+ inset-block-start: var(--avatar-agent-inset, calc(var(--space-1) * -1));
250
+ inset-inline-end: var(--avatar-agent-inset, calc(var(--space-1) * -1));
251
+ display: inline-flex;
252
+ align-items: center;
253
+ justify-content: center;
254
+ padding-inline: var(--avatar-agent-padding-inline, var(--space-1));
255
+ border-radius: var(--radius-pill);
256
+ font-size: var(
257
+ --avatar-agent-font-size,
258
+ var(
259
+ --font-size-2xs,
260
+ calc(var(--font-size-base) / var(--font-size-ratio) / var(--font-size-ratio))
261
+ )
262
+ );
263
+ font-weight: var(--avatar-agent-font-weight, var(--font-weight-bold));
264
+ line-height: var(--line-height-tight);
265
+ white-space: nowrap;
266
+ color: hsl(var(--avatar-agent-foreground, var(--agent-foreground)));
267
+ background-color: hsl(var(--avatar-agent-background, var(--agent)));
268
+ box-shadow: 0 0 0 var(--avatar-agent-ring-width, var(--stroke-md))
269
+ hsl(var(--avatar-agent-ring-color, var(--background)));
270
+ pointer-events: none;
271
+ }
272
+
273
+ @media (forced-colors: active) {
274
+ [data-slot="avatar-agent"] {
275
+ color: Canvas;
276
+ background-color: CanvasText;
277
+ outline: var(--avatar-agent-ring-width, var(--stroke-md)) solid Canvas;
278
+ }
279
+ }
280
+
237
281
  .ui-progress {
238
282
  display: flex;
239
283
  flex-direction: column;
@@ -1,6 +1,9 @@
1
1
 
2
2
  @layer components {
3
3
  svg.ui-icon[data-slot="icon"] {
4
+
5
+ display: inline-block;
6
+ vertical-align: middle;
4
7
  inline-size: var(--icon-glyph-size);
5
8
  block-size: var(--icon-glyph-size);
6
9
 
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "33.22.2",
2
+ "version": "33.24.0",
3
3
  "generatedBy": "scripts/gen-style-layers.mjs — do not edit by hand; run `pnpm gen:style-layers`",
4
4
  "base": "base.css",
5
5
  "fonts": "fonts.css",
@@ -64,6 +64,12 @@
64
64
  "layout.css"
65
65
  ]
66
66
  },
67
+ "AgentBadge": {
68
+ "layers": [
69
+ "dialog-layout.css",
70
+ "badge-layout.css"
71
+ ]
72
+ },
67
73
  "Alert": {
68
74
  "layers": [
69
75
  "layout.css",
@@ -115,7 +121,11 @@
115
121
  "AppShell": {
116
122
  "layers": [
117
123
  "shell-layout.css",
118
- "dialog-layout.css"
124
+ "layout.css",
125
+ "control.css",
126
+ "text-layout.css",
127
+ "dialog-layout.css",
128
+ "data-display-layout.css"
119
129
  ]
120
130
  },
121
131
  "AreaChart": {
@@ -970,6 +980,16 @@
970
980
  "layout.css"
971
981
  ]
972
982
  },
983
+ "PageErrorBoundary": {
984
+ "layers": [
985
+ "shell-layout.css",
986
+ "layout.css",
987
+ "control.css",
988
+ "text-layout.css",
989
+ "dialog-layout.css",
990
+ "data-display-layout.css"
991
+ ]
992
+ },
973
993
  "Pagination": {
974
994
  "layers": [
975
995
  "layout.css",
@@ -907,6 +907,12 @@
907
907
  max-inline-size: 100%;
908
908
  }
909
909
 
910
+ .ui-page-header-help {
911
+ display: flex;
912
+ flex: none;
913
+ margin-inline-start: auto;
914
+ }
915
+
910
916
  .ui-page-header-title-row {
911
917
  display: flex;
912
918
  flex-wrap: wrap;
@@ -1124,6 +1130,7 @@
1124
1130
  }
1125
1131
 
1126
1132
  .ui-page-subtitle {
1133
+ overflow-wrap: anywhere;
1127
1134
  font-size: var(--page-subtitle-font-size);
1128
1135
  color: hsl(var(--muted-foreground));
1129
1136
  margin-top: var(--space-1);
@@ -1211,6 +1218,8 @@
1211
1218
  }
1212
1219
 
1213
1220
  .ui-breadcrumb-item {
1221
+ min-inline-size: 0;
1222
+ overflow-wrap: anywhere;
1214
1223
  display: inline-flex;
1215
1224
  align-items: center;
1216
1225
  gap: var(--space-inline-xs);
@@ -2780,6 +2789,7 @@
2780
2789
  }
2781
2790
 
2782
2791
  .ui-editorial-page-header-title {
2792
+ overflow-wrap: anywhere;
2783
2793
  margin: var(--editorial-page-header-title-space-block-start) 0
2784
2794
  var(--editorial-page-header-title-space-block-end);
2785
2795
  font-family: var(--font-family-editorial, var(--font-family-display));
@@ -2828,6 +2838,7 @@
2828
2838
  }
2829
2839
 
2830
2840
  .ui-editorial-article-title {
2841
+ overflow-wrap: anywhere;
2831
2842
  margin: var(--editorial-article-title-space-block) 0;
2832
2843
  font-family: var(--font-family-editorial, var(--font-family-display));
2833
2844
  font-size: var(--editorial-article-title-font-size);
@@ -6,6 +6,8 @@
6
6
  width: 100%;
7
7
  max-width: 100vw;
8
8
  min-width: 0;
9
+
10
+ overflow-x: clip;
9
11
  grid-template-areas:
10
12
  "sidebar topbar"
11
13
  "sidebar main"
@@ -784,7 +786,7 @@
784
786
  flex: 1;
785
787
  align-items: center;
786
788
  align-self: stretch;
787
- gap: var(--space-3);
789
+ gap: var(--app-shell-rail-gap);
788
790
  }
789
791
 
790
792
  .app-topbar-rail:has(> .app-topbar-right) {
@@ -829,6 +831,10 @@
829
831
  gap: var(--space-3);
830
832
  }
831
833
 
834
+ .app-topbar-custom:has(> .ui-topbar[data-overflow="menu"]) {
835
+ min-inline-size: var(--topbar-item-min-width);
836
+ }
837
+
832
838
  .app-topbar-left,
833
839
  .app-topbar-right {
834
840
  display: flex;
@@ -1858,6 +1864,10 @@
1858
1864
  border-inline-start: var(--stroke-hairline) solid hsl(var(--border));
1859
1865
  }
1860
1866
 
1867
+ .sb-nav-sub .sb-nav-sub {
1868
+ margin-inline-start: calc(var(--sidebar-nav-item-padding-x) + 2px);
1869
+ }
1870
+
1861
1871
  .sb-nav-item--sub {
1862
1872
  height: 1.75rem;
1863
1873
  font-size: var(--sidebar-nav-sub-font-size);
@@ -1944,6 +1954,12 @@
1944
1954
  white-space: nowrap;
1945
1955
  }
1946
1956
 
1957
+ .sb-flyout-group {
1958
+ display: flex;
1959
+ flex-direction: column;
1960
+ gap: var(--sidebar-nav-gap);
1961
+ }
1962
+
1947
1963
  .sb-user {
1948
1964
  display: flex;
1949
1965
  width: 100%;
@@ -166,7 +166,7 @@
166
166
  [data-slot="swatch"]
167
167
  ),
168
168
  [data-slot="table-cell"]
169
- > :not(
169
+ > :is(span, a, [data-direction="row"]):not(
170
170
  [data-wrap],
171
171
  [data-direction="col"],
172
172
  [data-direction="responsive"],