@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.
Files changed (91) hide show
  1. package/dist/components/charts/compact-bar-trend.d.ts +2 -1
  2. package/dist/components/charts/index.d.ts +4 -1
  3. package/dist/components/data-display/data-table.d.ts +25 -4
  4. package/dist/components/data-display/data-table.js +13 -2
  5. package/dist/components/data-display/empty-state.js +1 -1
  6. package/dist/components/data-display/index.d.ts +1 -1
  7. package/dist/components/data-display/list-row.d.ts +19 -0
  8. package/dist/components/data-display/list-row.js +2 -0
  9. package/dist/components/data-display/qr-code.d.ts +1 -1
  10. package/dist/components/data-display/table.d.ts +47 -2
  11. package/dist/components/data-display/table.js +29 -4
  12. package/dist/components/data-entry/command.d.ts +10 -10
  13. package/dist/components/data-entry/index.d.ts +1 -0
  14. package/dist/components/data-entry/input-otp.d.ts +1 -0
  15. package/dist/components/feedback/dialog.d.ts +14 -1
  16. package/dist/components/feedback/dialog.js +4 -0
  17. package/dist/components/feedback/index.d.ts +1 -1
  18. package/dist/components/feedback/index.js +2 -0
  19. package/dist/components/general/logo.d.ts +7 -1
  20. package/dist/components/general/logo.js +1 -1
  21. package/dist/components/layout/app-shell.d.ts +1 -1
  22. package/dist/components/layout/app-shell.js +55 -46
  23. package/dist/components/layout/auth-account-summary.d.ts +5 -0
  24. package/dist/components/layout/auth-account-summary.js +31 -0
  25. package/dist/components/layout/auth-shell.d.ts +3 -2
  26. package/dist/components/layout/centered-shell.d.ts +1 -1
  27. package/dist/components/layout/centered-shell.js +28 -19
  28. package/dist/components/layout/error-surface.d.ts +35 -0
  29. package/dist/components/layout/error-surface.js +155 -0
  30. package/dist/components/layout/flex.d.ts +1 -1
  31. package/dist/components/layout/flex.js +4 -0
  32. package/dist/components/layout/index.d.ts +5 -0
  33. package/dist/components/layout/index.js +4 -0
  34. package/dist/components/layout/page-container.d.ts +1 -1
  35. package/dist/components/layout/page-container.js +4 -0
  36. package/dist/components/navigation/steps.js +38 -19
  37. package/dist/components/navigation/tabs.js +12 -3
  38. package/dist/components/ui/avatar.d.ts +2 -1
  39. package/dist/components/ui/avatar.js +2 -1
  40. package/dist/components/ui/input-otp.d.ts +4 -1
  41. package/dist/components/ui/input-otp.js +2 -1
  42. package/dist/components/ui/toggle-group.d.ts +7 -4
  43. package/dist/components/ui/toggle-group.js +32 -21
  44. package/dist/email/brand-mark.d.ts +21 -5
  45. package/dist/email/brand-mark.js +5 -0
  46. package/dist/email/color.d.ts +2 -1
  47. package/dist/email/geometry.d.ts +9 -1
  48. package/dist/email/geometry.js +1 -0
  49. package/dist/email/index.d.ts +6 -1
  50. package/dist/email/index.js +6 -0
  51. package/dist/email/inline-style.d.ts +7 -5
  52. package/dist/email/inline-style.js +5 -0
  53. package/dist/email/tokens.generated.d.ts +40 -20
  54. package/dist/email/tokens.generated.js +40 -20
  55. package/dist/email/urgency.d.ts +22 -0
  56. package/dist/email/urgency.js +14 -0
  57. package/dist/i18n/messages/en.json +15 -1
  58. package/dist/i18n/messages/ja.json +15 -1
  59. package/dist/i18n/messages/vi.json +15 -1
  60. package/dist/props/components/data-display.prop.d.ts +63 -1
  61. package/dist/props/components/data-entry.prop.d.ts +6 -0
  62. package/dist/props/components/index.d.ts +1 -1
  63. package/dist/props/components/layout.prop.d.ts +191 -4
  64. package/dist/props/components/navigation.prop.d.ts +5 -1
  65. package/dist/props/registry.d.ts +145 -4
  66. package/dist/props/registry.js +189 -5
  67. package/dist/props/vocabulary/data.prop.d.ts +27 -0
  68. package/dist/props/vocabulary/index.d.ts +3 -3
  69. package/dist/props/vocabulary/interaction.prop.d.ts +9 -0
  70. package/dist/props/vocabulary/layout.prop.d.ts +38 -7
  71. package/dist/styles/control.css +28 -0
  72. package/dist/styles/data-display-layout.css +26 -0
  73. package/dist/styles/layout.css +99 -0
  74. package/dist/styles/logo-layout.css +42 -9
  75. package/dist/styles/navigation-layout.css +109 -0
  76. package/dist/styles/shell-layout.css +302 -0
  77. package/dist/styles/table-layout.css +164 -1
  78. package/dist/theme/dxs.canonical.css +5 -4
  79. package/dist/tokens/axes.css +4 -3
  80. package/dist/tokens/base.css +1 -0
  81. package/dist/tokens/components/data-display.css +13 -0
  82. package/dist/tokens/components/email.css +43 -16
  83. package/dist/tokens/components/error-surface.css +36 -0
  84. package/dist/tokens/components/list-row.css +20 -0
  85. package/dist/tokens/components/logo.css +52 -10
  86. package/dist/tokens/components/navigation.css +15 -0
  87. package/dist/tokens/components/shell.css +72 -0
  88. package/dist/tokens/components/table.css +45 -0
  89. package/dist/tokens/foundation.css +26 -0
  90. package/dist/tokens/semantic/layout.css +25 -0
  91. 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 consumer-side
180
- * `--auth-shell-card-max-width` override.
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
- type?: "default" | "dot";
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;