@godxjp/ui 33.24.0 → 33.25.1

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 (88) hide show
  1. package/README.md +14 -3
  2. package/agent/START-HERE.md +5 -5
  3. package/agent/components/CatalogDetail.json +7 -3
  4. package/agent/components/DatePicker.json +1 -1
  5. package/agent/components/DropdownMenu.json +1 -0
  6. package/agent/components/EditorialCard.json +2 -1
  7. package/agent/components/Image.json +6 -1
  8. package/agent/components/Pagination.json +5 -0
  9. package/agent/components/Popover.json +1 -0
  10. package/agent/components/Select.json +2 -1
  11. package/agent/components/Toaster.json +1 -1
  12. package/agent/components.json +26 -8
  13. package/agent/index.json +5 -5
  14. package/agent/llms.txt +6 -6
  15. package/agent/patterns/notice-bar.json +16 -0
  16. package/agent/patterns-index.json +15 -0
  17. package/agent/patterns.json +16 -0
  18. package/agent/rules.json +2 -2
  19. package/agent/tokens.json +37 -7
  20. package/dist/components/charts/chart-cartesian.js +5 -1
  21. package/dist/components/charts/chart-summary.d.ts +1 -1
  22. package/dist/components/charts/chart-summary.js +17 -6
  23. package/dist/components/charts/compact-bar-trend.js +4 -3
  24. package/dist/components/charts/pie-chart.js +2 -1
  25. package/dist/components/data-display/image.d.ts +1 -0
  26. package/dist/components/data-display/image.js +9 -1
  27. package/dist/components/data-display/popover.js +11 -0
  28. package/dist/components/data-entry/calendar.js +1 -1
  29. package/dist/components/data-entry/date-picker.js +22 -5
  30. package/dist/components/general/button.js +2 -2
  31. package/dist/components/layout/affix.js +20 -4
  32. package/dist/components/layout/editorial-catalog.d.ts +1 -1
  33. package/dist/components/layout/editorial-catalog.js +53 -15
  34. package/dist/components/navigation/dropdown-menu.d.ts +13 -3
  35. package/dist/components/navigation/dropdown-menu.js +36 -6
  36. package/dist/components/navigation/pagination.d.ts +1 -1
  37. package/dist/components/navigation/pagination.js +13 -1
  38. package/dist/contracts/measurement.json +1 -1
  39. package/dist/i18n/messages/en.json +1 -0
  40. package/dist/i18n/messages/ja.json +1 -0
  41. package/dist/i18n/messages/vi.json +1 -0
  42. package/dist/props/components/data-display.prop.d.ts +2 -0
  43. package/dist/props/components/layout.prop.d.ts +7 -2
  44. package/dist/props/components/navigation.prop.d.ts +3 -0
  45. package/dist/props/registry.d.ts +15 -3
  46. package/dist/props/registry.js +18 -1
  47. package/dist/styles/application.css +24 -0
  48. package/dist/styles/base.css +11 -0
  49. package/dist/styles/control.css +32 -19
  50. package/dist/styles/core.css +1 -0
  51. package/dist/styles/data-display-layout.css +7 -0
  52. package/dist/styles/dialog-layout.css +9 -0
  53. package/dist/styles/editorial-layout.css +2076 -0
  54. package/dist/styles/editorial.css +3 -0
  55. package/dist/styles/index.css +1 -0
  56. package/dist/styles/layers.json +39 -8
  57. package/dist/styles/layout.css +6 -1987
  58. package/dist/styles/precompiled/alert-layout.css +2 -0
  59. package/dist/styles/precompiled/badge-layout.css +2 -0
  60. package/dist/styles/precompiled/base.css +2 -0
  61. package/dist/styles/precompiled/card-layout.css +2 -0
  62. package/dist/styles/precompiled/chart-layout.css +2 -0
  63. package/dist/styles/precompiled/control.css +2 -0
  64. package/dist/styles/precompiled/data-display-layout.css +2 -0
  65. package/dist/styles/precompiled/data-entry-layout.css +2 -0
  66. package/dist/styles/precompiled/dialog-layout.css +2 -0
  67. package/dist/styles/precompiled/editorial-account-layout.css +2 -0
  68. package/dist/styles/precompiled/editorial-layout.css +2 -0
  69. package/dist/styles/precompiled/float-button-layout.css +2 -0
  70. package/dist/styles/precompiled/form-layout.css +2 -0
  71. package/dist/styles/precompiled/icon-layout.css +2 -0
  72. package/dist/styles/precompiled/layout.css +2 -0
  73. package/dist/styles/precompiled/logo-layout.css +2 -0
  74. package/dist/styles/precompiled/motion.css +2 -0
  75. package/dist/styles/precompiled/navigation-layout.css +2 -0
  76. package/dist/styles/precompiled/shell-layout.css +2 -0
  77. package/dist/styles/precompiled/table-layout.css +2 -0
  78. package/dist/styles/precompiled/text-layout.css +2 -0
  79. package/dist/styles/precompiled/toggle.css +2 -0
  80. package/dist/styles/precompiled/vendor-day-picker.css +2 -0
  81. package/dist/styles/precompiled/vendor-sonner.css +2 -0
  82. package/dist/styles.css +1 -1
  83. package/dist/tokens/components/control.css +3 -0
  84. package/dist/tokens/components/editorial.css +9 -6
  85. package/docs/CONSUMER-RULES.md +35 -0
  86. package/package.json +4 -2
  87. package/scripts/prune-css.mjs +56 -8
  88. package/scripts/ui-audit.mjs +36 -0
