@k8o/arte-odyssey 10.2.0 → 10.4.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 (54) hide show
  1. package/dist/components/buttons/icon-button/icon-button.d.mts +1 -1
  2. package/dist/components/buttons/icon-button/icon-button.mjs +1 -1
  3. package/dist/components/feedback/toast/toast.mjs +2 -2
  4. package/dist/components/form/autocomplete/autocomplete.mjs +20 -28
  5. package/dist/components/form/checkbox/checkbox.mjs +1 -1
  6. package/dist/components/form/checkbox-card/checkbox-card.mjs +1 -1
  7. package/dist/components/form/checkbox-group/index.d.mts +3 -3
  8. package/dist/components/form/file-field/file-field.mjs +1 -1
  9. package/dist/components/form/number-field/number-field.mjs +1 -1
  10. package/dist/components/icons/index.d.mts +2 -2
  11. package/dist/components/icons/index.mjs +2 -2
  12. package/dist/components/icons/lucide-deep.d.mts +9 -0
  13. package/dist/components/icons/lucide-imports.d.mts +62 -0
  14. package/dist/components/icons/lucide-imports.mjs +62 -0
  15. package/dist/components/icons/lucide.d.mts +5 -1
  16. package/dist/components/icons/lucide.mjs +18 -2
  17. package/dist/components/index.d.mts +2 -2
  18. package/dist/components/index.mjs +11 -11
  19. package/dist/components/navigation/tabs/tabs.mjs +1 -1
  20. package/dist/components/overlays/_internal/use-list-navigation.d.mts +40 -0
  21. package/dist/components/overlays/_internal/use-list-navigation.mjs +95 -0
  22. package/dist/components/overlays/dialog/dialog.mjs +1 -1
  23. package/dist/components/overlays/drawer/drawer.mjs +1 -1
  24. package/dist/components/overlays/dropdown-menu/dropdown-menu.d.mts +2 -1
  25. package/dist/components/overlays/dropdown-menu/dropdown-menu.mjs +39 -52
  26. package/dist/components/overlays/dropdown-menu/hooks.d.mts +14 -294
  27. package/dist/components/overlays/dropdown-menu/hooks.mjs +7 -18
  28. package/dist/components/overlays/list-box/hooks.d.mts +12 -292
  29. package/dist/components/overlays/list-box/hooks.mjs +7 -16
  30. package/dist/components/overlays/list-box/list-box.d.mts +1 -1
  31. package/dist/components/overlays/list-box/list-box.mjs +25 -32
  32. package/dist/components/overlays/popover/anchor-positioning.d.mts +26 -0
  33. package/dist/components/overlays/popover/anchor-positioning.mjs +44 -0
  34. package/dist/components/overlays/popover/hooks.d.mts +10 -13
  35. package/dist/components/overlays/popover/hooks.mjs +7 -14
  36. package/dist/components/overlays/popover/popover.d.mts +2 -3
  37. package/dist/components/overlays/popover/popover.mjs +31 -59
  38. package/dist/components/overlays/tooltip/tooltip.d.mts +1 -1
  39. package/dist/components/overlays/tooltip/tooltip.mjs +2 -23
  40. package/dist/helpers/index.mjs +2 -2
  41. package/dist/hooks/focus-trap/index.d.mts +19 -0
  42. package/dist/hooks/focus-trap/index.mjs +51 -0
  43. package/dist/hooks/index.mjs +4 -4
  44. package/dist/index.d.mts +3 -3
  45. package/dist/index.mjs +34 -34
  46. package/dist/integrations/_shared/renderers.mjs +6 -6
  47. package/dist/integrations/_shared/schemas.d.mts +31 -31
  48. package/dist/integrations/json-render/catalog.d.mts +25 -30
  49. package/dist/integrations/openui/form-views.d.mts +0 -9
  50. package/dist/integrations/openui/form-views.mjs +0 -9
  51. package/dist/styles/base.css +39 -1
  52. package/dist/styles/tokens.css +0 -1
  53. package/dist/types/variables.d.mts +6 -1
  54. package/package.json +4 -4
