@godxjp/ui 33.12.8 → 33.13.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 (40) hide show
  1. package/README.md +4 -0
  2. package/agent/START-HERE.md +1 -1
  3. package/agent/components/BranchScopePicker.json +21 -1
  4. package/agent/components/Breadcrumb.json +8 -2
  5. package/agent/components/DataTable.json +1 -1
  6. package/agent/components/MobileShell.json +1 -0
  7. package/agent/components/PageContainer.json +6 -0
  8. package/agent/components/Sidebar.json +1 -0
  9. package/agent/components/Table.json +1 -1
  10. package/agent/components.json +39 -5
  11. package/agent/index.json +3 -3
  12. package/agent/llms.txt +3 -3
  13. package/agent/tokens.json +2 -2
  14. package/agent/vocabulary.json +13 -0
  15. package/dist/components/data-entry/branch-scope-picker.d.ts +3 -0
  16. package/dist/components/data-entry/branch-scope-picker.js +65 -11
  17. package/dist/components/layout/breadcrumb-ellipsis.js +33 -1
  18. package/dist/components/layout/breadcrumb.d.ts +4 -2
  19. package/dist/components/layout/breadcrumb.js +13 -3
  20. package/dist/components/layout/page-container.d.ts +1 -1
  21. package/dist/components/layout/page-container.js +5 -3
  22. package/dist/contracts/measurement.json +1 -1
  23. package/dist/i18n/messages/en.json +2 -1
  24. package/dist/i18n/messages/ja.json +13 -12
  25. package/dist/i18n/messages/vi.json +2 -1
  26. package/dist/props/components/data-entry.prop.d.ts +6 -0
  27. package/dist/props/components/layout.prop.d.ts +5 -1
  28. package/dist/props/registry.d.ts +19 -2
  29. package/dist/props/registry.js +21 -0
  30. package/dist/props/vocabulary/index.d.ts +1 -1
  31. package/dist/props/vocabulary/navigation.prop.d.ts +2 -0
  32. package/dist/styles/control.css +29 -3
  33. package/dist/styles/layers.json +3 -2
  34. package/dist/styles/table-layout.css +16 -4
  35. package/dist/styles.css +1 -1
  36. package/dist/tokens/components/table.css +1 -1
  37. package/docs/TOKENS.md +11 -0
  38. package/package.json +2 -2
  39. package/scripts/cli.mjs +8 -2
  40. package/scripts/visual-audit.mjs +119 -27
@@ -11,6 +11,7 @@ import {
11
11
  } from "../navigation/dropdown-menu.js";
12
12
  function Breadcrumb({
13
13
  items,
14
+ currentItem = "last",
14
15
  linkComponent: LinkComponent = "a",
15
16
  ariaLabel,
16
17
  separator,
@@ -27,7 +28,15 @@ function Breadcrumb({
27
28
  "data-ellipsis": item.ellipsis ? "" : void 0,
28
29
  children: [
29
30
  index > 0 ? /* @__PURE__ */ jsx("span", { className: "ui-breadcrumb-separator", "aria-hidden": "true", children: separatorNode }) : null,
30
- renderBreadcrumbSegment({ item, index, isLast, items, itemRender, LinkComponent })
31
+ renderBreadcrumbSegment({
32
+ item,
33
+ index,
34
+ isLast,
35
+ isCurrent: isLast && currentItem === "last",
36
+ items,
37
+ itemRender,
38
+ LinkComponent
39
+ })
31
40
  ]
32
41
  },
33
42
  item.to ?? index
@@ -38,6 +47,7 @@ function renderBreadcrumbSegment({
38
47
  item,
39
48
  index,
40
49
  isLast,
50
+ isCurrent,
41
51
  items,
42
52
  itemRender,
43
53
  LinkComponent
@@ -62,10 +72,10 @@ function renderBreadcrumbSegment({
62
72
  )) })
63
73
  ] });
64
74
  }
65
- if (item.to && !isLast) {
75
+ if (item.to && !isCurrent) {
66
76
  return /* @__PURE__ */ jsx(BreadcrumbCrumbText, { item, children: /* @__PURE__ */ jsx(LinkComponent, { href: item.to, to: item.to, className: "ui-breadcrumb-link", children: item.label }) });
67
77
  }
68
- return /* @__PURE__ */ jsx(BreadcrumbCrumbText, { item, children: /* @__PURE__ */ jsx("span", { className: "ui-breadcrumb-current", "aria-current": isLast ? "page" : void 0, children: item.label }) });
78
+ return /* @__PURE__ */ jsx(BreadcrumbCrumbText, { item, children: /* @__PURE__ */ jsx("span", { className: "ui-breadcrumb-current", "aria-current": isCurrent ? "page" : void 0, children: item.label }) });
69
79
  }
