@godxjp/ui 33.22.2 → 33.25.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 (130) hide show
  1. package/DESIGN.md +1 -1
  2. package/README.md +16 -5
  3. package/agent/DESIGN.md +1 -1
  4. package/agent/START-HERE.md +8 -8
  5. package/agent/components/AgentBadge.json +43 -0
  6. package/agent/components/AppShell.json +6 -0
  7. package/agent/components/Avatar.json +7 -0
  8. package/agent/components/CatalogDetail.json +7 -3
  9. package/agent/components/DatePicker.json +1 -1
  10. package/agent/components/DropdownMenu.json +1 -0
  11. package/agent/components/EditorialCard.json +2 -1
  12. package/agent/components/Image.json +6 -1
  13. package/agent/components/PageContainer.json +5 -0
  14. package/agent/components/PageErrorBoundary.json +48 -0
  15. package/agent/components/Pagination.json +5 -0
  16. package/agent/components/Popover.json +1 -0
  17. package/agent/components/Select.json +2 -1
  18. package/agent/components/Toaster.json +2 -2
  19. package/agent/components/Toolbar.json +1 -1
  20. package/agent/components/Topbar.json +1 -1
  21. package/agent/components-index.json +10 -0
  22. package/agent/components.json +138 -11
  23. package/agent/index.json +8 -8
  24. package/agent/llms.txt +7 -7
  25. package/agent/patterns/notice-bar.json +16 -0
  26. package/agent/patterns-index.json +15 -0
  27. package/agent/patterns.json +16 -0
  28. package/agent/rules.json +2 -2
  29. package/agent/tokens.json +121 -7
  30. package/dist/components/charts/chart-cartesian.js +5 -1
  31. package/dist/components/charts/chart-summary.d.ts +1 -1
  32. package/dist/components/charts/chart-summary.js +17 -6
  33. package/dist/components/charts/compact-bar-trend.js +4 -3
  34. package/dist/components/charts/pie-chart.js +2 -1
  35. package/dist/components/data-display/avatar.d.ts +1 -1
  36. package/dist/components/data-display/avatar.js +7 -1
  37. package/dist/components/data-display/badge.d.ts +11 -0
  38. package/dist/components/data-display/badge.js +20 -0
  39. package/dist/components/data-display/image.d.ts +1 -0
  40. package/dist/components/data-display/image.js +10 -2
  41. package/dist/components/data-display/index.d.ts +2 -2
  42. package/dist/components/data-display/index.js +2 -1
  43. package/dist/components/data-display/popover.js +11 -0
  44. package/dist/components/data-entry/calendar.js +1 -1
  45. package/dist/components/data-entry/date-picker.js +22 -5
  46. package/dist/components/data-entry/record-picker.js +122 -98
  47. package/dist/components/data-entry/select.js +13 -3
  48. package/dist/components/general/button.js +2 -2
  49. package/dist/components/layout/affix.js +1 -1
  50. package/dist/components/layout/app-shell.d.ts +1 -1
  51. package/dist/components/layout/app-shell.js +3 -1
  52. package/dist/components/layout/editorial-catalog.d.ts +1 -1
  53. package/dist/components/layout/editorial-catalog.js +53 -15
  54. package/dist/components/layout/index.d.ts +2 -0
  55. package/dist/components/layout/index.js +2 -0
  56. package/dist/components/layout/page-container.d.ts +1 -1
  57. package/dist/components/layout/page-container.js +6 -3
  58. package/dist/components/layout/page-error-boundary.d.ts +32 -0
  59. package/dist/components/layout/page-error-boundary.js +57 -0
  60. package/dist/components/layout/sidebar.d.ts +1 -1
  61. package/dist/components/layout/sidebar.js +100 -49
  62. package/dist/components/layout/topbar.js +108 -21
  63. package/dist/components/navigation/dropdown-menu.d.ts +13 -3
  64. package/dist/components/navigation/dropdown-menu.js +36 -6
  65. package/dist/components/navigation/pagination.d.ts +1 -1
  66. package/dist/components/navigation/pagination.js +13 -1
  67. package/dist/components/navigation/toolbar.js +2 -1
  68. package/dist/contracts/measurement.json +1 -1
  69. package/dist/i18n/messages/en.json +7 -0
  70. package/dist/i18n/messages/ja.json +7 -0
  71. package/dist/i18n/messages/vi.json +7 -0
  72. package/dist/props/components/data-display.prop.d.ts +29 -0
  73. package/dist/props/components/layout.prop.d.ts +52 -2
  74. package/dist/props/components/navigation.prop.d.ts +15 -1
  75. package/dist/props/registry.d.ts +65 -5
  76. package/dist/props/registry.js +90 -4
  77. package/dist/styles/alert-layout.css +4 -0
  78. package/dist/styles/application.css +24 -0
  79. package/dist/styles/badge-layout.css +14 -0
  80. package/dist/styles/base.css +11 -0
  81. package/dist/styles/control.css +32 -19
  82. package/dist/styles/core.css +1 -0
  83. package/dist/styles/data-display-layout.css +51 -0
  84. package/dist/styles/dialog-layout.css +9 -0
  85. package/dist/styles/editorial-layout.css +2076 -0
  86. package/dist/styles/editorial.css +3 -0
  87. package/dist/styles/icon-layout.css +3 -0
  88. package/dist/styles/index.css +1 -0
  89. package/dist/styles/layers.json +60 -9
  90. package/dist/styles/layout.css +9 -1985
  91. package/dist/styles/precompiled/alert-layout.css +2 -0
  92. package/dist/styles/precompiled/badge-layout.css +2 -0
  93. package/dist/styles/precompiled/base.css +2 -0
  94. package/dist/styles/precompiled/card-layout.css +2 -0
  95. package/dist/styles/precompiled/chart-layout.css +2 -0
  96. package/dist/styles/precompiled/control.css +2 -0
  97. package/dist/styles/precompiled/data-display-layout.css +2 -0
  98. package/dist/styles/precompiled/data-entry-layout.css +2 -0
  99. package/dist/styles/precompiled/dialog-layout.css +2 -0
  100. package/dist/styles/precompiled/editorial-account-layout.css +2 -0
  101. package/dist/styles/precompiled/editorial-layout.css +2 -0
  102. package/dist/styles/precompiled/float-button-layout.css +2 -0
  103. package/dist/styles/precompiled/form-layout.css +2 -0
  104. package/dist/styles/precompiled/icon-layout.css +2 -0
  105. package/dist/styles/precompiled/layout.css +2 -0
  106. package/dist/styles/precompiled/logo-layout.css +2 -0
  107. package/dist/styles/precompiled/motion.css +2 -0
  108. package/dist/styles/precompiled/navigation-layout.css +2 -0
  109. package/dist/styles/precompiled/shell-layout.css +2 -0
  110. package/dist/styles/precompiled/table-layout.css +2 -0
  111. package/dist/styles/precompiled/text-layout.css +2 -0
  112. package/dist/styles/precompiled/toggle.css +2 -0
  113. package/dist/styles/precompiled/vendor-day-picker.css +2 -0
  114. package/dist/styles/precompiled/vendor-sonner.css +2 -0
  115. package/dist/styles/shell-layout.css +17 -1
  116. package/dist/styles/table-layout.css +1 -1
  117. package/dist/styles.css +1 -1
  118. package/dist/tokens/components/badge.css +3 -0
  119. package/dist/tokens/components/control.css +3 -0
  120. package/dist/tokens/components/data-display.css +9 -0
  121. package/dist/tokens/components/editorial.css +9 -6
  122. package/dist/tokens/components/shell.css +2 -0
  123. package/dist/tokens/foundation.css +8 -0
  124. package/docs/CONSUMER-RULES.md +36 -1
  125. package/package.json +4 -2
  126. package/scripts/consumer-rule.md +1 -1
  127. package/scripts/prune-css.mjs +56 -8
  128. package/scripts/ui-audit.mjs +36 -0
  129. package/skills/godxjp-ui-navigation/SKILL.md +14 -9
  130. package/skills/godxjp-ui-navigation/references/principles.md +2 -2
