@godxjp/ui 33.12.7 → 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.
- package/README.md +4 -0
- package/agent/START-HERE.md +1 -1
- package/agent/components/BranchScopePicker.json +21 -1
- package/agent/components/Breadcrumb.json +8 -2
- package/agent/components/DataTable.json +1 -1
- package/agent/components/DatePicker.json +1 -1
- package/agent/components/MobileShell.json +1 -0
- package/agent/components/PageContainer.json +6 -0
- package/agent/components/Select.json +1 -1
- package/agent/components/Sidebar.json +1 -0
- package/agent/components/Table.json +1 -1
- package/agent/components.json +41 -7
- package/agent/index.json +3 -3
- package/agent/llms.txt +3 -3
- package/agent/tokens.json +2 -2
- package/agent/vocabulary.json +13 -0
- package/dist/components/data-entry/branch-scope-picker.d.ts +3 -0
- package/dist/components/data-entry/branch-scope-picker.js +65 -11
- package/dist/components/data-entry/date-picker.js +2 -1
- package/dist/components/data-entry/select.js +1 -1
- package/dist/components/feedback/dialog.js +1 -1
- package/dist/components/feedback/sheet.js +1 -1
- package/dist/components/layout/breadcrumb-ellipsis.js +33 -1
- package/dist/components/layout/breadcrumb.d.ts +4 -2
- package/dist/components/layout/breadcrumb.js +13 -3
- package/dist/components/layout/page-container.d.ts +1 -1
- package/dist/components/layout/page-container.js +5 -3
- package/dist/contracts/measurement.json +1 -1
- package/dist/i18n/messages/en.json +2 -1
- package/dist/i18n/messages/ja.json +13 -12
- package/dist/i18n/messages/vi.json +2 -1
- package/dist/props/components/data-entry.prop.d.ts +6 -0
- package/dist/props/components/layout.prop.d.ts +5 -1
- package/dist/props/registry.d.ts +19 -2
- package/dist/props/registry.js +21 -0
- package/dist/props/vocabulary/index.d.ts +1 -1
- package/dist/props/vocabulary/navigation.prop.d.ts +2 -0
- package/dist/styles/control.css +29 -3
- package/dist/styles/dialog-layout.css +4 -0
- package/dist/styles/layers.json +3 -2
- package/dist/styles/table-layout.css +16 -4
- package/dist/styles.css +1 -1
- package/dist/tokens/components/table.css +1 -1
- package/docs/TOKENS.md +11 -0
- package/package.json +2 -2
- package/scripts/cli.mjs +8 -2
- package/scripts/visual-audit.mjs +119 -27
|
@@ -1,8 +1,24 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
Children,
|
|
5
|
+
cloneElement,
|
|
6
|
+
isValidElement,
|
|
7
|
+
useEffect,
|
|
8
|
+
useRef
|
|
9
|
+
} from "react";
|
|
4
10
|
import { cn } from "../../lib/utils.js";
|
|
5
11
|
import { EllipsisTooltip } from "../feedback/tooltip.js";
|
|
12
|
+
function labelText(label) {
|
|
13
|
+
return Children.toArray(label).map((node) => {
|
|
14
|
+
if (typeof node === "string" || typeof node === "number") return String(node);
|
|
15
|
+
if (!isValidElement(node))
|
|
16
|
+
return "";
|
|
17
|
+
if (node.props["aria-hidden"] === true || node.props["aria-hidden"] === "true" || node.props.hidden)
|
|
18
|
+
return "";
|
|
19
|
+
return labelText(node.props.children);
|
|
20
|
+
}).join("");
|
|
21
|
+
}
|
|
6
22
|
function trailEllipsis(items) {
|
|
7
23
|
return items.some((item) => item.ellipsis) ? "" : void 0;
|
|
8
24
|
}
|
|
@@ -11,12 +27,28 @@ function BreadcrumbCrumbText({
|
|
|
11
27
|
children
|
|
12
28
|
}) {
|
|
13
29
|
const anchorRef = useRef(null);
|
|
30
|
+
const fullLabel = labelText(item.label);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
const node = anchorRef.current;
|
|
33
|
+
if (!node || !item.ellipsis) return;
|
|
34
|
+
const rendered = node.cloneNode(true);
|
|
35
|
+
rendered.querySelectorAll('[aria-hidden="true"], [hidden]').forEach((child) => child.remove());
|
|
36
|
+
const text = rendered.textContent || fullLabel;
|
|
37
|
+
if (text) {
|
|
38
|
+
node.setAttribute("aria-label", text);
|
|
39
|
+
node.setAttribute("title", text);
|
|
40
|
+
}
|
|
41
|
+
}, [fullLabel, item.label, item.ellipsis]);
|
|
14
42
|
if (!item.ellipsis) return children;
|
|
15
43
|
const tooltip = typeof item.ellipsis === "object" && "tooltip" in item.ellipsis ? item.ellipsis.tooltip === true ? item.label : item.ellipsis.tooltip : item.label;
|
|
16
44
|
const hasTooltip = tooltip !== void 0 && tooltip !== null && tooltip !== false && tooltip !== "";
|
|
17
45
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
18
46
|
cloneElement(children, {
|
|
47
|
+
// Keep the label's own start visible regardless of the page direction (#1370).
|
|
48
|
+
dir: "auto",
|
|
19
49
|
ref: anchorRef,
|
|
50
|
+
"aria-label": fullLabel || void 0,
|
|
51
|
+
title: fullLabel || void 0,
|
|
20
52
|
className: cn(children.props.className, "ui-breadcrumb-ellipsis")
|
|
21
53
|
}),
|
|
22
54
|
hasTooltip ? /* @__PURE__ */ jsx(EllipsisTooltip, { anchorRef, title: tooltip }) : null
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { ElementType } from "react";
|
|
2
|
-
import type { BreadcrumbItemRenderProp, BreadcrumbProp, BreadcrumbSeparatorProp } from "../../props/vocabulary/navigation.prop.js";
|
|
2
|
+
import type { BreadcrumbCurrentItemProp, BreadcrumbItemRenderProp, BreadcrumbProp, BreadcrumbSeparatorProp } from "../../props/vocabulary/navigation.prop.js";
|
|
3
3
|
export type BreadcrumbProps = {
|
|
4
4
|
items: BreadcrumbProp;
|
|
5
|
+
/** Last item is current by default; none keeps an ancestor-only trail linked. */
|
|
6
|
+
currentItem?: BreadcrumbCurrentItemProp;
|
|
5
7
|
linkComponent?: ElementType;
|
|
6
8
|
/** Override the `<nav>` landmark's accessible name. Defaults to a localized "Breadcrumb". */
|
|
7
9
|
ariaLabel?: string;
|
|
@@ -18,4 +20,4 @@ export type BreadcrumbProps = {
|
|
|
18
20
|
*/
|
|
19
21
|
itemRender?: BreadcrumbItemRenderProp;
|
|
20
22
|
};
|
|
21
|
-
export declare function Breadcrumb({ items, linkComponent: LinkComponent, ariaLabel, separator, itemRender, }: BreadcrumbProps): import("react").JSX.Element;
|
|
23
|
+
export declare function Breadcrumb({ items, currentItem, linkComponent: LinkComponent, ariaLabel, separator, itemRender, }: BreadcrumbProps): import("react").JSX.Element;
|
|
@@ -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({
|
|
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 && !
|
|
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":
|
|
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 && !
|
|
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:
|
|
139
|
-
"aria-current":
|
|
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.
|
|
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
|
package/dist/props/registry.d.ts
CHANGED
|
@@ -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 [
|
|
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).";
|
package/dist/props/registry.js
CHANGED
|
@@ -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
|
/**
|
package/dist/styles/control.css
CHANGED
|
@@ -1850,8 +1850,7 @@
|
|
|
1850
1850
|
.ui-number-input-step::after {
|
|
1851
1851
|
content: "";
|
|
1852
1852
|
position: absolute;
|
|
1853
|
-
inset-inline-start:
|
|
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:
|
|
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;
|
package/dist/styles/layers.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "33.
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|