@@ -0,0 +1,95 @@
1
+ "use client";
2
+ import { useEffect, useRef } from "react";
3
+ //#region src/components/overlays/_internal/use-list-navigation.ts
4
+ const isVerticalWritingMode = (el) => {
5
+ const wm = getComputedStyle(el).writingMode;
6
+ return wm.startsWith("vertical") || wm.startsWith("sideways");
7
+ };
8
+ /**
9
+ * 矢印キーによる roving-tabindex のリストナビゲーション。
10
+ * floating-ui の useListNavigation / useInteractions / FloatingList / useListItem を置換する。
11
+ *
12
+ * コンテンツの書字方向に追従してキーを割り当てる:
13
+ * - 横書き: ↑=前 / ↓=次
14
+ * - 縦書き(vertical-rl, 項目は右→左に並ぶ): ←=次 / →=前(↑/↓ も保険として有効)
15
+ *
16
+ * roving-tabindex: アクティブな項目だけ tabIndex=0、他は -1。アクティブ変更時に
17
+ * その項目へフォーカスを移す。開いたら先頭(選択済みがあればそれ)をアクティブにする。
18
+ */
19
+ const useListNavigation = ({ open, activeIndex, setActiveIndex, selectedIndex = null, loop = true }) => {
20
+ const itemElementsRef = useRef([]);
21
+ useEffect(() => {
22
+ if (!open) {
23
+ setActiveIndex(null);
24
+ return;
25
+ }
26
+ setActiveIndex((prev) => prev ?? (selectedIndex !== null && selectedIndex >= 0 ? selectedIndex : 0));
27
+ }, [
28
+ open,
29
+ selectedIndex,
30
+ setActiveIndex
31
+ ]);
32
+ useEffect(() => {
33
+ if (open && activeIndex !== null) itemElementsRef.current[activeIndex]?.focus();
34
+ }, [open, activeIndex]);
35
+ const count = () => itemElementsRef.current.filter(Boolean).length;
36
+ const move = (delta) => {
37
+ const total = count();
38
+ if (total === 0) return;
39
+ setActiveIndex((prev) => {
40
+ const next = (prev ?? (delta === 1 ? -1 : total)) + delta;
41
+ if (loop) return (next + total) % total;
42
+ return Math.max(0, Math.min(total - 1, next));
43
+ });
44
+ };
45
+ const onKeyDown = (event) => {
46
+ const vertical = isVerticalWritingMode(event.currentTarget);
47
+ switch (event.key) {
48
+ case "ArrowDown":
49
+ event.preventDefault();
50
+ move(1);
51
+ break;
52
+ case "ArrowUp":
53
+ event.preventDefault();
54
+ move(-1);
55
+ break;
56
+ case "ArrowLeft":
57
+ if (vertical) {
58
+ event.preventDefault();
59
+ move(1);
60
+ }
61
+ break;
62
+ case "ArrowRight":
63
+ if (vertical) {
64
+ event.preventDefault();
65
+ move(-1);
66
+ }
67
+ break;
68
+ case "Home":
69
+ event.preventDefault();
70
+ setActiveIndex(count() > 0 ? 0 : null);
71
+ break;
72
+ case "End": {
73
+ const total = count();
74
+ event.preventDefault();
75
+ setActiveIndex(total > 0 ? total - 1 : null);
76
+ break;
77
+ }
78
+ default: break;
79
+ }
80
+ };
81
+ return {
82
+ getContentProps: () => ({ onKeyDown }),
83
+ getItemProps: (index) => ({
84
+ ref: (node) => {
85
+ itemElementsRef.current[index] = node;
86
+ },
87
+ tabIndex: activeIndex === index ? 0 : -1,
88
+ onFocus: () => {
89
+ setActiveIndex(index);
90
+ }
91
+ })
92
+ };
93
+ };
94
+ //#endregion
95
+ export { useListNavigation };
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { createSafeContext } from "../../../helpers/create-safe-context.mjs";
3
- import { CloseIcon } from "../../icons/lucide.mjs";
4
3
  import { IconButton } from "../../buttons/icon-button/icon-button.mjs";
4
+ import { CloseIcon } from "../../icons/lucide.mjs";
5
5
  import { Heading } from "../../data-display/heading/heading.mjs";
6
6
  import { useId, useMemo } from "react";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { cn } from "../../../helpers/cn.mjs";
3
- import { CloseIcon } from "../../icons/lucide.mjs";
4
3
  import { IconButton } from "../../buttons/icon-button/icon-button.mjs";
4
+ import { CloseIcon } from "../../icons/lucide.mjs";
5
5
  import { Heading } from "../../data-display/heading/heading.mjs";
6
6
  import { Modal } from "../modal/modal.mjs";
7
7
  import { useId, useRef } from "react";
@@ -1,6 +1,6 @@
1
1
  import { Button } from "../../buttons/button/button.mjs";
2
+ import { Placement } from "../../../types/variables.mjs";
2
3
  import { ComponentProps, FC, MouseEventHandler, PropsWithChildren, ReactNode } from "react";
3
- import { Placement } from "@floating-ui/react";
4
4
 
5
5
  //#region src/components/overlays/dropdown-menu/dropdown-menu.d.ts
