@a11y-core/react 0.1.0-alpha.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 (70) hide show
  1. package/README.md +252 -0
  2. package/dist/chunk-3WBTHTVK.js +41 -0
  3. package/dist/chunk-3WBTHTVK.js.map +1 -0
  4. package/dist/chunk-47MFBHV6.js +85 -0
  5. package/dist/chunk-47MFBHV6.js.map +1 -0
  6. package/dist/chunk-7A3IDIUB.cjs +89 -0
  7. package/dist/chunk-7A3IDIUB.cjs.map +1 -0
  8. package/dist/chunk-AZFZWGI6.cjs +383 -0
  9. package/dist/chunk-AZFZWGI6.cjs.map +1 -0
  10. package/dist/chunk-CTW5D77X.cjs +220 -0
  11. package/dist/chunk-CTW5D77X.cjs.map +1 -0
  12. package/dist/chunk-EY73HQNR.js +380 -0
  13. package/dist/chunk-EY73HQNR.js.map +1 -0
  14. package/dist/chunk-FJABCNFE.js +215 -0
  15. package/dist/chunk-FJABCNFE.js.map +1 -0
  16. package/dist/chunk-FTZ5KCOO.js +326 -0
  17. package/dist/chunk-FTZ5KCOO.js.map +1 -0
  18. package/dist/chunk-GS3H4T2O.cjs +106 -0
  19. package/dist/chunk-GS3H4T2O.cjs.map +1 -0
  20. package/dist/chunk-N6L4GLFC.cjs +45 -0
  21. package/dist/chunk-N6L4GLFC.cjs.map +1 -0
  22. package/dist/chunk-N774QCHE.js +234 -0
  23. package/dist/chunk-N774QCHE.js.map +1 -0
  24. package/dist/chunk-OSHIYZCZ.cjs +386 -0
  25. package/dist/chunk-OSHIYZCZ.cjs.map +1 -0
  26. package/dist/chunk-SRJSGDIA.js +373 -0
  27. package/dist/chunk-SRJSGDIA.js.map +1 -0
  28. package/dist/chunk-THB5U7YC.cjs +338 -0
  29. package/dist/chunk-THB5U7YC.cjs.map +1 -0
  30. package/dist/chunk-U6DUSMEA.js +99 -0
  31. package/dist/chunk-U6DUSMEA.js.map +1 -0
  32. package/dist/chunk-WDCYEMBO.cjs +245 -0
  33. package/dist/chunk-WDCYEMBO.cjs.map +1 -0
  34. package/dist/components/combobox/index.cjs +31 -0
  35. package/dist/components/combobox/index.cjs.map +1 -0
  36. package/dist/components/combobox/index.d.cts +55 -0
  37. package/dist/components/combobox/index.d.ts +55 -0
  38. package/dist/components/combobox/index.js +6 -0
  39. package/dist/components/combobox/index.js.map +1 -0
  40. package/dist/components/dialog/index.cjs +46 -0
  41. package/dist/components/dialog/index.cjs.map +1 -0
  42. package/dist/components/dialog/index.d.cts +84 -0
  43. package/dist/components/dialog/index.d.ts +84 -0
  44. package/dist/components/dialog/index.js +5 -0
  45. package/dist/components/dialog/index.js.map +1 -0
  46. package/dist/components/menu/index.cjs +46 -0
  47. package/dist/components/menu/index.cjs.map +1 -0
  48. package/dist/components/menu/index.d.cts +80 -0
  49. package/dist/components/menu/index.d.ts +80 -0
  50. package/dist/components/menu/index.js +5 -0
  51. package/dist/components/menu/index.js.map +1 -0
  52. package/dist/components/tabs/index.cjs +35 -0
  53. package/dist/components/tabs/index.cjs.map +1 -0
  54. package/dist/components/tabs/index.d.cts +65 -0
  55. package/dist/components/tabs/index.d.ts +65 -0
  56. package/dist/components/tabs/index.js +6 -0
  57. package/dist/components/tabs/index.js.map +1 -0
  58. package/dist/components/toast/index.cjs +24 -0
  59. package/dist/components/toast/index.cjs.map +1 -0
  60. package/dist/components/toast/index.d.cts +49 -0
  61. package/dist/components/toast/index.d.ts +49 -0
  62. package/dist/components/toast/index.js +3 -0
  63. package/dist/components/toast/index.js.map +1 -0
  64. package/dist/index.cjs +698 -0
  65. package/dist/index.cjs.map +1 -0
  66. package/dist/index.d.cts +402 -0
  67. package/dist/index.d.ts +402 -0
  68. package/dist/index.js +426 -0
  69. package/dist/index.js.map +1 -0
  70. package/package.json +89 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/combobox/combobox.tsx"],"names":["createComponentWarnings","createContext","useContext","useState","useId","useEffect","useCallback","useMemo","jsx","forwardRef","ComboboxInput","useAnnouncer","useKeyboard","jsxs","ComboboxListbox","useRef","useLayoutEffect","ComboboxOption"],"mappings":"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","file":"chunk-OSHIYZCZ.cjs","sourcesContent":["import React, {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useId } from '../../hooks/use-id';\nimport { useKeyboard } from '../../hooks/use-keyboard';\nimport { useAnnouncer } from '../../hooks/use-announcer';\nimport { createComponentWarnings } from '@a11y-core/core';\n\nconst warnings = createComponentWarnings('Combobox');\n\nexport interface ComboboxOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\ninterface ComboboxContextValue {\n inputValue: string;\n setInputValue: (value: string) => void;\n selectedValue: string | null;\n setSelectedValue: (value: string | null) => void;\n isOpen: boolean;\n setIsOpen: (open: boolean) => void;\n highlightedIndex: number;\n setHighlightedIndex: (index: number) => void;\n options: ComboboxOption[];\n filteredOptions: ComboboxOption[];\n inputId: string;\n listboxId: string;\n getOptionId: (index: number) => string;\n onSelect: (option: ComboboxOption) => void;\n}\n\nconst ComboboxContext = createContext<ComboboxContextValue | null>(null);\n\nfunction useComboboxContext(): ComboboxContextValue {\n const context = useContext(ComboboxContext);\n if (!context) {\n throw new Error(\n 'Combobox compound components must be used within a Combobox component'\n );\n }\n return context;\n}\n\nexport interface ComboboxProps {\n /** List of options */\n options: ComboboxOption[];\n /** Currently selected value */\n value?: string | null;\n /** Called when selection changes */\n onValueChange?: (value: string | null) => void;\n /** Called when input changes */\n onInputChange?: (value: string) => void;\n /** Default input value */\n defaultInputValue?: string;\n /** Whether the combobox is disabled */\n disabled?: boolean;\n /** Placeholder text */\n placeholder?: string;\n /** Custom filter function */\n filterFn?: (option: ComboboxOption, inputValue: string) => boolean;\n /** Accessible label */\n 'aria-label'?: string;\n /** ID of labelling element */\n 'aria-labelledby'?: string;\n children: React.ReactNode;\n}\n\nexport function Combobox({\n options,\n value: controlledValue,\n onValueChange,\n onInputChange,\n defaultInputValue = '',\n disabled = false,\n filterFn,\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n children,\n}: ComboboxProps) {\n const [inputValue, setInputValueState] = useState(defaultInputValue);\n const [selectedValue, setSelectedValueState] = useState<string | null>(\n controlledValue ?? null\n );\n const [isOpen, setIsOpen] = useState(false);\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n\n const inputId = useId('combobox-input');\n const listboxId = useId('combobox-listbox');\n const baseOptionId = useId('combobox-option');\n\n // Sync controlled value\n useEffect(() => {\n if (controlledValue !== undefined) {\n setSelectedValueState(controlledValue);\n // Update input value to match selected option\n const option = options.find((o) => o.value === controlledValue);\n if (option) {\n setInputValueState(option.label);\n }\n }\n }, [controlledValue, options]);\n\n const setInputValue = useCallback(\n (value: string) => {\n setInputValueState(value);\n onInputChange?.(value);\n },\n [onInputChange]\n );\n\n const setSelectedValue = useCallback(\n (value: string | null) => {\n if (controlledValue === undefined) {\n setSelectedValueState(value);\n }\n onValueChange?.(value);\n },\n [controlledValue, onValueChange]\n );\n\n const filteredOptions = useMemo(() => {\n if (!inputValue) return options;\n\n const defaultFilter = (opt: ComboboxOption, input: string) =>\n opt.label.toLowerCase().includes(input.toLowerCase());\n\n const filter = filterFn ?? defaultFilter;\n return options.filter((opt) => filter(opt, inputValue));\n }, [options, inputValue, filterFn]);\n\n const getOptionId = useCallback(\n (index: number) => `${baseOptionId}-${index}`,\n [baseOptionId]\n );\n\n const onSelect = useCallback(\n (option: ComboboxOption) => {\n setSelectedValue(option.value);\n setInputValue(option.label);\n setIsOpen(false);\n setHighlightedIndex(-1);\n },\n [setSelectedValue, setInputValue]\n );\n\n useEffect(() => {\n if (!ariaLabel && !ariaLabelledBy) {\n warnings.warning(\n 'Combobox has no accessible label.',\n 'Add aria-label or aria-labelledby prop.'\n );\n }\n }, [ariaLabel, ariaLabelledBy]);\n\n const contextValue: ComboboxContextValue = {\n inputValue,\n setInputValue,\n selectedValue,\n setSelectedValue,\n isOpen,\n setIsOpen,\n highlightedIndex,\n setHighlightedIndex,\n options,\n filteredOptions,\n inputId,\n listboxId,\n getOptionId,\n onSelect,\n };\n\n return (\n <ComboboxContext.Provider value={contextValue}>\n <div data-a11y-core-combobox data-disabled={disabled}>\n {children}\n </div>\n </ComboboxContext.Provider>\n );\n}\n\nexport interface ComboboxInputProps extends Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'value' | 'onChange'\n> {\n /** Show clear button */\n clearable?: boolean;\n}\n\nexport const ComboboxInput = forwardRef<HTMLInputElement, ComboboxInputProps>(\n function ComboboxInput(\n { clearable = false, onKeyDown, onFocus, onBlur, ...props },\n ref\n ) {\n const {\n inputValue,\n setInputValue,\n setSelectedValue,\n isOpen,\n setIsOpen,\n highlightedIndex,\n setHighlightedIndex,\n filteredOptions,\n inputId,\n listboxId,\n getOptionId,\n onSelect,\n } = useComboboxContext();\n const { announce } = useAnnouncer();\n\n const keyboardProps = useKeyboard(\n {\n ArrowDown: () => {\n if (!isOpen) {\n setIsOpen(true);\n setHighlightedIndex(0);\n } else {\n const nextIndex = (highlightedIndex + 1) % filteredOptions.length;\n setHighlightedIndex(nextIndex);\n }\n },\n ArrowUp: () => {\n if (!isOpen) {\n setIsOpen(true);\n setHighlightedIndex(filteredOptions.length - 1);\n } else {\n const prevIndex =\n (highlightedIndex - 1 + filteredOptions.length) %\n filteredOptions.length;\n setHighlightedIndex(prevIndex);\n }\n },\n Enter: () => {\n if (isOpen && highlightedIndex >= 0) {\n const option = filteredOptions[highlightedIndex];\n if (option && !option.disabled) {\n onSelect(option);\n announce(`${option.label} selected`);\n }\n }\n },\n Escape: () => {\n if (isOpen) {\n setIsOpen(false);\n setHighlightedIndex(-1);\n }\n },\n Tab: () => {\n // Tab should close the listbox and allow natural focus movement\n if (isOpen) {\n setIsOpen(false);\n setHighlightedIndex(-1);\n }\n // Return false to allow browser's default Tab behavior\n return false;\n },\n Home: () => {\n if (isOpen) {\n setHighlightedIndex(0);\n }\n },\n End: () => {\n if (isOpen) {\n setHighlightedIndex(filteredOptions.length - 1);\n }\n },\n },\n { preventDefault: true, stopPropagation: false }\n );\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown?.(event);\n if (!event.defaultPrevented) {\n keyboardProps.onKeyDown(event);\n }\n };\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const value = event.target.value;\n setInputValue(value);\n setIsOpen(true);\n setHighlightedIndex(0);\n\n if (value === '') {\n setSelectedValue(null);\n }\n };\n\n const handleFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n onFocus?.(event);\n setIsOpen(true);\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n onBlur?.(event);\n // Use setTimeout to allow clicks on options to register before closing\n // This delay allows option click events to fire before the listbox closes\n setTimeout(() => {\n // Only close if focus didn't move to the listbox itself\n // This handles cases where user clicks on an option\n setIsOpen(false);\n }, 150);\n };\n\n const handleClear = () => {\n setInputValue('');\n setSelectedValue(null);\n setIsOpen(false);\n };\n\n const activeDescendant =\n isOpen && highlightedIndex >= 0\n ? getOptionId(highlightedIndex)\n : undefined;\n\n return (\n <div data-a11y-core-combobox-input-wrapper>\n <input\n ref={ref}\n id={inputId}\n type=\"text\"\n role=\"combobox\"\n value={inputValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n aria-expanded={isOpen}\n aria-controls={listboxId}\n aria-activedescendant={activeDescendant}\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n autoComplete=\"off\"\n data-a11y-core-combobox-input\n {...props}\n />\n {clearable && inputValue && (\n <button\n type=\"button\"\n onClick={handleClear}\n aria-label=\"Clear selection\"\n tabIndex={-1}\n data-a11y-core-combobox-clear\n >\n ×\n </button>\n )}\n </div>\n );\n }\n);\n\nexport interface ComboboxListboxProps extends React.HTMLAttributes<HTMLUListElement> {\n /** Render when no options match */\n emptyMessage?: React.ReactNode;\n children?: React.ReactNode;\n}\n\nexport const ComboboxListbox = forwardRef<\n HTMLUListElement,\n ComboboxListboxProps\n>(function ComboboxListbox(\n { emptyMessage = 'No results found', children, style, ...props },\n forwardedRef\n) {\n const { isOpen, filteredOptions, listboxId, inputId } = useComboboxContext();\n const { announce } = useAnnouncer();\n const internalRef = useRef<HTMLUListElement | null>(null);\n const [position, setPosition] = useState<'bottom' | 'top'>('bottom');\n\n useEffect(() => {\n if (isOpen) {\n const count = filteredOptions.length;\n announce(\n count === 0\n ? 'No results'\n : `${count} result${count === 1 ? '' : 's'} available`\n );\n }\n }, [isOpen, filteredOptions.length, announce]);\n\n useLayoutEffect(() => {\n if (isOpen && internalRef.current) {\n const listbox = internalRef.current;\n const rect = listbox.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const spaceBelow = viewportHeight - rect.top;\n const spaceAbove = rect.top;\n const listboxHeight = Math.min(rect.height, 200); // max-height from CSS\n\n if (spaceBelow < listboxHeight + 50 && spaceAbove > spaceBelow) {\n setPosition('top');\n } else {\n setPosition('bottom');\n }\n }\n }, [isOpen]);\n\n const setRefs = useCallback(\n (node: HTMLUListElement | null) => {\n internalRef.current = node;\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else if (forwardedRef) {\n (\n forwardedRef as React.MutableRefObject<HTMLUListElement | null>\n ).current = node;\n }\n },\n [forwardedRef]\n );\n\n if (!isOpen) {\n return null;\n }\n\n const positionStyle: React.CSSProperties =\n position === 'top'\n ? { bottom: '100%', top: 'auto', marginBottom: '4px', marginTop: 0 }\n : {};\n\n return (\n <ul\n ref={setRefs}\n id={listboxId}\n role=\"listbox\"\n aria-labelledby={inputId}\n style={{ ...style, ...positionStyle }}\n data-a11y-core-combobox-listbox\n data-position={position}\n {...props}\n >\n {filteredOptions.length === 0 ? (\n <li role=\"presentation\" data-a11y-core-combobox-empty>\n {emptyMessage}\n </li>\n ) : (\n (children ??\n filteredOptions.map((option, index) => (\n <ComboboxOption key={option.value} option={option} index={index} />\n )))\n )}\n </ul>\n );\n});\n\nexport interface ComboboxOptionProps extends React.LiHTMLAttributes<HTMLLIElement> {\n option: ComboboxOption;\n index: number;\n}\n\nexport const ComboboxOption = forwardRef<HTMLLIElement, ComboboxOptionProps>(\n function ComboboxOption(\n { option, index, onClick, onMouseEnter, ...props },\n forwardedRef\n ) {\n const {\n selectedValue,\n highlightedIndex,\n setHighlightedIndex,\n getOptionId,\n onSelect,\n } = useComboboxContext();\n const internalRef = useRef<HTMLLIElement | null>(null);\n\n const isSelected = selectedValue === option.value;\n const isHighlighted = highlightedIndex === index;\n const optionId = getOptionId(index);\n\n useEffect(() => {\n if (isHighlighted && internalRef.current) {\n internalRef.current.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n }\n }, [isHighlighted]);\n\n const handleClick = (event: React.MouseEvent<HTMLLIElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented && !option.disabled) {\n onSelect(option);\n }\n };\n\n const handleMouseEnter = (event: React.MouseEvent<HTMLLIElement>) => {\n onMouseEnter?.(event);\n if (!option.disabled) {\n setHighlightedIndex(index);\n }\n };\n\n const setRefs = useCallback(\n (node: HTMLLIElement | null) => {\n internalRef.current = node;\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else if (forwardedRef) {\n (\n forwardedRef as React.MutableRefObject<HTMLLIElement | null>\n ).current = node;\n }\n },\n [forwardedRef]\n );\n\n return (\n <li\n ref={setRefs}\n id={optionId}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled}\n data-highlighted={isHighlighted}\n data-selected={isSelected}\n data-disabled={option.disabled}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n data-a11y-core-combobox-option\n {...props}\n >\n {option.label}\n </li>\n );\n }\n);\n\nexport const ComboboxCompound = Object.assign(Combobox, {\n Input: ComboboxInput,\n Listbox: ComboboxListbox,\n Option: ComboboxOption,\n});\n"]}
@@ -0,0 +1,373 @@
1
+ import { useKeyboard } from './chunk-U6DUSMEA.js';
2
+ import { useId } from './chunk-3WBTHTVK.js';
3
+ import { createContext, forwardRef, useRef, useEffect, useContext, useState, useCallback } from 'react';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ var ActionMenuContext = createContext(null);
7
+ function useActionMenuContext() {
8
+ const context = useContext(ActionMenuContext);
9
+ if (!context) {
10
+ throw new Error(
11
+ "ActionMenu compound components must be used within an ActionMenu component"
12
+ );
13
+ }
14
+ return context;
15
+ }
16
+ var ActionMenuProvider = ActionMenuContext.Provider;
17
+ function ActionMenu({
18
+ defaultOpen = false,
19
+ open: controlledOpen,
20
+ onOpenChange,
21
+ children,
22
+ unstyled = false
23
+ }) {
24
+ const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);
25
+ const isOpen = controlledOpen ?? uncontrolledOpen;
26
+ const [highlightedIndex, setHighlightedIndex] = useState(-1);
27
+ const itemsRef = useRef([]);
28
+ const onSelectRef = useRef(null);
29
+ const menuId = useId("action-menu");
30
+ const triggerId = useId("action-menu-trigger");
31
+ const setOpen = useCallback(
32
+ (value) => {
33
+ if (controlledOpen === void 0) {
34
+ setUncontrolledOpen(value);
35
+ }
36
+ onOpenChange?.(value);
37
+ if (!value) {
38
+ setHighlightedIndex(-1);
39
+ }
40
+ },
41
+ [controlledOpen, onOpenChange]
42
+ );
43
+ const open = useCallback(() => setOpen(true), [setOpen]);
44
+ const close = useCallback(() => setOpen(false), [setOpen]);
45
+ const toggle = useCallback(() => setOpen(!isOpen), [setOpen, isOpen]);
46
+ const registerItem = useCallback((id) => {
47
+ const index = itemsRef.current.length;
48
+ itemsRef.current.push(id);
49
+ return index;
50
+ }, []);
51
+ const unregisterItem = useCallback((id) => {
52
+ const index = itemsRef.current.indexOf(id);
53
+ if (index > -1) {
54
+ itemsRef.current.splice(index, 1);
55
+ }
56
+ }, []);
57
+ const getItemCount = useCallback(() => itemsRef.current.length, []);
58
+ const selectItem = useCallback(
59
+ (index) => {
60
+ onSelectRef.current?.(index);
61
+ close();
62
+ },
63
+ [close]
64
+ );
65
+ const contextValue = {
66
+ isOpen,
67
+ open,
68
+ close,
69
+ toggle,
70
+ highlightedIndex,
71
+ setHighlightedIndex,
72
+ menuId,
73
+ triggerId,
74
+ registerItem,
75
+ unregisterItem,
76
+ getItemCount,
77
+ selectItem,
78
+ unstyled
79
+ };
80
+ return /* @__PURE__ */ jsx(ActionMenuProvider, { value: contextValue, children: /* @__PURE__ */ jsx(
81
+ "div",
82
+ {
83
+ style: { position: "relative", display: "inline-block" },
84
+ "data-a11y-core-action-menu": true,
85
+ children
86
+ }
87
+ ) });
88
+ }
89
+ var ActionMenuTrigger = forwardRef(function ActionMenuTrigger2({ children, onClick, onKeyDown, ...props }, ref) {
90
+ const {
91
+ isOpen,
92
+ toggle,
93
+ open,
94
+ close,
95
+ triggerId,
96
+ menuId,
97
+ setHighlightedIndex,
98
+ getItemCount
99
+ } = useActionMenuContext();
100
+ const handleClick = (event) => {
101
+ onClick?.(event);
102
+ if (!event.defaultPrevented) {
103
+ toggle();
104
+ }
105
+ };
106
+ const keyboardProps = useKeyboard(
107
+ {
108
+ ArrowDown: () => {
109
+ if (!isOpen) {
110
+ open();
111
+ }
112
+ setHighlightedIndex(0);
113
+ },
114
+ ArrowUp: () => {
115
+ if (!isOpen) {
116
+ open();
117
+ }
118
+ setHighlightedIndex(getItemCount() - 1);
119
+ },
120
+ Enter: () => toggle(),
121
+ Space: () => toggle(),
122
+ Escape: () => close()
123
+ },
124
+ { preventDefault: true }
125
+ );
126
+ const handleKeyDown = (event) => {
127
+ onKeyDown?.(event);
128
+ if (!event.defaultPrevented) {
129
+ keyboardProps.onKeyDown(event);
130
+ }
131
+ };
132
+ return /* @__PURE__ */ jsx(
133
+ "button",
134
+ {
135
+ ref,
136
+ id: triggerId,
137
+ type: "button",
138
+ tabIndex: 0,
139
+ "aria-haspopup": "menu",
140
+ "aria-expanded": isOpen,
141
+ "aria-controls": isOpen ? menuId : void 0,
142
+ onClick: handleClick,
143
+ onKeyDown: handleKeyDown,
144
+ "data-a11y-core-action-menu-trigger": true,
145
+ ...props,
146
+ children
147
+ }
148
+ );
149
+ });
150
+ var ActionMenuContent = forwardRef(function ActionMenuContent2({ children, onKeyDown, style, ...props }, ref) {
151
+ const {
152
+ isOpen,
153
+ close,
154
+ menuId,
155
+ triggerId,
156
+ highlightedIndex,
157
+ setHighlightedIndex,
158
+ getItemCount,
159
+ unstyled
160
+ } = useActionMenuContext();
161
+ const menuRef = useRef(null);
162
+ const clickHighlightedItem = () => {
163
+ if (highlightedIndex >= 0 && menuRef.current) {
164
+ const items = menuRef.current.querySelectorAll('[role="menuitem"]');
165
+ const item = items[highlightedIndex];
166
+ if (item && item.getAttribute("aria-disabled") !== "true") {
167
+ item.click();
168
+ }
169
+ }
170
+ };
171
+ const keyboardProps = useKeyboard(
172
+ {
173
+ ArrowDown: () => {
174
+ const count = getItemCount();
175
+ setHighlightedIndex((highlightedIndex + 1) % count);
176
+ },
177
+ ArrowUp: () => {
178
+ const count = getItemCount();
179
+ setHighlightedIndex((highlightedIndex - 1 + count) % count);
180
+ },
181
+ Home: () => setHighlightedIndex(0),
182
+ End: () => setHighlightedIndex(getItemCount() - 1),
183
+ Enter: () => clickHighlightedItem(),
184
+ Space: () => clickHighlightedItem(),
185
+ Escape: () => close(),
186
+ Tab: () => {
187
+ close();
188
+ return false;
189
+ }
190
+ },
191
+ { preventDefault: true }
192
+ );
193
+ const handleKeyDown = (event) => {
194
+ onKeyDown?.(event);
195
+ if (!event.defaultPrevented) {
196
+ keyboardProps.onKeyDown(event);
197
+ }
198
+ };
199
+ useEffect(() => {
200
+ if (isOpen && menuRef.current) {
201
+ menuRef.current.focus();
202
+ }
203
+ }, [isOpen]);
204
+ useEffect(() => {
205
+ if (!isOpen) return;
206
+ const handleClick = (event) => {
207
+ const target = event.target;
208
+ const menu = menuRef.current;
209
+ const trigger = document.getElementById(triggerId);
210
+ if (menu && !menu.contains(target) && trigger && !trigger.contains(target)) {
211
+ close();
212
+ }
213
+ };
214
+ document.addEventListener("mousedown", handleClick);
215
+ return () => document.removeEventListener("mousedown", handleClick);
216
+ }, [isOpen, close, triggerId]);
217
+ if (!isOpen) {
218
+ return null;
219
+ }
220
+ const contentStructuralStyles = {
221
+ position: "absolute",
222
+ top: "100%",
223
+ left: 0,
224
+ marginTop: "4px",
225
+ zIndex: 1e3
226
+ };
227
+ const contentVisualStyles = unstyled ? {} : {
228
+ minWidth: "160px",
229
+ backgroundColor: "white",
230
+ border: "1px solid #e0e0e0",
231
+ borderRadius: "4px",
232
+ boxShadow: "0 4px 6px rgba(0, 0, 0, 0.1)",
233
+ padding: "4px 0"
234
+ };
235
+ const contentStyles = {
236
+ ...contentStructuralStyles,
237
+ ...contentVisualStyles
238
+ };
239
+ return /* @__PURE__ */ jsx(
240
+ "div",
241
+ {
242
+ ref: (node) => {
243
+ menuRef.current = node;
244
+ if (typeof ref === "function") {
245
+ ref(node);
246
+ } else if (ref) {
247
+ ref.current = node;
248
+ }
249
+ },
250
+ id: menuId,
251
+ role: "menu",
252
+ "aria-labelledby": triggerId,
253
+ tabIndex: -1,
254
+ onKeyDown: handleKeyDown,
255
+ style: { ...contentStyles, ...style },
256
+ "data-a11y-core-action-menu-content": true,
257
+ ...props,
258
+ children
259
+ }
260
+ );
261
+ });
262
+ var ActionMenuItem = forwardRef(
263
+ function ActionMenuItem2({
264
+ children,
265
+ disabled = false,
266
+ onSelect,
267
+ onClick,
268
+ onMouseEnter,
269
+ style,
270
+ ...props
271
+ }, ref) {
272
+ const {
273
+ registerItem,
274
+ unregisterItem,
275
+ highlightedIndex,
276
+ setHighlightedIndex,
277
+ close,
278
+ unstyled
279
+ } = useActionMenuContext();
280
+ const itemId = useId("action-menu-item");
281
+ const indexRef = useRef(-1);
282
+ useEffect(() => {
283
+ if (!disabled) {
284
+ indexRef.current = registerItem(itemId);
285
+ }
286
+ return () => {
287
+ if (!disabled) {
288
+ unregisterItem(itemId);
289
+ }
290
+ };
291
+ }, [itemId, disabled, registerItem, unregisterItem]);
292
+ const isHighlighted = indexRef.current === highlightedIndex;
293
+ const handleClick = (event) => {
294
+ onClick?.(event);
295
+ if (!event.defaultPrevented && !disabled) {
296
+ onSelect?.();
297
+ close();
298
+ }
299
+ };
300
+ const handleMouseEnter = (event) => {
301
+ onMouseEnter?.(event);
302
+ if (!disabled) {
303
+ setHighlightedIndex(indexRef.current);
304
+ }
305
+ };
306
+ const itemBehaviorStyles = {
307
+ cursor: disabled ? "not-allowed" : "pointer",
308
+ opacity: disabled ? 0.5 : 1
309
+ };
310
+ const itemVisualStyles = unstyled ? {} : {
311
+ padding: "8px 16px",
312
+ backgroundColor: isHighlighted ? "#f0f0f0" : "transparent"
313
+ };
314
+ const itemStyles = {
315
+ ...itemBehaviorStyles,
316
+ ...itemVisualStyles
317
+ };
318
+ return /* @__PURE__ */ jsx(
319
+ "div",
320
+ {
321
+ ref,
322
+ id: itemId,
323
+ role: "menuitem",
324
+ tabIndex: -1,
325
+ "aria-disabled": disabled,
326
+ "data-highlighted": isHighlighted,
327
+ "data-disabled": disabled,
328
+ onClick: handleClick,
329
+ onMouseEnter: handleMouseEnter,
330
+ style: { ...itemStyles, ...style },
331
+ "data-a11y-core-action-menu-item": true,
332
+ ...props,
333
+ children
334
+ }
335
+ );
336
+ }
337
+ );
338
+ var ActionMenuSeparator = forwardRef(function ActionMenuSeparator2(props, ref) {
339
+ return /* @__PURE__ */ jsx(
340
+ "div",
341
+ {
342
+ ref,
343
+ role: "separator",
344
+ "data-a11y-core-action-menu-separator": true,
345
+ ...props
346
+ }
347
+ );
348
+ });
349
+ var ActionMenuLabel = forwardRef(
350
+ function ActionMenuLabel2({ children, ...props }, ref) {
351
+ return /* @__PURE__ */ jsx(
352
+ "div",
353
+ {
354
+ ref,
355
+ role: "presentation",
356
+ "data-a11y-core-action-menu-label": true,
357
+ ...props,
358
+ children
359
+ }
360
+ );
361
+ }
362
+ );
363
+ var ActionMenuCompound = Object.assign(ActionMenu, {
364
+ Trigger: ActionMenuTrigger,
365
+ Content: ActionMenuContent,
366
+ Item: ActionMenuItem,
367
+ Separator: ActionMenuSeparator,
368
+ Label: ActionMenuLabel
369
+ });
370
+
371
+ export { ActionMenu, ActionMenuCompound, ActionMenuContent, ActionMenuItem, ActionMenuLabel, ActionMenuProvider, ActionMenuSeparator, ActionMenuTrigger, useActionMenuContext };
372
+ //# sourceMappingURL=chunk-SRJSGDIA.js.map
373
+ //# sourceMappingURL=chunk-SRJSGDIA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/menu/menu-context.ts","../src/components/menu/menu.tsx"],"names":["ActionMenuTrigger","ActionMenuContent","ActionMenuItem","ActionMenuSeparator","ActionMenuLabel"],"mappings":"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","file":"chunk-SRJSGDIA.js","sourcesContent":["import { createContext, useContext } from 'react';\n\nexport interface ActionMenuContextValue {\n /** Whether the menu is open */\n isOpen: boolean;\n /** Open the menu */\n open: () => void;\n /** Close the menu */\n close: () => void;\n /** Toggle the menu */\n toggle: () => void;\n /** Currently highlighted item index */\n highlightedIndex: number;\n /** Set highlighted item */\n setHighlightedIndex: (index: number) => void;\n /** ID for the menu element */\n menuId: string;\n /** ID for the trigger element */\n triggerId: string;\n /** Register a menu item */\n registerItem: (id: string) => number;\n /** Unregister a menu item */\n unregisterItem: (id: string) => void;\n /** Get item count */\n getItemCount: () => number;\n /** Select an item */\n selectItem: (index: number) => void;\n /** Whether default styles are disabled */\n unstyled: boolean;\n}\n\nconst ActionMenuContext = createContext<ActionMenuContextValue | null>(null);\n\nexport function useActionMenuContext(): ActionMenuContextValue {\n const context = useContext(ActionMenuContext);\n if (!context) {\n throw new Error(\n 'ActionMenu compound components must be used within an ActionMenu component'\n );\n }\n return context;\n}\n\nexport const ActionMenuProvider = ActionMenuContext.Provider;\n","import React, {\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { useId } from '../../hooks/use-id';\nimport { useKeyboard } from '../../hooks/use-keyboard';\nimport {\n ActionMenuProvider,\n useActionMenuContext,\n type ActionMenuContextValue,\n} from './menu-context';\n\n// ============================================================================\n// ActionMenu Root\n// ============================================================================\n\nexport interface ActionMenuProps {\n /** Whether the menu is initially open */\n defaultOpen?: boolean;\n /** Controlled open state */\n open?: boolean;\n /** Called when open state changes */\n onOpenChange?: (open: boolean) => void;\n /** Menu content */\n children: React.ReactNode;\n /** Remove default styles to allow full customization via className */\n unstyled?: boolean;\n}\n\nexport function ActionMenu({\n defaultOpen = false,\n open: controlledOpen,\n onOpenChange,\n children,\n unstyled = false,\n}: ActionMenuProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const isOpen = controlledOpen ?? uncontrolledOpen;\n\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n const itemsRef = useRef<string[]>([]);\n const onSelectRef = useRef<((index: number) => void) | null>(null);\n\n const menuId = useId('action-menu');\n const triggerId = useId('action-menu-trigger');\n\n const setOpen = useCallback(\n (value: boolean) => {\n if (controlledOpen === undefined) {\n setUncontrolledOpen(value);\n }\n onOpenChange?.(value);\n\n if (!value) {\n setHighlightedIndex(-1);\n }\n },\n [controlledOpen, onOpenChange]\n );\n\n const open = useCallback(() => setOpen(true), [setOpen]);\n const close = useCallback(() => setOpen(false), [setOpen]);\n const toggle = useCallback(() => setOpen(!isOpen), [setOpen, isOpen]);\n\n const registerItem = useCallback((id: string) => {\n const index = itemsRef.current.length;\n itemsRef.current.push(id);\n return index;\n }, []);\n\n const unregisterItem = useCallback((id: string) => {\n const index = itemsRef.current.indexOf(id);\n if (index > -1) {\n itemsRef.current.splice(index, 1);\n }\n }, []);\n\n const getItemCount = useCallback(() => itemsRef.current.length, []);\n\n const selectItem = useCallback(\n (index: number) => {\n onSelectRef.current?.(index);\n close();\n },\n [close]\n );\n\n const contextValue: ActionMenuContextValue = {\n isOpen,\n open,\n close,\n toggle,\n highlightedIndex,\n setHighlightedIndex,\n menuId,\n triggerId,\n registerItem,\n unregisterItem,\n getItemCount,\n selectItem,\n unstyled,\n };\n\n return (\n <ActionMenuProvider value={contextValue}>\n <div\n style={{ position: 'relative', display: 'inline-block' }}\n data-a11y-core-action-menu\n >\n {children}\n </div>\n </ActionMenuProvider>\n );\n}\n\nexport interface ActionMenuTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n children: React.ReactNode;\n}\n\nexport const ActionMenuTrigger = forwardRef<\n HTMLButtonElement,\n ActionMenuTriggerProps\n>(function ActionMenuTrigger({ children, onClick, onKeyDown, ...props }, ref) {\n const {\n isOpen,\n toggle,\n open,\n close,\n triggerId,\n menuId,\n setHighlightedIndex,\n getItemCount,\n } = useActionMenuContext();\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented) {\n toggle();\n }\n };\n\n const keyboardProps = useKeyboard(\n {\n ArrowDown: () => {\n if (!isOpen) {\n open();\n }\n setHighlightedIndex(0);\n },\n ArrowUp: () => {\n if (!isOpen) {\n open();\n }\n setHighlightedIndex(getItemCount() - 1);\n },\n Enter: () => toggle(),\n Space: () => toggle(),\n Escape: () => close(),\n },\n { preventDefault: true }\n );\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(event);\n if (!event.defaultPrevented) {\n keyboardProps.onKeyDown(event);\n }\n };\n\n return (\n <button\n ref={ref}\n id={triggerId}\n type=\"button\"\n // Safari fix: Ensure button is in tab order (Safari skips buttons by default)\n tabIndex={0}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? menuId : undefined}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n data-a11y-core-action-menu-trigger\n {...props}\n >\n {children}\n </button>\n );\n});\n\nexport interface ActionMenuContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport const ActionMenuContent = forwardRef<\n HTMLDivElement,\n ActionMenuContentProps\n>(function ActionMenuContent({ children, onKeyDown, style, ...props }, ref) {\n const {\n isOpen,\n close,\n menuId,\n triggerId,\n highlightedIndex,\n setHighlightedIndex,\n getItemCount,\n unstyled,\n } = useActionMenuContext();\n const menuRef = useRef<HTMLDivElement>(null);\n\n const clickHighlightedItem = () => {\n if (highlightedIndex >= 0 && menuRef.current) {\n const items = menuRef.current.querySelectorAll('[role=\"menuitem\"]');\n const item = items[highlightedIndex] as HTMLElement;\n if (item && item.getAttribute('aria-disabled') !== 'true') {\n item.click();\n }\n }\n };\n\n const keyboardProps = useKeyboard(\n {\n ArrowDown: () => {\n const count = getItemCount();\n setHighlightedIndex((highlightedIndex + 1) % count);\n },\n ArrowUp: () => {\n const count = getItemCount();\n setHighlightedIndex((highlightedIndex - 1 + count) % count);\n },\n Home: () => setHighlightedIndex(0),\n End: () => setHighlightedIndex(getItemCount() - 1),\n Enter: () => clickHighlightedItem(),\n Space: () => clickHighlightedItem(),\n Escape: () => close(),\n Tab: () => {\n close();\n return false; // Allow default tab behavior\n },\n },\n { preventDefault: true }\n );\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (!event.defaultPrevented) {\n keyboardProps.onKeyDown(event);\n }\n };\n\n useEffect(() => {\n if (isOpen && menuRef.current) {\n menuRef.current.focus();\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClick = (event: MouseEvent) => {\n const target = event.target as Node;\n const menu = menuRef.current;\n const trigger = document.getElementById(triggerId);\n\n if (\n menu &&\n !menu.contains(target) &&\n trigger &&\n !trigger.contains(target)\n ) {\n close();\n }\n };\n\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [isOpen, close, triggerId]);\n\n if (!isOpen) {\n return null;\n }\n\n // Structural styles - always applied, required for dropdown positioning\n const contentStructuralStyles: React.CSSProperties = {\n position: 'absolute',\n top: '100%',\n left: 0,\n marginTop: '4px',\n zIndex: 1000,\n };\n\n // Visual styles - only applied when not unstyled\n const contentVisualStyles: React.CSSProperties = unstyled\n ? {}\n : {\n minWidth: '160px',\n backgroundColor: 'white',\n border: '1px solid #e0e0e0',\n borderRadius: '4px',\n boxShadow: '0 4px 6px rgba(0, 0, 0, 0.1)',\n padding: '4px 0',\n };\n\n const contentStyles: React.CSSProperties = {\n ...contentStructuralStyles,\n ...contentVisualStyles,\n };\n\n return (\n <div\n ref={(node) => {\n (menuRef as React.MutableRefObject<HTMLDivElement | null>).current =\n node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n }}\n id={menuId}\n role=\"menu\"\n aria-labelledby={triggerId}\n tabIndex={-1}\n onKeyDown={handleKeyDown}\n style={{ ...contentStyles, ...style }}\n data-a11y-core-action-menu-content\n {...props}\n >\n {children}\n </div>\n );\n});\n\nexport interface ActionMenuItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Whether the item is disabled */\n disabled?: boolean;\n /** Called when item is selected */\n onSelect?: () => void;\n children: React.ReactNode;\n}\n\nexport const ActionMenuItem = forwardRef<HTMLDivElement, ActionMenuItemProps>(\n function ActionMenuItem(\n {\n children,\n disabled = false,\n onSelect,\n onClick,\n onMouseEnter,\n style,\n ...props\n },\n ref\n ) {\n const {\n registerItem,\n unregisterItem,\n highlightedIndex,\n setHighlightedIndex,\n close,\n unstyled,\n } = useActionMenuContext();\n const itemId = useId('action-menu-item');\n const indexRef = useRef(-1);\n\n useEffect(() => {\n if (!disabled) {\n indexRef.current = registerItem(itemId);\n }\n return () => {\n if (!disabled) {\n unregisterItem(itemId);\n }\n };\n }, [itemId, disabled, registerItem, unregisterItem]);\n\n const isHighlighted = indexRef.current === highlightedIndex;\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented && !disabled) {\n onSelect?.();\n close();\n }\n };\n\n const handleMouseEnter = (event: React.MouseEvent<HTMLDivElement>) => {\n onMouseEnter?.(event);\n if (!disabled) {\n setHighlightedIndex(indexRef.current);\n }\n };\n\n // Behavioral styles - always applied for correct UX\n const itemBehaviorStyles: React.CSSProperties = {\n cursor: disabled ? 'not-allowed' : 'pointer',\n opacity: disabled ? 0.5 : 1,\n };\n\n // Visual styles - only applied when not unstyled\n const itemVisualStyles: React.CSSProperties = unstyled\n ? {}\n : {\n padding: '8px 16px',\n backgroundColor: isHighlighted ? '#f0f0f0' : 'transparent',\n };\n\n const itemStyles: React.CSSProperties = {\n ...itemBehaviorStyles,\n ...itemVisualStyles,\n };\n\n return (\n <div\n ref={ref}\n id={itemId}\n role=\"menuitem\"\n tabIndex={-1}\n aria-disabled={disabled}\n data-highlighted={isHighlighted}\n data-disabled={disabled}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n style={{ ...itemStyles, ...style }}\n data-a11y-core-action-menu-item\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nexport interface ActionMenuSeparatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const ActionMenuSeparator = forwardRef<\n HTMLDivElement,\n ActionMenuSeparatorProps\n>(function ActionMenuSeparator(props, ref) {\n return (\n <div\n ref={ref}\n role=\"separator\"\n data-a11y-core-action-menu-separator\n {...props}\n />\n );\n});\n\nexport interface ActionMenuLabelProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\nexport const ActionMenuLabel = forwardRef<HTMLDivElement, ActionMenuLabelProps>(\n function ActionMenuLabel({ children, ...props }, ref) {\n return (\n <div\n ref={ref}\n role=\"presentation\"\n data-a11y-core-action-menu-label\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nexport const ActionMenuCompound = Object.assign(ActionMenu, {\n Trigger: ActionMenuTrigger,\n Content: ActionMenuContent,\n Item: ActionMenuItem,\n Separator: ActionMenuSeparator,\n Label: ActionMenuLabel,\n});\n"]}