@@ -375,10 +375,16 @@
375
375
  "position": "Vị trí ảnh bìa",
376
376
  "hint": "Kéo ảnh hoặc dùng phím mũi tên để chỉnh vị trí",
377
377
  "valueText": "{value}% tính từ trên"
378
+ },
379
+ "pageErrorBoundary": {
380
+ "title": "Không thể hiển thị trang này",
381
+ "description": "Đã xảy ra lỗi khi hiển thị trang này. Các phần khác của ứng dụng vẫn hoạt động: hãy tải lại trang, hoặc chuyển sang trang khác từ menu.",
382
+ "reload": "Tải lại trang"
378
383
  }
379
384
  },
380
385
  "dataDisplay": {
381
386
  "avatar": {
387
+ "agent": "Tác tử AI",
382
388
  "presence": {
383
389
  "online": "Trực tuyến",
384
390
  "away": "Vắng mặt",
@@ -780,6 +786,7 @@
780
786
  "trendCurrent": "hiện tại",
781
787
  "heatmapSummary": "Bản đồ nhiệt {rows} × {columns}",
782
788
  "heatmapHighest": "Cao nhất: {value} tại {row}, {column}",
789
+ "noData": "Không có dữ liệu",
783
790
  "heatmapNoData": "Không có dữ liệu",
784
791
  "heatmapTop": "Hạng {rank}",
785
792
  "heatmapLegend": "Thang màu",
@@ -261,9 +261,25 @@ export type AvatarProp = React.ComponentPropsWithoutRef<"span"> & {
261
261
  * a presence dot never carries visible text; that is `Badge status`.
262
262
  */
263
263
  presenceLabel?: LabelProp;
264
+ /**
265
+ * Who the mark stands for. `person` (default) is inert — no attribute, no node. `agent` marks an
266
+ * AI agent: a small "AI" tag at the block-start/inline-end corner (the corner `presence` does not
267
+ * use) plus a localized visually hidden "AI agent" folded into the avatar's accessible text, so the
268
+ * difference is never carried by the tag's colour alone (WCAG 1.4.1). Same vocabulary as
269
+ * `OrgChartNode.variant`.
270
+ */
271
+ kind?: AvatarKindProp;
264
272
  className?: ClassNameProp;
265
273
  children?: ChildrenProp;
266
274
  };
275
+ /**
276
+ * Who an Avatar stands for — a person or an AI agent. Deliberately the same two values as
277
+ * `OrgChartNodeVariantProp`, so an app that already knows a principal's kind passes it unchanged
278
+ * to both. Retune the agent tag with `--avatar-agent-*`.
279
+ *
280
+ * @see Avatar
281
+ */
282
+ export type AvatarKindProp = "person" | "agent";
267
283
  /**
268
284
  * Avatar presence status — a person's realtime reachability.
269
285
  *
@@ -307,6 +323,17 @@ export type AvatarAppearanceProp = "default" | "tinted";
307
323
  */
308
324
  export type AvatarImageFitProp = "cover" | "contain";
309
325
  /** @see Badge */
326
+ /**
327
+ * @see AgentBadge — the "AI agent" label beside a name (violet outline, pill, never wraps). The
328
+ * text-row half of telling an agent apart from a person; `Avatar kind="agent"` is the mark half.
329
+ */
330
+ export type AgentBadgeProp = Omit<React.HTMLAttributes<HTMLElement>, "children"> & {
331
+ /** Render element — `span` (default; the label sits in a name's text line) or `div`. */
332
+ as?: "div" | "span";
333
+ /** Overrides the localized default label (`dataDisplay.avatar.agent`). */
334
+ children?: ChildrenProp;
335
+ className?: ClassNameProp;
336
+ };
310
337
  export type BadgeProp = {
311
338
  /**
312
339
  * Render element — `div` (default) or `span` when the chip sits in a phrasing context where a
@@ -1325,6 +1352,8 @@ export type ImageProp = Omit<React.ImgHTMLAttributes<HTMLImageElement>, "alt" |
1325
1352
  fallback?: string;
1326
1353
  /** Painted over the frame until the picture loads. `true` = the plain muted block. */
1327
1354
  placeholder?: React.ReactNode | boolean;
1355
+ /** Resolved source status, including cached-before-mount images. Error stays final for fallback. */
1356
+ onStatusChange?: (status: "loading" | "loaded" | "error") => void;
1328
1357
  /** `false` = a plain picture, not clickable, not in its group. Default `true`. */
1329
1358
  preview?: boolean | ImagePreviewConfigProp;
1330
1359
  /**
@@ -1,5 +1,6 @@
1
1
  /** Layout component prop types — @see docs/COMPONENTS.md#layout */
2
2
  import type * as React from "react";
3
+ import type { ImageProp } from "./data-display.prop.js";
3
4
  import type { ComponentType, ReactNode, SVGProps } from "react";
4
5
  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, LabelProp, NameProp, PlaceholderProp } from "../vocabulary/index.js";
5
6
  import type { EmptyStateToneProp } from "./data-display.prop.js";
@@ -73,6 +74,13 @@ export type PageContainerProp = {
73
74
  titleRef?: React.Ref<HTMLHeadingElement>;
74
75
  /** @see PageContainerExtraProp */
75
76
  extra?: PageContainerExtraProp;
77
+ /**
78
+ * The page's Help control (gh#1494) — a `Button` that opens a help Sheet, or a link to the
79
+ * manual. It has ONE fixed place on every page: the inline end of the header row, after the
80
+ * `extra` actions, and still the last item at the inline end when those actions wrap. A page
81
+ * passing only `help` still gets a header. Pass one control; it is not a second action cluster.
82
+ */
83
+ help?: ReactNode;
76
84
  /**
77
85
  * FIXED chrome band between the page header and the scrolling body — a filter strip, a status
78
86
  * bar, a "channel workflow" rail. It is a first-class page-chrome slot precisely because the
@@ -454,6 +462,33 @@ export type PageInsetProp = React.HTMLAttributes<HTMLDivElement> & {
454
462
  children?: ChildrenProp;
455
463
  className?: ClassNameProp;
456
464
  };
465
+ /** @see PageErrorBoundary — the render-prop form of `fallback`. */
466
+ export type PageErrorBoundaryFallbackProp = (failure: {
467
+ /** What the page threw. */
468
+ error: unknown;
469
+ /** Draws the page again (e.g. a "Try again" button that re-renders without a reload). */
470
+ reset: () => void;
471
+ }) => ReactNode;
472
+ /**
473
+ * @see PageErrorBoundary — a page-level error boundary (gh#1494). A page that throws while
474
+ * rendering is replaced by an `ErrorSurface`; the shell around it stays.
475
+ */
476
+ export type PageErrorBoundaryProp = {
477
+ children?: ChildrenProp;
478
+ /**
479
+ * What to draw instead of the page. Default: an `application` `ErrorSurface` (status 500,
480
+ * localized title and description, one "Reload page" action). A function receives
481
+ * `{ error, reset }`.
482
+ */
483
+ fallback?: ReactNode | PageErrorBoundaryFallbackProp;
484
+ /**
485
+ * Draw the page again whenever this value changes (compared with `Object.is`). The boundary
486
+ * already resets when the URL changes; pass a key for a change the URL does not show.
487
+ */
488
+ resetKey?: unknown;
489
+ /** Report the error (Sentry, a log endpoint). Replaces the development-time `console.error`. */
490
+ onError?: (error: unknown, info: React.ErrorInfo) => void;
491
+ };
457
492
  /** @see AppShell */
458
493
  export type AppShellProp = {
459
494
  /** Phone destinations, using MobileShell tabBar children (3–5 links or Buttons with aria-current="page"). Only rendered in drawer navigation mode. Main/footer reserve the measured safe-area-inclusive height. */
@@ -463,6 +498,14 @@ export type AppShellProp = {
463
498
  /** Omit or pass null/false for a shell without the sidebar landmark or grid track. */
464
499
  sidebar?: ReactNode;
465
500
  children: ReactNode;
501
+ /**
502
+ * The page-level error boundary around `children` (gh#1494). Default `true`: a page that throws
503
+ * while rendering is replaced by an `ErrorSurface` inside `<main>`, and the sidebar, topbar and
504
+ * breadcrumb stay, so the user can navigate away; the boundary resets when the URL changes.
505
+ * Pass props to configure it (`{ fallback, resetKey, onError }`), or `false` when the app
506
+ * already wraps its pages in its own boundary.
507
+ */
508
+ errorBoundary?: boolean | Omit<PageErrorBoundaryProp, "children">;
466
509
  topbar?: ReactNode;
467
510
  topbarLeft?: ReactNode;
468
511
  topbarRight?: ReactNode;
@@ -1149,6 +1192,9 @@ export type SidebarItemProp = {
1149
1192
  * Nested rows — renders a collapsible submenu group (the parent reads active when any child is).
1150
1193
  * Honoured by BOTH `Sidebar` and `NavList` (gh#815): `NavList` used to map `items` straight to a
1151
1194
  * row, so a nested group type-checked, rendered as one flat row and lost its children silently.
1195
+ * A child may carry `children` of its own (gh#1493): the group nests one level further, so a
1196
+ * section can hold work area → sub-area → page (three clickable levels), and the collapsed-rail
1197
+ * flyout lists the grandchildren under a labelled group.
1152
1198
  */
1153
1199
  children?: SidebarItemProp[];
1154
1200
  };
@@ -2594,8 +2640,12 @@ export type EditorialFilterFieldProp = {
2594
2640
  export type CatalogDetailProp = {
2595
2641
  /** `"sealed"` frames a product package instead of a card. */
2596
2642
  variant?: "card" | "sealed";
2597
- /** The picture — an `<img>` (or a link around one). */
2598
- media: ReactNode;
2643
+ /** Custom media. Used when `image` is omitted. */
2644
+ media?: ReactNode;
2645
+ /** Kit-owned, source-keyed Image with loading skeleton and error fallback. Takes precedence over media. */
2646
+ image?: Pick<ImageProp, "src" | "alt" | "width" | "height" | "fallback"> & {
2647
+ priority?: boolean;
2648
+ };
2599
2649
  /** The save toggle over the frame's corner (same shape as `CatalogCard`'s). */
2600
2650
  favorite?: CatalogCardProp["favorite"];
2601
2651
  /** A line under the frame (the picture's source, an official link). */
@@ -2,7 +2,7 @@
2
2
  import type * as React from "react";
3
3
  import type { ReactNode } from "react";
4
4
  import type { AffixProp, AffixTargetProp, ResponsiveGridColumnsProp, SidebarLinkComponentProp } from "./layout.prop.js";
5
- import type { ActionsProp, ChildrenProp, ClassNameProp, DisabledProp, ErrorProp, HasActiveFiltersProp, IdProp, LabelProp, OnClearFiltersProp, OnOpenChangeProp, OpenProp, DefaultOpenProp, PendingProp, PlaceholderProp, StickyProp, TextAlignProp } from "../vocabulary/index.js";
5
+ import type { ActionsProp, AllowClearProp, ChildrenProp, ClassNameProp, DisabledProp, ErrorProp, HasActiveFiltersProp, IdProp, LabelProp, OnClearFiltersProp, OnOpenChangeProp, OpenProp, DefaultOpenProp, PendingProp, PlaceholderProp, RequiredProp, StickyProp, TextAlignProp } from "../vocabulary/index.js";
6
6
  import type { FormProp, SearchSelectOptionProp } from "./data-entry.prop.js";
7
7
  /**
8
8
  * Renders the canonical SearchInput as the FIRST control of the strip, with a token-owned
@@ -41,6 +41,17 @@ export type FilterBarFilterProp = {
41
41
  onSelectedChange?: (selected: string) => void;
42
42
  placeholder?: PlaceholderProp;
43
43
  disabled?: DisabledProp;
44
+ /**
45
+ * A SCOPE filter that is never empty — the branch, the month (gh#1495). The filter renders no
46
+ * ✕ and its control is `aria-required`; the bar's clear-all is still the consumer's `onClear`,
47
+ * which should leave a required filter at its value. Implies `allowClear={false}`.
48
+ */
49
+ required?: RequiredProp;
50
+ /**
51
+ * The per-filter ✕. Default `true`: a filter is optional by nature, "no filter" is its resting
52
+ * state. `false` hides it without marking the filter required (gh#1495).
53
+ */
54
+ allowClear?: AllowClearProp;
44
55
  };
45
56
  /**
46
57
  * Chips are pure consumer data — the lifecycle is: ADD by including the chip in `chips`, REMOVE
@@ -221,6 +232,9 @@ export type PaginationProp = {
221
232
  disabled?: DisabledProp;
222
233
  className?: ClassNameProp;
223
234
  onValueChange?: (page: number, pageSize: number) => void;
235
+ /** Pointer enter, focus or touch start on an enabled page/previous/next target. May repeat;
236
+ * preload/cache the target without changing the controlled value. Also applies in simple mode. */
237
+ onPageIntent?: (page: number) => void;
224
238
  };
225
239
  /** @see Pagination — control tier (Ant Design `size`: `small` → `sm`, `middle` → `md`). */
226
240
  export type PaginationSizeProp = "sm" | "md";
@@ -847,6 +847,10 @@ export declare const COMPONENT_PROP_REGISTRY: {
847
847
  readonly group: "layout";
848
848
  readonly file: "components/layout.prop.ts";
849
849
  readonly vocabulary: readonly ["TitleProp", "SubtitleProp", "StatusProp", "ExtraProp", "FooterProp", "BreadcrumbProp", "BreadcrumbCurrentItemProp", "DensityProp", "PageContainerVariantProp", {
850
+ readonly field: "help";
851
+ readonly local: true;
852
+ readonly reason: "The page's ONE Help control (gh#1494), at a fixed place: the last item at the header row's inline end, after the `extra` actions. A single node, not an ActionsProp list.";
853
+ }, {
850
854
  readonly field: "toolbar";
851
855
  readonly local: true;
852
856
  readonly reason: "FIXED chrome band between the page header and the scrolling body (filter strip, status bar, channel workflow rail). Distinct from ExtraProp (header actions, inside the title row) and FooterProp (action bar after the body): it is the only slot that stays OUT of the `fill` scroll viewport while sharing the header/body gutters and measure, so a consumer never hand-lays `position: sticky` page chrome.";
@@ -1133,7 +1137,11 @@ export declare const COMPONENT_PROP_REGISTRY: {
1133
1137
  readonly AppShellProp: {
1134
1138
  readonly group: "layout";
1135
1139
  readonly file: "components/layout.prop.ts";
1136
- readonly vocabulary: readonly ["ChildrenProp", "BreakpointProp", {
1140
+ readonly vocabulary: readonly ["ChildrenProp", {
1141
+ readonly field: "errorBoundary";
1142
+ readonly local: true;
1143
+ readonly reason: "Page-level error boundary around `children` (gh#1494): `true` (default) keeps the shell when a page throws, an object configures PageErrorBoundary, `false` opts out.";
1144
+ }, "BreakpointProp", {
1137
1145
  readonly field: "logoCompact";
1138
1146
  readonly local: true;
1139
1147
  readonly reason: "The brand node a narrow bar gets instead of `logo` — the consumer's own mark/viewBox, which a stylesheet cannot produce (gh#728).";
@@ -1929,7 +1937,11 @@ export declare const COMPONENT_PROP_REGISTRY: {
1929
1937
  readonly CatalogDetailProp: {
1930
1938
  readonly group: "layout";
1931
1939
  readonly file: "components/layout.prop.ts";
1932
- readonly vocabulary: readonly ["TitleProp", "ClassNameProp", {
1940
+ readonly vocabulary: readonly [{
1941
+ readonly field: "image";
1942
+ readonly local: true;
1943
+ readonly reason: "Kit-owned source-keyed media configuration.";
1944
+ }, "TitleProp", "ClassNameProp", {
1933
1945
  readonly field: "variant";
1934
1946
  readonly local: true;
1935
1947
  readonly reason: "Card or sealed-product frame.";
@@ -2452,6 +2464,32 @@ export declare const COMPONENT_PROP_REGISTRY: {
2452
2464
  readonly reason: "Slot for the host's cover controls (change / reposition / remove), laid out off the focal area — a ReactNode slot, not the ActionsProp item list.";
2453
2465
  }];
2454
2466
  };
2467
+ readonly PageErrorBoundaryFallbackProp: {
2468
+ readonly group: "layout";
2469
+ readonly file: "components/layout.prop.ts";
2470
+ readonly vocabulary: readonly [{
2471
+ readonly field: "fallback";
2472
+ readonly local: true;
2473
+ readonly reason: "Render-prop form of PageErrorBoundary `fallback`: `({ error, reset }) => node` (gh#1494).";
2474
+ }];
2475
+ };
2476
+ readonly PageErrorBoundaryProp: {
2477
+ readonly group: "layout";
2478
+ readonly file: "components/layout.prop.ts";
2479
+ readonly vocabulary: readonly ["ChildrenProp", {
2480
+ readonly field: "fallback";
2481
+ readonly local: true;
2482
+ readonly reason: "What replaces the page that threw — a node, or `({ error, reset }) => node`. Default: an application ErrorSurface with the kit's localized copy (gh#1494).";
2483
+ }, {
2484
+ readonly field: "resetKey";
2485
+ readonly local: true;
2486
+ readonly reason: "React error-boundary reset key (react-error-boundary's resetKeys, one value): a change draws the page again. The URL change already resets.";
2487
+ }, {
2488
+ readonly field: "onError";
2489
+ readonly local: true;
2490
+ readonly reason: "componentDidCatch reporter `(error, info)` for an error tracker.";
2491
+ }];
2492
+ };
2455
2493
  readonly ErrorSurfaceProp: {
2456
2494
  readonly group: "layout";
2457
2495
  readonly file: "components/layout.prop.ts";
@@ -3339,6 +3377,20 @@ export declare const COMPONENT_PROP_REGISTRY: {
3339
3377
  readonly file: "components/data-display.prop.ts";
3340
3378
  readonly vocabulary: readonly [];
3341
3379
  };
3380
+ readonly AvatarKindProp: {
3381
+ readonly group: "data-display";
3382
+ readonly file: "components/data-display.prop.ts";
3383
+ readonly vocabulary: readonly [];
3384
+ };
3385
+ readonly AgentBadgeProp: {
3386
+ readonly group: "data-display";
3387
+ readonly file: "components/data-display.prop.ts";
3388
+ readonly vocabulary: readonly [{
3389
+ readonly field: "as";
3390
+ readonly local: true;
3391
+ readonly reason: "Closed tag seam (div | span), the same one Badge carries, so the label stays valid HTML beside a name inside a link or a <button>.";
3392
+ }, "ChildrenProp", "ClassNameProp"];
3393
+ };
3342
3394
  readonly AvatarImageFitProp: {
3343
3395
  readonly group: "data-display";
3344
3396
  readonly file: "components/data-display.prop.ts";
@@ -4003,7 +4055,7 @@ export declare const COMPONENT_PROP_REGISTRY: {
4003
4055
  readonly FilterBarFilterProp: {
4004
4056
  readonly group: "navigation";
4005
4057
  readonly file: "components/navigation.prop.ts";
4006
- readonly vocabulary: readonly ["LabelProp", "PlaceholderProp", "DisabledProp"];
4058
+ readonly vocabulary: readonly ["LabelProp", "PlaceholderProp", "DisabledProp", "RequiredProp", "AllowClearProp"];
4007
4059
  };
4008
4060
  readonly FilterBarChipProp: {
4009
4061
  readonly group: "navigation";
@@ -4018,7 +4070,11 @@ export declare const COMPONENT_PROP_REGISTRY: {
4018
4070
  readonly PaginationProp: {
4019
4071
  readonly group: "navigation";
4020
4072
  readonly file: "components/navigation.prop.ts";
4021
- readonly vocabulary: readonly ["ValueProp", "OnValueChangeProp", "DisabledProp", "ClassNameProp", "SizeProp"];
4073
+ readonly vocabulary: readonly ["ValueProp", "OnValueChangeProp", "DisabledProp", "ClassNameProp", "SizeProp", {
4074
+ readonly field: "onPageIntent";
4075
+ readonly local: true;
4076
+ readonly reason: "A page target intent event for cache/router preloading, separate from the controlled value channel; pointer enter, focus and touch start (gh#1472).";
4077
+ }];
4022
4078
  };
4023
4079
  readonly PaginationSizeProp: {
4024
4080
  readonly group: "navigation";
@@ -5643,7 +5699,11 @@ export declare const COMPONENT_PROP_REGISTRY: {
5643
5699
  readonly ImageProp: {
5644
5700
  readonly group: "data-display";
5645
5701
  readonly file: "components/data-display.prop.ts";
5646
- readonly vocabulary: readonly ["ClassNameProp", "PlaceholderProp", {
5702
+ readonly vocabulary: readonly [{
5703
+ readonly field: "onStatusChange";
5704
+ readonly local: true;
5705
+ readonly reason: "Resolved image loading state, including cached images and fallback.";
5706
+ }, "ClassNameProp", "PlaceholderProp", {
5647
5707
  readonly field: "src";
5648
5708
  readonly local: true;
5649
5709
  readonly reason: "The native img src attribute.";
@@ -861,6 +861,11 @@ const COMPONENT_PROP_REGISTRY = {
861
861
  "BreadcrumbCurrentItemProp",
862
862
  "DensityProp",
863
863
  "PageContainerVariantProp",
864
+ {
865
+ field: "help",
866
+ local: true,
867
+ reason: "The page's ONE Help control (gh#1494), at a fixed place: the last item at the header row's inline end, after the `extra` actions. A single node, not an ActionsProp list."
868
+ },
864
869
  {
865
870
  field: "toolbar",
866
871
  local: true,
@@ -1152,6 +1157,11 @@ const COMPONENT_PROP_REGISTRY = {
1152
1157
  file: "components/layout.prop.ts",
1153
1158
  vocabulary: [
1154
1159
  "ChildrenProp",
1160
+ {
1161
+ field: "errorBoundary",
1162
+ local: true,
1163
+ reason: "Page-level error boundary around `children` (gh#1494): `true` (default) keeps the shell when a page throws, an object configures PageErrorBoundary, `false` opts out."
1164
+ },
1155
1165
  "BreakpointProp",
1156
1166
  {
1157
1167
  field: "logoCompact",
@@ -1590,9 +1600,17 @@ const COMPONENT_PROP_REGISTRY = {
1590
1600
  { field: "variant", local: true, reason: "inset (site search) or inline (collection row)." },
1591
1601
  { field: "count", local: true, reason: "Live count at the end of the inline row." },
1592
1602
  { field: "debounce", local: true, reason: "Settle delay in ms, as SearchInput.debounce." },
1593
- { field: "suggestions", local: true, reason: "Grouped suggestion rows under the box (gh#1447)." },
1603
+ {
1604
+ field: "suggestions",
1605
+ local: true,
1606
+ reason: "Grouped suggestion rows under the box (gh#1447)."
1607
+ },
1594
1608
  { field: "suggestionsFooter", local: true, reason: "Last popup row linking to all results." },
1595
- { field: "suggestionsLabel", local: true, reason: "Accessible name of the suggestions listbox." },
1609
+ {
1610
+ field: "suggestionsLabel",
1611
+ local: true,
1612
+ reason: "Accessible name of the suggestions listbox."
1613
+ },
1596
1614
  {
1597
1615
  field: "onQueryChange",
1598
1616
  local: true,
@@ -1874,6 +1892,7 @@ const COMPONENT_PROP_REGISTRY = {
1874
1892
  group: "layout",
1875
1893
  file: "components/layout.prop.ts",
1876
1894
  vocabulary: [
1895
+ { field: "image", local: true, reason: "Kit-owned source-keyed media configuration." },
1877
1896
  "TitleProp",
1878
1897
  "ClassNameProp",
1879
1898
  { field: "variant", local: true, reason: "Card or sealed-product frame." },
@@ -2182,6 +2201,39 @@ const COMPONENT_PROP_REGISTRY = {
2182
2201
  }
2183
2202
  ]
2184
2203
  },
2204
+ PageErrorBoundaryFallbackProp: {
2205
+ group: "layout",
2206
+ file: "components/layout.prop.ts",
2207
+ vocabulary: [
2208
+ {
2209
+ field: "fallback",
2210
+ local: true,
2211
+ reason: "Render-prop form of PageErrorBoundary `fallback`: `({ error, reset }) => node` (gh#1494)."
2212
+ }
2213
+ ]
2214
+ },
2215
+ PageErrorBoundaryProp: {
2216
+ group: "layout",
2217
+ file: "components/layout.prop.ts",
2218
+ vocabulary: [
2219
+ "ChildrenProp",
2220
+ {
2221
+ field: "fallback",
2222
+ local: true,
2223
+ reason: "What replaces the page that threw \u2014 a node, or `({ error, reset }) => node`. Default: an application ErrorSurface with the kit's localized copy (gh#1494)."
2224
+ },
2225
+ {
2226
+ field: "resetKey",
2227
+ local: true,
2228
+ reason: "React error-boundary reset key (react-error-boundary's resetKeys, one value): a change draws the page again. The URL change already resets."
2229
+ },
2230
+ {
2231
+ field: "onError",
2232
+ local: true,
2233
+ reason: "componentDidCatch reporter `(error, info)` for an error tracker."
2234
+ }
2235
+ ]
2236
+ },
2185
2237
  ErrorSurfaceProp: {
2186
2238
  group: "layout",
2187
2239
  file: "components/layout.prop.ts",
@@ -3453,6 +3505,24 @@ const COMPONENT_PROP_REGISTRY = {
3453
3505
  file: "components/data-display.prop.ts",
3454
3506
  vocabulary: []
3455
3507
  },
3508
+ AvatarKindProp: {
3509
+ group: "data-display",
3510
+ file: "components/data-display.prop.ts",
3511
+ vocabulary: []
3512
+ },
3513
+ AgentBadgeProp: {
3514
+ group: "data-display",
3515
+ file: "components/data-display.prop.ts",
3516
+ vocabulary: [
3517
+ {
3518
+ field: "as",
3519
+ local: true,
3520
+ reason: "Closed tag seam (div | span), the same one Badge carries, so the label stays valid HTML beside a name inside a link or a <button>."
3521
+ },
3522
+ "ChildrenProp",
3523
+ "ClassNameProp"
3524
+ ]
3525
+ },
3456
3526
  AvatarImageFitProp: {
3457
3527
  group: "data-display",
3458
3528
  file: "components/data-display.prop.ts",
@@ -4180,7 +4250,7 @@ const COMPONENT_PROP_REGISTRY = {
4180
4250
  FilterBarFilterProp: {
4181
4251
  group: "navigation",
4182
4252
  file: "components/navigation.prop.ts",
4183
- vocabulary: ["LabelProp", "PlaceholderProp", "DisabledProp"]
4253
+ vocabulary: ["LabelProp", "PlaceholderProp", "DisabledProp", "RequiredProp", "AllowClearProp"]
4184
4254
  },
4185
4255
  FilterBarChipProp: {
4186
4256
  group: "navigation",
@@ -4195,7 +4265,18 @@ const COMPONENT_PROP_REGISTRY = {
4195
4265
  PaginationProp: {
4196
4266
  group: "navigation",
4197
4267
  file: "components/navigation.prop.ts",
4198
- vocabulary: ["ValueProp", "OnValueChangeProp", "DisabledProp", "ClassNameProp", "SizeProp"]
4268
+ vocabulary: [
4269
+ "ValueProp",
4270
+ "OnValueChangeProp",
4271
+ "DisabledProp",
4272
+ "ClassNameProp",
4273
+ "SizeProp",
4274
+ {
4275
+ field: "onPageIntent",
4276
+ local: true,
4277
+ reason: "A page target intent event for cache/router preloading, separate from the controlled value channel; pointer enter, focus and touch start (gh#1472)."
4278
+ }
4279
+ ]
4199
4280
  },
4200
4281
  PaginationSizeProp: {
4201
4282
  group: "navigation",
@@ -6260,6 +6341,11 @@ const COMPONENT_PROP_REGISTRY = {
6260
6341
  group: "data-display",
6261
6342
  file: "components/data-display.prop.ts",
6262
6343
  vocabulary: [
6344
+ {
6345
+ field: "onStatusChange",
6346
+ local: true,
6347
+ reason: "Resolved image loading state, including cached images and fallback."
6348
+ },
6263
6349
  "ClassNameProp",
6264
6350
  "PlaceholderProp",
6265
6351
  { field: "src", local: true, reason: "The native img src attribute." },
@@ -243,6 +243,10 @@
243
243
  visibility: hidden;
244
244
  }
245
245
 
246
+ :root:has(.ui-overlay-modal) [data-sonner-toaster] {
247
+ pointer-events: none;
248
+ }
249
+
246
250
  .ui-skeleton-block {
247
251
  border-radius: var(--skeleton-radius, var(--radius));
248
252
  background: var(--skeleton-background, hsl(var(--muted)));
@@ -0,0 +1,24 @@
1
+
2
+ @layer theme, base, vendor, components, utilities;
3
+ @import "./vendor-sonner.css";
4
+ @import "./vendor-day-picker.css";
5
+ @import "./base.css";
6
+ @import "./shell-layout.css";
7
+ @import "./motion.css";
8
+ @import "./layout.css";
9
+ @import "./control.css";
10
+ @import "./toggle.css";
11
+ @import "./logo-layout.css";
12
+ @import "./card-layout.css";
13
+ @import "./text-layout.css";
14
+ @import "./table-layout.css";
15
+ @import "./dialog-layout.css";
16
+ @import "./alert-layout.css";
17
+ @import "./badge-layout.css";
18
+ @import "./data-display-layout.css";
19
+ @import "./data-entry-layout.css";
20
+ @import "./form-layout.css";
21
+ @import "./navigation-layout.css";
22
+ @import "./chart-layout.css";
23
+ @import "./float-button-layout.css";
24
+ @import "./icon-layout.css";
@@ -94,4 +94,18 @@
94
94
  width: var(--badge-remove-icon-size);
95
95
  height: var(--badge-remove-icon-size);
96
96
  }
97
+
98
+ [data-slot="badge"][data-agent] {
99
+ border-color: hsl(var(--badge-agent-border, var(--agent)));
100
+ background-color: transparent;
101
+ color: hsl(var(--badge-agent-foreground, var(--text-agent)));
102
+ white-space: nowrap;
103
+ }
104
+
105
+ @media (forced-colors: active) {
106
+ [data-slot="badge"][data-agent] {
107
+ border-color: CanvasText;
108
+ color: CanvasText;
109
+ }
110
+ }
97
111
  }
@@ -174,6 +174,17 @@
174
174
  }
175
175
 
176
176
  @layer base {
177
+ :root {
178
+ color-scheme: light;
179
+ }
180
+
181
+ @media not print {
182
+ .dark,
183
+ :root[data-theme="dark"] {
184
+ color-scheme: dark;
185
+ }
186
+ }
187
+
177
188
  * {
178
189
  border-color: hsl(var(--border));
179
190
  }
@@ -138,6 +138,12 @@
138
138
  flex-shrink: 0;
139
139
  }
140
140
 
141
+ .ui-button--xs svg,
142
+ .ui-button--icon-xs svg {
143
+ width: var(--button-icon-size, var(--button-xs-icon-size));
144
+ height: var(--button-icon-size, var(--button-xs-icon-size));
145
+ }
146
+
141
147
  .ui-button {
142
148
  backdrop-filter: blur(var(--button-backdrop-blur-size))
143
149
  saturate(var(--surface-backdrop-saturate, 160%));
@@ -1945,9 +1951,13 @@
1945
1951
  max-block-size: var(--radix-popover-content-available-height);
1946
1952
  max-inline-size: min(
1947
1953
  var(--search-select-panel-max-width),
1948
- calc(100vw - var(--search-select-panel-viewport-inset))
1954
+ calc(var(--popover-viewport-inline-size, 100vw) - var(--search-select-panel-viewport-inset))
1955
+ );
1956
+ min-inline-size: min(
1957
+ var(--radix-popover-trigger-width),
1958
+ var(--search-select-panel-max-width),
1959
+ calc(var(--popover-viewport-inline-size, 100vw) - var(--search-select-panel-viewport-inset))
1949
1960
  );
1950
- min-inline-size: var(--radix-popover-trigger-width);
1951
1961
  }
1952
1962
 
1953
1963
  .ui-search-select-panel[data-popup-match="content"] {
@@ -1955,8 +1965,16 @@
1955
1965
  }
1956
1966
 
1957
1967
  .ui-search-select-panel[data-popup-match="fixed"] {
1958
- min-inline-size: var(--search-select-panel-inline-size);
1959
- inline-size: var(--search-select-panel-inline-size);
1968
+ min-inline-size: min(
1969
+ var(--search-select-panel-inline-size, var(--radix-popover-trigger-width)),
1970
+ var(--search-select-panel-max-width),
1971
+ calc(var(--popover-viewport-inline-size, 100vw) - var(--search-select-panel-viewport-inset))
1972
+ );
1973
+ inline-size: min(
1974
+ var(--search-select-panel-inline-size, var(--radix-popover-trigger-width)),
1975
+ var(--search-select-panel-max-width),
1976
+ calc(var(--popover-viewport-inline-size, 100vw) - var(--search-select-panel-viewport-inset))
1977
+ );
1960
1978
  }
1961
1979
 
1962
1980
  .ui-search-select-selected-icon {
@@ -2243,6 +2261,12 @@
2243
2261
  var(--menu-content-min-width),
2244
2262
  var(--trigger-width, var(--menu-content-min-width))
2245
2263
  );
2264
+
2265
+ inline-size: max-content;
2266
+ max-inline-size: min(
2267
+ var(--select-content-max-width),
2268
+ calc(100vw - var(--select-content-viewport-inset))
2269
+ );
2246
2270
  overflow: hidden;
2247
2271
  border-radius: var(--radius-md, calc(var(--radius) / var(--radius-ratio)));
2248
2272
  border: var(--stroke-hairline) solid hsl(var(--border));
@@ -2262,6 +2286,7 @@
2262
2286
  .ui-select-content[data-popup-match="fixed"] {
2263
2287
  min-width: var(--select-content-inline-size);
2264
2288
  width: var(--select-content-inline-size);
2289
+ max-inline-size: none;
2265
2290
  }
2266
2291
 
2267
2292
  .ui-select-viewport {
@@ -2287,21 +2312,9 @@
2287
2312
  calc(var(--radius) / var(--radius-ratio) / var(--radius-ratio))
2288
2313
  );
2289
2314
  padding-inline: var(--menu-item-space-inline);
2290
- height: var(--menu-item-height);
2291
- display: flex;
2292
- align-items: center;
2293
- gap: var(--menu-item-space-gap);
2294
- font-size: var(--menu-item-font-size);
2295
- }
2296
-
2297
- .ui-select-item,
2298
- .ui-select-label {
2299
- border-radius: var(
2300
- --menu-item-radius,
2301
- calc(var(--radius) / var(--radius-ratio) / var(--radius-ratio))
2302
- );
2303
- padding-inline: var(--menu-item-space-inline);
2304
- height: var(--menu-item-height);
2315
+ height: auto;
2316
+ min-height: var(--menu-item-height);
2317
+ padding-block: max(0px, calc((var(--menu-item-height) - 1lh) / 2));
2305
2318
  display: flex;
2306
2319
  align-items: center;
2307
2320
  gap: var(--menu-item-space-gap);
@@ -8,6 +8,7 @@
8
8
  @import "./shell-layout.css";
9
9
  @import "./motion.css";
10
10
  @import "./layout.css";
11
+ @import "./editorial-layout.css";
11
12
  @import "./editorial-account-layout.css";
12
13
  @import "./control.css";
13
14
  @import "./toggle.css";