@k8o/arte-odyssey 9.1.0 → 10.0.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 (103) hide show
  1. package/README.md +121 -28
  2. package/dist/components/_internal/focus-ring.d.mts +8 -0
  3. package/dist/components/_internal/focus-ring.mjs +8 -0
  4. package/dist/components/buttons/button/button.d.mts +8 -1
  5. package/dist/components/buttons/button/button.mjs +13 -12
  6. package/dist/components/buttons/icon-button/icon-button.d.mts +7 -1
  7. package/dist/components/buttons/icon-button/icon-button.mjs +3 -2
  8. package/dist/components/data-display/accordion/accordion-button.mjs +2 -1
  9. package/dist/components/data-display/accordion/accordion-item.d.mts +2 -0
  10. package/dist/components/data-display/accordion/accordion-item.mjs +3 -1
  11. package/dist/components/data-display/accordion/context.d.mts +2 -0
  12. package/dist/components/data-display/accordion/context.mjs +12 -6
  13. package/dist/components/data-display/accordion/index.d.mts +9 -9
  14. package/dist/components/data-display/avatar/avatar.mjs +1 -1
  15. package/dist/components/data-display/badge/badge.d.mts +1 -1
  16. package/dist/components/data-display/badge/badge.mjs +3 -2
  17. package/dist/components/data-display/card/card.mjs +1 -1
  18. package/dist/components/data-display/code/find-all-colors.mjs +3 -3
  19. package/dist/components/feedback/alert/alert.d.mts +1 -1
  20. package/dist/components/feedback/alert/alert.mjs +6 -6
  21. package/dist/components/feedback/toast/context.d.mts +3 -4
  22. package/dist/components/feedback/toast/context.mjs +3 -4
  23. package/dist/components/feedback/toast/provider.mjs +1 -1
  24. package/dist/components/feedback/toast/toast.d.mts +1 -1
  25. package/dist/components/feedback/toast/toast.mjs +2 -2
  26. package/dist/components/form/autocomplete/autocomplete.mjs +6 -1
  27. package/dist/components/form/checkbox/checkbox.d.mts +3 -3
  28. package/dist/components/form/checkbox/checkbox.mjs +5 -4
  29. package/dist/components/form/checkbox-card/checkbox-card.mjs +2 -0
  30. package/dist/components/form/checkbox-group/checkbox-group.mjs +1 -0
  31. package/dist/components/form/checkbox-group/index.d.mts +10 -12
  32. package/dist/components/form/file-field/file-field.d.mts +3 -4
  33. package/dist/components/form/file-field/file-field.mjs +2 -7
  34. package/dist/components/form/number-field/cast.mjs +2 -2
  35. package/dist/components/form/number-field/number-field.mjs +4 -3
  36. package/dist/components/form/password-input/password-input.mjs +3 -2
  37. package/dist/components/form/radio/radio.d.mts +3 -3
  38. package/dist/components/form/radio/radio.mjs +6 -5
  39. package/dist/components/form/radio-card/radio-card.d.mts +3 -3
  40. package/dist/components/form/radio-card/radio-card.mjs +3 -2
  41. package/dist/components/form/select/select.mjs +2 -1
  42. package/dist/components/form/slider/slider.mjs +1 -1
  43. package/dist/components/form/switch/switch.d.mts +3 -3
  44. package/dist/components/form/switch/switch.mjs +3 -2
  45. package/dist/components/form/text-field/text-field.mjs +2 -1
  46. package/dist/components/form/textarea/textarea.mjs +2 -1
  47. package/dist/components/index.d.mts +3 -1
  48. package/dist/components/index.mjs +3 -1
  49. package/dist/components/layout/_shared/gap.d.mts +11 -0
  50. package/dist/components/layout/_shared/gap.mjs +10 -0
  51. package/dist/components/layout/grid/grid.d.mts +16 -0
  52. package/dist/components/layout/grid/grid.mjs +35 -0
  53. package/dist/components/layout/grid/index.d.mts +2 -0
  54. package/dist/components/layout/grid/index.mjs +2 -0
  55. package/dist/components/layout/stack/index.d.mts +2 -0
  56. package/dist/components/layout/stack/index.mjs +2 -0
  57. package/dist/components/layout/stack/stack.d.mts +13 -0
  58. package/dist/components/layout/stack/stack.mjs +23 -0
  59. package/dist/components/navigation/anchor/anchor.d.mts +9 -8
  60. package/dist/components/navigation/anchor/anchor.mjs +4 -3
  61. package/dist/components/navigation/breadcrumb/breadcrumb.d.mts +2 -4
  62. package/dist/components/navigation/breadcrumb/breadcrumb.mjs +3 -3
  63. package/dist/components/navigation/tabs/tabs.d.mts +2 -0
  64. package/dist/components/navigation/tabs/tabs.mjs +15 -8
  65. package/dist/components/overlays/dialog/dialog.d.mts +1 -2
  66. package/dist/components/overlays/drawer/drawer.d.mts +3 -2
  67. package/dist/components/overlays/drawer/drawer.mjs +6 -3
  68. package/dist/components/overlays/dropdown-menu/dropdown-menu.mjs +3 -3
  69. package/dist/components/overlays/dropdown-menu/hooks.d.mts +153 -154
  70. package/dist/components/overlays/list-box/hooks.d.mts +173 -174
  71. package/dist/components/overlays/list-box/list-box.d.mts +1 -1
  72. package/dist/components/overlays/list-box/list-box.mjs +5 -5
  73. package/dist/components/overlays/popover/hooks.d.mts +1 -2
  74. package/dist/components/overlays/tooltip/tooltip.d.mts +1 -2
  75. package/dist/hooks/index.d.mts +2 -2
  76. package/dist/hooks/index.mjs +2 -2
  77. package/dist/index.d.mts +4 -2
  78. package/dist/index.mjs +20 -18
  79. package/dist/integrations/_shared/renderers.d.mts +74 -0
  80. package/dist/integrations/_shared/renderers.mjs +667 -0
  81. package/dist/integrations/_shared/schemas.d.mts +704 -0
  82. package/dist/integrations/_shared/schemas.mjs +496 -0
  83. package/dist/integrations/json-render/catalog.d.mts +770 -0
  84. package/dist/integrations/json-render/catalog.mjs +229 -0
  85. package/dist/integrations/json-render/registry.d.mts +4 -0
  86. package/dist/integrations/json-render/registry.mjs +137 -0
  87. package/dist/integrations/openui/form-views.d.mts +31 -0
  88. package/dist/integrations/openui/form-views.mjs +75 -0
  89. package/dist/integrations/openui/library.d.mts +4 -0
  90. package/dist/integrations/openui/library.mjs +432 -0
  91. package/dist/styles/base.css +75 -0
  92. package/dist/styles/index.css +12 -500
  93. package/dist/styles/tokens.css +379 -0
  94. package/dist/styles/tokens.d.mts +2 -95
  95. package/dist/styles/tokens.generated.d.mts +839 -0
  96. package/dist/styles/tokens.generated.mjs +812 -0
  97. package/dist/styles/tokens.mjs +2 -776
  98. package/dist/styles/utilities.css +62 -0
  99. package/dist/types/index.d.mts +1 -1
  100. package/docs/GUIDE.md +26 -7
  101. package/docs/references/components.md +40 -21
  102. package/docs/references/hooks.md +17 -0
  103. package/package.json +69 -27
