@godxjp/ui 18.5.0 → 18.6.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/dist/components/charts/compact-bar-trend.d.ts +2 -1
- package/dist/components/charts/index.d.ts +4 -1
- package/dist/components/data-display/data-table.d.ts +25 -4
- package/dist/components/data-display/data-table.js +13 -2
- package/dist/components/data-display/empty-state.js +1 -1
- package/dist/components/data-display/index.d.ts +1 -1
- package/dist/components/data-display/list-row.d.ts +19 -0
- package/dist/components/data-display/list-row.js +2 -0
- package/dist/components/data-display/qr-code.d.ts +1 -1
- package/dist/components/data-display/table.d.ts +47 -2
- package/dist/components/data-display/table.js +29 -4
- package/dist/components/data-entry/command.d.ts +10 -10
- package/dist/components/data-entry/index.d.ts +1 -0
- package/dist/components/data-entry/input-otp.d.ts +1 -0
- package/dist/components/feedback/dialog.d.ts +14 -1
- package/dist/components/feedback/dialog.js +4 -0
- package/dist/components/feedback/index.d.ts +1 -1
- package/dist/components/feedback/index.js +2 -0
- package/dist/components/general/logo.d.ts +7 -1
- package/dist/components/general/logo.js +1 -1
- package/dist/components/layout/app-shell.d.ts +1 -1
- package/dist/components/layout/app-shell.js +55 -46
- package/dist/components/layout/auth-account-summary.d.ts +5 -0
- package/dist/components/layout/auth-account-summary.js +31 -0
- package/dist/components/layout/auth-shell.d.ts +3 -2
- package/dist/components/layout/centered-shell.d.ts +1 -1
- package/dist/components/layout/centered-shell.js +28 -19
- package/dist/components/layout/error-surface.d.ts +35 -0
- package/dist/components/layout/error-surface.js +155 -0
- package/dist/components/layout/flex.d.ts +1 -1
- package/dist/components/layout/flex.js +4 -0
- package/dist/components/layout/index.d.ts +5 -0
- package/dist/components/layout/index.js +4 -0
- package/dist/components/layout/page-container.d.ts +1 -1
- package/dist/components/layout/page-container.js +4 -0
- package/dist/components/navigation/steps.js +38 -19
- package/dist/components/navigation/tabs.js +12 -3
- package/dist/components/ui/avatar.d.ts +2 -1
- package/dist/components/ui/avatar.js +2 -1
- package/dist/components/ui/input-otp.d.ts +4 -1
- package/dist/components/ui/input-otp.js +2 -1
- package/dist/components/ui/toggle-group.d.ts +7 -4
- package/dist/components/ui/toggle-group.js +32 -21
- package/dist/email/brand-mark.d.ts +21 -5
- package/dist/email/brand-mark.js +5 -0
- package/dist/email/color.d.ts +2 -1
- package/dist/email/geometry.d.ts +9 -1
- package/dist/email/geometry.js +1 -0
- package/dist/email/index.d.ts +6 -1
- package/dist/email/index.js +6 -0
- package/dist/email/inline-style.d.ts +7 -5
- package/dist/email/inline-style.js +5 -0
- package/dist/email/tokens.generated.d.ts +40 -20
- package/dist/email/tokens.generated.js +40 -20
- package/dist/email/urgency.d.ts +22 -0
- package/dist/email/urgency.js +14 -0
- package/dist/i18n/messages/en.json +15 -1
- package/dist/i18n/messages/ja.json +15 -1
- package/dist/i18n/messages/vi.json +15 -1
- package/dist/props/components/data-display.prop.d.ts +63 -1
- package/dist/props/components/data-entry.prop.d.ts +6 -0
- package/dist/props/components/index.d.ts +1 -1
- package/dist/props/components/layout.prop.d.ts +191 -4
- package/dist/props/components/navigation.prop.d.ts +5 -1
- package/dist/props/registry.d.ts +145 -4
- package/dist/props/registry.js +189 -5
- package/dist/props/vocabulary/data.prop.d.ts +27 -0
- package/dist/props/vocabulary/index.d.ts +3 -3
- package/dist/props/vocabulary/interaction.prop.d.ts +9 -0
- package/dist/props/vocabulary/layout.prop.d.ts +38 -7
- package/dist/styles/control.css +28 -0
- package/dist/styles/data-display-layout.css +26 -0
- package/dist/styles/layout.css +99 -0
- package/dist/styles/logo-layout.css +42 -9
- package/dist/styles/navigation-layout.css +109 -0
- package/dist/styles/shell-layout.css +302 -0
- package/dist/styles/table-layout.css +164 -1
- package/dist/theme/dxs.canonical.css +5 -4
- package/dist/tokens/axes.css +4 -3
- package/dist/tokens/base.css +1 -0
- package/dist/tokens/components/data-display.css +13 -0
- package/dist/tokens/components/email.css +43 -16
- package/dist/tokens/components/error-surface.css +36 -0
- package/dist/tokens/components/list-row.css +20 -0
- package/dist/tokens/components/logo.css +52 -10
- package/dist/tokens/components/navigation.css +15 -0
- package/dist/tokens/components/shell.css +72 -0
- package/dist/tokens/components/table.css +45 -0
- package/dist/tokens/foundation.css +26 -0
- package/dist/tokens/semantic/layout.css +25 -0
- package/package.json +8 -2
|
@@ -150,6 +150,14 @@
|
|
|
150
150
|
"version": "Version {version}",
|
|
151
151
|
"effectiveDate": "Effective {date}"
|
|
152
152
|
},
|
|
153
|
+
"errorSurface": {
|
|
154
|
+
"statusLabel": "HTTP status {status}",
|
|
155
|
+
"requestId": "Request ID",
|
|
156
|
+
"permission": "Required permission",
|
|
157
|
+
"organization": "Organization",
|
|
158
|
+
"maintenanceWindow": "Scheduled maintenance",
|
|
159
|
+
"maintenanceProgress": "Maintenance progress {percent}"
|
|
160
|
+
},
|
|
153
161
|
"topbar": {
|
|
154
162
|
"toggleSidebar": "Toggle sidebar",
|
|
155
163
|
"search": "Search",
|
|
@@ -205,7 +213,13 @@
|
|
|
205
213
|
},
|
|
206
214
|
"navigation": {
|
|
207
215
|
"steps": {
|
|
208
|
-
"ariaLabel": "Progress"
|
|
216
|
+
"ariaLabel": "Progress",
|
|
217
|
+
"status": {
|
|
218
|
+
"wait": "Waiting",
|
|
219
|
+
"process": "Current step",
|
|
220
|
+
"finish": "Completed",
|
|
221
|
+
"error": "Error"
|
|
222
|
+
}
|
|
209
223
|
},
|
|
210
224
|
"breadcrumb": {
|
|
211
225
|
"ariaLabel": "Breadcrumb"
|
|
@@ -150,6 +150,14 @@
|
|
|
150
150
|
"version": "バージョン {version}",
|
|
151
151
|
"effectiveDate": "施行日 {date}"
|
|
152
152
|
},
|
|
153
|
+
"errorSurface": {
|
|
154
|
+
"statusLabel": "HTTP ステータス {status}",
|
|
155
|
+
"requestId": "リクエスト ID",
|
|
156
|
+
"permission": "必要な権限",
|
|
157
|
+
"organization": "組織",
|
|
158
|
+
"maintenanceWindow": "計画メンテナンス",
|
|
159
|
+
"maintenanceProgress": "メンテナンス進捗 {percent}"
|
|
160
|
+
},
|
|
153
161
|
"topbar": {
|
|
154
162
|
"toggleSidebar": "サイドバーの切り替え",
|
|
155
163
|
"search": "検索",
|
|
@@ -205,7 +213,13 @@
|
|
|
205
213
|
},
|
|
206
214
|
"navigation": {
|
|
207
215
|
"steps": {
|
|
208
|
-
"ariaLabel": "進行状況"
|
|
216
|
+
"ariaLabel": "進行状況",
|
|
217
|
+
"status": {
|
|
218
|
+
"wait": "未完了",
|
|
219
|
+
"process": "現在のステップ",
|
|
220
|
+
"finish": "完了",
|
|
221
|
+
"error": "エラー"
|
|
222
|
+
}
|
|
209
223
|
},
|
|
210
224
|
"breadcrumb": {
|
|
211
225
|
"ariaLabel": "パンくずリスト"
|
|
@@ -150,6 +150,14 @@
|
|
|
150
150
|
"version": "Phiên bản {version}",
|
|
151
151
|
"effectiveDate": "Hiệu lực từ {date}"
|
|
152
152
|
},
|
|
153
|
+
"errorSurface": {
|
|
154
|
+
"statusLabel": "Trạng thái HTTP {status}",
|
|
155
|
+
"requestId": "Mã yêu cầu",
|
|
156
|
+
"permission": "Quyền yêu cầu",
|
|
157
|
+
"organization": "Tổ chức",
|
|
158
|
+
"maintenanceWindow": "Bảo trì theo lịch",
|
|
159
|
+
"maintenanceProgress": "Tiến độ bảo trì {percent}"
|
|
160
|
+
},
|
|
153
161
|
"topbar": {
|
|
154
162
|
"toggleSidebar": "Bật/tắt thanh bên",
|
|
155
163
|
"search": "Tìm kiếm",
|
|
@@ -205,7 +213,13 @@
|
|
|
205
213
|
},
|
|
206
214
|
"navigation": {
|
|
207
215
|
"steps": {
|
|
208
|
-
"ariaLabel": "Tiến trình"
|
|
216
|
+
"ariaLabel": "Tiến trình",
|
|
217
|
+
"status": {
|
|
218
|
+
"wait": "Đang chờ",
|
|
219
|
+
"process": "Bước hiện tại",
|
|
220
|
+
"finish": "Đã hoàn tất",
|
|
221
|
+
"error": "Lỗi"
|
|
222
|
+
}
|
|
209
223
|
},
|
|
210
224
|
"breadcrumb": {
|
|
211
225
|
"ariaLabel": "Đường dẫn"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Data Display component prop types — @see docs/COMPONENTS.md#data-display */
|
|
2
2
|
import type * as React from "react";
|
|
3
|
-
import type { ActionProp, ClassNameProp, DescriptionProp, IconProp, TitleProp, ColumnDefProp, GetRowIdProp, OnRowClickProp, OnSelectChangeProp, OnSortChangeProp, OnTableDensityChangeProp, SelectedIdsProp, SortStateProp, TableDensityProp, ChildrenProp, ToneProp, HeadingLevelProp, HandlerProp, SizeProp, LabelProp, IdProp } from "../vocabulary/index.js";
|
|
3
|
+
import type { ActionProp, ClassNameProp, DescriptionProp, IconProp, TitleProp, ColumnDefProp, GetRowIdProp, OnRowClickProp, OnSelectChangeProp, OnSortChangeProp, OnTableDensityChangeProp, SelectedIdsProp, SortStateProp, TableDensityProp, TablePresetProp, BreakpointProp, DensityProp, ChildrenProp, ToneProp, AvatarShapeProp, HeadingLevelProp, HandlerProp, SizeProp, LabelProp, IdProp } from "../vocabulary/index.js";
|
|
4
4
|
/** @see EmptyState */
|
|
5
5
|
/**
|
|
6
6
|
* Semantic intent of the EmptyState icon medallion — a subset of the shared `ToneProp` vocabulary
|
|
@@ -50,6 +50,21 @@ export type DescriptionsItemProp = {
|
|
|
50
50
|
value: React.ReactNode;
|
|
51
51
|
mono?: boolean;
|
|
52
52
|
};
|
|
53
|
+
/**
|
|
54
|
+
* @see Avatar
|
|
55
|
+
*
|
|
56
|
+
* Identity mark. `shape` is the ONLY appearance knob: the default `circle` is the person avatar
|
|
57
|
+
* (unchanged — an existing `<Avatar>` renders identically), `square` is the entity-header
|
|
58
|
+
* organization / service mark (compact rounded square on the brand surface). Every value it
|
|
59
|
+
* paints — radius, box size, fill, glyph colour — comes from the `--avatar-square-*` component
|
|
60
|
+
* tokens (cardinal rule #45), so a service retunes the entity mark once in its theme instead of
|
|
61
|
+
* overriding `className` per call site.
|
|
62
|
+
*/
|
|
63
|
+
export type AvatarProp = React.ComponentPropsWithoutRef<"span"> & {
|
|
64
|
+
shape?: AvatarShapeProp;
|
|
65
|
+
className?: ClassNameProp;
|
|
66
|
+
children?: ChildrenProp;
|
|
67
|
+
};
|
|
53
68
|
/** @see Badge */
|
|
54
69
|
export type BadgeProp = {
|
|
55
70
|
variant?: "default" | "secondary" | "outline";
|
|
@@ -148,6 +163,53 @@ export type DataTableProp<T> = {
|
|
|
148
163
|
denied?: React.ReactNode;
|
|
149
164
|
/** Retry handler surfaced by the built-in `error` state. */
|
|
150
165
|
onRetry?: HandlerProp;
|
|
166
|
+
/**
|
|
167
|
+
* Named collection contract (gh#253) — the SAME preset the `Table` primitive owns, forwarded to
|
|
168
|
+
* the table DataTable renders. `"default"` (the default) emits no attribute and matches no
|
|
169
|
+
* selector. `"action-collection"` is the canonical dense approval / action queue: below
|
|
170
|
+
* `collapseBelow` the desktop intrinsic column widths give way to the token-owned column-PRIORITY
|
|
171
|
+
* measures (`--table-action-collection-*`) under `table-layout: fixed`, cells wrap, and the
|
|
172
|
+
* surface drops its `--table-surface-min-inline-size` floor — so every column, row actions
|
|
173
|
+
* included, stays inside a 390px frame with no horizontal scroll. Mark each column with
|
|
174
|
+
* `priority` on its `ColumnDef`.
|
|
175
|
+
*/
|
|
176
|
+
preset?: TablePresetProp;
|
|
177
|
+
/**
|
|
178
|
+
* Container step at which `preset="action-collection"` switches to the compact priority measures.
|
|
179
|
+
* Measured against the TABLE's own container (a container query), not the viewport, so a table in
|
|
180
|
+
* a master rail collapses before the page does. Default `"sm"`. Ignored while `preset` is
|
|
181
|
+
* `"default"`.
|
|
182
|
+
*/
|
|
183
|
+
collapseBelow?: BreakpointProp;
|
|
151
184
|
className?: ClassNameProp;
|
|
152
185
|
children?: ChildrenProp;
|
|
153
186
|
};
|
|
187
|
+
/**
|
|
188
|
+
* ListRow geometry — `default` (the roomy entity row) or `compact` (#246: the inline-actions row —
|
|
189
|
+
* Avatar + title/description + one or two small trailing Buttons on ONE line inside a narrow card).
|
|
190
|
+
* A ListRow-LOCAL subset of the shared density vocabulary: the row has no `comfortable` step, so it
|
|
191
|
+
* is deliberately narrower than `DensityProp` (and unrelated to `PageDensityProp`/`TableDensityProp`).
|
|
192
|
+
*/
|
|
193
|
+
export type ListRowDensityProp = Exclude<DensityProp, "comfortable">;
|
|
194
|
+
/** @see ListRow */
|
|
195
|
+
export type ListRowProp = {
|
|
196
|
+
/** Render element — `div` (default) or `li` when the parent is a `<ul>`/`<ol>`. */
|
|
197
|
+
as?: "div" | "li";
|
|
198
|
+
/** Leading slot — a decorative icon or an Avatar. Mark a purely decorative icon `aria-hidden`. */
|
|
199
|
+
leading?: React.ReactNode;
|
|
200
|
+
/** Primary line — rendered in medium weight. */
|
|
201
|
+
title: TitleProp | React.ReactNode;
|
|
202
|
+
/** Secondary line under the title (muted, xs). */
|
|
203
|
+
description?: DescriptionProp | React.ReactNode;
|
|
204
|
+
/** Trailing slot — the row action(s): a Button / DropdownMenu trigger, a Badge, or a Switch. */
|
|
205
|
+
trailing?: React.ReactNode;
|
|
206
|
+
/** Cross-axis alignment of the columns — `center` (default) or `start` for multi-line content. */
|
|
207
|
+
align?: "center" | "start";
|
|
208
|
+
/** How over-long title/description resolve — `truncate` (default) or `wrap` (#224). */
|
|
209
|
+
overflow?: "truncate" | "wrap";
|
|
210
|
+
/** Row geometry — `default` or the compact inline-actions preset (#246). */
|
|
211
|
+
density?: ListRowDensityProp;
|
|
212
|
+
/** Read/unread state — indicator dot + localized `sr-only` text, never colour alone (#225). */
|
|
213
|
+
unread?: boolean;
|
|
214
|
+
className?: ClassNameProp;
|
|
215
|
+
};
|
|
@@ -10,6 +10,12 @@ import type { UploadFileItem } from "../../components/data-entry/upload-types.js
|
|
|
10
10
|
import type { FieldA11yProps } from "../../lib/field-a11y.js";
|
|
11
11
|
import type { ClassNameProp, DisabledProp, EmptyMessageProp, ErrorProp, HelperProp, IdProp, LabelProp, NameProp, OnChangeProp, OnValueChangeProp, OnSearchChangeProp, OpenProp, OnOpenChangeProp, PlaceholderProp, RequiredProp, ValueProp, DefaultValueProp, FormLayoutProp, WidthProp, BreakpointProp, DensityProp, SizeProp } from "../vocabulary/index.js";
|
|
12
12
|
import type { ResponsiveGridColumnsProp } from "./layout.prop.js";
|
|
13
|
+
/** One-outline-per-group appearance for the compound InputOTP control. */
|
|
14
|
+
export type InputOTPGroupAppearanceProp = "slots" | "grouped";
|
|
15
|
+
/** @see InputOTPGroup */
|
|
16
|
+
export type InputOTPGroupProp = React.HTMLAttributes<HTMLDivElement> & {
|
|
17
|
+
appearance?: InputOTPGroupAppearanceProp;
|
|
18
|
+
};
|
|
13
19
|
/** @see Input */
|
|
14
20
|
export type InputProp = React.InputHTMLAttributes<HTMLInputElement> & {
|
|
15
21
|
/** Show an inline ✕ that clears the field while it holds text (default false). */
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export type { AppShellProp, AuthFooterProp, AuthIdentityProp, OrgSwitcherLabels, OrgSwitcherOrganization, OrgSwitcherProp, PageContainerProp, PageInsetProp, SidebarItemProp, SidebarProductProp, SidebarProp, SidebarSectionProp, TopbarProp, } from "./layout.prop.js";
|
|
2
2
|
export type { ButtonProp } from "./general.prop.js";
|
|
3
3
|
export type { InputProp, TextareaProp, FormFieldProp, SearchInputProp, CheckboxProp, CheckboxGroupProp, ChoiceOptionProp, RadioProp, RadioGroupProp, SwitchProp, SliderProp, CalendarProp, DatePickerProp, DateRangePickerProp, TimePickerProp, ColorPickerProp, UploadProp, UploadFileItemProp, UploadVariantProp, TreeOptionProp, TreeFieldNamesProp, CascaderProp, TreeSelectProp, ShowCheckedStrategyProp, TransferProp, TransferItemProp, } from "./data-entry.prop.js";
|
|
4
|
-
export type { EmptyStateProp, DescriptionsProp, DescriptionsItemProp, BadgeProp, DataTableProp, QrCodeProp, } from "./data-display.prop.js";
|
|
4
|
+
export type { AvatarProp, EmptyStateProp, DescriptionsProp, DescriptionsItemProp, BadgeProp, DataTableProp, QrCodeProp, } from "./data-display.prop.js";
|
|
5
5
|
export type { ChartDatum, ChartSeriesProp, LineChartProp, BarChartProp, AreaChartProp, PieChartProp, } from "./charts.prop.js";
|
|
6
6
|
export type { AlertQueryErrorProp, AlertProp, AlertTitleProp, AlertContentProp, AlertDescriptionProp, AlertActionsProp, SheetResponsiveProp, SkeletonRowsProp, } from "./feedback.prop.js";
|
|
7
7
|
export type { DataStateProp, InfiniteQueryStateProp, InfiniteQueryHelpers, PrefetchLinkProp, } from "./query.prop.js";
|
|
@@ -1,7 +1,8 @@
|
|
|
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, ExtraProp, FooterProp, PageDensityProp, PageContainerVariantProp, CenteredShellWidthProp, CenteredShellAlignProp, AuthShellPresetProp, BreakpointProp, GapProp, ClassNameProp, ChildrenProp, IdProp } from "../vocabulary/index.js";
|
|
4
|
+
import type { BreadcrumbProp, TitleProp, SubtitleProp, ExtraProp, FooterProp, PageDensityProp, PageContainerVariantProp, CenteredShellWidthProp, CenteredShellAlignProp, CenteredShellPresetProp, ErrorSurfaceModeProp, ErrorSurfaceStatusProp, AuthShellPresetProp, BreakpointProp, GapProp, ClassNameProp, ChildrenProp, IdProp, DisabledProp, DescriptionProp, ActionProp, IconProp, HeadingLevelProp } from "../vocabulary/index.js";
|
|
5
|
+
import type { EmptyStateToneProp } from "./data-display.prop.js";
|
|
5
6
|
/**
|
|
6
7
|
* Arrangement of the page header's title band and its `extra` slot below the 640px step.
|
|
7
8
|
* `stack` (default) is the historical arrangement — `extra` drops onto its own full-width line
|
|
@@ -9,6 +10,20 @@ import type { BreadcrumbProp, TitleProp, SubtitleProp, ExtraProp, FooterProp, Pa
|
|
|
9
10
|
* `--page-header-extra-measure` measure, letting the title/subtitle wrap into what is left.
|
|
10
11
|
*/
|
|
11
12
|
export type PageContainerHeaderLayoutProp = "stack" | "responsive-inline";
|
|
13
|
+
/** Whole-page semantic composition owned by PageContainer. */
|
|
14
|
+
export type PageContainerPresetProp = "default" | "admin-collection";
|
|
15
|
+
/**
|
|
16
|
+
* Bounded page MEASURE — the shared inline cap applied to the page header AND body together, so
|
|
17
|
+
* the header `extra` action ends on the same edge as the body surface. Orthogonal to
|
|
18
|
+
* `PageContainerVariantProp` (chrome) and to `PageContainerHeaderLayoutProp`, so a quiet
|
|
19
|
+
* `variant="ghost"` feed can finally have a bounded measure too (gh#245 / gh#247).
|
|
20
|
+
*
|
|
21
|
+
* `default` applies NO cap — the page is fluid exactly as before. `narrow` / `medium` read the
|
|
22
|
+
* `--page-measure-{narrow,medium}` tokens (42rem / 48rem OUTER, i.e. 624px / 720px VISIBLE surface
|
|
23
|
+
* once the package-owned page gutters are subtracted). Both are maxes, so a compact viewport stays
|
|
24
|
+
* fluid at the compact gutter.
|
|
25
|
+
*/
|
|
26
|
+
export type PageContainerMeasureProp = "default" | "narrow" | "medium";
|
|
12
27
|
/** @see PageContainer */
|
|
13
28
|
export type PageContainerProp = {
|
|
14
29
|
title: TitleProp;
|
|
@@ -28,6 +43,12 @@ export type PageContainerProp = {
|
|
|
28
43
|
linkComponent?: React.ElementType;
|
|
29
44
|
density?: PageDensityProp;
|
|
30
45
|
variant?: PageContainerVariantProp;
|
|
46
|
+
/**
|
|
47
|
+
* Whole-page composition contract. `admin-collection` sets the header-to-toolbar rhythm,
|
|
48
|
+
* collection search measure, control height and table density once for the entire subtree.
|
|
49
|
+
* Geometry remains token-owned and service-themeable; no child needs a sizing override.
|
|
50
|
+
*/
|
|
51
|
+
preset?: PageContainerPresetProp;
|
|
31
52
|
/**
|
|
32
53
|
* How the title band and `extra` share the header row below the 640px step. Defaults to
|
|
33
54
|
* `stack` — the historical arrangement, where `extra` wraps onto its own full-width line under
|
|
@@ -36,6 +57,15 @@ export type PageContainerProp = {
|
|
|
36
57
|
* `--page-header-extra-measure`. At >=640px both arrangements are identical.
|
|
37
58
|
*/
|
|
38
59
|
headerLayout?: PageContainerHeaderLayoutProp;
|
|
60
|
+
/**
|
|
61
|
+
* Bounded page measure shared by the header and the body. Defaults to `default` — no cap, the
|
|
62
|
+
* historical fluid page. `narrow` (624px surface) / `medium` (720px surface) cap BOTH bands to
|
|
63
|
+
* one token-owned measure (`--page-measure-{narrow,medium}`), so a header action ends flush with
|
|
64
|
+
* the body surface instead of at the page edge. Orthogonal to `variant`, so `variant="ghost"`
|
|
65
|
+
* quiet chrome composes with a bounded measure (gh#245 / gh#247). Unlike `variant="narrow"`,
|
|
66
|
+
* which caps only the body.
|
|
67
|
+
*/
|
|
68
|
+
measure?: PageContainerMeasureProp;
|
|
39
69
|
/** Pin footer to viewport bottom on scroll — pairs well with `variant="narrow"`. */
|
|
40
70
|
stickyFooter?: boolean;
|
|
41
71
|
/**
|
|
@@ -68,6 +98,20 @@ export type FlexProp = React.HTMLAttributes<HTMLDivElement> & {
|
|
|
68
98
|
align?: FlexAlignProp;
|
|
69
99
|
justify?: FlexJustifyProp;
|
|
70
100
|
wrap?: boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Drop this region below a breakpoint step (`sm` 40rem · `md` 48rem · `lg` 64rem · `xl` 80rem).
|
|
103
|
+
* The ONE public way to make a layout region responsive without a page-local media query — a
|
|
104
|
+
* public header hides its anchor navigation below the tablet step with `hideBelow="md"` instead
|
|
105
|
+
* of a consumer `@media` rule (gh#252). Omit (the default) and no attribute is emitted, so no
|
|
106
|
+
* rule can match and the Flex is unchanged. The region is removed from the accessibility tree
|
|
107
|
+
* too, so keep its destinations reachable elsewhere at that width (a footer nav).
|
|
108
|
+
*/
|
|
109
|
+
hideBelow?: BreakpointProp;
|
|
110
|
+
/**
|
|
111
|
+
* The inverse of `hideBelow` — drop this region FROM a breakpoint step upwards, i.e. keep it
|
|
112
|
+
* only on the narrow side (a compact-only affordance). Omit for no attribute and no rule.
|
|
113
|
+
*/
|
|
114
|
+
hideFrom?: BreakpointProp;
|
|
71
115
|
};
|
|
72
116
|
export type ResponsiveGridColumnsProp = number | {
|
|
73
117
|
sm?: number;
|
|
@@ -136,6 +180,17 @@ export type AppShellProp = {
|
|
|
136
180
|
breadcrumb?: ReactNode;
|
|
137
181
|
footer?: ReactNode;
|
|
138
182
|
sidebarCollapsed?: boolean;
|
|
183
|
+
/**
|
|
184
|
+
* Responsive navigation strategy below the canonical 900px shell breakpoint.
|
|
185
|
+
*
|
|
186
|
+
* - `"drawer"` (default) hides the docked sidebar and exposes the accessible mobile Sheet.
|
|
187
|
+
* - `"docked"` keeps the sidebar grid track, footer/account region and active navigation in the
|
|
188
|
+
* shell at narrow widths. The sidebar width remains owned by `--app-shell-sidebar-width`.
|
|
189
|
+
*
|
|
190
|
+
* Use `"docked"` only when the product's approved responsive contract explicitly retains the
|
|
191
|
+
* rail; it intentionally suppresses the redundant mobile drawer trigger.
|
|
192
|
+
*/
|
|
193
|
+
responsiveNavigation?: "drawer" | "docked";
|
|
139
194
|
/**
|
|
140
195
|
* Navigation shown in the mobile drawer at the DXS 900px breakpoint, where the docked sidebar is
|
|
141
196
|
* hidden. AppShell OWNS the drawer: it renders a hamburger trigger in the topbar and a focus-
|
|
@@ -176,10 +231,15 @@ export type AuthShellProp = {
|
|
|
176
231
|
/**
|
|
177
232
|
* Named flow MEASURE — the page geometry contract for one canonical hosted-identity flow: the
|
|
178
233
|
* auth card's max-width plus the desktop and mobile page gutters, all owned by component tokens
|
|
179
|
-
* (`--auth-shell-{device,context,recovery}-*`). Selecting a preset replaces every
|
|
180
|
-
*
|
|
234
|
+
* (`--auth-shell-{login,device,context,recovery}-*`). Selecting a preset replaces every
|
|
235
|
+
* consumer-side geometry override.
|
|
181
236
|
*
|
|
182
237
|
* - `"default"` (default) — the shell's own measure; nothing changes.
|
|
238
|
+
* - `"login"` — SCR-001's 360px card at x=540/332/15 and y=363/363/353 for the canonical
|
|
239
|
+
* 1440x900, 1024x900 and 390x844 viewports. The identity occupies a package-owned anchor slot,
|
|
240
|
+
* so standalone, one-line requester and wrapped two-line requester states keep the same card
|
|
241
|
+
* position without truncating or inventing requester data. Pass AuthIdentity, Card and
|
|
242
|
+
* AuthFooter as direct children (an anchor may wrap AuthIdentity).
|
|
183
243
|
* - `"device-authorization"` — 380px card measure with a 5px inline page gutter at a 390px
|
|
184
244
|
* viewport (canonical device-grant artboard).
|
|
185
245
|
* - `"context-selection"` — 25rem card measure on desktop/tablet, edge-to-edge on mobile, and a
|
|
@@ -190,7 +250,7 @@ export type AuthShellProp = {
|
|
|
190
250
|
* · passkey-failure), whose title and description sit INSIDE the bordered surface.
|
|
191
251
|
*
|
|
192
252
|
* Orthogonal to `variant`: presets are applied AFTER it, so `variant="canonical"` keeps owning
|
|
193
|
-
* control density and heading size while the preset re-measures the page.
|
|
253
|
+
* control density and heading size while the preset re-measures/anchors the page.
|
|
194
254
|
*/
|
|
195
255
|
preset?: AuthShellPresetProp;
|
|
196
256
|
/**
|
|
@@ -241,6 +301,20 @@ export type AuthIdentityProp = {
|
|
|
241
301
|
requester?: ReactNode;
|
|
242
302
|
className?: ClassNameProp;
|
|
243
303
|
};
|
|
304
|
+
/**
|
|
305
|
+
* @see AuthAccountSummary — compact signed-in identity row for hosted authentication surfaces.
|
|
306
|
+
* It owns avatar fallback, bidi-safe email truncation and the keyboard action geometry; the
|
|
307
|
+
* consumer owns the authoritative email, localized action label and navigation handler.
|
|
308
|
+
*/
|
|
309
|
+
export type AuthAccountSummaryProp = {
|
|
310
|
+
email: string;
|
|
311
|
+
avatarSrc?: string;
|
|
312
|
+
avatarFallback?: ReactNode;
|
|
313
|
+
actionLabel: ReactNode;
|
|
314
|
+
onAction: () => void;
|
|
315
|
+
disabled?: DisabledProp;
|
|
316
|
+
className?: ClassNameProp;
|
|
317
|
+
};
|
|
244
318
|
/**
|
|
245
319
|
* @see CenteredShell — authenticated, no-sidebar, centred-column page shell (hosted-ID "My Page",
|
|
246
320
|
* account / self-service, standalone settings). A padded top bar with real actions (banner) reusing
|
|
@@ -276,6 +350,119 @@ export type CenteredShellProp = {
|
|
|
276
350
|
* a long localized message is never clipped.
|
|
277
351
|
*/
|
|
278
352
|
align?: CenteredShellAlignProp;
|
|
353
|
+
/**
|
|
354
|
+
* Whole-page shell contract. `"default"` (the default) emits no attribute and keeps the shell's
|
|
355
|
+
* exact box. `"public-landing"` owns the PUBLIC landing geometry — one content measure shared by
|
|
356
|
+
* the header bar, the centred column and the footer, the section rhythm, the flat public-surface
|
|
357
|
+
* card chrome and the hero `h1` tier — from `--centered-shell-landing-*` tokens, so a landing
|
|
358
|
+
* composition (header · hero · sections · legal footer) needs no page-local CSS and no descendant
|
|
359
|
+
* selector against shell internals (gh#252).
|
|
360
|
+
*/
|
|
361
|
+
preset?: CenteredShellPresetProp;
|
|
362
|
+
className?: ClassNameProp;
|
|
363
|
+
};
|
|
364
|
+
/**
|
|
365
|
+
* @see ErrorSurface — the optional maintenance / planned-outage timing slot (503, occasionally a
|
|
366
|
+
* planned 500).
|
|
367
|
+
*
|
|
368
|
+
* `start` / `end` are **ISO-8601 instants** and `timeZone` an **IANA** zone id: the surface formats
|
|
369
|
+
* them with `Intl.DateTimeFormat(locale, …).formatRange()` (CLDR), so ja / en / vi each read
|
|
370
|
+
* natively. NEVER pass a pre-formatted string like `"18:00 - 20:00 JST"` — it cannot localize, and
|
|
371
|
+
* the machine-readable value is what lands in `<time dateTime>`.
|
|
372
|
+
*
|
|
373
|
+
* `progress` is server-sent on purpose: deriving "how far through the window are we" from the
|
|
374
|
+
* client clock makes SSR and hydration disagree, and an exception page must be readable before
|
|
375
|
+
* hydration.
|
|
376
|
+
*/
|
|
377
|
+
export type ErrorSurfaceMaintenanceProp = {
|
|
378
|
+
/** Window start as an ISO-8601 instant (`2026-08-02T18:00:00Z`). Also the `<time dateTime>` value. */
|
|
379
|
+
start: string;
|
|
380
|
+
/** Window end as an ISO-8601 instant. Omit for an open-ended outage — a single instant is shown. */
|
|
381
|
+
end?: string;
|
|
382
|
+
/**
|
|
383
|
+
* IANA time zone id (`Asia/Tokyo`) the window is presented in. Omit to use the runtime zone —
|
|
384
|
+
* pass it explicitly whenever the page is server-rendered, or SSR and client output diverge.
|
|
385
|
+
*/
|
|
386
|
+
timeZone?: string;
|
|
387
|
+
/**
|
|
388
|
+
* Completion of the maintenance window as a **percentage 0–100**, rendered as a labelled
|
|
389
|
+
* `Progress` meter. Server-sent (see above); omit for an outage with no published progress.
|
|
390
|
+
*/
|
|
391
|
+
progress?: number;
|
|
392
|
+
};
|
|
393
|
+
/**
|
|
394
|
+
* @see ErrorSurface — the package-owned semantic exception surface for 403 / 404 / 500 / 503.
|
|
395
|
+
*
|
|
396
|
+
* The `mode` is the SHELL CONTRACT, not a skin:
|
|
397
|
+
* - `mode="application"` (403/404) renders the surface as the **body** you put inside the
|
|
398
|
+
* `AppShell` the route already provides (normally within a `PageContainer`). It deliberately does
|
|
399
|
+
* NOT reconstruct navigation chrome: the sidebar, topbar and user menu are consumer-owned data,
|
|
400
|
+
* so the surface preserves the shell it is placed in instead of manufacturing a fake one.
|
|
401
|
+
* - `mode="system"` (500/503) owns the whole page: it renders `CenteredShell align="center"`, so
|
|
402
|
+
* the viewport-centred geometry at 1440 / 1024 / 390 stays package-owned and a consumer never
|
|
403
|
+
* writes `min-h-dvh`, a flex-centring class or a media query.
|
|
404
|
+
*
|
|
405
|
+
* `action` is **exactly one** recovery action, enforced structurally by a single slot (a second
|
|
406
|
+
* element is dropped with a development error). Support contact belongs in `description`, not in a
|
|
407
|
+
* second CTA.
|
|
408
|
+
*
|
|
409
|
+
* All product COPY stays consumer-owned (`title` / `description` / `action` come from the app's own
|
|
410
|
+
* `t()`); the surface owns only its own metadata labels, which it localizes itself.
|
|
411
|
+
*/
|
|
412
|
+
export type ErrorSurfaceProp = {
|
|
413
|
+
/** Where the surface lives — `application` = AppShell body (403/404), `system` = own page (500/503). */
|
|
414
|
+
mode: ErrorSurfaceModeProp;
|
|
415
|
+
/** HTTP status presented. Drives the default `icon`, `tone` and the rendered status code. */
|
|
416
|
+
status: ErrorSurfaceStatusProp;
|
|
417
|
+
/** Headline. Consumer-owned copy from the app's `t()` — the library ships no product text. */
|
|
418
|
+
title: TitleProp;
|
|
419
|
+
/** Supporting sentence under the title. Put support-contact guidance here, never in a 2nd CTA. */
|
|
420
|
+
description?: DescriptionProp;
|
|
421
|
+
/**
|
|
422
|
+
* The ONE recovery action (a `Button`, or a `Button asChild` wrapping a router `Link`). A single
|
|
423
|
+
* slot IS the enforcement: pass more than one element and only the first renders, with a
|
|
424
|
+
* development-time error.
|
|
425
|
+
*/
|
|
426
|
+
action: ActionProp;
|
|
427
|
+
/** Override the status-derived icon (403 ShieldAlert · 404 SearchX · 500 ServerCrash · 503 Wrench). */
|
|
428
|
+
icon?: IconProp;
|
|
429
|
+
/** Override the status-derived tone (403/503 `warning` · 404 `muted` · 500 `destructive`). */
|
|
430
|
+
tone?: EmptyStateToneProp;
|
|
431
|
+
/**
|
|
432
|
+
* Semantic heading level of `title`. Defaults to `2` in `application` mode (a `PageContainer`
|
|
433
|
+
* `h1` sits above it) and `1` in `system` mode (the surface IS the page). Choose it to keep the
|
|
434
|
+
* outline valid, never for size.
|
|
435
|
+
*/
|
|
436
|
+
titleLevel?: HeadingLevelProp;
|
|
437
|
+
/**
|
|
438
|
+
* Support correlation id for the failure, rendered as a monospace/tabular metadata row so it can
|
|
439
|
+
* be read out or copied accurately. Pass the bare id — the localized label is the surface's.
|
|
440
|
+
*/
|
|
441
|
+
requestId?: string;
|
|
442
|
+
/**
|
|
443
|
+
* The permission / role the viewer is missing (403). Pass the bare permission name
|
|
444
|
+
* (`reports.view`) — the surface renders the localized "Required permission" label around it.
|
|
445
|
+
*/
|
|
446
|
+
permission?: ReactNode;
|
|
447
|
+
/**
|
|
448
|
+
* The organization / tenant the failed request was scoped to. Disambiguates a 403 caused by
|
|
449
|
+
* being in the wrong workspace from one caused by a missing role.
|
|
450
|
+
*/
|
|
451
|
+
organization?: ReactNode;
|
|
452
|
+
/** Optional planned-outage timing + progress (503). ISO-8601 + IANA, formatted with `Intl`. */
|
|
453
|
+
maintenance?: ErrorSurfaceMaintenanceProp;
|
|
454
|
+
/**
|
|
455
|
+
* `system` mode only — brand slot above the status code (a `Logo`). Ignored in `application`
|
|
456
|
+
* mode, where the shell already shows the product brand.
|
|
457
|
+
*/
|
|
458
|
+
brand?: ReactNode;
|
|
459
|
+
/** `system` mode only — the page footer (contentinfo): copyright, status page, locale switch. */
|
|
460
|
+
footer?: FooterProp;
|
|
461
|
+
/**
|
|
462
|
+
* `system` mode only — measure of the centred column (`CenteredShell` width tier). Default `sm`.
|
|
463
|
+
*/
|
|
464
|
+
width?: CenteredShellWidthProp;
|
|
465
|
+
id?: IdProp;
|
|
279
466
|
className?: ClassNameProp;
|
|
280
467
|
};
|
|
281
468
|
/** @see Sidebar */
|
|
@@ -85,7 +85,11 @@ export type StepsProp = {
|
|
|
85
85
|
defaultValue?: number;
|
|
86
86
|
status?: StepStatusProp;
|
|
87
87
|
orientation?: "horizontal" | "vertical";
|
|
88
|
-
|
|
88
|
+
/**
|
|
89
|
+
* Marker appearance. `inline` renders the compact numbered auth/device progress row without the
|
|
90
|
+
* icon rail while preserving the same status and current-step semantics.
|
|
91
|
+
*/
|
|
92
|
+
type?: "default" | "dot" | "inline";
|
|
89
93
|
size?: "md" | "sm";
|
|
90
94
|
titlePlacement?: "horizontal" | "vertical";
|
|
91
95
|
onValueChange?: (value: number) => void;
|