@arun-dev/headless 4.13.0 → 4.14.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.
@@ -0,0 +1,218 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/avatar/index.ts
21
+ var avatar_exports = {};
22
+ __export(avatar_exports, {
23
+ Avatar: () => index_parts_exports
24
+ });
25
+ module.exports = __toCommonJS(avatar_exports);
26
+
27
+ // src/avatar/index.parts.ts
28
+ var index_parts_exports = {};
29
+ __export(index_parts_exports, {
30
+ Fallback: () => AvatarFallback,
31
+ Image: () => AvatarImage,
32
+ Root: () => AvatarRoot
33
+ });
34
+
35
+ // src/avatar/AvatarRoot.tsx
36
+ var import_react2 = require("react");
37
+
38
+ // src/core/useRender.ts
39
+ var import_react = require("react");
40
+
41
+ // src/core/mergeProps.ts
42
+ function isEventHandler(key) {
43
+ return key.length > 2 && key.startsWith("on") && key[2] === key[2]?.toUpperCase();
44
+ }
45
+ function mergeRefs(...refs) {
46
+ return (node) => {
47
+ const cleanups = refs.map((ref) => {
48
+ if (typeof ref === "function") {
49
+ const result = ref(node);
50
+ return typeof result === "function" ? result : () => ref(null);
51
+ }
52
+ if (ref && typeof ref === "object") {
53
+ ref.current = node;
54
+ return () => {
55
+ ref.current = null;
56
+ };
57
+ }
58
+ return void 0;
59
+ });
60
+ return () => {
61
+ cleanups.forEach((cleanup) => {
62
+ if (typeof cleanup === "function") cleanup();
63
+ });
64
+ };
65
+ };
66
+ }
67
+ function isSyntheticEvent(event) {
68
+ return typeof event === "object" && event !== null && "nativeEvent" in event;
69
+ }
70
+ function makeEventPreventable(event) {
71
+ if (Object.prototype.hasOwnProperty.call(event, "preventComponentHandler")) return;
72
+ const target = event;
73
+ target.preventComponentHandler = () => {
74
+ target.componentHandlerPrevented = true;
75
+ };
76
+ }
77
+ function isComponentHandlerPrevented(event) {
78
+ return typeof event === "object" && event !== null && event.componentHandlerPrevented === true;
79
+ }
80
+ function chainHandlers(earlier, value) {
81
+ return (...args) => {
82
+ const event = args[0];
83
+ if (isSyntheticEvent(event)) makeEventPreventable(event);
84
+ value(...args);
85
+ if (isComponentHandlerPrevented(event)) return;
86
+ earlier(...args);
87
+ };
88
+ }
89
+ function mergeProps(...objects) {
90
+ const merged = {};
91
+ for (const props of objects) {
92
+ if (!props) continue;
93
+ for (const key of Object.keys(props)) {
94
+ const value = props[key];
95
+ if (value === void 0) continue;
96
+ if (isEventHandler(key) && typeof value === "function") {
97
+ const earlier = merged[key];
98
+ merged[key] = typeof earlier === "function" ? chainHandlers(earlier, value) : value;
99
+ } else if (key === "className") {
100
+ merged.className = merged.className ? `${String(merged.className)} ${String(value)}` : value;
101
+ } else if (key === "style") {
102
+ merged.style = { ...merged.style, ...value };
103
+ } else if (key === "ref") {
104
+ merged.ref = merged.ref ? mergeRefs(merged.ref, value) : value;
105
+ } else {
106
+ merged[key] = value;
107
+ }
108
+ }
109
+ }
110
+ return merged;
111
+ }
112
+
113
+ // src/core/useRender.ts
114
+ function useRender({
115
+ render,
116
+ defaultTagName,
117
+ props,
118
+ consumerProps
119
+ }) {
120
+ const merged = mergeProps(props, consumerProps);
121
+ if ((0, import_react.isValidElement)(render)) {
122
+ return (0, import_react.cloneElement)(render, mergeProps(merged, render.props));
123
+ }
124
+ return (0, import_react.createElement)(defaultTagName, merged);
125
+ }
126
+
127
+ // src/avatar/AvatarRoot.tsx
128
+ var import_jsx_runtime = require("react/jsx-runtime");
129
+ var AvatarContext = (0, import_react2.createContext)(null);
130
+ function useAvatarContext(part) {
131
+ const context = (0, import_react2.useContext)(AvatarContext);
132
+ if (!context) throw new Error(`<Avatar.${part}> must be rendered inside <Avatar.Root>.`);
133
+ return context;
134
+ }
135
+ function AvatarRoot({ className, children, render, ...rest }) {
136
+ const [status, setStatus] = (0, import_react2.useState)("idle");
137
+ const context = (0, import_react2.useMemo)(() => ({ status, setStatus }), [status]);
138
+ const element = useRender({
139
+ render,
140
+ defaultTagName: "span",
141
+ props: { "data-image-status": status, className, children },
142
+ consumerProps: rest
143
+ });
144
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AvatarContext.Provider, { value: context, children: element });
145
+ }
146
+
147
+ // src/avatar/AvatarImage.tsx
148
+ var import_react3 = require("react");
149
+ function AvatarImage({
150
+ src,
151
+ srcSet,
152
+ sizes,
153
+ crossOrigin,
154
+ referrerPolicy,
155
+ className,
156
+ render,
157
+ ...rest
158
+ }) {
159
+ const { status, setStatus } = useAvatarContext("Image");
160
+ (0, import_react3.useLayoutEffect)(() => {
161
+ if (!src && !srcSet) {
162
+ setStatus("error");
163
+ return;
164
+ }
165
+ let active = true;
166
+ const image = new window.Image();
167
+ const settle = (next) => () => {
168
+ if (active) setStatus(next);
169
+ };
170
+ image.onload = settle("loaded");
171
+ image.onerror = settle("error");
172
+ if (crossOrigin !== void 0) image.crossOrigin = crossOrigin;
173
+ if (referrerPolicy) image.referrerPolicy = referrerPolicy;
174
+ if (sizes) image.sizes = sizes;
175
+ if (srcSet) image.srcset = srcSet;
176
+ if (src) image.src = src;
177
+ setStatus(image.complete && image.naturalWidth > 0 ? "loaded" : "loading");
178
+ return () => {
179
+ active = false;
180
+ };
181
+ }, [src, srcSet, sizes, crossOrigin, referrerPolicy, setStatus]);
182
+ const element = useRender({
183
+ render,
184
+ defaultTagName: "img",
185
+ props: { src, srcSet, sizes, crossOrigin, referrerPolicy, className },
186
+ consumerProps: rest
187
+ });
188
+ return status === "loaded" ? element : null;
189
+ }
190
+
191
+ // src/avatar/AvatarFallback.tsx
192
+ var import_react4 = require("react");
193
+ function AvatarFallback({
194
+ delay = 0,
195
+ className,
196
+ children,
197
+ render,
198
+ ...rest
199
+ }) {
200
+ const { status } = useAvatarContext("Fallback");
201
+ const [waited, setWaited] = (0, import_react4.useState)(delay === 0);
202
+ (0, import_react4.useEffect)(() => {
203
+ if (delay === 0) return;
204
+ const timer = setTimeout(() => setWaited(true), delay);
205
+ return () => clearTimeout(timer);
206
+ }, [delay]);
207
+ const element = useRender({
208
+ render,
209
+ defaultTagName: "span",
210
+ props: { className, children },
211
+ consumerProps: rest
212
+ });
213
+ return status !== "loaded" && waited ? element : null;
214
+ }
215
+ // Annotate the CommonJS export names for ESM import in node:
216
+ 0 && (module.exports = {
217
+ Avatar
218
+ });
@@ -0,0 +1,52 @@
1
+ import * as react from 'react';
2
+ import { ReactElement, Ref, ComponentPropsWithRef } from 'react';
3
+
4
+ /** Where the Image is: none yet, on its way, shown, or failed for good. */
5
+ type AvatarImageStatus = 'idle' | 'loading' | 'loaded' | 'error';
6
+ type AvatarRootOwnProps = {
7
+ /** Element to render instead of the default `<span>`. Props and ref are merged onto it. */
8
+ render?: ReactElement;
9
+ /** Ref to the rendered element. Merged with any ref on the `render` element. */
10
+ ref?: Ref<HTMLElement>;
11
+ };
12
+ type AvatarRootProps = AvatarRootOwnProps & Omit<ComponentPropsWithRef<'span'>, keyof AvatarRootOwnProps>;
13
+ /**
14
+ * A person's picture, or their initials until it loads (decision 17). Holds whether the Image
15
+ * has loaded; `data-image-status` carries it for styling.
16
+ */
17
+ declare function AvatarRoot({ className, children, render, ...rest }: AvatarRootProps): react.JSX.Element;
18
+
19
+ type AvatarImageOwnProps = {
20
+ /** Element to render instead of the default `<img>`. Props and ref are merged onto it. */
21
+ render?: ReactElement;
22
+ /** Ref to the rendered element. Merged with any ref on the `render` element. */
23
+ ref?: Ref<HTMLElement>;
24
+ };
25
+ type AvatarImageProps = AvatarImageOwnProps & Omit<ComponentPropsWithRef<'img'>, keyof AvatarImageOwnProps>;
26
+ /**
27
+ * The picture. Loaded off-screen first, and rendered only once it has loaded, so a broken
28
+ * image never shows — the Fallback does instead. Give it an `alt`: the person's name.
29
+ */
30
+ declare function AvatarImage({ src, srcSet, sizes, crossOrigin, referrerPolicy, className, render, ...rest }: AvatarImageProps): ReactElement<unknown, string | react.JSXElementConstructor<any>> | null;
31
+
32
+ type AvatarFallbackOwnProps = {
33
+ /** Milliseconds to wait before showing, so a quick image does not flash the initials first. */
34
+ delay?: number;
35
+ /** Element to render instead of the default `<span>`. Props and ref are merged onto it. */
36
+ render?: ReactElement;
37
+ /** Ref to the rendered element. Merged with any ref on the `render` element. */
38
+ ref?: Ref<HTMLElement>;
39
+ };
40
+ type AvatarFallbackProps = AvatarFallbackOwnProps & Omit<ComponentPropsWithRef<'span'>, keyof AvatarFallbackOwnProps>;
41
+ /**
42
+ * Initials or an icon, shown until the Image loads, and for good if it fails or there is none.
43
+ * Initials read out as letters; give the Root an `aria-label` with the name, or mark these
44
+ * `aria-hidden` beside a visible name.
45
+ */
46
+ declare function AvatarFallback({ delay, className, children, render, ...rest }: AvatarFallbackProps): ReactElement<unknown, string | react.JSXElementConstructor<any>> | null;
47
+
48
+ declare namespace index_parts {
49
+ export { AvatarFallback as Fallback, AvatarImage as Image, AvatarRoot as Root };
50
+ }
51
+
52
+ export { index_parts as Avatar, type AvatarFallbackProps, type AvatarImageProps, type AvatarImageStatus, type AvatarRootProps };
@@ -0,0 +1,52 @@
1
+ import * as react from 'react';
2
+ import { ReactElement, Ref, ComponentPropsWithRef } from 'react';
3
+
4
+ /** Where the Image is: none yet, on its way, shown, or failed for good. */
5
+ type AvatarImageStatus = 'idle' | 'loading' | 'loaded' | 'error';
6
+ type AvatarRootOwnProps = {
7
+ /** Element to render instead of the default `<span>`. Props and ref are merged onto it. */
8
+ render?: ReactElement;
9
+ /** Ref to the rendered element. Merged with any ref on the `render` element. */
10
+ ref?: Ref<HTMLElement>;
11
+ };
12
+ type AvatarRootProps = AvatarRootOwnProps & Omit<ComponentPropsWithRef<'span'>, keyof AvatarRootOwnProps>;
13
+ /**
14
+ * A person's picture, or their initials until it loads (decision 17). Holds whether the Image
15
+ * has loaded; `data-image-status` carries it for styling.
16
+ */
17
+ declare function AvatarRoot({ className, children, render, ...rest }: AvatarRootProps): react.JSX.Element;
18
+
19
+ type AvatarImageOwnProps = {
20
+ /** Element to render instead of the default `<img>`. Props and ref are merged onto it. */
21
+ render?: ReactElement;
22
+ /** Ref to the rendered element. Merged with any ref on the `render` element. */
23
+ ref?: Ref<HTMLElement>;
24
+ };
25
+ type AvatarImageProps = AvatarImageOwnProps & Omit<ComponentPropsWithRef<'img'>, keyof AvatarImageOwnProps>;
26
+ /**
27
+ * The picture. Loaded off-screen first, and rendered only once it has loaded, so a broken
28
+ * image never shows — the Fallback does instead. Give it an `alt`: the person's name.
29
+ */
30
+ declare function AvatarImage({ src, srcSet, sizes, crossOrigin, referrerPolicy, className, render, ...rest }: AvatarImageProps): ReactElement<unknown, string | react.JSXElementConstructor<any>> | null;
31
+
32
+ type AvatarFallbackOwnProps = {
33
+ /** Milliseconds to wait before showing, so a quick image does not flash the initials first. */
34
+ delay?: number;
35
+ /** Element to render instead of the default `<span>`. Props and ref are merged onto it. */
36
+ render?: ReactElement;
37
+ /** Ref to the rendered element. Merged with any ref on the `render` element. */
38
+ ref?: Ref<HTMLElement>;
39
+ };
40
+ type AvatarFallbackProps = AvatarFallbackOwnProps & Omit<ComponentPropsWithRef<'span'>, keyof AvatarFallbackOwnProps>;
41
+ /**
42
+ * Initials or an icon, shown until the Image loads, and for good if it fails or there is none.
43
+ * Initials read out as letters; give the Root an `aria-label` with the name, or mark these
44
+ * `aria-hidden` beside a visible name.
45
+ */
46
+ declare function AvatarFallback({ delay, className, children, render, ...rest }: AvatarFallbackProps): ReactElement<unknown, string | react.JSXElementConstructor<any>> | null;
47
+
48
+ declare namespace index_parts {
49
+ export { AvatarFallback as Fallback, AvatarImage as Image, AvatarRoot as Root };
50
+ }
51
+
52
+ export { index_parts as Avatar, type AvatarFallbackProps, type AvatarImageProps, type AvatarImageStatus, type AvatarRootProps };
@@ -0,0 +1,105 @@
1
+ import {
2
+ __export,
3
+ useRender
4
+ } from "../chunk-OQTWWZ4B.js";
5
+
6
+ // src/avatar/index.parts.ts
7
+ var index_parts_exports = {};
8
+ __export(index_parts_exports, {
9
+ Fallback: () => AvatarFallback,
10
+ Image: () => AvatarImage,
11
+ Root: () => AvatarRoot
12
+ });
13
+
14
+ // src/avatar/AvatarRoot.tsx
15
+ import { createContext, useContext, useMemo, useState } from "react";
16
+ import { jsx } from "react/jsx-runtime";
17
+ var AvatarContext = createContext(null);
18
+ function useAvatarContext(part) {
19
+ const context = useContext(AvatarContext);
20
+ if (!context) throw new Error(`<Avatar.${part}> must be rendered inside <Avatar.Root>.`);
21
+ return context;
22
+ }
23
+ function AvatarRoot({ className, children, render, ...rest }) {
24
+ const [status, setStatus] = useState("idle");
25
+ const context = useMemo(() => ({ status, setStatus }), [status]);
26
+ const element = useRender({
27
+ render,
28
+ defaultTagName: "span",
29
+ props: { "data-image-status": status, className, children },
30
+ consumerProps: rest
31
+ });
32
+ return /* @__PURE__ */ jsx(AvatarContext.Provider, { value: context, children: element });
33
+ }
34
+
35
+ // src/avatar/AvatarImage.tsx
36
+ import { useLayoutEffect } from "react";
37
+ function AvatarImage({
38
+ src,
39
+ srcSet,
40
+ sizes,
41
+ crossOrigin,
42
+ referrerPolicy,
43
+ className,
44
+ render,
45
+ ...rest
46
+ }) {
47
+ const { status, setStatus } = useAvatarContext("Image");
48
+ useLayoutEffect(() => {
49
+ if (!src && !srcSet) {
50
+ setStatus("error");
51
+ return;
52
+ }
53
+ let active = true;
54
+ const image = new window.Image();
55
+ const settle = (next) => () => {
56
+ if (active) setStatus(next);
57
+ };
58
+ image.onload = settle("loaded");
59
+ image.onerror = settle("error");
60
+ if (crossOrigin !== void 0) image.crossOrigin = crossOrigin;
61
+ if (referrerPolicy) image.referrerPolicy = referrerPolicy;
62
+ if (sizes) image.sizes = sizes;
63
+ if (srcSet) image.srcset = srcSet;
64
+ if (src) image.src = src;
65
+ setStatus(image.complete && image.naturalWidth > 0 ? "loaded" : "loading");
66
+ return () => {
67
+ active = false;
68
+ };
69
+ }, [src, srcSet, sizes, crossOrigin, referrerPolicy, setStatus]);
70
+ const element = useRender({
71
+ render,
72
+ defaultTagName: "img",
73
+ props: { src, srcSet, sizes, crossOrigin, referrerPolicy, className },
74
+ consumerProps: rest
75
+ });
76
+ return status === "loaded" ? element : null;
77
+ }
78
+
79
+ // src/avatar/AvatarFallback.tsx
80
+ import { useEffect, useState as useState2 } from "react";
81
+ function AvatarFallback({
82
+ delay = 0,
83
+ className,
84
+ children,
85
+ render,
86
+ ...rest
87
+ }) {
88
+ const { status } = useAvatarContext("Fallback");
89
+ const [waited, setWaited] = useState2(delay === 0);
90
+ useEffect(() => {
91
+ if (delay === 0) return;
92
+ const timer = setTimeout(() => setWaited(true), delay);
93
+ return () => clearTimeout(timer);
94
+ }, [delay]);
95
+ const element = useRender({
96
+ render,
97
+ defaultTagName: "span",
98
+ props: { className, children },
99
+ consumerProps: rest
100
+ });
101
+ return status !== "loaded" && waited ? element : null;
102
+ }
103
+ export {
104
+ index_parts_exports as Avatar
105
+ };
@@ -0,0 +1,78 @@
1
+ import {
2
+ byDocumentOrder,
3
+ rovingIndex
4
+ } from "./chunk-2S4XG4VD.js";
5
+
6
+ // src/core/rovingGroup.ts
7
+ import { createContext, useCallback, useContext, useLayoutEffect, useMemo, useState } from "react";
8
+ var RovingGroupContext = createContext(null);
9
+ function useRovingGroupContext() {
10
+ return useContext(RovingGroupContext);
11
+ }
12
+ function keyBelongsToField(event, orientation) {
13
+ const target = event.target;
14
+ if (!(target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement)) return false;
15
+ if (target instanceof HTMLInputElement && !/^(text|search|url|tel|email|password|number)$/.test(target.type)) {
16
+ return false;
17
+ }
18
+ const { key } = event;
19
+ const along = orientation === "horizontal" ? ["ArrowLeft", "ArrowRight", "Home", "End"] : [];
20
+ if (!along.includes(key)) return false;
21
+ const start = target.selectionStart ?? 0;
22
+ const end = target.selectionEnd ?? 0;
23
+ const atStart = start === 0 && end === 0;
24
+ const atEnd = start === target.value.length && end === target.value.length;
25
+ const rtl = getComputedStyle(target).direction === "rtl";
26
+ const towardStart = key === (rtl ? "ArrowRight" : "ArrowLeft") || key === "Home";
27
+ return towardStart ? !atStart : !atEnd;
28
+ }
29
+ function useRovingGroup({ orientation }) {
30
+ const [items, setItems] = useState([]);
31
+ const register = useCallback((item) => {
32
+ setItems((current) => [...current, item].sort(byDocumentOrder));
33
+ return () => setItems((current) => current.filter((i) => i !== item));
34
+ }, []);
35
+ const [chosen, setTabStop] = useState(null);
36
+ const enabled = items.filter((item) => !item.disabled);
37
+ const tabStop = (
38
+ // Matched by element: an item re-registers when its props change.
39
+ chosen && enabled.find((item) => item.ref === chosen.ref) || enabled.find((item) => item.selected) || enabled[0] || null
40
+ );
41
+ const onKeyDown = useCallback(
42
+ (event) => {
43
+ if (event.defaultPrevented || keyBelongsToField(event, orientation)) return;
44
+ const current = enabled.findIndex((item2) => item2.ref.current?.contains(event.target));
45
+ const rtl = getComputedStyle(event.currentTarget).direction === "rtl";
46
+ const next = rovingIndex(event.key, { count: enabled.length, current, orientation, rtl });
47
+ if (next === null) return;
48
+ const item = enabled[next];
49
+ if (!item) return;
50
+ event.preventDefault();
51
+ item.ref.current?.focus();
52
+ setTabStop(item);
53
+ },
54
+ [enabled, orientation]
55
+ );
56
+ const context = useMemo(() => ({ tabStop, register, setTabStop }), [tabStop, register]);
57
+ return { context, onKeyDown };
58
+ }
59
+ function useRovingItem(ref, disabled, selected = false) {
60
+ const group = useRovingGroupContext();
61
+ const item = useMemo(() => ({ ref, disabled, selected }), [ref, disabled, selected]);
62
+ const register = group?.register;
63
+ useLayoutEffect(() => register?.(item), [register, item]);
64
+ if (!group) return { tabIndex: void 0, onFocus: void 0 };
65
+ return {
66
+ tabIndex: group.tabStop?.ref === ref ? 0 : -1,
67
+ onFocus() {
68
+ group.setTabStop(item);
69
+ }
70
+ };
71
+ }
72
+
73
+ export {
74
+ RovingGroupContext,
75
+ useRovingGroupContext,
76
+ useRovingGroup,
77
+ useRovingItem
78
+ };
@@ -0,0 +1,11 @@
1
+ // src/toggle-group/ToggleGroupContext.ts
2
+ import { createContext, useContext } from "react";
3
+ var ToggleGroupContext = createContext(null);
4
+ function useToggleGroupContext() {
5
+ return useContext(ToggleGroupContext);
6
+ }
7
+
8
+ export {
9
+ ToggleGroupContext,
10
+ useToggleGroupContext
11
+ };
@@ -1,12 +1,12 @@
1
- import {
2
- byDocumentOrder,
3
- rovingIndex
4
- } from "../chunk-2S4XG4VD.js";
5
1
  import {
6
2
  anchorNameFor,
7
3
  anchoredDataAttributes,
8
4
  anchoredPopupStyle
9
5
  } from "../chunk-HCOCPQXS.js";