@@ -2,18 +2,17 @@
2
2
  import { createSafeContext } from "../../../helpers/create-safe-context.mjs";
3
3
  import { useCallback } from "react";
4
4
  //#region src/components/feedback/toast/context.ts
5
- const MAX_TOAST_COUNT = 5;
6
5
  const [SetToastContext, useSetToast] = createSafeContext("useToast must be used within a ToastProvider");
7
6
  const useToast = () => {
8
7
  const setToasts = useSetToast();
9
8
  return {
10
- onOpen: useCallback((status, message) => {
9
+ onOpen: useCallback((tone, message) => {
11
10
  setToasts((prev) => {
12
11
  return [...prev, {
13
12
  id: crypto.randomUUID(),
14
- status,
13
+ tone,
15
14
  message
16
- }].slice(-MAX_TOAST_COUNT);
15
+ }].slice(-5);
17
16
  });
18
17
  }, [setToasts]),
19
18
  onClose: useCallback((id) => {
@@ -67,7 +67,7 @@ const ToastProvider = ({ children, portalRef = null, position = "fixed" }) => {
67
67
  children: /* @__PURE__ */ jsx("div", {
68
68
  "aria-atomic": true,
69
69
  className: "shadow-lg",
70
- role: toast.status === "error" || toast.status === "warning" ? "alert" : "status",
70
+ role: toast.tone === "error" || toast.tone === "warning" ? "alert" : "status",
71
71
  children: /* @__PURE__ */ jsx(Toast, { ...toast })
72
72
  })
73
73
  }, toast.id))
@@ -4,7 +4,7 @@ import { FC } from "react";
4
4
  //#region src/components/feedback/toast/toast.d.ts
5
5
  type ToastProps = {
6
6
  id: string;
7
- status: Status;
7
+ tone: Status;
8
8
  message: string;
9
9
  };
10
10
  declare const Toast: FC<ToastProps>;
@@ -6,14 +6,14 @@ import { useCallback } from "react";
6
6
  import { jsx } from "react/jsx-runtime";
7
7
  //#region src/components/feedback/toast/toast.tsx
8
8
  const DELAY_MS = 5e3;
9
- const Toast = ({ id, status, message }) => {
9
+ const Toast = ({ id, tone, message }) => {
10
10
  const { onClose } = useToast();
11
11
  useTimeout(useCallback(() => {
12
12
  onClose(id);
13
13
  }, [id, onClose]), DELAY_MS);
14
14
  return /* @__PURE__ */ jsx(Alert, {
15
15
  message,
16
- status
16
+ tone
17
17
  });
18
18
  };
19
19
  //#endregion
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import { FOCUS_RING_WITHIN } from "../../_internal/focus-ring.mjs";
2
3
  import { cn } from "../../../helpers/cn.mjs";
3
4
  import { useDisclosure } from "../../../hooks/disclosure/index.mjs";
4
5
  import { CloseIcon } from "../../icons/lucide.mjs";
@@ -63,7 +64,7 @@ const Autocomplete = ({ id, name, invalid = false, disabled = false, required =
63
64
  refs.setReference(node);
64
65
  };
65
66
  return /* @__PURE__ */ jsxs("div", {
66
- className: cn("relative rounded-xl border border-border-base bg-bg-base inline-full", "focus-within:border-transparent focus-within:outline-hidden focus-within:ring-2 focus-within:ring-border-info", "has-aria-invalid:border-border-error", "has-disabled:cursor-not-allowed has-disabled:border-border-mute has-disabled:bg-bg-mute hover:has-disabled:has-hover:bg-bg-mute"),
67
+ className: cn("relative rounded-xl border border-border-base bg-bg-base inline-full", FOCUS_RING_WITHIN, "has-aria-invalid:border-border-error", "has-disabled:cursor-not-allowed has-disabled:border-border-mute has-disabled:bg-bg-mute hover:has-disabled:has-hover:bg-bg-mute"),
67
68
  ref: setReferenceRef,
68
69
  children: [
69
70
  name !== void 0 && name !== "" ? currentValue.map((selectedValue) => /* @__PURE__ */ jsx("input", {
@@ -181,14 +182,18 @@ const Autocomplete = ({ id, name, invalid = false, disabled = false, required =
181
182
  "aria-busy": isPending || void 0,
182
183
  className: cn("max-h-96 py-2 transition-opacity vertical:max-h-none vertical:max-w-96", isPending && "opacity-60"),
183
184
  id: `${id}_listbox`,
185
+ role: "listbox",
184
186
  children: [filteredOptions.length === 0 && /* @__PURE__ */ jsx("li", {
185
187
  className: "text-fg-mute px-3 py-2",
188
+ role: "presentation",
186
189
  children: "該当なし"
187
190
  }), filteredOptions.map((option, idx) => {
188
191
  const selected = currentValue.includes(option.value);
189
192
  return /* @__PURE__ */ jsx("li", {
193
+ "aria-selected": selected,
190
194
  className: cn("cursor-pointer px-3 py-2 transition-colors", selected && "bg-primary-bg-subtle text-primary-fg", selectIndex === idx && !selected && "bg-bg-subtle", selectIndex === idx && selected && "bg-primary-bg-mute text-primary-fg"),
191
195
  id: `${id}_option_${option.value}`,
196
+ role: "option",
192
197
  onClick: (e) => {
193
198
  e.stopPropagation();
194
199
  reset();
@@ -1,4 +1,4 @@
1
- import { ChangeEventHandler, FC, InputHTMLAttributes } from "react";
1
+ import { ChangeEvent, FC, InputHTMLAttributes } from "react";
2
2
 
3
3
  //#region src/components/form/checkbox/checkbox.d.ts
4
4
  type BaseProps = {
@@ -7,13 +7,13 @@ type BaseProps = {
7
7
  } & Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'className' | 'style' | 'value' | 'onChange' | 'defaultChecked' | 'checked' | 'children'>;
8
8
  type ControlledProps = {
9
9
  value: boolean;
10
- onChange: ChangeEventHandler<HTMLInputElement>;
10
+ onChange: (checked: boolean, event: ChangeEvent<HTMLInputElement>) => void;
11
11
  defaultChecked?: never;
12
12
  };
13
13
  type UncontrolledProps = {
14
14
  defaultChecked?: boolean;
15
15
  value?: never;
16
- onChange?: ChangeEventHandler<HTMLInputElement>;
16
+ onChange?: (checked: boolean, event: ChangeEvent<HTMLInputElement>) => void;
17
17
  };
18
18
  type Props = BaseProps & (ControlledProps | UncontrolledProps);
19
19
  declare const Checkbox: FC<Props>;
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import { FOCUS_RING_PEER } from "../../_internal/focus-ring.mjs";
2
3
  import { cn } from "../../../helpers/cn.mjs";
3
4
  import { CheckIcon } from "../../icons/lucide.mjs";
4
5
  import { useControllableState } from "../../../hooks/controllable-state/index.mjs";
@@ -18,9 +19,9 @@ const Checkbox = ({ name, itemValue, disabled = false, label, value, defaultChec
18
19
  const isControlled = value !== void 0;
19
20
  const disabledResolved = disabled || groupContext?.disabled === true || pending;
20
21
  const checked = groupContext ? groupContext.currentValue.includes(groupItemValue) : internalChecked;
21
- const setChecked = (nextChecked) => {
22
+ const setChecked = (nextChecked, event) => {
22
23
  setInternalChecked(nextChecked);
23
- onChange?.({ target: { checked: nextChecked } });
24
+ onChange?.(nextChecked, event);
24
25
  };
25
26
  return /* @__PURE__ */ jsxs("label", {
26
27
  className: cn("inline-flex items-center gap-2 text-left", disabledResolved ? "cursor-not-allowed text-fg-mute" : "cursor-pointer"),
@@ -36,14 +37,14 @@ const Checkbox = ({ name, itemValue, disabled = false, label, value, defaultChec
36
37
  groupContext.toggleValue(groupItemValue);
37
38
  return;
38
39
  }
39
- setChecked(event.target.checked);
40
+ setChecked(event.target.checked, event);
40
41
  },
41
42
  type: "checkbox",
42
43
  value: groupContext ? groupItemValue : void 0
43
44
  }),
44
45
  /* @__PURE__ */ jsx("span", {
45
46
  "aria-hidden": true,
46
- className: cn("inline-flex size-5 items-center justify-center rounded-md border-2 transition-colors", "peer-focus-visible:border-transparent peer-focus-visible:outline-hidden peer-focus-visible:ring-2 peer-focus-visible:ring-border-info", disabledResolved && "border-border-mute bg-bg-mute", checked ? "border-border-base bg-primary-bg text-fg-base" : "border-border-mute bg-bg-base"),
47
+ className: cn("inline-flex size-5 items-center justify-center rounded-md border-2 transition-colors", FOCUS_RING_PEER, disabledResolved && "border-border-mute bg-bg-mute", checked ? "border-border-base bg-primary-bg text-fg-base" : "border-border-mute bg-bg-base"),
47
48
  children: checked ? /* @__PURE__ */ jsx(CheckIcon, { size: "sm" }) : null
48
49
  }),
49
50
  /* @__PURE__ */ jsx("span", {
@@ -30,6 +30,7 @@ const CheckboxCard = ({ name, disabled = false, invalid = false, options, value,
30
30
  children: [
31
31
  /* @__PURE__ */ jsx("input", {
32
32
  "aria-describedby": hasDescription ? `${optionId}-description` : void 0,
33
+ "aria-labelledby": `${optionId}-label`,
33
34
  checked,
34
35
  className: "sr-only",
35
36
  disabled: optionDisabled,
@@ -49,6 +50,7 @@ const CheckboxCard = ({ name, disabled = false, invalid = false, options, value,
49
50
  className: "flex min-w-0 flex-1 flex-col gap-1",
50
51
  children: [/* @__PURE__ */ jsx("span", {
51
52
  className: "text-fg-base font-medium",
53
+ id: `${optionId}-label`,
52
54
  children: option.label
53
55
  }), hasDescription ? /* @__PURE__ */ jsx("span", {
54
56
  className: "text-fg-mute text-sm",
@@ -29,6 +29,7 @@ const Root = ({ children, defaultValue, disabled = false, invalid = false, requi
29
29
  return /* @__PURE__ */ jsx("fieldset", {
30
30
  ...rest,
31
31
  "aria-invalid": invalid,
32
+ "aria-required": required,
32
33
  className: cn("flex flex-col gap-2", disabled && "cursor-not-allowed"),
33
34
  children: /* @__PURE__ */ jsx(CheckboxGroupContext, {
34
35
  value: contextValue,
@@ -1,12 +1,10 @@
1
- import * as _$react from "react";
2
-
3
1
  //#region src/components/form/checkbox-group/index.d.ts
4
- declare const CheckboxGroup: _$react.FC<{
2
+ declare const CheckboxGroup: import("react").FC<{
5
3
  invalid?: boolean;
6
4
  required?: boolean;
7
5
  name: string;
8
- } & Omit<_$react.FieldsetHTMLAttributes<HTMLFieldSetElement>, "defaultValue" | "onChange" | "className" | "style" | "name"> & {
9
- children?: _$react.ReactNode | undefined;
6
+ } & Omit<import("react").FieldsetHTMLAttributes<HTMLFieldSetElement>, "className" | "style" | "name" | "defaultValue" | "onChange"> & {
7
+ children?: import("react").ReactNode | undefined;
10
8
  } & ({
11
9
  value: string[];
12
10
  onChange: (value: string[]) => void;
@@ -16,12 +14,12 @@ declare const CheckboxGroup: _$react.FC<{
16
14
  value?: never;
17
15
  onChange?: (value: string[]) => void;
18
16
  })> & {
19
- Root: _$react.FC<{
17
+ Root: import("react").FC<{
20
18
  invalid?: boolean;
21
19
  required?: boolean;
22
20
  name: string;
23
- } & Omit<_$react.FieldsetHTMLAttributes<HTMLFieldSetElement>, "defaultValue" | "onChange" | "className" | "style" | "name"> & {
24
- children?: _$react.ReactNode | undefined;
21
+ } & Omit<import("react").FieldsetHTMLAttributes<HTMLFieldSetElement>, "className" | "style" | "name" | "defaultValue" | "onChange"> & {
22
+ children?: import("react").ReactNode | undefined;
25
23
  } & ({
26
24
  value: string[];
27
25
  onChange: (value: string[]) => void;
@@ -32,17 +30,17 @@ declare const CheckboxGroup: _$react.FC<{
32
30
  onChange?: (value: string[]) => void;
33
31
  })>;
34
32
  } & {
35
- Item: _$react.FC<{
33
+ Item: import("react").FC<{
36
34
  itemValue?: string;
37
35
  label: string;
38
- } & Omit<_$react.InputHTMLAttributes<HTMLInputElement>, "value" | "onChange" | "type" | "className" | "style" | "checked" | "defaultChecked" | "children"> & ({
36
+ } & Omit<import("react").InputHTMLAttributes<HTMLInputElement>, "value" | "type" | "className" | "style" | "checked" | "defaultChecked" | "children" | "onChange"> & ({
39
37
  value: boolean;
40
- onChange: _$react.ChangeEventHandler<HTMLInputElement>;
38
+ onChange: (checked: boolean, event: import("react").ChangeEvent<HTMLInputElement>) => void;
41
39
  defaultChecked?: never;
42
40
  } | {
43
41
  defaultChecked?: boolean;
44
42
  value?: never;
45
- onChange?: _$react.ChangeEventHandler<HTMLInputElement>;
43
+ onChange?: (checked: boolean, event: import("react").ChangeEvent<HTMLInputElement>) => void;
46
44
  })>;
47
45
  };
48
46
  //#endregion
@@ -1,12 +1,11 @@
1
- import { ChangeEventHandler, FC, InputHTMLAttributes, PropsWithChildren, ReactElement } from "react";
2
- import * as _$react_jsx_runtime0 from "react/jsx-runtime";
1
+ import { ChangeEvent, FC, InputHTMLAttributes, PropsWithChildren, ReactElement } from "react";
3
2
 
4
3
  //#region src/components/form/file-field/file-field.d.ts
5
4
  type RootProps = PropsWithChildren<{
6
5
  invalid?: boolean;
7
6
  maxFiles?: number;
8
7
  defaultValue?: File[];
9
- onChange?: ChangeEventHandler<HTMLInputElement>;
8
+ onChange?: (files: FileList | null, event?: ChangeEvent<HTMLInputElement>) => void;
10
9
  webkitDirectory?: boolean;
11
10
  } & Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'className' | 'style' | 'onChange' | 'defaultValue' | 'value' | 'children'>>;
12
11
  declare const FileField: {
@@ -20,7 +19,7 @@ declare const FileField: {
20
19
  onChange,
21
20
  webkitDirectory,
22
21
  ...rest
23
- }: RootProps) => _$react_jsx_runtime0.JSX.Element;
22
+ }: RootProps) => import("react/jsx-runtime").JSX.Element;
24
23
  readonly Trigger: FC<{
25
24
  renderItem: (props: {
26
25
  onClick: () => void;
@@ -14,7 +14,7 @@ const Root = ({ children, disabled = false, invalid = false, required = false, m
14
14
  const disabledResolved = disabled || pending;
15
15
  const [acceptedFiles, setAcceptedFiles] = useState([]);
16
16
  const onFilesChange = useCallback((event) => {
17
- onChange?.(event);
17
+ onChange?.(event.target.files, event);
18
18
  const newFiles = Array.from(event.target.files ?? []).map((file) => ({
19
19
  file,
20
20
  id: crypto.randomUUID()
@@ -34,12 +34,7 @@ const Root = ({ children, disabled = false, invalid = false, required = false, m
34
34
  const dataTransfer = new DataTransfer();
35
35
  for (const { file } of updatedFiles) dataTransfer.items.add(file);
36
36
  inputRef.current.files = dataTransfer.files;
37
- const event = new Event("change", { bubbles: true });
38
- Object.defineProperty(event, "target", {
39
- writable: false,
40
- value: inputRef.current
41
- });
42
- onChange(event);
37
+ onChange(dataTransfer.files);
43
38
  }
44
39
  }, [acceptedFiles, onChange]);
45
40
  const openFilePicker = useCallback(() => {
@@ -1,9 +1,9 @@
1
1
  import { toPrecision } from "../../../internal/to-precision.mjs";
2
2
  //#region src/components/form/number-field/cast.ts
3
- const FLOATING_POINT_REGEX = /^[Ee0-9+\-.]$/;
3
+ const FLOATING_POINT_REGEX = /^[Ee0-9+\-.]$/u;
4
4
  const isInvalidCharacter = (value) => FLOATING_POINT_REGEX.test(value);
5
5
  const sanitize = (value) => value.split("").filter((char) => isInvalidCharacter(char)).join("");
6
- const parse = (value) => Number.parseFloat(value.toString().replaceAll(/[^\w.-]+/g, ""));
6
+ const parse = (value) => Number.parseFloat(value.toString().replaceAll(/[^\w.-]+/gu, ""));
7
7
  const countDecimalPlaces = (value) => {
8
8
  if (!Number.isFinite(value)) return 0;
9
9
  let e = 1;
@@ -1,8 +1,9 @@
1
1
  "use client";
2
+ import { FOCUS_RING_WITHIN } from "../../_internal/focus-ring.mjs";
2
3
  import { cn } from "../../../helpers/cn.mjs";
3
4
  import { ChevronIcon } from "../../icons/lucide.mjs";
4
- import { toPrecision } from "../../../internal/to-precision.mjs";
5
5
  import { useControllableState } from "../../../hooks/controllable-state/index.mjs";
6
+ import { toPrecision } from "../../../internal/to-precision.mjs";
6
7
  import { clamp } from "../../../internal/clamp.mjs";
7
8
  import { cast } from "./cast.mjs";
8
9
  import { useState } from "react";
@@ -26,7 +27,7 @@ const NumberField = ({ invalid = false, disabled = false, required = false, valu
26
27
  setCurrentValue(newValue);
27
28
  };
28
29
  return /* @__PURE__ */ jsxs("div", {
29
- className: cn("relative flex h-12 w-full items-center justify-between gap-2 rounded-xl border border-border-base bg-bg-base vertical:h-auto vertical:w-12", "focus-within:border-transparent focus-within:outline-hidden focus-within:ring-2 focus-within:ring-border-info", "has-aria-invalid:border-border-error", "has-disabled:cursor-not-allowed has-disabled:border-border-mute has-disabled:bg-bg-mute hover:has-disabled:has-hover:bg-bg-mute"),
30
+ className: cn("relative flex h-12 w-full items-center justify-between gap-2 rounded-xl border border-border-base bg-bg-base vertical:h-auto vertical:w-12", FOCUS_RING_WITHIN, "has-aria-invalid:border-border-error", "has-disabled:cursor-not-allowed has-disabled:border-border-mute has-disabled:bg-bg-mute hover:has-disabled:has-hover:bg-bg-mute"),
30
31
  children: [/* @__PURE__ */ jsx("input", {
31
32
  autoComplete: "off",
32
33
  autoCorrect: "off",
@@ -67,7 +68,7 @@ const NumberField = ({ invalid = false, disabled = false, required = false, valu
67
68
  value: displayValue
68
69
  }), /* @__PURE__ */ jsxs("div", {
69
70
  "aria-hidden": "true",
70
- className: "vertical:inset-e-auto vertical:bottom-1 vertical:h-auto vertical:w-full vertical:flex-row vertical:px-1 vertical:py-0 absolute end-1 flex h-full flex-col py-1",
71
+ className: "vertical:inset-e-auto vertical:bottom-1 vertical:h-auto vertical:w-full vertical:flex-row vertical:px-1 vertical:py-0 absolute inset-e-1 flex h-full flex-col py-1",
71
72
  children: [/* @__PURE__ */ jsxs("button", {
72
73
  className: cn("flex w-6 grow items-center justify-center rounded-md text-fg-mute transition-colors vertical:h-6 vertical:w-auto", "hover:bg-bg-mute hover:text-fg-base", "disabled:cursor-not-allowed disabled:text-fg-mute hover:disabled:bg-transparent"),
73
74
  disabled: disabled || pending,
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import { FOCUS_RING_NO_BORDER, FOCUS_RING_WITHIN } from "../../_internal/focus-ring.mjs";
2
3
  import { cn } from "../../../helpers/cn.mjs";
3
4
  import { useDisclosure } from "../../../hooks/disclosure/index.mjs";
4
5
  import { ViewIcon, ViewOffIcon } from "../../icons/lucide.mjs";
@@ -9,7 +10,7 @@ const PasswordInput = ({ invalid = false, autoComplete = "current-password", sho
9
10
  const { isOpen: isVisible, toggle: toggleVisible } = useDisclosure();
10
11
  const { pending } = useFormStatus();
11
12
  return /* @__PURE__ */ jsxs("div", {
12
- className: cn("relative flex w-full items-center rounded-xl border border-border-base bg-bg-base vertical:h-full vertical:w-auto", invalid && "border-border-error", (disabled || pending) && "cursor-not-allowed border-border-mute bg-bg-mute", "focus-within:border-transparent focus-within:outline-hidden focus-within:ring-2 focus-within:ring-border-info"),
13
+ className: cn("relative flex w-full items-center rounded-xl border border-border-base bg-bg-base vertical:h-full vertical:w-auto", invalid && "border-border-error", (disabled || pending) && "cursor-not-allowed border-border-mute bg-bg-mute", FOCUS_RING_WITHIN),
13
14
  children: [/* @__PURE__ */ jsx("input", {
14
15
  "aria-invalid": invalid,
15
16
  autoComplete,
@@ -20,7 +21,7 @@ const PasswordInput = ({ invalid = false, autoComplete = "current-password", sho
20
21
  ...rest
21
22
  }), /* @__PURE__ */ jsx("button", {
22
23
  "aria-label": isVisible ? hideLabel : showLabel,
23
- className: cn("me-2 inline-flex shrink-0 items-center justify-center rounded-md p-1 text-fg-mute transition-colors", "focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-border-info", !disabled && !pending && "hover:bg-bg-mute hover:text-fg-base", (disabled || pending) && "cursor-not-allowed text-fg-mute/70"),
24
+ className: cn("me-2 inline-flex shrink-0 items-center justify-center rounded-md p-1 text-fg-mute transition-colors", FOCUS_RING_NO_BORDER, !disabled && !pending && "hover:bg-bg-mute hover:text-fg-base", (disabled || pending) && "cursor-not-allowed text-fg-mute/70"),
24
25
  disabled: disabled || pending,
25
26
  onClick: toggleVisible,
26
27
  type: "button",
@@ -1,5 +1,5 @@
1
1
  import { Option } from "../../../types/variables.mjs";
2
- import { ChangeEventHandler, FC, HTMLAttributes } from "react";
2
+ import { ChangeEvent, FC, HTMLAttributes } from "react";
3
3
 
4
4
  //#region src/components/form/radio/radio.d.ts
5
5
  type BaseProps = {
@@ -10,13 +10,13 @@ type BaseProps = {
10
10
  } & Omit<HTMLAttributes<HTMLDivElement>, 'role' | 'className' | 'style' | 'children' | 'aria-labelledby' | 'onChange'>;
11
11
  type ControlledProps = {
12
12
  value: string;
13
- onChange: ChangeEventHandler<HTMLInputElement>;
13
+ onChange: (value: string, event: ChangeEvent<HTMLInputElement>) => void;
14
14
  defaultValue?: never;
15
15
  };
16
16
  type UncontrolledProps = {
17
17
  defaultValue?: string;
18
18
  value?: never;
19
- onChange?: ChangeEventHandler<HTMLInputElement>;
19
+ onChange?: (value: string, event: ChangeEvent<HTMLInputElement>) => void;
20
20
  };
21
21
  type Props = BaseProps & (ControlledProps | UncontrolledProps);
22
22
  declare const Radio: FC<Props>;
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import { FOCUS_RING_PEER } from "../../_internal/focus-ring.mjs";
2
3
  import { cn } from "../../../helpers/cn.mjs";
3
4
  import { useControllableState } from "../../../hooks/controllable-state/index.mjs";
4
5
  import { useFormStatus } from "react-dom";
@@ -12,9 +13,9 @@ const Radio = ({ "aria-labelledby": labelledbyId, name, disabled = false, value,
12
13
  const { pending } = useFormStatus();
13
14
  const isControlled = value !== void 0;
14
15
  const disabledResolved = disabled || pending;
15
- const selectValue = (nextValue) => {
16
+ const selectValue = (nextValue, event) => {
16
17
  setSelectedValue(nextValue);
17
- onChange?.({ target: { value: nextValue } });
18
+ onChange?.(nextValue, event);
18
19
  };
19
20
  return /* @__PURE__ */ jsx("div", {
20
21
  ...rest,
@@ -29,15 +30,15 @@ const Radio = ({ "aria-labelledby": labelledbyId, name, disabled = false, value,
29
30
  className: "peer sr-only",
30
31
  disabled: disabledResolved,
31
32
  name: name ?? labelledbyId,
32
- onChange: () => {
33
- selectValue(option.value);
33
+ onChange: (event) => {
34
+ selectValue(option.value, event);
34
35
  },
35
36
  type: "radio",
36
37
  value: option.value
37
38
  }),
38
39
  /* @__PURE__ */ jsx("span", {
39
40
  "aria-hidden": true,
40
- className: cn("inline-flex size-5 items-center justify-center rounded-full border-2 transition-colors", "peer-focus-visible:border-transparent peer-focus-visible:outline-hidden peer-focus-visible:ring-2 peer-focus-visible:ring-border-info", selectedValue === option.value ? "border-border-base bg-primary-bg" : "border-border-mute bg-bg-base", disabledResolved && "border-border-mute bg-bg-mute"),
41
+ className: cn("inline-flex size-5 items-center justify-center rounded-full border-2 transition-colors", FOCUS_RING_PEER, selectedValue === option.value ? "border-border-base bg-primary-bg" : "border-border-mute bg-bg-base", disabledResolved && "border-border-mute bg-bg-mute"),
41
42
  children: /* @__PURE__ */ jsx("span", { className: cn("size-2 rounded-full transition-opacity", selectedValue === option.value ? "bg-primary-border opacity-100" : "bg-transparent opacity-0") })
42
43
  }),
43
44
  /* @__PURE__ */ jsx("span", { children: option.label })
@@ -1,4 +1,4 @@
1
- import { ChangeEventHandler, FC, FieldsetHTMLAttributes, ReactNode } from "react";
1
+ import { FC, FieldsetHTMLAttributes, ReactNode } from "react";
2
2
 
3
3
  //#region src/components/form/radio-card/radio-card.d.ts
4
4
  type RadioCardOption = Readonly<{
@@ -15,13 +15,13 @@ type BaseProps = {
15
15
  } & Omit<FieldsetHTMLAttributes<HTMLFieldSetElement>, 'className' | 'style' | 'children' | 'onChange' | 'defaultValue' | 'aria-labelledby'>;
16
16
  type ControlledProps = {
17
17
  value: string;
18
- onChange: ChangeEventHandler<HTMLInputElement>;
18
+ onChange: (value: string) => void;
19
19
  defaultValue?: never;
20
20
  };
21
21
  type UncontrolledProps = {
22
22
  defaultValue?: string;
23
23
  value?: never;
24
- onChange?: ChangeEventHandler<HTMLInputElement>;
24
+ onChange?: (value: string) => void;
25
25
  };
26
26
  type Props = BaseProps & (ControlledProps | UncontrolledProps);
27
27
  declare const RadioCard: FC<Props>;
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import { FOCUS_RING_NO_BORDER } from "../../_internal/focus-ring.mjs";
2
3
  import { cn } from "../../../helpers/cn.mjs";
3
4
  import { useControllableState } from "../../../hooks/controllable-state/index.mjs";
4
5
  import { useId, useRef } from "react";
@@ -13,7 +14,7 @@ const RadioCard = ({ "aria-labelledby": labelledbyId, name, disabled = false, in
13
14
  });
14
15
  const selectValue = (nextValue) => {
15
16
  setCurrentValue(nextValue);
16
- onChange?.({ target: { value: nextValue } });
17
+ onChange?.(nextValue);
17
18
  };
18
19
  const focusIndex = (index) => {
19
20
  buttonRefs.current[index]?.focus();
@@ -41,7 +42,7 @@ const RadioCard = ({ "aria-labelledby": labelledbyId, name, disabled = false, in
41
42
  return /* @__PURE__ */ jsxs("button", {
42
43
  "aria-describedby": hasDescription ? `${optionId}-description` : void 0,
43
44
  "aria-pressed": checked,
44
- className: cn("flex min-w-0 rounded-xl border bg-bg-base p-4 text-left transition-colors inline-full", "focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-border-info", checked && "border-primary-border bg-primary-bg-subtle hover:bg-primary-bg-mute", invalid ? "border-border-error" : !checked && "border-border-mute hover:bg-bg-subtle", optionDisabled && "cursor-not-allowed border-border-mute bg-bg-subtle text-fg-mute"),
45
+ className: cn("flex min-w-0 rounded-xl border bg-bg-base p-4 text-left transition-colors inline-full", FOCUS_RING_NO_BORDER, checked && "border-primary-border bg-primary-bg-subtle hover:bg-primary-bg-mute", invalid ? "border-border-error" : !checked && "border-border-mute hover:bg-bg-subtle", optionDisabled && "cursor-not-allowed border-border-mute bg-bg-subtle text-fg-mute"),
45
46
  disabled: optionDisabled,
46
47
  id: optionId,
47
48
  onClick: () => {
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import { FOCUS_RING_WITHIN } from "../../_internal/focus-ring.mjs";
2
3
  import { cn } from "../../../helpers/cn.mjs";
3
4
  import { ChevronIcon } from "../../icons/lucide.mjs";
4
5
  import { useFormStatus } from "react-dom";
@@ -7,7 +8,7 @@ import { jsx, jsxs } from "react/jsx-runtime";
7
8
  const Select = ({ invalid = false, options, disabled = false, ...rest }) => {
8
9
  const { pending } = useFormStatus();
9
10
  return /* @__PURE__ */ jsxs("div", {
10
- className: cn("relative flex h-fit w-full items-center rounded-xl border border-border-base bg-bg-base vertical:h-full vertical:w-fit", invalid && "border-border-error", (disabled || pending) && "cursor-not-allowed border-border-mute bg-bg-mute", "focus-within:border-transparent focus-within:outline-hidden focus-within:ring-2 focus-within:ring-border-info"),
11
+ className: cn("relative flex h-fit w-full items-center rounded-xl border border-border-base bg-bg-base vertical:h-full vertical:w-fit", invalid && "border-border-error", (disabled || pending) && "cursor-not-allowed border-border-mute bg-bg-mute", FOCUS_RING_WITHIN),
11
12
  children: [/* @__PURE__ */ jsx("select", {
12
13
  "aria-invalid": invalid,
13
14
  className: cn("w-full grow appearance-none bg-transparent px-3 py-2 text-fg-base focus-visible:outline-hidden vertical:h-full vertical:w-auto", "disabled:cursor-not-allowed"),
@@ -23,7 +23,7 @@ const Slider = ({ invalid = false, disabled = false, required = false, value, de
23
23
  className: "bg-bg-mute relative rounded-full block-2 inline-full",
24
24
  children: /* @__PURE__ */ jsx("span", {
25
25
  "aria-hidden": true,
26
- className: cn("bg-primary-bg absolute start-0 inset-be-0 block-full inline-(--slider-progress) rounded-full", invalid && "bg-bg-error")
26
+ className: cn("bg-primary-bg absolute inset-s-0 inset-be-0 block-full inline-(--slider-progress) rounded-full", invalid && "bg-bg-error")
27
27
  })
28
28
  }), /* @__PURE__ */ jsx("input", {
29
29
  ...rest,
@@ -1,4 +1,4 @@
1
- import { ChangeEventHandler, FC, InputHTMLAttributes } from "react";
1
+ import { ChangeEvent, FC, InputHTMLAttributes } from "react";
2
2
 
3
3
  //#region src/components/form/switch/switch.d.ts
4
4
  type BaseProps = {
@@ -7,13 +7,13 @@ type BaseProps = {
7
7
  } & Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'role' | 'className' | 'style' | 'value' | 'onChange' | 'defaultChecked' | 'checked' | 'children'>;
8
8
  type ControlledProps = {
9
9
  value: boolean;
10
- onChange: ChangeEventHandler<HTMLInputElement>;
10
+ onChange: (checked: boolean, event: ChangeEvent<HTMLInputElement>) => void;
11
11
  defaultChecked?: never;
12
12
  };
13
13
  type UncontrolledProps = {
14
14
  defaultChecked?: boolean;
15
15
  value?: never;
16
- onChange?: ChangeEventHandler<HTMLInputElement>;
16
+ onChange?: (checked: boolean, event: ChangeEvent<HTMLInputElement>) => void;
17
17
  };
18
18
  type Props = BaseProps & (ControlledProps | UncontrolledProps);
19
19
  declare const Switch: FC<Props>;
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import { FOCUS_RING_PEER_NO_BORDER } from "../../_internal/focus-ring.mjs";
2
3
  import { cn } from "../../../helpers/cn.mjs";
3
4
  import { useControllableState } from "../../../hooks/controllable-state/index.mjs";
4
5
  import { useId } from "react";
@@ -31,14 +32,14 @@ const Switch = ({ value, defaultChecked, id, disabled = false, invalid = false,
31
32
  id: inputId,
32
33
  onChange: (event) => {
33
34
  setSelected(event.target.checked);
34
- onChange?.(event);
35
+ onChange?.(event.target.checked, event);
35
36
  },
36
37
  required,
37
38
  role: "switch",
38
39
  type: "checkbox"
39
40
  }), /* @__PURE__ */ jsx("span", {
40
41
  "aria-hidden": true,
41
- className: cn("inline-flex items-center rounded-full transition-colors", "h-7 w-12 vertical:h-12 vertical:w-7", invalid && "ring-2 ring-border-error", isSelected ? "bg-primary-bg" : "bg-bg-mute", disabledResolved && "bg-bg-subtle", "peer-focus-visible:outline-hidden peer-focus-visible:ring-2 peer-focus-visible:ring-border-info peer-focus-visible:ring-offset-2"),
42
+ className: cn("inline-flex items-center rounded-full transition-colors", "h-7 w-12 vertical:h-12 vertical:w-7", invalid && "ring-2 ring-border-error", isSelected ? "bg-primary-bg" : "bg-bg-mute", disabledResolved && "bg-bg-subtle", FOCUS_RING_PEER_NO_BORDER, "peer-focus-visible:ring-offset-2"),
42
43
  children: /* @__PURE__ */ jsx("span", { className: cn("ms-0.5 size-5 rounded-full bg-bg-base shadow-xs transition-transform", isSelected && "translate-x-5 vertical:translate-x-0 vertical:translate-y-5", disabledResolved && "bg-bg-emphasize") })
43
44
  })]
44
45
  }), label ? /* @__PURE__ */ jsx("span", { children: label }) : null]
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import { FOCUS_RING } from "../../_internal/focus-ring.mjs";
2
3
  import { cn } from "../../../helpers/cn.mjs";
3
4
  import { useFormStatus } from "react-dom";
4
5
  import { jsx } from "react/jsx-runtime";
@@ -7,7 +8,7 @@ const TextField = ({ invalid = false, readOnly, ...rest }) => {
7
8
  const { pending } = useFormStatus();
8
9
  return /* @__PURE__ */ jsx("input", {
9
10
  "aria-invalid": invalid,
10
- className: cn("rounded-xl border border-border-base bg-bg-base px-3 py-2 inline-full", "aria-invalid:border-border-error", "disabled:cursor-not-allowed disabled:border-border-mute disabled:bg-bg-mute hover:disabled:bg-bg-mute", "read-only:cursor-not-allowed read-only:bg-bg-subtle", "focus-visible:border-transparent focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-border-info"),
11
+ className: cn("rounded-xl border border-border-base bg-bg-base px-3 py-2 inline-full", "aria-invalid:border-border-error", "disabled:cursor-not-allowed disabled:border-border-mute disabled:bg-bg-mute hover:disabled:bg-bg-mute", "read-only:cursor-not-allowed read-only:bg-bg-subtle", FOCUS_RING),
11
12
  readOnly: pending || readOnly,
12
13
  type: "text",
13
14
  ...rest
@@ -1,4 +1,5 @@
1
1
  "use client";
2
+ import { FOCUS_RING } from "../../_internal/focus-ring.mjs";
2
3
  import { cn } from "../../../helpers/cn.mjs";
3
4
  import { useEffect, useRef } from "react";
4
5
  import { useFormStatus } from "react-dom";
@@ -16,7 +17,7 @@ const Textarea = ({ invalid = false, fullHeight = false, autoResize = false, rea
16
17
  }, [autoResize, value]);
17
18
  return /* @__PURE__ */ jsx("textarea", {
18
19
  "aria-invalid": invalid,
19
- className: cn("resize-none rounded-xl border border-border-base bg-bg-base px-3 py-2 inline-full", "aria-invalid:border-border-error", "disabled:cursor-not-allowed disabled:border-border-mute disabled:bg-bg-mute hover:disabled:bg-bg-mute", "read-only:cursor-not-allowed read-only:bg-bg-subtle", "focus-visible:border-transparent focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-border-info", fullHeight && "h-full"),
20
+ className: cn("resize-none rounded-xl border border-border-base bg-bg-base px-3 py-2 inline-full", "aria-invalid:border-border-error", "disabled:cursor-not-allowed disabled:border-border-mute disabled:bg-bg-mute hover:disabled:bg-bg-mute", "read-only:cursor-not-allowed read-only:bg-bg-subtle", FOCUS_RING, fullHeight && "h-full"),
20
21
  onInput: (e) => {
21
22
  if (autoResize) resizeToContent(e.currentTarget);
22
23
  onInput?.(e);
@@ -39,8 +39,10 @@ import { AIIcon, AccessibilityIcon, AlertIcon, AtomIcon, BadIcon, BlogIcon, Bori
39
39
  import { QiitaIcon } from "./icons/qiita.mjs";
40
40
  import { TwitterIcon } from "./icons/twitter.mjs";
41
41
  import { VerticalWritingIcon } from "./icons/vertical-writing.mjs";
42
+ import { Grid, GridProps } from "./layout/grid/grid.mjs";
42
43
  import { ScrollLinked } from "./layout/scroll-linked/scroll-linked.mjs";
43
44
  import { Separator } from "./layout/separator/separator.mjs";
45
+ import { Stack, StackProps } from "./layout/stack/stack.mjs";
44
46
  import { Anchor } from "./navigation/anchor/anchor.mjs";
45
47
  import { Breadcrumb } from "./navigation/breadcrumb/breadcrumb.mjs";
46
48
  import { Pagination } from "./navigation/pagination/pagination.mjs";
@@ -54,4 +56,4 @@ import { useOpenContext } from "./overlays/popover/hooks.mjs";
54
56
  import { Popover } from "./overlays/popover/popover.mjs";
55
57
  import { ArteOdysseyProvider } from "./providers/arte-odyssey-provider.mjs";
56
58
  import { PortalRootProvider, usePortalRoot } from "./providers/portal-root.mjs";
57
- export { AIIcon, AccessibilityIcon, Accordion, Alert, AlertIcon, Anchor, ArteOdyssey, ArteOdysseyProvider, AtomIcon, Autocomplete, Avatar, BadIcon, Badge, BaselineStatus, BlogIcon, BoringIcon, Breadcrumb, Button, Card, CheckIcon, Checkbox, CheckboxCard, CheckboxGroup, ChevronIcon, CloseIcon, Code, ColorContrastIcon, ColorInfoIcon, CopyIcon, DarkModeIcon, Dialog, DifficultIcon, Drawer, DropdownMenu, EasyIcon, ExternalLinkIcon, FileField, Form, FormControl, FormIcon, GitHubIcon, GoodIcon, Heading, HistoryIcon, HorizontalWritingIcon, IconButton, InformativeIcon, InteractiveCard, InterestingIcon, LightModeIcon, LinkIcon, ListBox, ListIcon, LocationIcon, Logo, LogoIcon, MailIcon, MinusIcon, MixedColorIcon, Modal, NavigationMenuIcon, NewsIcon, NumberField, Pagination, PaletteIcon, PasswordInput, PlusIcon, Popover, PortalRootProvider, PrepareIcon, Progress, PublishDateIcon, QiitaIcon, RSSIcon, Radio, RadioCard, ScrollLinked, Select, SendIcon, Separator, ShallowIcon, ShieldCheckIcon, Skeleton, SlideIcon, Slider, SparklesIcon, Spinner, SubscribeIcon, Switch, Table, TableIcon, Tabs, TagIcon, TextField, Textarea, ToastProvider, Tooltip, TwitterIcon, UpdateDateIcon, VerticalWritingIcon, ViewIcon, ViewOffIcon, useOpenContext, usePortalRoot, useToast };
59
+ export { AIIcon, AccessibilityIcon, Accordion, Alert, AlertIcon, Anchor, ArteOdyssey, ArteOdysseyProvider, AtomIcon, Autocomplete, Avatar, BadIcon, Badge, BaselineStatus, BlogIcon, BoringIcon, Breadcrumb, Button, Card, CheckIcon, Checkbox, CheckboxCard, CheckboxGroup, ChevronIcon, CloseIcon, Code, ColorContrastIcon, ColorInfoIcon, CopyIcon, DarkModeIcon, Dialog, DifficultIcon, Drawer, DropdownMenu, EasyIcon, ExternalLinkIcon, FileField, Form, FormControl, FormIcon, GitHubIcon, GoodIcon, Grid, type GridProps, Heading, HistoryIcon, HorizontalWritingIcon, IconButton, InformativeIcon, InteractiveCard, InterestingIcon, LightModeIcon, LinkIcon, ListBox, ListIcon, LocationIcon, Logo, LogoIcon, MailIcon, MinusIcon, MixedColorIcon, Modal, NavigationMenuIcon, NewsIcon, NumberField, Pagination, PaletteIcon, PasswordInput, PlusIcon, Popover, PortalRootProvider, PrepareIcon, Progress, PublishDateIcon, QiitaIcon, RSSIcon, Radio, RadioCard, ScrollLinked, Select, SendIcon, Separator, ShallowIcon, ShieldCheckIcon, Skeleton, SlideIcon, Slider, SparklesIcon, Spinner, Stack, type StackProps, SubscribeIcon, Switch, Table, TableIcon, Tabs, TagIcon, TextField, Textarea, ToastProvider, Tooltip, TwitterIcon, UpdateDateIcon, VerticalWritingIcon, ViewIcon, ViewOffIcon, useOpenContext, usePortalRoot, useToast };
@@ -43,8 +43,10 @@ import { Slider } from "./form/slider/slider.mjs";
43
43
  import { Switch } from "./form/switch/switch.mjs";
44
44
  import { TextField } from "./form/text-field/text-field.mjs";
45
45
  import { Textarea } from "./form/textarea/textarea.mjs";
46
+ import { Grid } from "./layout/grid/grid.mjs";
46
47
  import { ScrollLinked } from "./layout/scroll-linked/scroll-linked.mjs";
47
48
  import { Separator } from "./layout/separator/separator.mjs";
49
+ import { Stack } from "./layout/stack/stack.mjs";
48
50
  import { Anchor } from "./navigation/anchor/anchor.mjs";
49
51
  import { Breadcrumb } from "./navigation/breadcrumb/breadcrumb.mjs";
50
52
  import { Pagination } from "./navigation/pagination/pagination.mjs";
@@ -54,4 +56,4 @@ import { Modal } from "./overlays/modal/modal.mjs";
54
56
  import { Drawer } from "./overlays/drawer/drawer.mjs";
55
57
  import { DropdownMenu } from "./overlays/dropdown-menu/dropdown-menu.mjs";
56
58
  import { ListBox } from "./overlays/list-box/list-box.mjs";
57
- export { AIIcon, AccessibilityIcon, Accordion, Alert, AlertIcon, Anchor, ArteOdyssey, ArteOdysseyProvider, AtomIcon, Autocomplete, Avatar, BadIcon, Badge, BaselineStatus, BlogIcon, BoringIcon, Breadcrumb, Button, Card, CheckIcon, Checkbox, CheckboxCard, CheckboxGroup, ChevronIcon, CloseIcon, Code, ColorContrastIcon, ColorInfoIcon, CopyIcon, DarkModeIcon, Dialog, DifficultIcon, Drawer, DropdownMenu, EasyIcon, ExternalLinkIcon, FileField, Form, FormControl, FormIcon, GitHubIcon, GoodIcon, Heading, HistoryIcon, HorizontalWritingIcon, IconButton, InformativeIcon, InteractiveCard, InterestingIcon, LightModeIcon, LinkIcon, ListBox, ListIcon, LocationIcon, Logo, LogoIcon, MailIcon, MinusIcon, MixedColorIcon, Modal, NavigationMenuIcon, NewsIcon, NumberField, Pagination, PaletteIcon, PasswordInput, PlusIcon, Popover, PortalRootProvider, PrepareIcon, Progress, PublishDateIcon, QiitaIcon, RSSIcon, Radio, RadioCard, ScrollLinked, Select, SendIcon, Separator, ShallowIcon, ShieldCheckIcon, Skeleton, SlideIcon, Slider, SparklesIcon, Spinner, SubscribeIcon, Switch, Table, TableIcon, Tabs, TagIcon, TextField, Textarea, ToastProvider, Tooltip, TwitterIcon, UpdateDateIcon, VerticalWritingIcon, ViewIcon, ViewOffIcon, useOpenContext, usePortalRoot, useToast };
59
+ export { AIIcon, AccessibilityIcon, Accordion, Alert, AlertIcon, Anchor, ArteOdyssey, ArteOdysseyProvider, AtomIcon, Autocomplete, Avatar, BadIcon, Badge, BaselineStatus, BlogIcon, BoringIcon, Breadcrumb, Button, Card, CheckIcon, Checkbox, CheckboxCard, CheckboxGroup, ChevronIcon, CloseIcon, Code, ColorContrastIcon, ColorInfoIcon, CopyIcon, DarkModeIcon, Dialog, DifficultIcon, Drawer, DropdownMenu, EasyIcon, ExternalLinkIcon, FileField, Form, FormControl, FormIcon, GitHubIcon, GoodIcon, Grid, Heading, HistoryIcon, HorizontalWritingIcon, IconButton, InformativeIcon, InteractiveCard, InterestingIcon, LightModeIcon, LinkIcon, ListBox, ListIcon, LocationIcon, Logo, LogoIcon, MailIcon, MinusIcon, MixedColorIcon, Modal, NavigationMenuIcon, NewsIcon, NumberField, Pagination, PaletteIcon, PasswordInput, PlusIcon, Popover, PortalRootProvider, PrepareIcon, Progress, PublishDateIcon, QiitaIcon, RSSIcon, Radio, RadioCard, ScrollLinked, Select, SendIcon, Separator, ShallowIcon, ShieldCheckIcon, Skeleton, SlideIcon, Slider, SparklesIcon, Spinner, Stack, SubscribeIcon, Switch, Table, TableIcon, Tabs, TagIcon, TextField, Textarea, ToastProvider, Tooltip, TwitterIcon, UpdateDateIcon, VerticalWritingIcon, ViewIcon, ViewOffIcon, useOpenContext, usePortalRoot, useToast };