6
6
  declare const DropdownMenu: {
@@ -13,6 +13,7 @@ declare const DropdownMenu: {
13
13
  readonly Item: FC<{
14
14
  onClick: MouseEventHandler;
15
15
  label: string;
16
+ index?: number;
16
17
  }>;
17
18
  readonly Trigger: FC<{
18
19
  text: string;
@@ -1,14 +1,14 @@
1
1
  "use client";
2
2
  import { cn } from "../../../helpers/cn.mjs";
3
3
  import { Button } from "../../buttons/button/button.mjs";
4
- import { ChevronIcon } from "../../icons/lucide.mjs";
5
- import { useFloatingUIContext } from "../popover/hooks.mjs";
4
+ import { useOpenContext } from "../popover/hooks.mjs";
6
5
  import { Popover } from "../popover/popover.mjs";
7
6
  import { IconButton } from "../../buttons/icon-button/icon-button.mjs";
8
- import { MenuContextProvider, useMenuContent, useMenuItem, useMenuTrigger } from "./hooks.mjs";
9
- import { useRef, useState } from "react";
7
+ import { ChevronIcon } from "../../icons/lucide.mjs";
8
+ import { useListNavigation } from "../_internal/use-list-navigation.mjs";
9
+ import { MenuContextProvider, useMenuContent, useMenuItem } from "./hooks.mjs";
10
+ import { Children, cloneElement, isValidElement, useState } from "react";
10
11
  import { jsx } from "react/jsx-runtime";
11
- import { FloatingList, useInteractions, useListNavigation } from "@floating-ui/react";
12
12
  //#region src/components/overlays/dropdown-menu/dropdown-menu.tsx
13
13
  const Root = ({ children, placement = "bottom-start" }) => /* @__PURE__ */ jsx(Popover.Root, {
14
14
  placement,
@@ -16,39 +16,32 @@ const Root = ({ children, placement = "bottom-start" }) => /* @__PURE__ */ jsx(P
16
16
  children: /* @__PURE__ */ jsx(MenuProvider, { children })
17
17
  });
18
18
  const MenuProvider = ({ children }) => {
19
+ const { isOpen } = useOpenContext();
19
20
  const [activeIndex, setActiveIndex] = useState(null);
20
- const itemElementsRef = useRef([]);
21
- const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions([useListNavigation(useFloatingUIContext(), {
22
- listRef: itemElementsRef,
23
- activeIndex,
24
- onNavigate: setActiveIndex,
25
- loop: true
26
- })]);
27
21
  return /* @__PURE__ */ jsx(MenuContextProvider, {
28
- value: {
22
+ value: useListNavigation({
23
+ open: isOpen,
29
24
  activeIndex,
30
- itemElementsRef,
31
- getTriggerProps: getReferenceProps,
32
- getContentProps: getFloatingProps,
33
- getItemProps
34
- },
25
+ setActiveIndex,
26
+ loop: true
27
+ }),
35
28
  children
36
29
  });
37
30
  };
38
31
  const Content = ({ children }) => {
39
- const { contentProps, itemElementsRef } = useMenuContent();
40
- return /* @__PURE__ */ jsx(FloatingList, {
41
- elementsRef: itemElementsRef,
42
- children: /* @__PURE__ */ jsx(Popover.Content, { renderItem: (props) => /* @__PURE__ */ jsx("div", {
43
- ...props,
44
- ...contentProps,
45
- className: "bg-bg-raised vertical:min-w-0 vertical:min-h-40 flex min-w-40 flex-col rounded-lg py-2 shadow-md",
46
- children
47
- }) })
48
- });
32
+ const { contentProps } = useMenuContent();
33
+ return /* @__PURE__ */ jsx(Popover.Content, { renderItem: (props) => /* @__PURE__ */ jsx("div", {
34
+ ...props,
35
+ ...contentProps,
36
+ className: "bg-bg-raised vertical:min-w-0 vertical:min-h-40 flex min-w-40 flex-col rounded-lg py-2 shadow-md",
37
+ children: Children.toArray(children).map((child, index) => isValidElement(child) ? cloneElement(child, { index }) : child)
38
+ }) });
49
39
  };
50
- const Item = ({ label, onClick }) => {
51
- const props = useMenuItem({ onClick });
40
+ const Item = ({ label, onClick, index = 0 }) => {
41
+ const props = useMenuItem({
42
+ onClick,
43
+ index
44
+ });
52
45
  return /* @__PURE__ */ jsx("button", {
53
46
  className: cn("w-full px-2 py-1 text-left transition-colors", "hover:bg-bg-subtle", "focus-visible:bg-bg-subtle focus-visible:outline-hidden"),
54
47
  type: "button",
@@ -56,28 +49,22 @@ const Item = ({ label, onClick }) => {
56
49
  children: label
57
50
  });
58
51
  };
59
- const Trigger = ({ text, size = "md", variant = "solid" }) => {
60
- const getTriggerProps = useMenuTrigger();
61
- return /* @__PURE__ */ jsx(Popover.Trigger, { renderItem: (props) => /* @__PURE__ */ jsx(Button, {
62
- ...getTriggerProps(props),
63
- color: "gray",
64
- endIcon: /* @__PURE__ */ jsx(ChevronIcon, { direction: "down" }),
65
- size,
66
- type: "button",
67
- variant,
68
- children: text
69
- }) });
70
- };
71
- const IconTrigger = ({ icon, label }) => {
72
- const getTriggerProps = useMenuTrigger();
73
- return /* @__PURE__ */ jsx(Popover.Trigger, { renderItem: (props) => /* @__PURE__ */ jsx(IconButton, {
74
- color: "base",
75
- label,
76
- tooltipDisabled: true,
77
- ...getTriggerProps(props),
78
- children: icon
79
- }) });
80
- };
52
+ const Trigger = ({ text, size = "md", variant = "solid" }) => /* @__PURE__ */ jsx(Popover.Trigger, { renderItem: (props) => /* @__PURE__ */ jsx(Button, {
53
+ ...props,
54
+ color: "gray",
55
+ endIcon: /* @__PURE__ */ jsx(ChevronIcon, { direction: "down" }),
56
+ size,
57
+ type: "button",
58
+ variant,
59
+ children: text
60
+ }) });
61
+ const IconTrigger = ({ icon, label }) => /* @__PURE__ */ jsx(Popover.Trigger, { renderItem: (props) => /* @__PURE__ */ jsx(IconButton, {
62
+ color: "base",
63
+ label,
64
+ tooltipDisabled: true,
65
+ ...props,
66
+ children: icon
67
+ }) });
81
68
  const DropdownMenu = {
82
69
  Root,
83
70
  Content,
@@ -1,305 +1,25 @@
1
- import { HTMLAttributes, HTMLProps, MouseEventHandler, RefObject } from "react";
1
+ import { ListNavigation } from "../_internal/use-list-navigation.mjs";
2
+ import { MouseEventHandler } from "react";
2
3
 
3
4
  //#region src/components/overlays/dropdown-menu/hooks.d.ts
4
- type MenuContext = {
5
- activeIndex: number | null;
6
- itemElementsRef: RefObject<Array<HTMLElement | null>>;
7
- getTriggerProps: (userProps?: HTMLProps<HTMLElement>) => Omit<HTMLAttributes<HTMLElement>, 'color'>;
8
- getContentProps: (userProps?: HTMLProps<HTMLElement>) => HTMLAttributes<HTMLElement>;
9
- getItemProps: (userProps?: Omit<HTMLProps<HTMLButtonElement>, 'selected' | 'active'>) => HTMLAttributes<HTMLElement>;
10
- };
11
- declare const MenuContextProvider: import("react").Context<MenuContext | null>, useMenuContext: () => MenuContext;
5
+ declare const MenuContextProvider: import("react").Context<ListNavigation | null>, useMenuContext: () => ListNavigation;
12
6
  declare const useMenuContent: () => {
13
- contentProps: HTMLAttributes<HTMLElement>;
14
- itemElementsRef: RefObject<(HTMLElement | null)[]>;
7
+ contentProps: {
8
+ onKeyDown: (event: import("react").KeyboardEvent<HTMLElement>) => void;
9
+ };
15
10
  };
16
11
  declare const useMenuItem: ({
17
- onClick
12
+ onClick,
13
+ index
18
14
  }: {
19
15
  onClick: MouseEventHandler;
16
+ index: number;
20
17
  }) => {
21
- defaultChecked?: boolean | undefined;
22
- defaultValue?: string | number | readonly string[] | undefined;
23
- suppressContentEditableWarning?: boolean | undefined;
24
- suppressHydrationWarning?: boolean | undefined;
25
- accessKey?: string | undefined;
26
- autoCapitalize?: "off" | "none" | "on" | "sentences" | "words" | "characters" | undefined | (string & {});
27
- autoFocus?: boolean | undefined;
28
- className?: string | undefined;
29
- contentEditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
30
- contextMenu?: string | undefined;
31
- dir?: string | undefined;
32
- draggable?: (boolean | "true" | "false") | undefined;
33
- enterKeyHint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
34
- hidden?: boolean | undefined;
35
- id?: string | undefined;
36
- lang?: string | undefined;
37
- nonce?: string | undefined;
38
- slot?: string | undefined;
39
- spellCheck?: (boolean | "true" | "false") | undefined;
40
- style?: import("react").CSSProperties | undefined;
41
- tabIndex: number;
42
- title?: string | undefined;
43
- translate?: "yes" | "no" | undefined;
44
- radioGroup?: string | undefined;
45
- role: string;
46
- about?: string | undefined;
47
- content?: string | undefined;
48
- datatype?: string | undefined;
49
- inlist?: any;
50
- prefix?: string | undefined;
51
- property?: string | undefined;
52
- rel?: string | undefined;
53
- resource?: string | undefined;
54
- rev?: string | undefined;
55
- typeof?: string | undefined;
56
- vocab?: string | undefined;
57
- autoCorrect?: string | undefined;
58
- autoSave?: string | undefined;
59
- color?: string | undefined;
60
- itemProp?: string | undefined;
61
- itemScope?: boolean | undefined;
62
- itemType?: string | undefined;
63
- itemID?: string | undefined;
64
- itemRef?: string | undefined;
65
- results?: number | undefined;
66
- security?: string | undefined;
67
- unselectable?: "on" | "off" | undefined;
68
- popover?: "" | "auto" | "manual" | "hint" | undefined;
69
- popoverTargetAction?: "toggle" | "show" | "hide" | undefined;
70
- popoverTarget?: string | undefined;
71
- inert?: boolean | undefined;
72
- inputMode?: "none" | "text" | "tel" | "url" | "email" | "numeric" | "decimal" | "search" | undefined;
73
- is?: string | undefined;
74
- exportparts?: string | undefined;
75
- part?: string | undefined;
76
- "aria-activedescendant"?: string | undefined;
77
- "aria-atomic"?: (boolean | "true" | "false") | undefined;
78
- "aria-autocomplete"?: "none" | "inline" | "list" | "both" | undefined;
79
- "aria-braillelabel"?: string | undefined;
80
- "aria-brailleroledescription"?: string | undefined;
81
- "aria-busy"?: (boolean | "true" | "false") | undefined;
82
- "aria-checked"?: boolean | "false" | "mixed" | "true" | undefined;
83
- "aria-colcount"?: number | undefined;
84
- "aria-colindex"?: number | undefined;
85
- "aria-colindextext"?: string | undefined;
86
- "aria-colspan"?: number | undefined;
87
- "aria-controls"?: string | undefined;
88
- "aria-current"?: boolean | "false" | "true" | "page" | "step" | "location" | "date" | "time" | undefined;
89
- "aria-describedby"?: string | undefined;
90
- "aria-description"?: string | undefined;
91
- "aria-details"?: string | undefined;
92
- "aria-disabled"?: (boolean | "true" | "false") | undefined;
93
- "aria-dropeffect"?: "none" | "copy" | "execute" | "link" | "move" | "popup" | undefined;
94
- "aria-errormessage"?: string | undefined;
95
- "aria-expanded"?: (boolean | "true" | "false") | undefined;
96
- "aria-flowto"?: string | undefined;
97
- "aria-grabbed"?: (boolean | "true" | "false") | undefined;
98
- "aria-haspopup"?: boolean | "false" | "true" | "menu" | "listbox" | "tree" | "grid" | "dialog" | undefined;
99
- "aria-hidden"?: (boolean | "true" | "false") | undefined;
100
- "aria-invalid"?: boolean | "false" | "true" | "grammar" | "spelling" | undefined;
101
- "aria-keyshortcuts"?: string | undefined;
102
- "aria-label"?: string | undefined;
103
- "aria-labelledby"?: string | undefined;
104
- "aria-level"?: number | undefined;
105
- "aria-live"?: "off" | "assertive" | "polite" | undefined;
106
- "aria-modal"?: (boolean | "true" | "false") | undefined;
107
- "aria-multiline"?: (boolean | "true" | "false") | undefined;
108
- "aria-multiselectable"?: (boolean | "true" | "false") | undefined;
109
- "aria-orientation"?: "horizontal" | "vertical" | undefined;
110
- "aria-owns"?: string | undefined;
111
- "aria-placeholder"?: string | undefined;
112
- "aria-posinset"?: number | undefined;
113
- "aria-pressed"?: boolean | "false" | "mixed" | "true" | undefined;
114
- "aria-readonly"?: (boolean | "true" | "false") | undefined;
115
- "aria-relevant"?: "additions" | "additions removals" | "additions text" | "all" | "removals" | "removals additions" | "removals text" | "text" | "text additions" | "text removals" | undefined;
116
- "aria-required"?: (boolean | "true" | "false") | undefined;
117
- "aria-roledescription"?: string | undefined;
118
- "aria-rowcount"?: number | undefined;
119
- "aria-rowindex"?: number | undefined;
120
- "aria-rowindextext"?: string | undefined;
121
- "aria-rowspan"?: number | undefined;
122
- "aria-selected"?: (boolean | "true" | "false") | undefined;
123
- "aria-setsize"?: number | undefined;
124
- "aria-sort"?: "none" | "ascending" | "descending" | "other" | undefined;
125
- "aria-valuemax"?: number | undefined;
126
- "aria-valuemin"?: number | undefined;
127
- "aria-valuenow"?: number | undefined;
128
- "aria-valuetext"?: string | undefined;
129
- children?: import("react").ReactNode | undefined;
130
- dangerouslySetInnerHTML?: {
131
- __html: string | TrustedHTML;
132
- } | undefined;
133
- onCopy?: import("react").ClipboardEventHandler<HTMLElement> | undefined;
134
- onCopyCapture?: import("react").ClipboardEventHandler<HTMLElement> | undefined;
135
- onCut?: import("react").ClipboardEventHandler<HTMLElement> | undefined;
136
- onCutCapture?: import("react").ClipboardEventHandler<HTMLElement> | undefined;
137
- onPaste?: import("react").ClipboardEventHandler<HTMLElement> | undefined;
138
- onPasteCapture?: import("react").ClipboardEventHandler<HTMLElement> | undefined;
139
- onCompositionEnd?: import("react").CompositionEventHandler<HTMLElement> | undefined;
140
- onCompositionEndCapture?: import("react").CompositionEventHandler<HTMLElement> | undefined;
141
- onCompositionStart?: import("react").CompositionEventHandler<HTMLElement> | undefined;
142
- onCompositionStartCapture?: import("react").CompositionEventHandler<HTMLElement> | undefined;
143
- onCompositionUpdate?: import("react").CompositionEventHandler<HTMLElement> | undefined;
144
- onCompositionUpdateCapture?: import("react").CompositionEventHandler<HTMLElement> | undefined;
145
- onFocus?: import("react").FocusEventHandler<HTMLElement> | undefined;
146
- onFocusCapture?: import("react").FocusEventHandler<HTMLElement> | undefined;
147
- onBlur?: import("react").FocusEventHandler<HTMLElement> | undefined;
148
- onBlurCapture?: import("react").FocusEventHandler<HTMLElement> | undefined;
149
- onChange?: import("react").ChangeEventHandler<HTMLElement, Element> | undefined;
150
- onChangeCapture?: import("react").ChangeEventHandler<HTMLElement, Element> | undefined;
151
- onBeforeInput?: import("react").InputEventHandler<HTMLElement> | undefined;
152
- onBeforeInputCapture?: import("react").InputEventHandler<HTMLElement> | undefined;
153
- onInput?: import("react").InputEventHandler<HTMLElement> | undefined;
154
- onInputCapture?: import("react").InputEventHandler<HTMLElement> | undefined;
155
- onReset?: import("react").ReactEventHandler<HTMLElement> | undefined;
156
- onResetCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
157
- onSubmit?: import("react").SubmitEventHandler<HTMLElement> | undefined;
158
- onSubmitCapture?: import("react").SubmitEventHandler<HTMLElement> | undefined;
159
- onInvalid?: import("react").ReactEventHandler<HTMLElement> | undefined;
160
- onInvalidCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
161
- onLoad?: import("react").ReactEventHandler<HTMLElement> | undefined;
162
- onLoadCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
163
- onError?: import("react").ReactEventHandler<HTMLElement> | undefined;
164
- onErrorCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
165
- onKeyDown?: import("react").KeyboardEventHandler<HTMLElement> | undefined;
166
- onKeyDownCapture?: import("react").KeyboardEventHandler<HTMLElement> | undefined;
167
- onKeyPress?: import("react").KeyboardEventHandler<HTMLElement> | undefined;
168
- onKeyPressCapture?: import("react").KeyboardEventHandler<HTMLElement> | undefined;
169
- onKeyUp?: import("react").KeyboardEventHandler<HTMLElement> | undefined;
170
- onKeyUpCapture?: import("react").KeyboardEventHandler<HTMLElement> | undefined;
171
- onAbort?: import("react").ReactEventHandler<HTMLElement> | undefined;
172
- onAbortCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
173
- onCanPlay?: import("react").ReactEventHandler<HTMLElement> | undefined;
174
- onCanPlayCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
175
- onCanPlayThrough?: import("react").ReactEventHandler<HTMLElement> | undefined;
176
- onCanPlayThroughCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
177
- onDurationChange?: import("react").ReactEventHandler<HTMLElement> | undefined;
178
- onDurationChangeCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
179
- onEmptied?: import("react").ReactEventHandler<HTMLElement> | undefined;
180
- onEmptiedCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
181
- onEncrypted?: import("react").ReactEventHandler<HTMLElement> | undefined;
182
- onEncryptedCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
183
- onEnded?: import("react").ReactEventHandler<HTMLElement> | undefined;
184
- onEndedCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
185
- onLoadedData?: import("react").ReactEventHandler<HTMLElement> | undefined;
186
- onLoadedDataCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
187
- onLoadedMetadata?: import("react").ReactEventHandler<HTMLElement> | undefined;
188
- onLoadedMetadataCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
189
- onLoadStart?: import("react").ReactEventHandler<HTMLElement> | undefined;
190
- onLoadStartCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
191
- onPause?: import("react").ReactEventHandler<HTMLElement> | undefined;
192
- onPauseCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
193
- onPlay?: import("react").ReactEventHandler<HTMLElement> | undefined;
194
- onPlayCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
195
- onPlaying?: import("react").ReactEventHandler<HTMLElement> | undefined;
196
- onPlayingCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
197
- onProgress?: import("react").ReactEventHandler<HTMLElement> | undefined;
198
- onProgressCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
199
- onRateChange?: import("react").ReactEventHandler<HTMLElement> | undefined;
200
- onRateChangeCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
201
- onSeeked?: import("react").ReactEventHandler<HTMLElement> | undefined;
202
- onSeekedCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
203
- onSeeking?: import("react").ReactEventHandler<HTMLElement> | undefined;
204
- onSeekingCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
205
- onStalled?: import("react").ReactEventHandler<HTMLElement> | undefined;
206
- onStalledCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
207
- onSuspend?: import("react").ReactEventHandler<HTMLElement> | undefined;
208
- onSuspendCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
209
- onTimeUpdate?: import("react").ReactEventHandler<HTMLElement> | undefined;
210
- onTimeUpdateCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
211
- onVolumeChange?: import("react").ReactEventHandler<HTMLElement> | undefined;
212
- onVolumeChangeCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
213
- onWaiting?: import("react").ReactEventHandler<HTMLElement> | undefined;
214
- onWaitingCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
215
- onAuxClick?: MouseEventHandler<HTMLElement> | undefined;
216
- onAuxClickCapture?: MouseEventHandler<HTMLElement> | undefined;
217
- onClick?: MouseEventHandler<HTMLElement> | undefined;
218
- onClickCapture?: MouseEventHandler<HTMLElement> | undefined;
219
- onContextMenu?: MouseEventHandler<HTMLElement> | undefined;
220
- onContextMenuCapture?: MouseEventHandler<HTMLElement> | undefined;
221
- onDoubleClick?: MouseEventHandler<HTMLElement> | undefined;
222
- onDoubleClickCapture?: MouseEventHandler<HTMLElement> | undefined;
223
- onDrag?: import("react").DragEventHandler<HTMLElement> | undefined;
224
- onDragCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
225
- onDragEnd?: import("react").DragEventHandler<HTMLElement> | undefined;
226
- onDragEndCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
227
- onDragEnter?: import("react").DragEventHandler<HTMLElement> | undefined;
228
- onDragEnterCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
229
- onDragExit?: import("react").DragEventHandler<HTMLElement> | undefined;
230
- onDragExitCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
231
- onDragLeave?: import("react").DragEventHandler<HTMLElement> | undefined;
232
- onDragLeaveCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
233
- onDragOver?: import("react").DragEventHandler<HTMLElement> | undefined;
234
- onDragOverCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
235
- onDragStart?: import("react").DragEventHandler<HTMLElement> | undefined;
236
- onDragStartCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
237
- onDrop?: import("react").DragEventHandler<HTMLElement> | undefined;
238
- onDropCapture?: import("react").DragEventHandler<HTMLElement> | undefined;
239
- onMouseDown?: MouseEventHandler<HTMLElement> | undefined;
240
- onMouseDownCapture?: MouseEventHandler<HTMLElement> | undefined;
241
- onMouseEnter?: MouseEventHandler<HTMLElement> | undefined;
242
- onMouseLeave?: MouseEventHandler<HTMLElement> | undefined;
243
- onMouseMove?: MouseEventHandler<HTMLElement> | undefined;
244
- onMouseMoveCapture?: MouseEventHandler<HTMLElement> | undefined;
245
- onMouseOut?: MouseEventHandler<HTMLElement> | undefined;
246
- onMouseOutCapture?: MouseEventHandler<HTMLElement> | undefined;
247
- onMouseOver?: MouseEventHandler<HTMLElement> | undefined;
248
- onMouseOverCapture?: MouseEventHandler<HTMLElement> | undefined;
249
- onMouseUp?: MouseEventHandler<HTMLElement> | undefined;
250
- onMouseUpCapture?: MouseEventHandler<HTMLElement> | undefined;
251
- onSelect?: import("react").ReactEventHandler<HTMLElement> | undefined;
252
- onSelectCapture?: import("react").ReactEventHandler<HTMLElement> | undefined;
253
- onTouchCancel?: import("react").TouchEventHandler<HTMLElement> | undefined;
254
- onTouchCancelCapture?: import("react").TouchEventHandler<HTMLElement> | undefined;
255
- onTouchEnd?: import("react").TouchEventHandler<HTMLElement> | undefined;
256
- onTouchEndCapture?: import("react").TouchEventHandler<HTMLElement> | undefined;
257
- onTouchMove?: import("react").TouchEventHandler<HTMLElement> | undefined;
258
- onTouchMoveCapture?: import("react").TouchEventHandler<HTMLElement> | undefined;
259
- onTouchStart?: import("react").TouchEventHandler<HTMLElement> | undefined;
260
- onTouchStartCapture?: import("react").TouchEventHandler<HTMLElement> | undefined;
261
- onPointerDown?: import("react").PointerEventHandler<HTMLElement> | undefined;
262
- onPointerDownCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
263
- onPointerMove?: import("react").PointerEventHandler<HTMLElement> | undefined;
264
- onPointerMoveCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
265
- onPointerUp?: import("react").PointerEventHandler<HTMLElement> | undefined;
266
- onPointerUpCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
267
- onPointerCancel?: import("react").PointerEventHandler<HTMLElement> | undefined;
268
- onPointerCancelCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
269
- onPointerEnter?: import("react").PointerEventHandler<HTMLElement> | undefined;
270
- onPointerLeave?: import("react").PointerEventHandler<HTMLElement> | undefined;
271
- onPointerOver?: import("react").PointerEventHandler<HTMLElement> | undefined;
272
- onPointerOverCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
273
- onPointerOut?: import("react").PointerEventHandler<HTMLElement> | undefined;
274
- onPointerOutCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
275
- onGotPointerCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
276
- onGotPointerCaptureCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
277
- onLostPointerCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
278
- onLostPointerCaptureCapture?: import("react").PointerEventHandler<HTMLElement> | undefined;
279
- onScroll?: import("react").UIEventHandler<HTMLElement> | undefined;
280
- onScrollCapture?: import("react").UIEventHandler<HTMLElement> | undefined;
281
- onScrollEnd?: import("react").UIEventHandler<HTMLElement> | undefined;
282
- onScrollEndCapture?: import("react").UIEventHandler<HTMLElement> | undefined;
283
- onWheel?: import("react").WheelEventHandler<HTMLElement> | undefined;
284
- onWheelCapture?: import("react").WheelEventHandler<HTMLElement> | undefined;
285
- onAnimationStart?: import("react").AnimationEventHandler<HTMLElement> | undefined;
286
- onAnimationStartCapture?: import("react").AnimationEventHandler<HTMLElement> | undefined;
287
- onAnimationEnd?: import("react").AnimationEventHandler<HTMLElement> | undefined;
288
- onAnimationEndCapture?: import("react").AnimationEventHandler<HTMLElement> | undefined;
289
- onAnimationIteration?: import("react").AnimationEventHandler<HTMLElement> | undefined;
290
- onAnimationIterationCapture?: import("react").AnimationEventHandler<HTMLElement> | undefined;
291
- onToggle?: import("react").ToggleEventHandler<HTMLElement> | undefined;
292
- onBeforeToggle?: import("react").ToggleEventHandler<HTMLElement> | undefined;
293
- onTransitionCancel?: import("react").TransitionEventHandler<HTMLElement> | undefined;
294
- onTransitionCancelCapture?: import("react").TransitionEventHandler<HTMLElement> | undefined;
295
- onTransitionEnd?: import("react").TransitionEventHandler<HTMLElement> | undefined;
296
- onTransitionEndCapture?: import("react").TransitionEventHandler<HTMLElement> | undefined;
297
- onTransitionRun?: import("react").TransitionEventHandler<HTMLElement> | undefined;
298
- onTransitionRunCapture?: import("react").TransitionEventHandler<HTMLElement> | undefined;
299
- onTransitionStart?: import("react").TransitionEventHandler<HTMLElement> | undefined;
300
- onTransitionStartCapture?: import("react").TransitionEventHandler<HTMLElement> | undefined;
18
+ onClick: (e: Parameters<MouseEventHandler>[0]) => void;
301
19
  ref: (node: HTMLElement | null) => void;
20
+ tabIndex: number;
21
+ onFocus: () => void;
22
+ role: "menuitem";
302
23
  };
303
- declare const useMenuTrigger: () => (userProps?: HTMLProps<HTMLElement>) => Omit<HTMLAttributes<HTMLElement>, "color">;
304
24
  //#endregion
305
- export { MenuContextProvider, useMenuContent, useMenuContext, useMenuItem, useMenuTrigger };
25
+ export { MenuContextProvider, useMenuContent, useMenuContext, useMenuItem };
@@ -2,39 +2,28 @@
2
2
  import { createSafeContext } from "../../../helpers/create-safe-context.mjs";
3
3
  import { useOpenContext } from "../popover/hooks.mjs";
4
4
  import { useMemo } from "react";
5
- import { useListItem } from "@floating-ui/react";
6
5
  //#region src/components/overlays/dropdown-menu/hooks.ts
7
6
  const [MenuContextProvider, useMenuContext] = createSafeContext("useMenuContext must be used within a DropdownMenu.Root");
8
7
  const useMenuContent = () => {
9
8
  const menu = useMenuContext();
10
- return useMemo(() => ({
11
- contentProps: menu.getContentProps(),
12
- itemElementsRef: menu.itemElementsRef
13
- }), [menu]);
9
+ return useMemo(() => ({ contentProps: menu.getContentProps() }), [menu]);
14
10
  };
15
- const useMenuItem = ({ onClick }) => {
11
+ const useMenuItem = ({ onClick, index }) => {
16
12
  const menu = useMenuContext();
17
13
  const { onClose } = useOpenContext();
18
- const item = useListItem();
19
14
  return useMemo(() => ({
20
- ref: item.ref,
21
15
  role: "menuitem",
22
- tabIndex: menu.activeIndex === item.index ? 0 : -1,
23
- ...menu.getItemProps({ onClick: (e) => {
16
+ ...menu.getItemProps(index),
17
+ onClick: (e) => {
24
18
  onClick(e);
25
19
  onClose();
26
- } })
20
+ }
27
21
  }), [
28
- item.index,
29
- item.ref,
22
+ index,
30
23
  menu,
31
24
  onClick,
32
25
  onClose
33
26
  ]);
34
27
  };
35
- const useMenuTrigger = () => {
36
- const menu = useMenuContext();
37
- return useMemo(() => menu.getTriggerProps, [menu]);
38
- };
39
28
  //#endregion
40
- export { MenuContextProvider, useMenuContent, useMenuContext, useMenuItem, useMenuTrigger };
29
+ export { MenuContextProvider, useMenuContent, useMenuContext, useMenuItem };