@@ -22,6 +22,7 @@ import {
22
22
  import { Check, ChevronRight } from "lucide-react";
23
23
  import { ariaKeyShortcuts, parseShortcut, shouldHandleShortcut } from "../../lib/shortcut.js";
24
24
  import { cn } from "../../lib/utils.js";
25
+ import { isDevelopment } from "../../lib/dev.js";
25
26
  import { Slot } from "../../lib/slot.js";
26
27
  const DROPDOWN_MENU_PLACEMENT = {
27
28
  top: { side: "top", align: "center" },
@@ -40,7 +41,7 @@ class MenuCollectionBoundary extends React.Component {
40
41
  // of gh#637 that cost the reporter a night of instrumenting `Object.prototype`.
41
42
  componentDidCatch(error) {
42
43
  console.error(
43
- "[@godxjp/ui] DropdownMenu: the menu could not be built and was left empty; the rest of the application is unaffected. A menu's children must be collection nodes (DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuGroup, DropdownMenuSub) or components returning one \u2014 an icon or a text label belongs INSIDE an item, not beside it. Underlying error:",
44
+ "[@godxjp/ui] DropdownMenu: the menu could not be built and was left empty; the rest of the application is unaffected. A menu's children must be collection nodes (DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuGroup, DropdownMenuSub) or components returning one \u2014 an icon or a text label belongs INSIDE an item, not beside it. Use Popover + ListRow for arbitrary panel content. Underlying error:",
44
45
  error
45
46
  );
46
47
  }
@@ -51,6 +52,10 @@ class MenuCollectionBoundary extends React.Component {
51
52
  function borrowedTag(children, asChild) {
52
53
  return asChild ? React.Children.only(children) : null;
53
54
  }
55
+ function borrowedHref(tag) {
56
+ const href = tag?.props?.href;
57
+ return typeof href === "string" ? href : void 0;
58
+ }
54
59
  function renderItemTag(tag, domProps, content) {
55
60
  if (!tag) {
56
61
  return /* @__PURE__ */ jsx("div", { ...domProps, children: content });
@@ -331,6 +336,16 @@ function DropdownMenuSub({ children }) {
331
336
  const parts = React.Children.toArray(children).filter(React.isValidElement);
332
337
  return /* @__PURE__ */ jsx(SubmenuTrigger, { children: parts });
333
338
  }
339
+ function hasNonMenuChildren(children) {
340
+ return React.Children.toArray(children).some((child) => {
341
+ if (!React.isValidElement(child)) return true;
342
+ if (typeof child.type === "string") return true;
343
+ if (child.type === React.Fragment || child.type === DropdownMenuGroup || child.type === DropdownMenuRadioGroup) {
344
+ return hasNonMenuChildren(child.props.children);
345
+ }
346
+ return false;
347
+ });
348
+ }
334
349
  function DropdownMenuContent({
335
350
  children,
336
351
  className,
@@ -348,6 +363,13 @@ function DropdownMenuContent({
348
363
  sticky,
349
364
  forceMount
350
365
  }) {
366
+ React.useEffect(() => {
367
+ if (isDevelopment() && hasNonMenuChildren(children)) {
368
+ console.error(
369
+ "[@godxjp/ui] DropdownMenuContent accepts menu collection children only. Use DropdownMenuItem for actions; use Popover + ListRow for notifications, headers, lists and links."
370
+ );
371
+ }
372
+ }, [children]);
351
373
  void hideWhenDetached;
352
374
  void sticky;
353
375
  void forceMount;
@@ -417,6 +439,7 @@ function DropdownMenuItem({
417
439
  textValue,
418
440
  description,
419
441
  asChild,
442
+ href,
420
443
  ...forwarded
421
444
  }) {
422
445
  const tag = borrowedTag(children, asChild);
@@ -426,6 +449,7 @@ function DropdownMenuItem({
426
449
  MenuItem,
427
450
  {
428
451
  isDisabled: disabled,
452
+ href: href ?? borrowedHref(tag),
429
453
  textValue: textValue ?? (typeof label === "string" ? label : void 0),
430
454
  onAction: onSelect ? () => onSelect(selectEvent("dropdownmenu.itemSelect")) : void 0,
431
455
  className: cn(
@@ -477,11 +501,17 @@ function DropdownMenuLabel({ children, className, inset, asChild }) {
477
501
  {
478
502
  ...props
479
503
  }
480
- ) : (props) => /* @__PURE__ */ jsx(
481
- "div",
482
- {
483
- ...props
484
- }
504
+ ) : (props) => (
505
+ // RAC's `Header` element (it warns in dev when `render` returns another one, gh#1452),
506
+ // with the landmark dropped: `role="presentation"` is allowed on `header` and keeps
507
+ // the menu owning no `banner`.
508
+ /* @__PURE__ */ jsx(
509
+ "header",
510
+ {
511
+ role: "presentation",
512
+ ...props
513
+ }
514
+ )
485
515
  ),
486
516
  children
487
517
  }
@@ -22,5 +22,5 @@ declare const PaginationNext: React.ForwardRefExoticComponent<Omit<Omit<React.De
22
22
  disabled?: boolean;
23
23
  href?: string;
24
24
  } & React.RefAttributes<HTMLButtonElement>>;
25
- export declare function Pagination({ ariaLabel, value, total, pageSize, pageSizeOptions, showSizeChanger, showTotal, hideOnSinglePage, simple, showQuickJumper, size, align, responsive, disabled, className, onValueChange, }: PaginationProp): React.JSX.Element | null;
25
+ export declare function Pagination({ ariaLabel, value, total, pageSize, pageSizeOptions, showSizeChanger, showTotal, hideOnSinglePage, simple, showQuickJumper, size, align, responsive, disabled, className, onValueChange, onPageIntent, }: PaginationProp): React.JSX.Element | null;
26
26
  export { PaginationContent, PaginationItem, PaginationLink, PaginationEllipsis, PaginationPrevious, PaginationNext, };
@@ -122,7 +122,8 @@ function Pagination({
122
122
  responsive = true,
123
123
  disabled,
124
124
  className,
125
- onValueChange
125
+ onValueChange,
126
+ onPageIntent
126
127
  }) {
127
128
  const { t } = useTranslation();
128
129
  const jumperId = React.useId();
@@ -138,6 +139,12 @@ function Pagination({
138
139
  const nextPage = Math.min(Math.max(1, page), Math.max(1, Math.ceil(total / size2)));
139
140
  onValueChange?.(nextPage, size2);
140
141
  };
142
+ const intent = (page) => {
143
+ const notify = () => {
144
+ if (!disabled && page >= 1 && page <= totalPages) onPageIntent?.(page);
145
+ };
146
+ return { onPointerEnter: notify, onFocus: notify, onTouchStart: notify };
147
+ };
141
148
  const commitJump = () => {
142
149
  const parsed = Number.parseInt(jumperDraft, 10);
143
150
  setJumperDraft("");
@@ -204,6 +211,7 @@ function Pagination({
204
211
  size: "sm",
205
212
  disabled: Boolean(disabled) || safeCurrent <= 1,
206
213
  "aria-label": t("navigation.pagination.prev"),
214
+ ...intent(safeCurrent - 1),
207
215
  onClick: () => go(safeCurrent - 1),
208
216
  children: /* @__PURE__ */ jsx(ChevronLeft, { "aria-hidden": "true" })
209
217
  }
@@ -221,6 +229,7 @@ function Pagination({
221
229
  size: "sm",
222
230
  disabled: Boolean(disabled) || safeCurrent >= totalPages,
223
231
  "aria-label": t("navigation.pagination.next"),
232
+ ...intent(safeCurrent + 1),
224
233
  onClick: () => go(safeCurrent + 1),
225
234
  children: /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true" })
226
235
  }
@@ -264,6 +273,7 @@ function Pagination({
264
273
  PaginationPrevious,
265
274
  {
266
275
  "aria-label": t("navigation.pagination.prev"),
276
+ ...intent(safeCurrent - 1),
267
277
  onClick: () => go(safeCurrent - 1),
268
278
  disabled: Boolean(disabled) || safeCurrent <= 1,
269
279
  children: /* @__PURE__ */ jsx(ChevronLeft, { "aria-hidden": "true" })
@@ -274,6 +284,7 @@ function Pagination({
274
284
  PaginationLink,
275
285
  {
276
286
  isActive: page === safeCurrent,
287
+ ...intent(page),
277
288
  "aria-label": t("navigation.pagination.page", { page }),
278
289
  onClick: () => {
279
290
  if (!disabled) go(page);
@@ -287,6 +298,7 @@ function Pagination({
287
298
  PaginationNext,
288
299
  {
289
300
  "aria-label": t("navigation.pagination.next"),
301
+ ...intent(safeCurrent + 1),
290
302
  onClick: () => go(safeCurrent + 1),
291
303
  disabled: Boolean(disabled) || safeCurrent >= totalPages,
292
304
  children: /* @__PURE__ */ jsx(ChevronRight, { "aria-hidden": "true" })
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$comment": "AUTO-GENERATED by scripts/gen-measurement-contract.mjs — do not edit. Read this instead of guessing: docs/MEASUREMENT-CONTRACT.md.",
3
- "version": "33.24.0",
3
+ "version": "33.25.1",
4
4
  "targetSize": {
5
5
  "standard": "WCAG 2.2 SC 2.5.8 Target Size (Minimum), level AA — 24×24 CSS px",
6
6
  "min": 24,
@@ -811,6 +811,7 @@
811
811
  "trendCurrent": "current",
812
812
  "heatmapSummary": "Heatmap, {rows} × {columns}",
813
813
  "heatmapHighest": "Highest: {value} at {row}, {column}",
814
+ "noData": "No data",
814
815
  "heatmapNoData": "No data",
815
816
  "heatmapTop": "Top {rank}",
816
817
  "heatmapLegend": "Color scale",
@@ -785,6 +785,7 @@
785
785
  "trendCurrent": "現在",
786
786
  "heatmapSummary": "ヒートマップ({rows}行×{columns}列)",
787
787
  "heatmapHighest": "最大 {value}({row}・{column})",
788
+ "noData": "データなし",
788
789
  "heatmapNoData": "データなし",
789
790
  "heatmapTop": "上位{rank}位",
790
791
  "heatmapLegend": "色の濃さの凡例",
@@ -786,6 +786,7 @@
786
786
  "trendCurrent": "hiện tại",
787
787
  "heatmapSummary": "Bản đồ nhiệt {rows} × {columns}",
788
788
  "heatmapHighest": "Cao nhất: {value} tại {row}, {column}",
789
+ "noData": "Không có dữ liệu",
789
790
  "heatmapNoData": "Không có dữ liệu",
790
791
  "heatmapTop": "Hạng {rank}",
791
792
  "heatmapLegend": "Thang màu",
@@ -1352,6 +1352,8 @@ export type ImageProp = Omit<React.ImgHTMLAttributes<HTMLImageElement>, "alt" |
1352
1352
  fallback?: string;
1353
1353
  /** Painted over the frame until the picture loads. `true` = the plain muted block. */
1354
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;
1355
1357
  /** `false` = a plain picture, not clickable, not in its group. Default `true`. */
1356
1358
  preview?: boolean | ImagePreviewConfigProp;
1357
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";
@@ -2639,8 +2640,12 @@ export type EditorialFilterFieldProp = {
2639
2640
  export type CatalogDetailProp = {
2640
2641
  /** `"sealed"` frames a product package instead of a card. */
2641
2642
  variant?: "card" | "sealed";
2642
- /** The picture — an `<img>` (or a link around one). */
2643
- 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
+ };
2644
2649
  /** The save toggle over the frame's corner (same shape as `CatalogCard`'s). */
2645
2650
  favorite?: CatalogCardProp["favorite"];
2646
2651
  /** A line under the frame (the picture's source, an official link). */
@@ -232,6 +232,9 @@ export type PaginationProp = {
232
232
  disabled?: DisabledProp;
233
233
  className?: ClassNameProp;
234
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;
235
238
  };
236
239
  /** @see Pagination — control tier (Ant Design `size`: `small` → `sm`, `middle` → `md`). */
237
240
  export type PaginationSizeProp = "sm" | "md";
@@ -1937,7 +1937,11 @@ export declare const COMPONENT_PROP_REGISTRY: {
1937
1937
  readonly CatalogDetailProp: {
1938
1938
  readonly group: "layout";
1939
1939
  readonly file: "components/layout.prop.ts";
1940
- 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", {
1941
1945
  readonly field: "variant";
1942
1946
  readonly local: true;
1943
1947
  readonly reason: "Card or sealed-product frame.";
@@ -4066,7 +4070,11 @@ export declare const COMPONENT_PROP_REGISTRY: {
4066
4070
  readonly PaginationProp: {
4067
4071
  readonly group: "navigation";
4068
4072
  readonly file: "components/navigation.prop.ts";
4069
- 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
+ }];
4070
4078
  };
4071
4079
  readonly PaginationSizeProp: {
4072
4080
  readonly group: "navigation";
@@ -5691,7 +5699,11 @@ export declare const COMPONENT_PROP_REGISTRY: {
5691
5699
  readonly ImageProp: {
5692
5700
  readonly group: "data-display";
5693
5701
  readonly file: "components/data-display.prop.ts";
5694
- 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", {
5695
5707
  readonly field: "src";
5696
5708
  readonly local: true;
5697
5709
  readonly reason: "The native img src attribute.";
@@ -1892,6 +1892,7 @@ const COMPONENT_PROP_REGISTRY = {
1892
1892
  group: "layout",
1893
1893
  file: "components/layout.prop.ts",
1894
1894
  vocabulary: [
1895
+ { field: "image", local: true, reason: "Kit-owned source-keyed media configuration." },
1895
1896
  "TitleProp",
1896
1897
  "ClassNameProp",
1897
1898
  { field: "variant", local: true, reason: "Card or sealed-product frame." },
@@ -4264,7 +4265,18 @@ const COMPONENT_PROP_REGISTRY = {
4264
4265
  PaginationProp: {
4265
4266
  group: "navigation",
4266
4267
  file: "components/navigation.prop.ts",
4267
- 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
+ ]
4268
4280
  },
4269
4281
  PaginationSizeProp: {
4270
4282
  group: "navigation",
@@ -6329,6 +6341,11 @@ const COMPONENT_PROP_REGISTRY = {
6329
6341
  group: "data-display",
6330
6342
  file: "components/data-display.prop.ts",
6331
6343
  vocabulary: [
6344
+ {
6345
+ field: "onStatusChange",
6346
+ local: true,
6347
+ reason: "Resolved image loading state, including cached images and fallback."
6348
+ },
6332
6349
  "ClassNameProp",
6333
6350
  "PlaceholderProp",
6334
6351
  { field: "src", local: true, reason: "The native img src attribute." },
@@ -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";
@@ -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";
@@ -3768,6 +3768,13 @@
3768
3768
  color: hsl(var(--muted-foreground));
3769
3769
  }
3770
3770
 
3771
+ .ui-image-placeholder > * {
3772
+ min-block-size: 0;
3773
+ min-inline-size: 0;
3774
+ max-block-size: 100%;
3775
+ max-inline-size: 100%;
3776
+ }
3777
+
3771
3778
  .ui-image-mask {
3772
3779
  position: absolute;
3773
3780
  inset: 0;
@@ -341,6 +341,9 @@
341
341
  }
342
342
 
343
343
  .ui-popover-content {
344
+
345
+ overflow: auto;
346
+ scroll-padding: calc(var(--focus-ring-width) + var(--focus-outline-offset));
344
347
  z-index: var(--overlay-z-index);
345
348
 
346
349
  width: var(--popover-surface-inline-size, var(--popover-width));
@@ -484,3 +487,9 @@
484
487
  min-block-size: 0;
485
488
  }
486
489
  }
490
+
491
+ @layer components {
492
+ .ui-popover-content[data-flush] :focus-visible {
493
+ --focus-ring-contained-offset: var(--focus-ring-inset-offset);
494
+ }
495
+ }