@compa11y/react 0.1.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 (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +252 -0
  3. package/dist/chunk-2S4C6FGA.js +380 -0
  4. package/dist/chunk-2S4C6FGA.js.map +1 -0
  5. package/dist/chunk-52J4Z3QD.cjs +45 -0
  6. package/dist/chunk-52J4Z3QD.cjs.map +1 -0
  7. package/dist/chunk-C7QK2I7H.js +373 -0
  8. package/dist/chunk-C7QK2I7H.js.map +1 -0
  9. package/dist/chunk-D2UMS62N.cjs +245 -0
  10. package/dist/chunk-D2UMS62N.cjs.map +1 -0
  11. package/dist/chunk-E265U2RK.js +234 -0
  12. package/dist/chunk-E265U2RK.js.map +1 -0
  13. package/dist/chunk-E4XJRXWM.js +215 -0
  14. package/dist/chunk-E4XJRXWM.js.map +1 -0
  15. package/dist/chunk-GDLOJH6K.cjs +110 -0
  16. package/dist/chunk-GDLOJH6K.cjs.map +1 -0
  17. package/dist/chunk-IR46CNNY.cjs +329 -0
  18. package/dist/chunk-IR46CNNY.cjs.map +1 -0
  19. package/dist/chunk-JXYOE7SH.js +103 -0
  20. package/dist/chunk-JXYOE7SH.js.map +1 -0
  21. package/dist/chunk-O3YYQZ5O.js +317 -0
  22. package/dist/chunk-O3YYQZ5O.js.map +1 -0
  23. package/dist/chunk-OIVTOU4Z.cjs +386 -0
  24. package/dist/chunk-OIVTOU4Z.cjs.map +1 -0
  25. package/dist/chunk-OND5B7UG.js +85 -0
  26. package/dist/chunk-OND5B7UG.js.map +1 -0
  27. package/dist/chunk-R4FR6M6I.cjs +383 -0
  28. package/dist/chunk-R4FR6M6I.cjs.map +1 -0
  29. package/dist/chunk-RBDQCIS7.cjs +89 -0
  30. package/dist/chunk-RBDQCIS7.cjs.map +1 -0
  31. package/dist/chunk-SOBS7MIH.cjs +220 -0
  32. package/dist/chunk-SOBS7MIH.cjs.map +1 -0
  33. package/dist/chunk-WURPAE3R.js +41 -0
  34. package/dist/chunk-WURPAE3R.js.map +1 -0
  35. package/dist/components/combobox/index.cjs +31 -0
  36. package/dist/components/combobox/index.cjs.map +1 -0
  37. package/dist/components/combobox/index.d.cts +55 -0
  38. package/dist/components/combobox/index.d.ts +55 -0
  39. package/dist/components/combobox/index.js +6 -0
  40. package/dist/components/combobox/index.js.map +1 -0
  41. package/dist/components/dialog/index.cjs +46 -0
  42. package/dist/components/dialog/index.cjs.map +1 -0
  43. package/dist/components/dialog/index.d.cts +84 -0
  44. package/dist/components/dialog/index.d.ts +84 -0
  45. package/dist/components/dialog/index.js +5 -0
  46. package/dist/components/dialog/index.js.map +1 -0
  47. package/dist/components/menu/index.cjs +46 -0
  48. package/dist/components/menu/index.cjs.map +1 -0
  49. package/dist/components/menu/index.d.cts +80 -0
  50. package/dist/components/menu/index.d.ts +80 -0
  51. package/dist/components/menu/index.js +5 -0
  52. package/dist/components/menu/index.js.map +1 -0
  53. package/dist/components/tabs/index.cjs +35 -0
  54. package/dist/components/tabs/index.cjs.map +1 -0
  55. package/dist/components/tabs/index.d.cts +65 -0
  56. package/dist/components/tabs/index.d.ts +65 -0
  57. package/dist/components/tabs/index.js +6 -0
  58. package/dist/components/tabs/index.js.map +1 -0
  59. package/dist/components/toast/index.cjs +24 -0
  60. package/dist/components/toast/index.cjs.map +1 -0
  61. package/dist/components/toast/index.d.cts +49 -0
  62. package/dist/components/toast/index.d.ts +49 -0
  63. package/dist/components/toast/index.js +3 -0
  64. package/dist/components/toast/index.js.map +1 -0
  65. package/dist/index.cjs +702 -0
  66. package/dist/index.cjs.map +1 -0
  67. package/dist/index.d.cts +402 -0
  68. package/dist/index.d.ts +402 -0
  69. package/dist/index.js +430 -0
  70. package/dist/index.js.map +1 -0
  71. package/package.json +99 -0
@@ -0,0 +1,245 @@
1
+ 'use strict';
2
+
3
+ var chunkRBDQCIS7_cjs = require('./chunk-RBDQCIS7.cjs');
4
+ var chunkGDLOJH6K_cjs = require('./chunk-GDLOJH6K.cjs');
5
+ var chunk52J4Z3QD_cjs = require('./chunk-52J4Z3QD.cjs');
6
+ var React = require('react');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
+
11
+ var React__default = /*#__PURE__*/_interopDefault(React);
12
+
13
+ var TabsContext = React.createContext(null);
14
+ function useTabsContext() {
15
+ const context = React.useContext(TabsContext);
16
+ if (!context) {
17
+ throw new Error(
18
+ "Tabs compound components must be used within a Tabs component"
19
+ );
20
+ }
21
+ return context;
22
+ }
23
+ var TabsProvider = TabsContext.Provider;
24
+ var Tabs = React.forwardRef(function Tabs2({
25
+ defaultValue = "",
26
+ value: controlledValue,
27
+ onValueChange,
28
+ orientation = "horizontal",
29
+ activationMode = "automatic",
30
+ children,
31
+ ...props
32
+ }, ref) {
33
+ const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);
34
+ const selectedValue = controlledValue ?? uncontrolledValue;
35
+ const tabsRef = React.useRef([]);
36
+ const baseId = chunk52J4Z3QD_cjs.useId("tabs");
37
+ const setSelectedValue = React.useCallback(
38
+ (value) => {
39
+ if (controlledValue === void 0) {
40
+ setUncontrolledValue(value);
41
+ }
42
+ onValueChange?.(value);
43
+ },
44
+ [controlledValue, onValueChange]
45
+ );
46
+ const registerTab = React.useCallback((value) => {
47
+ if (!tabsRef.current.includes(value)) {
48
+ tabsRef.current.push(value);
49
+ }
50
+ }, []);
51
+ const unregisterTab = React.useCallback((value) => {
52
+ const index = tabsRef.current.indexOf(value);
53
+ if (index > -1) {
54
+ tabsRef.current.splice(index, 1);
55
+ }
56
+ }, []);
57
+ const getTabValues = React.useCallback(() => [...tabsRef.current], []);
58
+ const contextValue = {
59
+ selectedValue,
60
+ setSelectedValue,
61
+ baseId,
62
+ orientation,
63
+ activationMode,
64
+ registerTab,
65
+ unregisterTab,
66
+ getTabValues
67
+ };
68
+ return /* @__PURE__ */ jsxRuntime.jsx(TabsProvider, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.jsx(
69
+ "div",
70
+ {
71
+ ref,
72
+ "data-orientation": orientation,
73
+ "data-compa11y-tabs": true,
74
+ ...props,
75
+ children
76
+ }
77
+ ) });
78
+ });
79
+ var TabList = React.forwardRef(
80
+ function TabList2({ children, "aria-label": ariaLabel, onKeyDown, ...props }, ref) {
81
+ const {
82
+ orientation,
83
+ selectedValue,
84
+ setSelectedValue,
85
+ getTabValues,
86
+ activationMode
87
+ } = useTabsContext();
88
+ const navigateToTab = React.useCallback(
89
+ (direction) => {
90
+ const values = getTabValues();
91
+ if (values.length === 0) return;
92
+ const currentIndex = values.indexOf(selectedValue);
93
+ let newIndex;
94
+ switch (direction) {
95
+ case "next":
96
+ newIndex = (currentIndex + 1) % values.length;
97
+ break;
98
+ case "previous":
99
+ newIndex = (currentIndex - 1 + values.length) % values.length;
100
+ break;
101
+ case "first":
102
+ newIndex = 0;
103
+ break;
104
+ case "last":
105
+ newIndex = values.length - 1;
106
+ break;
107
+ }
108
+ const newValue = values[newIndex];
109
+ if (newValue) {
110
+ const tabElement = document.querySelector(
111
+ `[data-compa11y-tab][data-value="${newValue}"]`
112
+ );
113
+ tabElement?.focus();
114
+ if (activationMode === "automatic") {
115
+ setSelectedValue(newValue);
116
+ }
117
+ }
118
+ },
119
+ [getTabValues, selectedValue, setSelectedValue, activationMode]
120
+ );
121
+ const keyboardProps = chunkGDLOJH6K_cjs.useKeyboard(
122
+ {
123
+ ArrowRight: () => {
124
+ if (orientation === "horizontal") navigateToTab("next");
125
+ },
126
+ ArrowLeft: () => {
127
+ if (orientation === "horizontal") navigateToTab("previous");
128
+ },
129
+ ArrowDown: () => {
130
+ if (orientation === "vertical") navigateToTab("next");
131
+ },
132
+ ArrowUp: () => {
133
+ if (orientation === "vertical") navigateToTab("previous");
134
+ },
135
+ Home: () => navigateToTab("first"),
136
+ End: () => navigateToTab("last")
137
+ },
138
+ { preventDefault: true }
139
+ );
140
+ const handleKeyDown = (event) => {
141
+ onKeyDown?.(event);
142
+ if (!event.defaultPrevented) {
143
+ keyboardProps.onKeyDown(event);
144
+ }
145
+ };
146
+ return /* @__PURE__ */ jsxRuntime.jsx(
147
+ "div",
148
+ {
149
+ ref,
150
+ role: "tablist",
151
+ "aria-label": ariaLabel,
152
+ "aria-orientation": orientation,
153
+ onKeyDown: handleKeyDown,
154
+ "data-compa11y-tablist": true,
155
+ ...props,
156
+ children
157
+ }
158
+ );
159
+ }
160
+ );
161
+ var Tab = React.forwardRef(function Tab2({ value, disabled = false, children, onClick, ...props }, ref) {
162
+ const {
163
+ selectedValue,
164
+ setSelectedValue,
165
+ baseId,
166
+ registerTab,
167
+ unregisterTab
168
+ } = useTabsContext();
169
+ const { announce } = chunkRBDQCIS7_cjs.useAnnouncer();
170
+ React__default.default.useEffect(() => {
171
+ registerTab(value);
172
+ return () => unregisterTab(value);
173
+ }, [value, registerTab, unregisterTab]);
174
+ const isSelected = selectedValue === value;
175
+ const tabId = `${baseId}-tab-${value}`;
176
+ const panelId = `${baseId}-panel-${value}`;
177
+ const handleClick = (event) => {
178
+ onClick?.(event);
179
+ if (!event.defaultPrevented && !disabled) {
180
+ setSelectedValue(value);
181
+ announce(`${value} tab selected`);
182
+ }
183
+ };
184
+ return /* @__PURE__ */ jsxRuntime.jsx(
185
+ "button",
186
+ {
187
+ ref,
188
+ type: "button",
189
+ role: "tab",
190
+ id: tabId,
191
+ "aria-selected": isSelected,
192
+ "aria-controls": panelId,
193
+ "aria-disabled": disabled,
194
+ tabIndex: isSelected ? 0 : -1,
195
+ onClick: handleClick,
196
+ disabled,
197
+ "data-selected": isSelected,
198
+ "data-disabled": disabled,
199
+ "data-value": value,
200
+ "data-compa11y-tab": true,
201
+ ...props,
202
+ children
203
+ }
204
+ );
205
+ });
206
+ var TabPanel = React.forwardRef(
207
+ function TabPanel2({ value, forceMount = false, children, ...props }, ref) {
208
+ const { selectedValue, baseId } = useTabsContext();
209
+ const isSelected = selectedValue === value;
210
+ const tabId = `${baseId}-tab-${value}`;
211
+ const panelId = `${baseId}-panel-${value}`;
212
+ if (!isSelected && !forceMount) {
213
+ return null;
214
+ }
215
+ return /* @__PURE__ */ jsxRuntime.jsx(
216
+ "div",
217
+ {
218
+ ref,
219
+ role: "tabpanel",
220
+ id: panelId,
221
+ "aria-labelledby": tabId,
222
+ tabIndex: 0,
223
+ hidden: !isSelected,
224
+ "data-selected": isSelected,
225
+ "data-compa11y-tabpanel": true,
226
+ ...props,
227
+ children
228
+ }
229
+ );
230
+ }
231
+ );
232
+ var TabsCompound = Object.assign(Tabs, {
233
+ List: TabList,
234
+ Tab,
235
+ Panel: TabPanel
236
+ });
237
+
238
+ exports.Tab = Tab;
239
+ exports.TabList = TabList;
240
+ exports.TabPanel = TabPanel;
241
+ exports.Tabs = Tabs;
242
+ exports.TabsCompound = TabsCompound;
243
+ exports.useTabsContext = useTabsContext;
244
+ //# sourceMappingURL=chunk-D2UMS62N.cjs.map
245
+ //# sourceMappingURL=chunk-D2UMS62N.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/tabs/tabs-context.ts","../src/components/tabs/tabs.tsx"],"names":["createContext","useContext","forwardRef","Tabs","useState","useRef","useId","useCallback","jsx","TabList","useKeyboard","Tab","useAnnouncer","React","TabPanel"],"mappings":"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","file":"chunk-D2UMS62N.cjs","sourcesContent":["import { createContext, useContext } from 'react';\n\nexport interface TabsContextValue {\n /** Currently selected tab value */\n selectedValue: string;\n /** Change selected tab */\n setSelectedValue: (value: string) => void;\n /** Base ID for ARIA relationships */\n baseId: string;\n /** Orientation of tabs */\n orientation: 'horizontal' | 'vertical';\n /** Whether tabs are activated on focus or on click */\n activationMode: 'automatic' | 'manual';\n /** Register a tab */\n registerTab: (value: string) => void;\n /** Unregister a tab */\n unregisterTab: (value: string) => void;\n /** Get all tab values */\n getTabValues: () => string[];\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null);\n\nexport function useTabsContext(): TabsContextValue {\n const context = useContext(TabsContext);\n if (!context) {\n throw new Error(\n 'Tabs compound components must be used within a Tabs component'\n );\n }\n return context;\n}\n\nexport const TabsProvider = TabsContext.Provider;\n","import React, { forwardRef, useCallback, useRef, useState } from 'react';\nimport { useId } from '../../hooks/use-id';\nimport { useKeyboard } from '../../hooks/use-keyboard';\nimport { useAnnouncer } from '../../hooks/use-announcer';\nimport {\n TabsProvider,\n useTabsContext,\n type TabsContextValue,\n} from './tabs-context';\n\nexport interface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Default selected tab value */\n defaultValue?: string;\n /** Controlled selected value */\n value?: string;\n /** Called when selection changes */\n onValueChange?: (value: string) => void;\n /** Orientation of tabs */\n orientation?: 'horizontal' | 'vertical';\n /** Activation mode */\n activationMode?: 'automatic' | 'manual';\n children: React.ReactNode;\n}\n\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(function Tabs(\n {\n defaultValue = '',\n value: controlledValue,\n onValueChange,\n orientation = 'horizontal',\n activationMode = 'automatic',\n children,\n ...props\n },\n ref\n) {\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);\n const selectedValue = controlledValue ?? uncontrolledValue;\n const tabsRef = useRef<string[]>([]);\n const baseId = useId('tabs');\n\n const setSelectedValue = useCallback(\n (value: string) => {\n if (controlledValue === undefined) {\n setUncontrolledValue(value);\n }\n onValueChange?.(value);\n },\n [controlledValue, onValueChange]\n );\n\n const registerTab = useCallback((value: string) => {\n if (!tabsRef.current.includes(value)) {\n tabsRef.current.push(value);\n }\n }, []);\n\n const unregisterTab = useCallback((value: string) => {\n const index = tabsRef.current.indexOf(value);\n if (index > -1) {\n tabsRef.current.splice(index, 1);\n }\n }, []);\n\n const getTabValues = useCallback(() => [...tabsRef.current], []);\n\n const contextValue: TabsContextValue = {\n selectedValue,\n setSelectedValue,\n baseId,\n orientation,\n activationMode,\n registerTab,\n unregisterTab,\n getTabValues,\n };\n\n return (\n <TabsProvider value={contextValue}>\n <div\n ref={ref}\n data-orientation={orientation}\n data-compa11y-tabs\n {...props}\n >\n {children}\n </div>\n </TabsProvider>\n );\n});\n\nexport interface TabListProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Accessible label for the tab list */\n 'aria-label'?: string;\n children: React.ReactNode;\n}\n\nexport const TabList = forwardRef<HTMLDivElement, TabListProps>(\n function TabList(\n { children, 'aria-label': ariaLabel, onKeyDown, ...props },\n ref\n ) {\n const {\n orientation,\n selectedValue,\n setSelectedValue,\n getTabValues,\n activationMode,\n } = useTabsContext();\n\n const navigateToTab = useCallback(\n (direction: 'next' | 'previous' | 'first' | 'last') => {\n const values = getTabValues();\n if (values.length === 0) return;\n\n const currentIndex = values.indexOf(selectedValue);\n let newIndex: number;\n\n switch (direction) {\n case 'next':\n newIndex = (currentIndex + 1) % values.length;\n break;\n case 'previous':\n newIndex = (currentIndex - 1 + values.length) % values.length;\n break;\n case 'first':\n newIndex = 0;\n break;\n case 'last':\n newIndex = values.length - 1;\n break;\n }\n\n const newValue = values[newIndex];\n if (newValue) {\n const tabElement = document.querySelector(\n `[data-compa11y-tab][data-value=\"${newValue}\"]`\n ) as HTMLElement;\n tabElement?.focus();\n\n if (activationMode === 'automatic') {\n setSelectedValue(newValue);\n }\n }\n },\n [getTabValues, selectedValue, setSelectedValue, activationMode]\n );\n\n const keyboardProps = useKeyboard(\n {\n ArrowRight: () => {\n if (orientation === 'horizontal') navigateToTab('next');\n },\n ArrowLeft: () => {\n if (orientation === 'horizontal') navigateToTab('previous');\n },\n ArrowDown: () => {\n if (orientation === 'vertical') navigateToTab('next');\n },\n ArrowUp: () => {\n if (orientation === 'vertical') navigateToTab('previous');\n },\n Home: () => navigateToTab('first'),\n End: () => navigateToTab('last'),\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 return (\n <div\n ref={ref}\n role=\"tablist\"\n aria-label={ariaLabel}\n aria-orientation={orientation}\n onKeyDown={handleKeyDown}\n data-compa11y-tablist\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nexport interface TabProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'value'\n> {\n /** Value identifying this tab */\n value: string;\n /** Whether the tab is disabled */\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nexport const Tab = forwardRef<HTMLButtonElement, TabProps>(function Tab(\n { value, disabled = false, children, onClick, ...props },\n ref\n) {\n const {\n selectedValue,\n setSelectedValue,\n baseId,\n registerTab,\n unregisterTab,\n } = useTabsContext();\n const { announce } = useAnnouncer();\n\n React.useEffect(() => {\n registerTab(value);\n return () => unregisterTab(value);\n }, [value, registerTab, unregisterTab]);\n\n const isSelected = selectedValue === value;\n const tabId = `${baseId}-tab-${value}`;\n const panelId = `${baseId}-panel-${value}`;\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented && !disabled) {\n setSelectedValue(value);\n announce(`${value} tab selected`);\n }\n };\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"tab\"\n id={tabId}\n aria-selected={isSelected}\n aria-controls={panelId}\n aria-disabled={disabled}\n tabIndex={isSelected ? 0 : -1}\n onClick={handleClick}\n disabled={disabled}\n data-selected={isSelected}\n data-disabled={disabled}\n data-value={value}\n data-compa11y-tab\n {...props}\n >\n {children}\n </button>\n );\n});\n\nexport interface TabPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Value identifying this panel (must match a Tab value) */\n value: string;\n /** Whether to keep panel mounted when not selected */\n forceMount?: boolean;\n children: React.ReactNode;\n}\n\nexport const TabPanel = forwardRef<HTMLDivElement, TabPanelProps>(\n function TabPanel({ value, forceMount = false, children, ...props }, ref) {\n const { selectedValue, baseId } = useTabsContext();\n\n const isSelected = selectedValue === value;\n const tabId = `${baseId}-tab-${value}`;\n const panelId = `${baseId}-panel-${value}`;\n\n if (!isSelected && !forceMount) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n id={panelId}\n aria-labelledby={tabId}\n tabIndex={0}\n hidden={!isSelected}\n data-selected={isSelected}\n data-compa11y-tabpanel\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nexport const TabsCompound = Object.assign(Tabs, {\n List: TabList,\n Tab: Tab,\n Panel: TabPanel,\n});\n"]}
@@ -0,0 +1,234 @@
1
+ import { useAnnouncer } from './chunk-OND5B7UG.js';
2
+ import { useKeyboard } from './chunk-JXYOE7SH.js';
3
+ import { useId } from './chunk-WURPAE3R.js';
4
+ import React, { createContext, forwardRef, useState, useRef, useCallback, useContext } from 'react';
5
+ import { jsx } from 'react/jsx-runtime';
6
+
7
+ var TabsContext = createContext(null);
8
+ function useTabsContext() {
9
+ const context = useContext(TabsContext);
10
+ if (!context) {
11
+ throw new Error(
12
+ "Tabs compound components must be used within a Tabs component"
13
+ );
14
+ }
15
+ return context;
16
+ }
17
+ var TabsProvider = TabsContext.Provider;
18
+ var Tabs = forwardRef(function Tabs2({
19
+ defaultValue = "",
20
+ value: controlledValue,
21
+ onValueChange,
22
+ orientation = "horizontal",
23
+ activationMode = "automatic",
24
+ children,
25
+ ...props
26
+ }, ref) {
27
+ const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);
28
+ const selectedValue = controlledValue ?? uncontrolledValue;
29
+ const tabsRef = useRef([]);
30
+ const baseId = useId("tabs");
31
+ const setSelectedValue = useCallback(
32
+ (value) => {
33
+ if (controlledValue === void 0) {
34
+ setUncontrolledValue(value);
35
+ }
36
+ onValueChange?.(value);
37
+ },
38
+ [controlledValue, onValueChange]
39
+ );
40
+ const registerTab = useCallback((value) => {
41
+ if (!tabsRef.current.includes(value)) {
42
+ tabsRef.current.push(value);
43
+ }
44
+ }, []);
45
+ const unregisterTab = useCallback((value) => {
46
+ const index = tabsRef.current.indexOf(value);
47
+ if (index > -1) {
48
+ tabsRef.current.splice(index, 1);
49
+ }
50
+ }, []);
51
+ const getTabValues = useCallback(() => [...tabsRef.current], []);
52
+ const contextValue = {
53
+ selectedValue,
54
+ setSelectedValue,
55
+ baseId,
56
+ orientation,
57
+ activationMode,
58
+ registerTab,
59
+ unregisterTab,
60
+ getTabValues
61
+ };
62
+ return /* @__PURE__ */ jsx(TabsProvider, { value: contextValue, children: /* @__PURE__ */ jsx(
63
+ "div",
64
+ {
65
+ ref,
66
+ "data-orientation": orientation,
67
+ "data-compa11y-tabs": true,
68
+ ...props,
69
+ children
70
+ }
71
+ ) });
72
+ });
73
+ var TabList = forwardRef(
74
+ function TabList2({ children, "aria-label": ariaLabel, onKeyDown, ...props }, ref) {
75
+ const {
76
+ orientation,
77
+ selectedValue,
78
+ setSelectedValue,
79
+ getTabValues,
80
+ activationMode
81
+ } = useTabsContext();
82
+ const navigateToTab = useCallback(
83
+ (direction) => {
84
+ const values = getTabValues();
85
+ if (values.length === 0) return;
86
+ const currentIndex = values.indexOf(selectedValue);
87
+ let newIndex;
88
+ switch (direction) {
89
+ case "next":
90
+ newIndex = (currentIndex + 1) % values.length;
91
+ break;
92
+ case "previous":
93
+ newIndex = (currentIndex - 1 + values.length) % values.length;
94
+ break;
95
+ case "first":
96
+ newIndex = 0;
97
+ break;
98
+ case "last":
99
+ newIndex = values.length - 1;
100
+ break;
101
+ }
102
+ const newValue = values[newIndex];
103
+ if (newValue) {
104
+ const tabElement = document.querySelector(
105
+ `[data-compa11y-tab][data-value="${newValue}"]`
106
+ );
107
+ tabElement?.focus();
108
+ if (activationMode === "automatic") {
109
+ setSelectedValue(newValue);
110
+ }
111
+ }
112
+ },
113
+ [getTabValues, selectedValue, setSelectedValue, activationMode]
114
+ );
115
+ const keyboardProps = useKeyboard(
116
+ {
117
+ ArrowRight: () => {
118
+ if (orientation === "horizontal") navigateToTab("next");
119
+ },
120
+ ArrowLeft: () => {
121
+ if (orientation === "horizontal") navigateToTab("previous");
122
+ },
123
+ ArrowDown: () => {
124
+ if (orientation === "vertical") navigateToTab("next");
125
+ },
126
+ ArrowUp: () => {
127
+ if (orientation === "vertical") navigateToTab("previous");
128
+ },
129
+ Home: () => navigateToTab("first"),
130
+ End: () => navigateToTab("last")
131
+ },
132
+ { preventDefault: true }
133
+ );
134
+ const handleKeyDown = (event) => {
135
+ onKeyDown?.(event);
136
+ if (!event.defaultPrevented) {
137
+ keyboardProps.onKeyDown(event);
138
+ }
139
+ };
140
+ return /* @__PURE__ */ jsx(
141
+ "div",
142
+ {
143
+ ref,
144
+ role: "tablist",
145
+ "aria-label": ariaLabel,
146
+ "aria-orientation": orientation,
147
+ onKeyDown: handleKeyDown,
148
+ "data-compa11y-tablist": true,
149
+ ...props,
150
+ children
151
+ }
152
+ );
153
+ }
154
+ );
155
+ var Tab = forwardRef(function Tab2({ value, disabled = false, children, onClick, ...props }, ref) {
156
+ const {
157
+ selectedValue,
158
+ setSelectedValue,
159
+ baseId,
160
+ registerTab,
161
+ unregisterTab
162
+ } = useTabsContext();
163
+ const { announce } = useAnnouncer();
164
+ React.useEffect(() => {
165
+ registerTab(value);
166
+ return () => unregisterTab(value);
167
+ }, [value, registerTab, unregisterTab]);
168
+ const isSelected = selectedValue === value;
169
+ const tabId = `${baseId}-tab-${value}`;
170
+ const panelId = `${baseId}-panel-${value}`;
171
+ const handleClick = (event) => {
172
+ onClick?.(event);
173
+ if (!event.defaultPrevented && !disabled) {
174
+ setSelectedValue(value);
175
+ announce(`${value} tab selected`);
176
+ }
177
+ };
178
+ return /* @__PURE__ */ jsx(
179
+ "button",
180
+ {
181
+ ref,
182
+ type: "button",
183
+ role: "tab",
184
+ id: tabId,
185
+ "aria-selected": isSelected,
186
+ "aria-controls": panelId,
187
+ "aria-disabled": disabled,
188
+ tabIndex: isSelected ? 0 : -1,
189
+ onClick: handleClick,
190
+ disabled,
191
+ "data-selected": isSelected,
192
+ "data-disabled": disabled,
193
+ "data-value": value,
194
+ "data-compa11y-tab": true,
195
+ ...props,
196
+ children
197
+ }
198
+ );
199
+ });
200
+ var TabPanel = forwardRef(
201
+ function TabPanel2({ value, forceMount = false, children, ...props }, ref) {
202
+ const { selectedValue, baseId } = useTabsContext();
203
+ const isSelected = selectedValue === value;
204
+ const tabId = `${baseId}-tab-${value}`;
205
+ const panelId = `${baseId}-panel-${value}`;
206
+ if (!isSelected && !forceMount) {
207
+ return null;
208
+ }
209
+ return /* @__PURE__ */ jsx(
210
+ "div",
211
+ {
212
+ ref,
213
+ role: "tabpanel",
214
+ id: panelId,
215
+ "aria-labelledby": tabId,
216
+ tabIndex: 0,
217
+ hidden: !isSelected,
218
+ "data-selected": isSelected,
219
+ "data-compa11y-tabpanel": true,
220
+ ...props,
221
+ children
222
+ }
223
+ );
224
+ }
225
+ );
226
+ var TabsCompound = Object.assign(Tabs, {
227
+ List: TabList,
228
+ Tab,
229
+ Panel: TabPanel
230
+ });
231
+
232
+ export { Tab, TabList, TabPanel, Tabs, TabsCompound, useTabsContext };
233
+ //# sourceMappingURL=chunk-E265U2RK.js.map
234
+ //# sourceMappingURL=chunk-E265U2RK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/tabs/tabs-context.ts","../src/components/tabs/tabs.tsx"],"names":["Tabs","TabList","Tab","TabPanel"],"mappings":";;;;;;AAqBA,IAAM,WAAA,GAAc,cAAuC,IAAI,CAAA;AAExD,SAAS,cAAA,GAAmC;AACjD,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAEO,IAAM,eAAe,WAAA,CAAY,QAAA;ACTjC,IAAM,IAAA,GAAO,UAAA,CAAsC,SAASA,KAAAA,CACjE;AAAA,EACE,YAAA,GAAe,EAAA;AAAA,EACf,KAAA,EAAO,eAAA;AAAA,EACP,aAAA;AAAA,EACA,WAAA,GAAc,YAAA;AAAA,EACd,cAAA,GAAiB,WAAA;AAAA,EACjB,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,YAAY,CAAA;AACvE,EAAA,MAAM,gBAAgB,eAAA,IAAmB,iBAAA;AACzC,EAAA,MAAM,OAAA,GAAU,MAAA,CAAiB,EAAE,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,MAAM,MAAM,CAAA;AAE3B,EAAA,MAAM,gBAAA,GAAmB,WAAA;AAAA,IACvB,CAAC,KAAA,KAAkB;AACjB,MAAA,IAAI,oBAAoB,MAAA,EAAW;AACjC,QAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,MAC5B;AACA,MAAA,aAAA,GAAgB,KAAK,CAAA;AAAA,IACvB,CAAA;AAAA,IACA,CAAC,iBAAiB,aAAa;AAAA,GACjC;AAEA,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,CAAC,KAAA,KAAkB;AACjD,IAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AACpC,MAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,WAAA,CAAY,CAAC,KAAA,KAAkB;AACnD,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA;AAC3C,IAAA,IAAI,QAAQ,EAAA,EAAI;AACd,MAAA,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAAA,IACjC;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,YAAY,MAAM,CAAC,GAAG,OAAA,CAAQ,OAAO,CAAA,EAAG,EAAE,CAAA;AAE/D,EAAA,MAAM,YAAA,GAAiC;AAAA,IACrC,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACE,GAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAO,YAAA,EACnB,QAAA,kBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,kBAAA,EAAkB,WAAA;AAAA,MAClB,oBAAA,EAAkB,IAAA;AAAA,MACjB,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACH,EACF,CAAA;AAEJ,CAAC;AAQM,IAAM,OAAA,GAAU,UAAA;AAAA,EACrB,SAASC,QAAAA,CACP,EAAE,QAAA,EAAU,YAAA,EAAc,WAAW,SAAA,EAAW,GAAG,KAAA,EAAM,EACzD,GAAA,EACA;AACA,IAAA,MAAM;AAAA,MACJ,WAAA;AAAA,MACA,aAAA;AAAA,MACA,gBAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,QACE,cAAA,EAAe;AAEnB,IAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,MACpB,CAAC,SAAA,KAAsD;AACrD,QAAA,MAAM,SAAS,YAAA,EAAa;AAC5B,QAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAEzB,QAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA;AACjD,QAAA,IAAI,QAAA;AAEJ,QAAA,QAAQ,SAAA;AAAW,UACjB,KAAK,MAAA;AACH,YAAA,QAAA,GAAA,CAAY,YAAA,GAAe,KAAK,MAAA,CAAO,MAAA;AACvC,YAAA;AAAA,UACF,KAAK,UAAA;AACH,YAAA,QAAA,GAAA,CAAY,YAAA,GAAe,CAAA,GAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,MAAA;AACvD,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,QAAA,GAAW,CAAA;AACX,YAAA;AAAA,UACF,KAAK,MAAA;AACH,YAAA,QAAA,GAAW,OAAO,MAAA,GAAS,CAAA;AAC3B,YAAA;AAAA;AAGJ,QAAA,MAAM,QAAA,GAAW,OAAO,QAAQ,CAAA;AAChC,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,aAAa,QAAA,CAAS,aAAA;AAAA,YAC1B,mCAAmC,QAAQ,CAAA,EAAA;AAAA,WAC7C;AACA,UAAA,UAAA,EAAY,KAAA,EAAM;AAElB,UAAA,IAAI,mBAAmB,WAAA,EAAa;AAClC,YAAA,gBAAA,CAAiB,QAAQ,CAAA;AAAA,UAC3B;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,CAAC,YAAA,EAAc,aAAA,EAAe,gBAAA,EAAkB,cAAc;AAAA,KAChE;AAEA,IAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,MACpB;AAAA,QACE,YAAY,MAAM;AAChB,UAAA,IAAI,WAAA,KAAgB,YAAA,EAAc,aAAA,CAAc,MAAM,CAAA;AAAA,QACxD,CAAA;AAAA,QACA,WAAW,MAAM;AACf,UAAA,IAAI,WAAA,KAAgB,YAAA,EAAc,aAAA,CAAc,UAAU,CAAA;AAAA,QAC5D,CAAA;AAAA,QACA,WAAW,MAAM;AACf,UAAA,IAAI,WAAA,KAAgB,UAAA,EAAY,aAAA,CAAc,MAAM,CAAA;AAAA,QACtD,CAAA;AAAA,QACA,SAAS,MAAM;AACb,UAAA,IAAI,WAAA,KAAgB,UAAA,EAAY,aAAA,CAAc,UAAU,CAAA;AAAA,QAC1D,CAAA;AAAA,QACA,IAAA,EAAM,MAAM,aAAA,CAAc,OAAO,CAAA;AAAA,QACjC,GAAA,EAAK,MAAM,aAAA,CAAc,MAAM;AAAA,OACjC;AAAA,MACA,EAAE,gBAAgB,IAAA;AAAK,KACzB;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAA+C;AACpE,MAAA,SAAA,GAAY,KAAK,CAAA;AACjB,MAAA,IAAI,CAAC,MAAM,gBAAA,EAAkB;AAC3B,QAAA,aAAA,CAAc,UAAU,KAAK,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA;AAEA,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,SAAA;AAAA,QACL,YAAA,EAAY,SAAA;AAAA,QACZ,kBAAA,EAAkB,WAAA;AAAA,QAClB,SAAA,EAAW,aAAA;AAAA,QACX,uBAAA,EAAqB,IAAA;AAAA,QACpB,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AAaO,IAAM,GAAA,GAAM,UAAA,CAAwC,SAASC,IAAAA,CAClE,EAAE,KAAA,EAAO,QAAA,GAAW,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,GAAG,KAAA,IACjD,GAAA,EACA;AACA,EAAA,MAAM;AAAA,IACJ,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,MACE,cAAA,EAAe;AACnB,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,YAAA,EAAa;AAElC,EAAA,KAAA,CAAM,UAAU,MAAM;AACpB,IAAA,WAAA,CAAY,KAAK,CAAA;AACjB,IAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,KAAA,EAAO,WAAA,EAAa,aAAa,CAAC,CAAA;AAEtC,EAAA,MAAM,aAAa,aAAA,KAAkB,KAAA;AACrC,EAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,MAAM,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAA;AACpC,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,MAAM,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAExC,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA+C;AAClE,IAAA,OAAA,GAAU,KAAK,CAAA;AACf,IAAA,IAAI,CAAC,KAAA,CAAM,gBAAA,IAAoB,CAAC,QAAA,EAAU;AACxC,MAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,MAAA,QAAA,CAAS,CAAA,EAAG,KAAK,CAAA,aAAA,CAAe,CAAA;AAAA,IAClC;AAAA,EACF,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,IAAA,EAAK,KAAA;AAAA,MACL,EAAA,EAAI,KAAA;AAAA,MACJ,eAAA,EAAe,UAAA;AAAA,MACf,eAAA,EAAe,OAAA;AAAA,MACf,eAAA,EAAe,QAAA;AAAA,MACf,QAAA,EAAU,aAAa,CAAA,GAAI,EAAA;AAAA,MAC3B,OAAA,EAAS,WAAA;AAAA,MACT,QAAA;AAAA,MACA,eAAA,EAAe,UAAA;AAAA,MACf,eAAA,EAAe,QAAA;AAAA,MACf,YAAA,EAAY,KAAA;AAAA,MACZ,mBAAA,EAAiB,IAAA;AAAA,MAChB,GAAG,KAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ,CAAC;AAUM,IAAM,QAAA,GAAW,UAAA;AAAA,EACtB,SAASC,SAAAA,CAAS,EAAE,KAAA,EAAO,UAAA,GAAa,OAAO,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,EAAK;AACxE,IAAA,MAAM,EAAE,aAAA,EAAe,MAAA,EAAO,GAAI,cAAA,EAAe;AAEjD,IAAA,MAAM,aAAa,aAAA,KAAkB,KAAA;AACrC,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,MAAM,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAA;AACpC,IAAA,MAAM,OAAA,GAAU,CAAA,EAAG,MAAM,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA;AAExC,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,EAAY;AAC9B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA,EAAK,UAAA;AAAA,QACL,EAAA,EAAI,OAAA;AAAA,QACJ,iBAAA,EAAiB,KAAA;AAAA,QACjB,QAAA,EAAU,CAAA;AAAA,QACV,QAAQ,CAAC,UAAA;AAAA,QACT,eAAA,EAAe,UAAA;AAAA,QACf,wBAAA,EAAsB,IAAA;AAAA,QACrB,GAAG,KAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;AAEO,IAAM,YAAA,GAAe,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM;AAAA,EAC9C,IAAA,EAAM,OAAA;AAAA,EACN,GAAA;AAAA,EACA,KAAA,EAAO;AACT,CAAC","file":"chunk-E265U2RK.js","sourcesContent":["import { createContext, useContext } from 'react';\n\nexport interface TabsContextValue {\n /** Currently selected tab value */\n selectedValue: string;\n /** Change selected tab */\n setSelectedValue: (value: string) => void;\n /** Base ID for ARIA relationships */\n baseId: string;\n /** Orientation of tabs */\n orientation: 'horizontal' | 'vertical';\n /** Whether tabs are activated on focus or on click */\n activationMode: 'automatic' | 'manual';\n /** Register a tab */\n registerTab: (value: string) => void;\n /** Unregister a tab */\n unregisterTab: (value: string) => void;\n /** Get all tab values */\n getTabValues: () => string[];\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null);\n\nexport function useTabsContext(): TabsContextValue {\n const context = useContext(TabsContext);\n if (!context) {\n throw new Error(\n 'Tabs compound components must be used within a Tabs component'\n );\n }\n return context;\n}\n\nexport const TabsProvider = TabsContext.Provider;\n","import React, { forwardRef, useCallback, useRef, useState } from 'react';\nimport { useId } from '../../hooks/use-id';\nimport { useKeyboard } from '../../hooks/use-keyboard';\nimport { useAnnouncer } from '../../hooks/use-announcer';\nimport {\n TabsProvider,\n useTabsContext,\n type TabsContextValue,\n} from './tabs-context';\n\nexport interface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Default selected tab value */\n defaultValue?: string;\n /** Controlled selected value */\n value?: string;\n /** Called when selection changes */\n onValueChange?: (value: string) => void;\n /** Orientation of tabs */\n orientation?: 'horizontal' | 'vertical';\n /** Activation mode */\n activationMode?: 'automatic' | 'manual';\n children: React.ReactNode;\n}\n\nexport const Tabs = forwardRef<HTMLDivElement, TabsProps>(function Tabs(\n {\n defaultValue = '',\n value: controlledValue,\n onValueChange,\n orientation = 'horizontal',\n activationMode = 'automatic',\n children,\n ...props\n },\n ref\n) {\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue);\n const selectedValue = controlledValue ?? uncontrolledValue;\n const tabsRef = useRef<string[]>([]);\n const baseId = useId('tabs');\n\n const setSelectedValue = useCallback(\n (value: string) => {\n if (controlledValue === undefined) {\n setUncontrolledValue(value);\n }\n onValueChange?.(value);\n },\n [controlledValue, onValueChange]\n );\n\n const registerTab = useCallback((value: string) => {\n if (!tabsRef.current.includes(value)) {\n tabsRef.current.push(value);\n }\n }, []);\n\n const unregisterTab = useCallback((value: string) => {\n const index = tabsRef.current.indexOf(value);\n if (index > -1) {\n tabsRef.current.splice(index, 1);\n }\n }, []);\n\n const getTabValues = useCallback(() => [...tabsRef.current], []);\n\n const contextValue: TabsContextValue = {\n selectedValue,\n setSelectedValue,\n baseId,\n orientation,\n activationMode,\n registerTab,\n unregisterTab,\n getTabValues,\n };\n\n return (\n <TabsProvider value={contextValue}>\n <div\n ref={ref}\n data-orientation={orientation}\n data-compa11y-tabs\n {...props}\n >\n {children}\n </div>\n </TabsProvider>\n );\n});\n\nexport interface TabListProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Accessible label for the tab list */\n 'aria-label'?: string;\n children: React.ReactNode;\n}\n\nexport const TabList = forwardRef<HTMLDivElement, TabListProps>(\n function TabList(\n { children, 'aria-label': ariaLabel, onKeyDown, ...props },\n ref\n ) {\n const {\n orientation,\n selectedValue,\n setSelectedValue,\n getTabValues,\n activationMode,\n } = useTabsContext();\n\n const navigateToTab = useCallback(\n (direction: 'next' | 'previous' | 'first' | 'last') => {\n const values = getTabValues();\n if (values.length === 0) return;\n\n const currentIndex = values.indexOf(selectedValue);\n let newIndex: number;\n\n switch (direction) {\n case 'next':\n newIndex = (currentIndex + 1) % values.length;\n break;\n case 'previous':\n newIndex = (currentIndex - 1 + values.length) % values.length;\n break;\n case 'first':\n newIndex = 0;\n break;\n case 'last':\n newIndex = values.length - 1;\n break;\n }\n\n const newValue = values[newIndex];\n if (newValue) {\n const tabElement = document.querySelector(\n `[data-compa11y-tab][data-value=\"${newValue}\"]`\n ) as HTMLElement;\n tabElement?.focus();\n\n if (activationMode === 'automatic') {\n setSelectedValue(newValue);\n }\n }\n },\n [getTabValues, selectedValue, setSelectedValue, activationMode]\n );\n\n const keyboardProps = useKeyboard(\n {\n ArrowRight: () => {\n if (orientation === 'horizontal') navigateToTab('next');\n },\n ArrowLeft: () => {\n if (orientation === 'horizontal') navigateToTab('previous');\n },\n ArrowDown: () => {\n if (orientation === 'vertical') navigateToTab('next');\n },\n ArrowUp: () => {\n if (orientation === 'vertical') navigateToTab('previous');\n },\n Home: () => navigateToTab('first'),\n End: () => navigateToTab('last'),\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 return (\n <div\n ref={ref}\n role=\"tablist\"\n aria-label={ariaLabel}\n aria-orientation={orientation}\n onKeyDown={handleKeyDown}\n data-compa11y-tablist\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nexport interface TabProps extends Omit<\n React.ButtonHTMLAttributes<HTMLButtonElement>,\n 'value'\n> {\n /** Value identifying this tab */\n value: string;\n /** Whether the tab is disabled */\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nexport const Tab = forwardRef<HTMLButtonElement, TabProps>(function Tab(\n { value, disabled = false, children, onClick, ...props },\n ref\n) {\n const {\n selectedValue,\n setSelectedValue,\n baseId,\n registerTab,\n unregisterTab,\n } = useTabsContext();\n const { announce } = useAnnouncer();\n\n React.useEffect(() => {\n registerTab(value);\n return () => unregisterTab(value);\n }, [value, registerTab, unregisterTab]);\n\n const isSelected = selectedValue === value;\n const tabId = `${baseId}-tab-${value}`;\n const panelId = `${baseId}-panel-${value}`;\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n if (!event.defaultPrevented && !disabled) {\n setSelectedValue(value);\n announce(`${value} tab selected`);\n }\n };\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"tab\"\n id={tabId}\n aria-selected={isSelected}\n aria-controls={panelId}\n aria-disabled={disabled}\n tabIndex={isSelected ? 0 : -1}\n onClick={handleClick}\n disabled={disabled}\n data-selected={isSelected}\n data-disabled={disabled}\n data-value={value}\n data-compa11y-tab\n {...props}\n >\n {children}\n </button>\n );\n});\n\nexport interface TabPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Value identifying this panel (must match a Tab value) */\n value: string;\n /** Whether to keep panel mounted when not selected */\n forceMount?: boolean;\n children: React.ReactNode;\n}\n\nexport const TabPanel = forwardRef<HTMLDivElement, TabPanelProps>(\n function TabPanel({ value, forceMount = false, children, ...props }, ref) {\n const { selectedValue, baseId } = useTabsContext();\n\n const isSelected = selectedValue === value;\n const tabId = `${baseId}-tab-${value}`;\n const panelId = `${baseId}-panel-${value}`;\n\n if (!isSelected && !forceMount) {\n return null;\n }\n\n return (\n <div\n ref={ref}\n role=\"tabpanel\"\n id={panelId}\n aria-labelledby={tabId}\n tabIndex={0}\n hidden={!isSelected}\n data-selected={isSelected}\n data-compa11y-tabpanel\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nexport const TabsCompound = Object.assign(Tabs, {\n List: TabList,\n Tab: Tab,\n Panel: TabPanel,\n});\n"]}