70
80
  export {
71
81
  Breadcrumb
@@ -2,7 +2,7 @@ import type { PageContainerProp, PageInsetProp } from "../../props/components/la
2
2
  export type { PageContainerProp, PageContainerProp as PageContainerProps, PageContainerExtraProp, } from "../../props/components/layout.prop.js";
3
3
  export type { BreadcrumbItemProp, BreadcrumbItemProp as BreadcrumbItem, } from "../../props/vocabulary/navigation.prop.js";
4
4
  export declare function PageContainerInset({ className, children, ...props }: PageInsetProp): import("react").JSX.Element;
5
- declare function PageContainerRoot({ title, subtitle, status, extra, toolbar, footer, toolbarPad, footerPad, breadcrumb, breadcrumbLabel, breadcrumbAriaLabel, linkComponent: LinkComponent, headerLoading, titleRef, density, variant, preset, headerLayout, headerScale, icon, cover, measure, stickyFooter, footerReveal, fill, children, className, }: PageContainerProp): import("react").JSX.Element;
5
+ declare function PageContainerRoot({ title, subtitle, status, extra, toolbar, footer, toolbarPad, footerPad, breadcrumb, breadcrumbCurrentItem, breadcrumbLabel, breadcrumbAriaLabel, linkComponent: LinkComponent, headerLoading, titleRef, density, variant, preset, headerLayout, headerScale, icon, cover, measure, stickyFooter, footerReveal, fill, children, className, }: PageContainerProp): import("react").JSX.Element;
6
6
  export declare const PageContainer: typeof PageContainerRoot & {
7
7
  Inset: typeof PageContainerInset;
8
8
  };
@@ -42,6 +42,7 @@ function PageContainerRoot({
42
42
  toolbarPad,
43
43
  footerPad,
44
44
  breadcrumb,
45
+ breadcrumbCurrentItem = "last",
45
46
  breadcrumbLabel,
46
47
  breadcrumbAriaLabel,
47
48
  linkComponent: LinkComponent = "a",
@@ -111,6 +112,7 @@ function PageContainerRoot({
111
112
  className: "ui-breadcrumb",
112
113
  children: /* @__PURE__ */ jsx("ol", { className: "ui-breadcrumb-list", "data-ellipsis": trailEllipsis(breadcrumb), children: breadcrumb.map((item, i) => {
113
114
  const isLast = i === breadcrumb.length - 1;
115
+ const isCurrent = isLast && breadcrumbCurrentItem === "last";
114
116
  return (
115
117
  // `--space-inline-xs` gap the previous `.ui-inline-xs` gave, and it brings
116
118
  // `.ui-breadcrumb-item svg { 0.75rem }` with it, so the separator glyph no
@@ -124,7 +126,7 @@ function PageContainerRoot({
124
126
  "data-ellipsis": item.ellipsis ? "" : void 0,
125
127
  children: [
126
128
  i > 0 ? /* @__PURE__ */ jsx("span", { className: "ui-breadcrumb-separator", "aria-hidden": "true", children: /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true" }) }) : null,
127
- item.to && !isLast ? /* @__PURE__ */ jsx(BreadcrumbCrumbText, { item, children: /* @__PURE__ */ jsx(
129
+ item.to && !isCurrent ? /* @__PURE__ */ jsx(BreadcrumbCrumbText, { item, children: /* @__PURE__ */ jsx(
128
130
  LinkComponent,
129
131
  {
130
132
  href: item.to,
@@ -135,8 +137,8 @@ function PageContainerRoot({
135
137
  ) }) : /* @__PURE__ */ jsx(BreadcrumbCrumbText, { item, children: /* @__PURE__ */ jsx(
136
138
  "span",
137
139
  {
138
- className: isLast ? "text-foreground" : "",
139
- "aria-current": isLast ? "page" : void 0,
140
+ className: isCurrent ? "text-foreground" : "",
141
+ "aria-current": isCurrent ? "page" : void 0,
140
142
  children: item.label
141
143
  }
142
144
  ) })
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$comment": "AUTO-GENERATED by scripts/gen-measurement-contract.mjs — do not edit. Read this instead of guessing: docs/MEASUREMENT-CONTRACT.md.",
3
- "version": "33.12.8",
3
+ "version": "33.13.0",
4
4
  "targetSize": {
5
5
  "standard": "WCAG 2.2 SC 2.5.8 Target Size (Minimum), level AA — 24×24 CSS px",
6
6
  "min": 24,
@@ -171,7 +171,8 @@
171
171
  "error": "Could not load branches",
172
172
  "denied": "You do not have permission to view branches",
173
173
  "loading": "Loading branches…",
174
- "noMatches": "No branches match your search"
174
+ "noMatches": "No branches match your search",
175
+ "choose": "Choose a branch"
175
176
  },
176
177
  "formErrors": {
177
178
  "title": "Please review the following errors"
@@ -155,19 +155,20 @@
155
155
  "placeholder": "年月を選択"
156
156
  },
157
157
  "branchScope": {
158
- "label": "ブランチ範囲",
159
- "all": "すべてのブランチ",
160
- "allDescription": "現在および今後のすべてのブランチに適用",
161
- "selected": "選択したブランチのみ",
162
- "selectedDescription": "下で選択したブランチにのみ適用",
163
- "listLabel": "ブランチ",
164
- "searchPlaceholder": "ブランチを検索",
158
+ "label": "支店範囲",
159
+ "all": "すべての支店",
160
+ "allDescription": "現在および今後のすべての支店に適用",
161
+ "selected": "選択した支店のみ",
162
+ "selectedDescription": "下で選択した支店にのみ適用",
163
+ "listLabel": "支店",
164
+ "searchPlaceholder": "支店を検索",
165
165
  "selectedCount": "{count} 件選択中",
166
- "empty": "選択できるブランチがありません",
167
- "error": "ブランチを取得できませんでした",
168
- "denied": "ブランチを表示する権限がありません",
169
- "loading": "ブランチを読み込み中…",
170
- "noMatches": "検索に一致するブランチがありません"
166
+ "empty": "選択できる支店がありません",
167
+ "error": "支店を取得できませんでした",
168
+ "denied": "支店を表示する権限がありません",
169
+ "loading": "支店を読み込み中…",
170
+ "noMatches": "検索に一致する支店がありません",
171
+ "choose": "支店を選択"
171
172
  },
172
173
  "formErrors": {
173
174
  "title": "入力内容にエラーがあります"
@@ -167,7 +167,8 @@
167
167
  "error": "Không tải được danh sách chi nhánh",
168
168
  "denied": "Bạn không có quyền xem chi nhánh",
169
169
  "loading": "Đang tải chi nhánh…",
170
- "noMatches": "Không có chi nhánh khớp với tìm kiếm"
170
+ "noMatches": "Không có chi nhánh khớp với tìm kiếm",
171
+ "choose": "Chọn chi nhánh"
171
172
  },
172
173
  "formErrors": {
173
174
  "title": "Dữ liệu nhập có lỗi, vui lòng kiểm tra"
@@ -2216,6 +2216,12 @@ export type BranchScopePickerProp = FieldA11yProps & {
2216
2216
  defaultValue?: BranchScopeValueProp;
2217
2217
  /** Value change handler (fires for mode switches AND branch checks). */
2218
2218
  onValueChange?: (value: BranchScopeValueProp) => void;
2219
+ /** Single compact Select for navigation/record fields; multiple preserves the all/subset editor. */
2220
+ selectionMode?: "single" | "multiple";
2221
+ /** Permit organization-wide scope. Set false for record forms; validate one concrete branch on submit. Default true. */
2222
+ allowAll?: boolean;
2223
+ /** Hide after a successful one-branch read, unless disabled branch or validation error. Does not emit or normalize value. Default false. */
2224
+ hideWhenSingle?: boolean;
2219
2225
  /** Disable the whole control. */
2220
2226
  disabled?: DisabledProp;
2221
2227
  /** Render the current value without any editable affordance (locked view). */
@@ -1,7 +1,7 @@
1
1
  /** Layout component prop types — @see docs/COMPONENTS.md#layout */
2
2
  import type * as React from "react";
3
3
  import type { ComponentType, ReactNode, SVGProps } from "react";
4
- import type { BreadcrumbProp, TitleProp, SubtitleProp, StatusProp, ExtraProp, FooterProp, PageDensityProp, DensityProp, PageContainerVariantProp, CenteredShellWidthProp, CenteredShellAlignProp, CenteredShellPresetProp, ErrorSurfaceModeProp, ErrorSurfaceStatusProp, AuthShellPresetProp, MobileShellHeightProp, MobileShellWidthProp, OrientationProp, TextAlignProp, TextToneProp, BreakpointProp, GapProp, PadProp, PadRawProp, ClassNameProp, ChildrenProp, IdProp, DisabledProp, DescriptionProp, ActionProp, IconProp, HeadingLevelProp, ToneProp, WidthProp, SizeProp } from "../vocabulary/index.js";
4
+ import type { BreadcrumbProp, BreadcrumbCurrentItemProp, TitleProp, SubtitleProp, StatusProp, ExtraProp, FooterProp, PageDensityProp, DensityProp, PageContainerVariantProp, CenteredShellWidthProp, CenteredShellAlignProp, CenteredShellPresetProp, ErrorSurfaceModeProp, ErrorSurfaceStatusProp, AuthShellPresetProp, MobileShellHeightProp, MobileShellWidthProp, OrientationProp, TextAlignProp, TextToneProp, BreakpointProp, GapProp, PadProp, PadRawProp, ClassNameProp, ChildrenProp, IdProp, DisabledProp, DescriptionProp, ActionProp, IconProp, HeadingLevelProp, ToneProp, WidthProp, SizeProp } from "../vocabulary/index.js";
5
5
  import type { EmptyStateToneProp } from "./data-display.prop.js";
6
6
  import type { SearchInputProp } from "./data-entry.prop.js";
7
7
  /**
@@ -82,6 +82,8 @@ export type PageContainerProp = {
82
82
  toolbar?: ReactNode;
83
83
  footer?: FooterProp;
84
84
  breadcrumb?: BreadcrumbProp;
85
+ /** Last item is current by default; none keeps an ancestor-only trail linked. */
86
+ breadcrumbCurrentItem?: BreadcrumbCurrentItemProp;
85
87
  /**
86
88
  * Override the breadcrumb `<nav>` landmark's accessible name. Defaults to a localized
87
89
  * "Breadcrumb".
@@ -1467,6 +1469,8 @@ export type SidebarProp = {
1467
1469
  */
1468
1470
  brand?: ReactNode | ((collapsed: boolean) => ReactNode);
1469
1471
  /**
1472
+ * Also accepts one app-local scope control (BranchScopePicker selectionMode="single").
1473
+ * This is viewing scope, not an organization/platform switch.
1470
1474
  * The rail's ONE primary action ("New issue", "+ Create", "New page"), rendered between `brand`
1471
1475
  * and the scrolling nav and never scrolling with it. Put exactly one primary control here: a
1472
1476
  * `Button` (variant primary) full width when expanded, icon-only with an `aria-label` + tooltip
@@ -604,6 +604,11 @@ export declare const VOCABULARY_REGISTRY: {
604
604
  readonly category: "navigation";
605
605
  readonly description: "One-line truncation of a breadcrumb segment, with the full label in a tooltip";
606
606
  };
607
+ readonly BreadcrumbCurrentItemProp: {
608
+ readonly file: "vocabulary/navigation.prop.ts";
609
+ readonly category: "navigation";
610
+ readonly description: "Current breadcrumb item: last (default) or none for ancestors only";
611
+ };
607
612
  readonly BreadcrumbProp: {
608
613
  readonly file: "vocabulary/navigation.prop.ts";
609
614
  readonly category: "navigation";
@@ -778,7 +783,7 @@ export declare const COMPONENT_PROP_REGISTRY: {
778
783
  readonly PageContainerProp: {
779
784
  readonly group: "layout";
780
785
  readonly file: "components/layout.prop.ts";
781
- readonly vocabulary: readonly ["TitleProp", "SubtitleProp", "StatusProp", "ExtraProp", "FooterProp", "BreadcrumbProp", "DensityProp", "PageContainerVariantProp", {
786
+ readonly vocabulary: readonly ["TitleProp", "SubtitleProp", "StatusProp", "ExtraProp", "FooterProp", "BreadcrumbProp", "BreadcrumbCurrentItemProp", "DensityProp", "PageContainerVariantProp", {
782
787
  readonly field: "toolbar";
783
788
  readonly local: true;
784
789
  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.";
@@ -3822,7 +3827,19 @@ export declare const COMPONENT_PROP_REGISTRY: {
3822
3827
  readonly BranchScopePickerProp: {
3823
3828
  readonly group: "data-entry";
3824
3829
  readonly file: "components/data-entry.prop.ts";
3825
- readonly vocabulary: readonly ["ValueProp", "DefaultValueProp", "OnValueChangeProp", "DisabledProp", "ErrorProp", "NameProp", "IdProp", "ClassNameProp", {
3830
+ readonly vocabulary: readonly [{
3831
+ readonly field: "selectionMode";
3832
+ readonly local: true;
3833
+ readonly reason: "Single navigation scope or existing multiple-branch subset editor.";
3834
+ }, {
3835
+ readonly field: "allowAll";
3836
+ readonly local: true;
3837
+ readonly reason: "Whether organization-wide branch scope is selectable.";
3838
+ }, {
3839
+ readonly field: "hideWhenSingle";
3840
+ readonly local: true;
3841
+ readonly reason: "Hide a settled single-branch navigation scope without changing consumer state.";
3842
+ }, "ValueProp", "DefaultValueProp", "OnValueChangeProp", "DisabledProp", "ErrorProp", "NameProp", "IdProp", "ClassNameProp", {
3826
3843
  readonly field: "branches";
3827
3844
  readonly local: true;
3828
3845
  readonly reason: "Consumer-supplied selectable branches (see BranchScopeOptionProp).";
@@ -604,6 +604,11 @@ const VOCABULARY_REGISTRY = {
604
604
  category: "navigation",
605
605
  description: "One-line truncation of a breadcrumb segment, with the full label in a tooltip"
606
606
  },
607
+ BreadcrumbCurrentItemProp: {
608
+ file: "vocabulary/navigation.prop.ts",
609
+ category: "navigation",
610
+ description: "Current breadcrumb item: last (default) or none for ancestors only"
611
+ },
607
612
  BreadcrumbProp: {
608
613
  file: "vocabulary/navigation.prop.ts",
609
614
  category: "navigation",
@@ -794,6 +799,7 @@ const COMPONENT_PROP_REGISTRY = {
794
799
  "ExtraProp",
795
800
  "FooterProp",
796
801
  "BreadcrumbProp",
802
+ "BreadcrumbCurrentItemProp",
797
803
  "DensityProp",
798
804
  "PageContainerVariantProp",
799
805
  {
@@ -4579,6 +4585,21 @@ const COMPONENT_PROP_REGISTRY = {
4579
4585
  group: "data-entry",
4580
4586
  file: "components/data-entry.prop.ts",
4581
4587
  vocabulary: [
4588
+ {
4589
+ field: "selectionMode",
4590
+ local: true,
4591
+ reason: "Single navigation scope or existing multiple-branch subset editor."
4592
+ },
4593
+ {
4594
+ field: "allowAll",
4595
+ local: true,
4596
+ reason: "Whether organization-wide branch scope is selectable."
4597
+ },
4598
+ {
4599
+ field: "hideWhenSingle",
4600
+ local: true,
4601
+ reason: "Hide a settled single-branch navigation scope without changing consumer state."
4602
+ },
4582
4603
  "ValueProp",
4583
4604
  "DefaultValueProp",
4584
4605
  "OnValueChangeProp",
@@ -3,5 +3,5 @@ export type { ClassNameProp, ChildrenProp, IdProp, OpenProp, DefaultOpenProp, On
3
3
  export type { TitleProp, SubtitleProp, StatusProp, DescriptionProp, ExtraProp, FooterProp, ActionProp, IconProp, ConfirmLabelProp, CancelLabelProp, ActionsProp, EmptyMessageProp, } from "./content.prop.js";
4
4
  export type { PageDensityProp, PageContainerVariantProp, CenteredShellWidthProp, CenteredShellAlignProp, CenteredShellPresetProp, ErrorSurfaceModeProp, ErrorSurfaceStatusProp, AuthShellPresetProp, MobileShellHeightProp, MobileShellWidthProp, OrientationProp, TableDensityProp, DensityProp, GapNameProp, PadProp, PadRawProp, PadSides, GapProp, GapStepProp, } from "./layout.prop.js";
5
5
  export type { ButtonVariantProp, ButtonSizeProp, BadgeVariantProp, AppSettingPickerAppearanceProp, AppSettingCycleAppearanceProp, ShapeProp, AvatarShapeProp, TextSizeProp, TextToneProp, FontWeightProp, HeadingLevelProp, TextAlignProp, TextWhitespaceProp, TextBreakProp, TypographyTypeProp, TypographyCopyConfigProp, TypographyEditConfigProp, TypographyEllipsisConfigProp, TypographyActionsConfigProp, SizeProp, ControlStatusProp, ControlVariantProp, FormLayoutProp, DescriptionsLayoutProp, BreakpointProp, ConfirmVariantProp, ToneProp, AlertVariantProp, CalloutKindProp, SortDirectionProp, ColumnAlignProp, SortStateProp, RevealDelayProp, RevealTriggerProp, InViewAmountProp, ActivityVariantProp, ActivityAnnounceProp, IconSizeProp, } from "./interaction.prop.js";
6
- export type { BreadcrumbItemProp, BreadcrumbProp, BreadcrumbItemMenuProp, BreadcrumbItemEllipsisProp, BreadcrumbItemMenuEntryProp, BreadcrumbSeparatorProp, BreadcrumbItemRenderProp, } from "./navigation.prop.js";
6
+ export type { BreadcrumbItemProp, BreadcrumbProp, BreadcrumbCurrentItemProp, BreadcrumbItemMenuProp, BreadcrumbItemEllipsisProp, BreadcrumbItemMenuEntryProp, BreadcrumbSeparatorProp, BreadcrumbItemRenderProp, } from "./navigation.prop.js";
7
7
  export type { GetRowIdProp, GetRowLabelProp, OnRowClickProp, ColumnDefProp, TablePresetProp, TableColumnPriorityProp, TableCellIndentProp, SelectedIdsProp, OnSelectChangeProp, OnTableDensityChangeProp, TableRowToneProp, RowToneProp, OnSortChangeProp, OnSearchChangeProp, OnClearFiltersProp, HasActiveFiltersProp, StickyProp, ColumnFixedProp, ColumnFilterValueProp, ColumnFilterItemProp, ColumnFilterStateProp, OnColumnFilterChangeProp, ColumnCompareProp, ColumnSorterProp, TableSelectionItemProp, TableSelectionBuiltInProp, TableSelectAllMatchingProp, TableRowSelectionProp, TableExpandableProp, TableSummaryProp, TableScrollProp, TableStickyProp, OnRowProp, TablePaginationProp, TablePaginationPositionProp, DescriptionsColumnProp, DescriptionsSpanProp, DescriptionsItemsProp, } from "./data.prop.js";
@@ -48,6 +48,8 @@ export type BreadcrumbItemProp = {
48
48
  export type BreadcrumbItemEllipsisProp = boolean | {
49
49
  tooltip?: React.ReactNode;
50
50
  };
51
+ /** Which item represents the current page; none is an ancestor-only trail. */
52
+ export type BreadcrumbCurrentItemProp = "last" | "none";
51
53
  /** Ordered breadcrumb trail above page title. */
52
54
  export type BreadcrumbProp = BreadcrumbItemProp[];
53
55
  /**
@@ -1850,8 +1850,7 @@
1850
1850
  .ui-number-input-step::after {
1851
1851
  content: "";
1852
1852
  position: absolute;
1853
- inset-inline-start: 50%;
1854
- translate: -50% 0;
1853
+ inset-inline-start: calc((100% - var(--touch-target-min)) / 2);
1855
1854
  inline-size: var(--touch-target-min);
1856
1855
  block-size: var(--touch-target-min);
1857
1856
  }
@@ -2689,6 +2688,7 @@
2689
2688
  .ui-calendar {
2690
2689
  position: relative;
2691
2690
  inline-size: fit-content;
2691
+ max-inline-size: 100%;
2692
2692
  padding: var(--calendar-space-inset);
2693
2693
  }
2694
2694
 
@@ -2912,12 +2912,37 @@
2912
2912
  block-size: var(--calendar-chevron-size);
2913
2913
  }
2914
2914
 
2915
+ .ui-calendar-month {
2916
+ min-inline-size: 0;
2917
+ }
2918
+
2919
+ .ui-calendar-day,
2920
+ .ui-calendar-weekday {
2921
+ flex: 0 1 var(--control-height);
2922
+ min-inline-size: calc(var(--touch-target-min) + var(--stroke-hairline));
2923
+ }
2924
+
2915
2925
  .ui-calendar-grid {
2916
2926
  margin-block-start: var(--calendar-grid-space-block-start);
2917
- inline-size: 100%;
2927
+ inline-size: calc(7 * var(--control-height));
2928
+ max-inline-size: 100%;
2929
+ table-layout: fixed;
2918
2930
  border-collapse: collapse;
2919
2931
  }
2920
2932
 
2933
+ .ui-calendar[data-bordered="true"] .ui-calendar-grid {
2934
+ inline-size: calc(7 * var(--control-height) + var(--stroke-hairline));
2935
+ }
2936
+
2937
+ .ui-calendar .ui-calendar-grid:has(.ui-calendar-week-number) {
2938
+ inline-size: 100%;
2939
+ table-layout: auto;
2940
+ }
2941
+
2942
+ .ui-calendar[data-width="full"] .ui-calendar-grid {
2943
+ inline-size: 100%;
2944
+ }
2945
+
2921
2946
  .ui-calendar-weekday {
2922
2947
  inline-size: var(--control-height);
2923
2948
  border-radius: var(--calendar-weekday-radius, calc(var(--radius) / var(--radius-ratio)));
@@ -2947,6 +2972,7 @@
2947
2972
  .ui-calendar .ui-calendar-day-button {
2948
2973
 
2949
2974
  color: inherit;
2975
+ max-inline-size: 100%;
2950
2976
  inline-size: var(--control-height);
2951
2977
  block-size: var(--control-height);
2952
2978
  padding: 0;
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "33.12.8",
2
+ "version": "33.13.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",
@@ -215,7 +215,8 @@
215
215
  "alert-layout.css",
216
216
  "badge-layout.css",
217
217
  "data-entry-layout.css",
218
- "form-layout.css"
218
+ "form-layout.css",
219
+ "navigation-layout.css"
219
220
  ]
220
221
  },
221
222
  "Breadcrumb": {
@@ -1053,7 +1053,10 @@
1053
1053
  border: var(--stroke-hairline) solid hsl(var(--border));
1054
1054
  border-radius: var(--radius-md, calc(var(--radius) / var(--radius-ratio)));
1055
1055
  padding: var(--table-stacked-collection-card-padding-y)
1056
- var(--table-stacked-collection-card-padding-x);
1056
+ var(
1057
+ --table-stacked-collection-card-padding-x,
1058
+ calc(var(--card-space-inset) - var(--stroke-hairline))
1059
+ );
1057
1060
  margin-block-end: var(--table-stacked-collection-card-gap);
1058
1061
  }
1059
1062
 
@@ -1107,7 +1110,10 @@
1107
1110
  border: var(--stroke-hairline) solid hsl(var(--border));
1108
1111
  border-radius: var(--radius-md, calc(var(--radius) / var(--radius-ratio)));
1109
1112
  padding: var(--table-stacked-collection-card-padding-y)
1110
- var(--table-stacked-collection-card-padding-x);
1113
+ var(
1114
+ --table-stacked-collection-card-padding-x,
1115
+ calc(var(--card-space-inset) - var(--stroke-hairline))
1116
+ );
1111
1117
  margin-block-end: var(--table-stacked-collection-card-gap);
1112
1118
  }
1113
1119
 
@@ -1159,7 +1165,10 @@
1159
1165
  border: var(--stroke-hairline) solid hsl(var(--border));
1160
1166
  border-radius: var(--radius-md, calc(var(--radius) / var(--radius-ratio)));
1161
1167
  padding: var(--table-stacked-collection-card-padding-y)
1162
- var(--table-stacked-collection-card-padding-x);
1168
+ var(
1169
+ --table-stacked-collection-card-padding-x,
1170
+ calc(var(--card-space-inset) - var(--stroke-hairline))
1171
+ );
1163
1172
  margin-block-end: var(--table-stacked-collection-card-gap);
1164
1173
  }
1165
1174
 
@@ -1211,7 +1220,10 @@
1211
1220
  border: var(--stroke-hairline) solid hsl(var(--border));
1212
1221
  border-radius: var(--radius-md, calc(var(--radius) / var(--radius-ratio)));
1213
1222
  padding: var(--table-stacked-collection-card-padding-y)
1214
- var(--table-stacked-collection-card-padding-x);
1223
+ var(
1224
+ --table-stacked-collection-card-padding-x,
1225
+ calc(var(--card-space-inset) - var(--stroke-hairline))
1226
+ );
1215
1227
  margin-block-end: var(--table-stacked-collection-card-gap);
1216
1228
  }
1217
1229