6
+ import {
7
+ byDocumentOrder,
8
+ rovingIndex
9
+ } from "../chunk-2S4XG4VD.js";
10
10
  import {
11
11
  useControlled
12
12
  } from "../chunk-UEIB3I3T.js";
@@ -1,12 +1,12 @@
1
- import {
2
- byDocumentOrder,
3
- rovingIndex
4
- } from "../chunk-2S4XG4VD.js";
5
1
  import {
6
2
  anchorNameFor,
7
3
  anchoredDataAttributes,
8
4
  anchoredPopupStyle
9
5
  } from "../chunk-HCOCPQXS.js";
6
+ import {
7
+ byDocumentOrder,
8
+ rovingIndex
9
+ } from "../chunk-2S4XG4VD.js";
10
10
  import {
11
11
  useControlled
12
12
  } from "../chunk-UEIB3I3T.js";
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Roving focus for composite widgets — one Tab stop for the group, arrow keys within it.
3
+ * Tabs first; Menu and Toolbar reuse it. Internal: shared between components, not exported
4
+ * (decision 9).
5
+ *
6
+ * The caller owns the list of items and which are enabled — from component props, never
7
+ * read back from the DOM (decision 10). This only answers "where does this key go".
8
+ */
9
+ type Orientation = 'horizontal' | 'vertical';
10
+
11
+ export type { Orientation as O };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Roving focus for composite widgets — one Tab stop for the group, arrow keys within it.
3
+ * Tabs first; Menu and Toolbar reuse it. Internal: shared between components, not exported
4
+ * (decision 9).
5
+ *
6
+ * The caller owns the list of items and which are enabled — from component props, never
7
+ * read back from the DOM (decision 10). This only answers "where does this key go".
8
+ */
9
+ type Orientation = 'horizontal' | 'vertical';
10
+
11
+ export type { Orientation as O };
@@ -1,15 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ReactElement, Ref, ComponentPropsWithRef } from 'react';
3
-
4
- /**
5
- * Roving focus for composite widgets — one Tab stop for the group, arrow keys within it.
6
- * Tabs first; Menu and Toolbar reuse it. Internal: shared between components, not exported
7
- * (decision 9).
8
- *
9
- * The caller owns the list of items and which are enabled — from component props, never
10
- * read back from the DOM (decision 10). This only answers "where does this key go".
11
- */
12
- type Orientation = 'horizontal' | 'vertical';
3
+ import { O as Orientation } from '../rovingFocus-BZB3yicE.cjs';
13
4
 
14
5
  type TabsActivationMode = 'automatic' | 'manual';
15
6
  /** The state Tabs.Root shares with its parts, and projects as `data-*` attributes. */
@@ -1,15 +1,6 @@
1
1
  import * as react from 'react';
2
2
  import { ReactElement, Ref, ComponentPropsWithRef } from 'react';
3
-
4
- /**
5
- * Roving focus for composite widgets — one Tab stop for the group, arrow keys within it.
6
- * Tabs first; Menu and Toolbar reuse it. Internal: shared between components, not exported
7
- * (decision 9).
8
- *
9
- * The caller owns the list of items and which are enabled — from component props, never
10
- * read back from the DOM (decision 10). This only answers "where does this key go".
11
- */
12
- type Orientation = 'horizontal' | 'vertical';
3
+ import { O as Orientation } from '../rovingFocus-BZB3yicE.js';
13
4
 
14
5
  type TabsActivationMode = 'automatic' | 'manual';
15
6
  /** The state Tabs.Root shares with its parts, and projects as `data-*` attributes. */