@alankrit2/ui 0.3.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/index.d.mts +46 -1
- package/dist/index.d.ts +46 -1
- package/dist/index.js +118 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +118 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -189,6 +189,6 @@ Contributions are welcome! Please open an issue or submit a pull request.
|
|
|
189
189
|
|
|
190
190
|
## Links
|
|
191
191
|
|
|
192
|
-
- [GitHub Repository](
|
|
193
|
-
- [Documentation](
|
|
194
|
-
- [Report Issues](
|
|
192
|
+
- [GitHub Repository]()
|
|
193
|
+
- [Documentation]()
|
|
194
|
+
- [Report Issues]()
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import * as React$1 from 'react';
|
|
2
|
+
import React__default, { ReactNode } from 'react';
|
|
3
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
4
|
|
|
3
5
|
interface DialogProps {
|
|
4
6
|
/** Controlled open state */
|
|
@@ -165,6 +167,49 @@ interface DropdownItemProps extends React$1.HTMLAttributes<HTMLDivElement> {
|
|
|
165
167
|
|
|
166
168
|
declare const DropdownRoot: any;
|
|
167
169
|
|
|
170
|
+
interface TabsProps {
|
|
171
|
+
defaultValue?: string;
|
|
172
|
+
value?: string;
|
|
173
|
+
onValueChange?: (value: string) => void;
|
|
174
|
+
children: ReactNode;
|
|
175
|
+
className?: string;
|
|
176
|
+
}
|
|
177
|
+
interface TabsListProps {
|
|
178
|
+
children: ReactNode;
|
|
179
|
+
className?: string;
|
|
180
|
+
}
|
|
181
|
+
interface TabsTriggerProps {
|
|
182
|
+
value: string;
|
|
183
|
+
children: ReactNode;
|
|
184
|
+
className?: string;
|
|
185
|
+
disabled?: boolean;
|
|
186
|
+
}
|
|
187
|
+
interface TabsContentProps {
|
|
188
|
+
value: string;
|
|
189
|
+
children: ReactNode;
|
|
190
|
+
className?: string;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
declare const Tabs: {
|
|
194
|
+
({ defaultValue, value: valueProp, onValueChange, children, className, }: TabsProps): react_jsx_runtime.JSX.Element;
|
|
195
|
+
List: ({ children, className }: TabsListProps) => react_jsx_runtime.JSX.Element;
|
|
196
|
+
Trigger: ({ value, children, className, disabled, }: TabsTriggerProps) => react_jsx_runtime.JSX.Element;
|
|
197
|
+
Content: ({ value, children, className }: TabsContentProps) => react_jsx_runtime.JSX.Element | null;
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
interface ToggleProps {
|
|
201
|
+
defaultPressed?: boolean;
|
|
202
|
+
pressed?: boolean;
|
|
203
|
+
onPressedChange?: (pressed: boolean) => void;
|
|
204
|
+
disabled?: boolean;
|
|
205
|
+
children?: ReactNode;
|
|
206
|
+
className?: string;
|
|
207
|
+
asChild?: boolean;
|
|
208
|
+
'aria-label'?: string;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
declare const Toggle: React__default.ForwardRefExoticComponent<ToggleProps & React__default.RefAttributes<HTMLButtonElement>>;
|
|
212
|
+
|
|
168
213
|
interface UseControlledOptions<T> {
|
|
169
214
|
/** Controlled value */
|
|
170
215
|
value?: T;
|
|
@@ -232,4 +277,4 @@ declare const Slot: React$1.ForwardRefExoticComponent<SlotProps & React$1.RefAtt
|
|
|
232
277
|
*/
|
|
233
278
|
declare function composeRefs<T>(...refs: Array<React.Ref<T> | undefined>): (node: T | null) => void;
|
|
234
279
|
|
|
235
|
-
export { Button, type ButtonProps, _default as Dialog, type DialogCloseProps, type DialogContentProps, type DialogDescriptionProps, type DialogOverlayProps, type DialogPortalProps, type DialogProps, type DialogTitleProps, type DialogTriggerProps, DropdownRoot as Dropdown, type DropdownContentProps, type DropdownItemProps, type DropdownProps, type DropdownTriggerProps, Slot, composeRefs, useBodyScrollLock, useClickOutside, useControlled, useEscapeKeydown, useFocusTrap, useStableId };
|
|
280
|
+
export { Button, type ButtonProps, _default as Dialog, type DialogCloseProps, type DialogContentProps, type DialogDescriptionProps, type DialogOverlayProps, type DialogPortalProps, type DialogProps, type DialogTitleProps, type DialogTriggerProps, DropdownRoot as Dropdown, type DropdownContentProps, type DropdownItemProps, type DropdownProps, type DropdownTriggerProps, Slot, Tabs, type TabsContentProps, type TabsListProps, type TabsProps, type TabsTriggerProps, Toggle, type ToggleProps, composeRefs, useBodyScrollLock, useClickOutside, useControlled, useEscapeKeydown, useFocusTrap, useStableId };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import * as React$1 from 'react';
|
|
2
|
+
import React__default, { ReactNode } from 'react';
|
|
3
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
4
|
|
|
3
5
|
interface DialogProps {
|
|
4
6
|
/** Controlled open state */
|
|
@@ -165,6 +167,49 @@ interface DropdownItemProps extends React$1.HTMLAttributes<HTMLDivElement> {
|
|
|
165
167
|
|
|
166
168
|
declare const DropdownRoot: any;
|
|
167
169
|
|
|
170
|
+
interface TabsProps {
|
|
171
|
+
defaultValue?: string;
|
|
172
|
+
value?: string;
|
|
173
|
+
onValueChange?: (value: string) => void;
|
|
174
|
+
children: ReactNode;
|
|
175
|
+
className?: string;
|
|
176
|
+
}
|
|
177
|
+
interface TabsListProps {
|
|
178
|
+
children: ReactNode;
|
|
179
|
+
className?: string;
|
|
180
|
+
}
|
|
181
|
+
interface TabsTriggerProps {
|
|
182
|
+
value: string;
|
|
183
|
+
children: ReactNode;
|
|
184
|
+
className?: string;
|
|
185
|
+
disabled?: boolean;
|
|
186
|
+
}
|
|
187
|
+
interface TabsContentProps {
|
|
188
|
+
value: string;
|
|
189
|
+
children: ReactNode;
|
|
190
|
+
className?: string;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
declare const Tabs: {
|
|
194
|
+
({ defaultValue, value: valueProp, onValueChange, children, className, }: TabsProps): react_jsx_runtime.JSX.Element;
|
|
195
|
+
List: ({ children, className }: TabsListProps) => react_jsx_runtime.JSX.Element;
|
|
196
|
+
Trigger: ({ value, children, className, disabled, }: TabsTriggerProps) => react_jsx_runtime.JSX.Element;
|
|
197
|
+
Content: ({ value, children, className }: TabsContentProps) => react_jsx_runtime.JSX.Element | null;
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
interface ToggleProps {
|
|
201
|
+
defaultPressed?: boolean;
|
|
202
|
+
pressed?: boolean;
|
|
203
|
+
onPressedChange?: (pressed: boolean) => void;
|
|
204
|
+
disabled?: boolean;
|
|
205
|
+
children?: ReactNode;
|
|
206
|
+
className?: string;
|
|
207
|
+
asChild?: boolean;
|
|
208
|
+
'aria-label'?: string;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
declare const Toggle: React__default.ForwardRefExoticComponent<ToggleProps & React__default.RefAttributes<HTMLButtonElement>>;
|
|
212
|
+
|
|
168
213
|
interface UseControlledOptions<T> {
|
|
169
214
|
/** Controlled value */
|
|
170
215
|
value?: T;
|
|
@@ -232,4 +277,4 @@ declare const Slot: React$1.ForwardRefExoticComponent<SlotProps & React$1.RefAtt
|
|
|
232
277
|
*/
|
|
233
278
|
declare function composeRefs<T>(...refs: Array<React.Ref<T> | undefined>): (node: T | null) => void;
|
|
234
279
|
|
|
235
|
-
export { Button, type ButtonProps, _default as Dialog, type DialogCloseProps, type DialogContentProps, type DialogDescriptionProps, type DialogOverlayProps, type DialogPortalProps, type DialogProps, type DialogTitleProps, type DialogTriggerProps, DropdownRoot as Dropdown, type DropdownContentProps, type DropdownItemProps, type DropdownProps, type DropdownTriggerProps, Slot, composeRefs, useBodyScrollLock, useClickOutside, useControlled, useEscapeKeydown, useFocusTrap, useStableId };
|
|
280
|
+
export { Button, type ButtonProps, _default as Dialog, type DialogCloseProps, type DialogContentProps, type DialogDescriptionProps, type DialogOverlayProps, type DialogPortalProps, type DialogProps, type DialogTitleProps, type DialogTriggerProps, DropdownRoot as Dropdown, type DropdownContentProps, type DropdownItemProps, type DropdownProps, type DropdownTriggerProps, Slot, Tabs, type TabsContentProps, type TabsListProps, type TabsProps, type TabsTriggerProps, Toggle, type ToggleProps, composeRefs, useBodyScrollLock, useClickOutside, useControlled, useEscapeKeydown, useFocusTrap, useStableId };
|
package/dist/index.js
CHANGED
|
@@ -539,11 +539,129 @@ DropdownRoot.Trigger = DropdownTrigger;
|
|
|
539
539
|
DropdownRoot.Content = DropdownContent;
|
|
540
540
|
DropdownRoot.Item = DropdownItem;
|
|
541
541
|
var dropdown_default = DropdownRoot;
|
|
542
|
+
var TabsContext = React8.createContext(void 0);
|
|
543
|
+
function useTabsContext() {
|
|
544
|
+
const context = React8.useContext(TabsContext);
|
|
545
|
+
if (!context) {
|
|
546
|
+
throw new Error("Tabs compound components must be used within a Tabs component");
|
|
547
|
+
}
|
|
548
|
+
return context;
|
|
549
|
+
}
|
|
550
|
+
var Tabs = ({
|
|
551
|
+
defaultValue,
|
|
552
|
+
value: valueProp,
|
|
553
|
+
onValueChange,
|
|
554
|
+
children,
|
|
555
|
+
className
|
|
556
|
+
}) => {
|
|
557
|
+
const [value, setValue] = useControlled({
|
|
558
|
+
value: valueProp,
|
|
559
|
+
defaultValue,
|
|
560
|
+
onChange: onValueChange
|
|
561
|
+
});
|
|
562
|
+
return /* @__PURE__ */ jsxRuntime.jsx(TabsContext.Provider, { value: { value, onValueChange: setValue }, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className, "data-value": value, children }) });
|
|
563
|
+
};
|
|
564
|
+
var TabsList = ({ children, className }) => {
|
|
565
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { role: "tablist", className, children });
|
|
566
|
+
};
|
|
567
|
+
var TabsTrigger = ({
|
|
568
|
+
value,
|
|
569
|
+
children,
|
|
570
|
+
className,
|
|
571
|
+
disabled
|
|
572
|
+
}) => {
|
|
573
|
+
const context = useTabsContext();
|
|
574
|
+
const isActive = context.value === value;
|
|
575
|
+
React8.useId();
|
|
576
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
577
|
+
"button",
|
|
578
|
+
{
|
|
579
|
+
role: "tab",
|
|
580
|
+
"aria-selected": isActive,
|
|
581
|
+
"aria-controls": `tabpanel-${value}`,
|
|
582
|
+
id: `tab-${value}`,
|
|
583
|
+
disabled,
|
|
584
|
+
"data-state": isActive ? "active" : "inactive",
|
|
585
|
+
"data-disabled": disabled ? "" : void 0,
|
|
586
|
+
className,
|
|
587
|
+
onClick: () => {
|
|
588
|
+
if (!disabled) {
|
|
589
|
+
context.onValueChange(value);
|
|
590
|
+
}
|
|
591
|
+
},
|
|
592
|
+
tabIndex: isActive ? 0 : -1,
|
|
593
|
+
children
|
|
594
|
+
}
|
|
595
|
+
);
|
|
596
|
+
};
|
|
597
|
+
var TabsContent = ({ value, children, className }) => {
|
|
598
|
+
const context = useTabsContext();
|
|
599
|
+
const isActive = context.value === value;
|
|
600
|
+
if (!isActive) return null;
|
|
601
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
602
|
+
"div",
|
|
603
|
+
{
|
|
604
|
+
role: "tabpanel",
|
|
605
|
+
id: `tabpanel-${value}`,
|
|
606
|
+
"aria-labelledby": `tab-${value}`,
|
|
607
|
+
className,
|
|
608
|
+
"data-state": isActive ? "active" : "inactive",
|
|
609
|
+
tabIndex: 0,
|
|
610
|
+
children
|
|
611
|
+
}
|
|
612
|
+
);
|
|
613
|
+
};
|
|
614
|
+
Tabs.List = TabsList;
|
|
615
|
+
Tabs.Trigger = TabsTrigger;
|
|
616
|
+
Tabs.Content = TabsContent;
|
|
617
|
+
var Toggle = React8__namespace.default.forwardRef(
|
|
618
|
+
({
|
|
619
|
+
defaultPressed = false,
|
|
620
|
+
pressed: pressedProp,
|
|
621
|
+
onPressedChange,
|
|
622
|
+
disabled = false,
|
|
623
|
+
className,
|
|
624
|
+
children,
|
|
625
|
+
asChild = false,
|
|
626
|
+
"aria-label": ariaLabel,
|
|
627
|
+
...props
|
|
628
|
+
}, ref) => {
|
|
629
|
+
const [pressed, setPressed] = useControlled({
|
|
630
|
+
value: pressedProp,
|
|
631
|
+
defaultValue: defaultPressed,
|
|
632
|
+
onChange: onPressedChange
|
|
633
|
+
});
|
|
634
|
+
const Comp = asChild ? Slot : "button";
|
|
635
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
636
|
+
Comp,
|
|
637
|
+
{
|
|
638
|
+
ref,
|
|
639
|
+
type: "button",
|
|
640
|
+
"aria-pressed": pressed,
|
|
641
|
+
"data-state": pressed ? "on" : "off",
|
|
642
|
+
"data-disabled": disabled ? "" : void 0,
|
|
643
|
+
disabled,
|
|
644
|
+
className,
|
|
645
|
+
"aria-label": ariaLabel,
|
|
646
|
+
onClick: () => {
|
|
647
|
+
if (!disabled) {
|
|
648
|
+
setPressed(!pressed);
|
|
649
|
+
}
|
|
650
|
+
},
|
|
651
|
+
...props,
|
|
652
|
+
children
|
|
653
|
+
}
|
|
654
|
+
);
|
|
655
|
+
}
|
|
656
|
+
);
|
|
657
|
+
Toggle.displayName = "Toggle";
|
|
542
658
|
|
|
543
659
|
exports.Button = button_default;
|
|
544
660
|
exports.Dialog = dialog_default;
|
|
545
661
|
exports.Dropdown = dropdown_default;
|
|
546
662
|
exports.Slot = Slot;
|
|
663
|
+
exports.Tabs = Tabs;
|
|
664
|
+
exports.Toggle = Toggle;
|
|
547
665
|
exports.composeRefs = composeRefs;
|
|
548
666
|
exports.useBodyScrollLock = useBodyScrollLock;
|
|
549
667
|
exports.useClickOutside = useClickOutside;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/use-controlled.ts","../src/hooks/use-focus-trap.ts","../src/hooks/use-escape-keydown.ts","../src/hooks/use-body-scroll-lock.ts","../src/hooks/use-id.ts","../src/utils/compose-refs.ts","../src/primitives/slot.tsx","../src/components/dialog/dialog-context.ts","../src/components/dialog/dialog.tsx","../src/components/button/button.tsx","../src/hooks/use-click-outside.ts","../src/components/dropdown/dropdown.tsx"],"names":["React","React2","React3","React4","React5","React6","React7","React8","jsx","ReactDOM","React9","useEffect","React10","createPortal"],"mappings":"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","file":"index.js","sourcesContent":["import * as React from 'react';\n\ninterface UseControlledOptions<T> {\n /** Controlled value */\n value?: T;\n /** Default value for uncontrolled mode */\n defaultValue?: T;\n /** Change handler */\n onChange?: (value: T) => void;\n}\n\n/**\n * Hook for managing controlled/uncontrolled state pattern.\n * Supports both controlled (value + onChange) and uncontrolled (defaultValue) modes.\n * \n * @example\n * // Controlled\n * const [value, setValue] = useControlled({ value: externalValue, onChange: setExternalValue });\n * \n * // Uncontrolled\n * const [value, setValue] = useControlled({ defaultValue: false });\n */\nexport function useControlled<T>({\n value: valueProp,\n defaultValue,\n onChange,\n}: UseControlledOptions<T>): [T, (newValue: T) => void] {\n const [valueState, setValueState] = React.useState<T>(defaultValue as T);\n const isControlled = valueProp !== undefined;\n\n const value = isControlled ? valueProp : valueState;\n\n const setValue = React.useCallback(\n (newValue: T) => {\n if (!isControlled) {\n setValueState(newValue);\n }\n onChange?.(newValue);\n },\n [isControlled, onChange]\n );\n\n return [value as T, setValue];\n}\n","import * as React from 'react';\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'textarea:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\n/**\n * Hook for trapping focus within a container.\n * Handles Tab/Shift+Tab cycling and prevents focus escape.\n * \n * @param containerRef - Ref to the container element\n * @param enabled - Whether the focus trap is active\n * @param autoFocus - Whether to auto-focus the first element on mount\n */\nexport function useFocusTrap(\n containerRef: React.RefObject<HTMLElement | null>,\n enabled = true,\n autoFocus = true\n) {\n const previouslyFocusedElement = React.useRef<HTMLElement | null>(null);\n\n React.useEffect(() => {\n if (!enabled || !containerRef.current) return;\n\n const container = containerRef.current;\n\n // Store the previously focused element\n previouslyFocusedElement.current = document.activeElement as HTMLElement;\n\n // Get all focusable elements\n const getFocusableElements = (): HTMLElement[] => {\n return Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)\n );\n };\n\n // Auto-focus first element if enabled\n if (autoFocus) {\n const focusableElements = getFocusableElements();\n if (focusableElements.length > 0) {\n focusableElements[0].focus();\n }\n }\n\n // Handle Tab key to cycle focus\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return;\n\n const focusableElements = getFocusableElements();\n if (focusableElements.length === 0) return;\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n if (event.shiftKey) {\n // Shift + Tab: move focus to last element if on first\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement.focus();\n }\n } else {\n // Tab: move focus to first element if on last\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement.focus();\n }\n }\n };\n\n container.addEventListener('keydown', handleKeyDown);\n\n return () => {\n container.removeEventListener('keydown', handleKeyDown);\n\n // Restore focus to previously focused element\n if (previouslyFocusedElement.current) {\n previouslyFocusedElement.current.focus();\n }\n };\n }, [enabled, autoFocus, containerRef]);\n}\n","import * as React from 'react';\n\n/**\n * Hook for handling Escape key press events.\n * Automatically cleans up event listener on unmount.\n */\nexport function useEscapeKeydown(\n handler: (event: KeyboardEvent) => void,\n enabled = true\n) {\n React.useEffect(() => {\n if (!enabled) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n handler(event);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [handler, enabled]);\n}\n","import * as React from 'react';\n\n/**\n * Hook for preventing body scroll when a modal/dialog is open.\n * This is an accessibility requirement to prevent background scrolling.\n */\nexport function useBodyScrollLock(enabled = true) {\n React.useEffect(() => {\n if (!enabled) return;\n\n const originalOverflow = document.body.style.overflow;\n const originalPaddingRight = document.body.style.paddingRight;\n\n // Prevent scroll\n document.body.style.overflow = 'hidden';\n\n // Prevent layout shift by adding padding to compensate for scrollbar\n const scrollbarWidth =\n window.innerWidth - document.documentElement.clientWidth;\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n\n return () => {\n document.body.style.overflow = originalOverflow;\n document.body.style.paddingRight = originalPaddingRight;\n };\n }, [enabled]);\n}\n","import * as React from 'react';\n\nlet count = 0;\nfunction generateId() {\n return `headless-ui-${++count}`;\n}\n\n/**\n * Hook for generating stable, unique IDs.\n * Uses React's useId when available, with a fallback for older versions.\n */\nexport function useStableId(idProp?: string): string {\n const [id] = React.useState(() => idProp || generateId());\n return idProp || id;\n}\n","/**\n * Composes multiple refs into a single ref callback.\n * Useful when you need to forward a ref while also using it internally.\n */\nexport function composeRefs<T>(...refs: Array<React.Ref<T> | undefined>) {\n return (node: T | null) => {\n refs.forEach((ref) => {\n if (!ref) return;\n\n if (typeof ref === 'function') {\n ref(node);\n } else {\n (ref as React.MutableRefObject<T | null>).current = node;\n }\n });\n };\n}\n","import * as React from 'react';\nimport { composeRefs } from '../utils/compose-refs';\n\ninterface SlotProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode;\n}\n\n/**\n * Slot component for the asChild pattern.\n * When asChild is true, merges props with the child element instead of rendering a wrapper.\n */\nexport const Slot = React.forwardRef<HTMLElement, SlotProps>(\n (props, forwardedRef) => {\n const { children, ...slotProps } = props;\n\n if (!React.isValidElement(children)) {\n return null;\n }\n\n return React.cloneElement(children, {\n ...mergeProps(slotProps, children.props),\n ref: forwardedRef\n ? composeRefs(forwardedRef, (children as any).ref)\n : (children as any).ref,\n });\n }\n);\n\nSlot.displayName = 'Slot';\n\n/**\n * Merges props from the Slot with props from the child element.\n * Event handlers are composed, other props from child take precedence.\n */\nfunction mergeProps(slotProps: any, childProps: any) {\n const merged = { ...childProps };\n\n for (const key in childProps) {\n const slotValue = slotProps[key];\n const childValue = childProps[key];\n\n // Compose event handlers\n if (/^on[A-Z]/.test(key)) {\n if (slotValue && childValue) {\n merged[key] = (...args: any[]) => {\n childValue(...args);\n slotValue(...args);\n };\n } else if (slotValue) {\n merged[key] = slotValue;\n }\n }\n // Child props take precedence for non-event handlers\n else if (key === 'style') {\n merged[key] = { ...slotValue, ...childValue };\n } else if (key === 'className') {\n merged[key] = [slotValue, childValue].filter(Boolean).join(' ');\n }\n }\n\n // Add slot props that don't exist in child\n for (const key in slotProps) {\n if (!(key in childProps)) {\n merged[key] = slotProps[key];\n }\n }\n\n return merged;\n}\n","import * as React from 'react';\n\nexport interface DialogContextValue {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n triggerRef: React.RefObject<HTMLElement | null>;\n contentRef: React.RefObject<HTMLElement | null>;\n titleId: string;\n descriptionId: string;\n}\n\nexport const DialogContext = React.createContext<DialogContextValue | null>(\n null\n);\n\n/**\n * Hook to access Dialog context.\n * Throws an error if used outside of a Dialog component.\n */\nexport function useDialogContext(componentName: string): DialogContextValue {\n const context = React.useContext(DialogContext);\n\n if (!context) {\n throw new Error(\n `<${componentName}> must be used within a <Dialog> component.`\n );\n }\n\n return context;\n}\n","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { useControlled } from '../../hooks/use-controlled';\nimport { useFocusTrap } from '../../hooks/use-focus-trap';\nimport { useEscapeKeydown } from '../../hooks/use-escape-keydown';\nimport { useBodyScrollLock } from '../../hooks/use-body-scroll-lock';\nimport { useStableId } from '../../hooks/use-id';\nimport { Slot } from '../../primitives/slot';\nimport { DialogContext, useDialogContext } from './dialog-context';\nimport type {\n DialogProps,\n DialogTriggerProps,\n DialogPortalProps,\n DialogOverlayProps,\n DialogContentProps,\n DialogTitleProps,\n DialogDescriptionProps,\n DialogCloseProps,\n} from './types';\n\n/**\n * Dialog Root Component\n * \n * Provides context for all Dialog sub-components.\n * Supports both controlled and uncontrolled state.\n * \n * @example\n * // Controlled\n * <Dialog open={open} onOpenChange={setOpen}>\n * ...\n * </Dialog>\n * \n * // Uncontrolled\n * <Dialog defaultOpen={false}>\n * ...\n * </Dialog>\n */\nexport function Dialog({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n children,\n}: DialogProps) {\n const [open, setOpen] = useControlled({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const triggerRef = React.useRef<HTMLElement>(null);\n const contentRef = React.useRef<HTMLElement>(null);\n const titleId = useStableId();\n const descriptionId = useStableId();\n\n const contextValue = React.useMemo(\n () => ({\n open,\n onOpenChange: setOpen,\n triggerRef,\n contentRef,\n titleId,\n descriptionId,\n }),\n [open, setOpen, titleId, descriptionId]\n );\n\n return (\n <DialogContext.Provider value={contextValue}>\n {children}\n </DialogContext.Provider>\n );\n}\n\n/**\n * Dialog Trigger Component\n * \n * Button that opens the dialog when clicked.\n * Supports asChild pattern for custom elements.\n * \n * @example\n * <Dialog.Trigger>Open Dialog</Dialog.Trigger>\n * \n * // With asChild\n * <Dialog.Trigger asChild>\n * <button className=\"custom-button\">Open</button>\n * </Dialog.Trigger>\n */\nconst DialogTrigger = React.forwardRef<HTMLButtonElement, DialogTriggerProps>(\n ({ asChild = false, children, onClick, ...props }, forwardedRef) => {\n const { onOpenChange, triggerRef } = useDialogContext('Dialog.Trigger');\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n onOpenChange(true);\n };\n\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n ref={(node: any) => {\n if (forwardedRef) {\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else {\n forwardedRef.current = node;\n }\n }\n (triggerRef as React.MutableRefObject<HTMLElement | null>).current =\n node;\n }}\n type={asChild ? undefined : 'button'}\n onClick={handleClick}\n {...props}\n >\n {children}\n </Comp>\n );\n }\n);\n\nDialogTrigger.displayName = 'Dialog.Trigger';\n\n/**\n * Dialog Portal Component\n * \n * Renders children in a portal outside the DOM hierarchy.\n * Only renders when dialog is open.\n * \n * @example\n * <Dialog.Portal>\n * <Dialog.Overlay />\n * <Dialog.Content>...</Dialog.Content>\n * </Dialog.Portal>\n */\nfunction DialogPortal({ container, children }: DialogPortalProps) {\n const { open } = useDialogContext('Dialog.Portal');\n const [mounted, setMounted] = React.useState(false);\n\n React.useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!open || !mounted) return null;\n\n return ReactDOM.createPortal(\n children,\n container || document.body\n );\n}\n\n/**\n * Dialog Overlay Component\n * \n * Semi-transparent backdrop behind the dialog.\n * Clicking it closes the dialog.\n * \n * @example\n * <Dialog.Overlay style={{ backgroundColor: 'rgba(0, 0, 0, 0.5)' }} />\n */\nconst DialogOverlay = React.forwardRef<HTMLDivElement, DialogOverlayProps>(\n ({ onClick, ...props }, forwardedRef) => {\n const { onOpenChange } = useDialogContext('Dialog.Overlay');\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n onOpenChange(false);\n };\n\n return (\n <div\n ref={forwardedRef}\n onClick={handleClick}\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 9998,\n }}\n {...props}\n />\n );\n }\n);\n\nDialogOverlay.displayName = 'Dialog.Overlay';\n\n/**\n * Dialog Content Component\n * \n * Main container for dialog content.\n * Implements focus trap, keyboard handling, and ARIA attributes.\n * \n * @example\n * <Dialog.Content>\n * <Dialog.Title>Title</Dialog.Title>\n * <Dialog.Description>Description</Dialog.Description>\n * <Dialog.Close>Close</Dialog.Close>\n * </Dialog.Content>\n */\nconst DialogContent = React.forwardRef<HTMLDivElement, DialogContentProps>(\n (\n { onEscapeKeyDown, onOverlayClick, children, ...props },\n forwardedRef\n ) => {\n const { open, onOpenChange, contentRef, titleId, descriptionId } =\n useDialogContext('Dialog.Content');\n\n // Focus trap\n useFocusTrap(contentRef, open, true);\n\n // Body scroll lock\n useBodyScrollLock(open);\n\n // Escape key handling\n useEscapeKeydown(\n (event) => {\n onEscapeKeyDown?.(event);\n onOpenChange(false);\n },\n open\n );\n\n // Prevent clicks inside content from closing dialog\n const handleContentClick = (event: React.MouseEvent<HTMLDivElement>) => {\n event.stopPropagation();\n };\n\n return (\n <div\n ref={(node) => {\n if (forwardedRef) {\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else {\n forwardedRef.current = node;\n }\n }\n (contentRef as React.MutableRefObject<HTMLDivElement | null>).current =\n node;\n }}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n onClick={handleContentClick}\n style={{\n position: 'fixed',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 9999,\n }}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nDialogContent.displayName = 'Dialog.Content';\n\n/**\n * Dialog Title Component\n * \n * Title for the dialog, linked via aria-labelledby.\n * \n * @example\n * <Dialog.Title>Confirm Action</Dialog.Title>\n */\nconst DialogTitle = React.forwardRef<HTMLHeadingElement, DialogTitleProps>(\n ({ children, ...props }, forwardedRef) => {\n const { titleId } = useDialogContext('Dialog.Title');\n\n return (\n <h2 ref={forwardedRef} id={titleId} {...props}>\n {children}\n </h2>\n );\n }\n);\n\nDialogTitle.displayName = 'Dialog.Title';\n\n/**\n * Dialog Description Component\n * \n * Description for the dialog, linked via aria-describedby.\n * \n * @example\n * <Dialog.Description>This action cannot be undone.</Dialog.Description>\n */\nconst DialogDescription = React.forwardRef<\n HTMLParagraphElement,\n DialogDescriptionProps\n>(({ children, ...props }, forwardedRef) => {\n const { descriptionId } = useDialogContext('Dialog.Description');\n\n return (\n <p ref={forwardedRef} id={descriptionId} {...props}>\n {children}\n </p>\n );\n});\n\nDialogDescription.displayName = 'Dialog.Description';\n\n/**\n * Dialog Close Component\n * \n * Button that closes the dialog when clicked.\n * Supports asChild pattern for custom elements.\n * \n * @example\n * <Dialog.Close>Cancel</Dialog.Close>\n * \n * // With asChild\n * <Dialog.Close asChild>\n * <button className=\"custom-button\">Close</button>\n * </Dialog.Close>\n */\nconst DialogClose = React.forwardRef<HTMLButtonElement, DialogCloseProps>(\n ({ asChild = false, children, onClick, ...props }, forwardedRef) => {\n const { onOpenChange } = useDialogContext('Dialog.Close');\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n onOpenChange(false);\n };\n\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n ref={forwardedRef}\n type={asChild ? undefined : 'button'}\n onClick={handleClick}\n {...props}\n >\n {children}\n </Comp>\n );\n }\n);\n\nDialogClose.displayName = 'Dialog.Close';\n\n// Attach sub-components to Dialog\nDialog.Trigger = DialogTrigger;\nDialog.Portal = DialogPortal;\nDialog.Overlay = DialogOverlay;\nDialog.Content = DialogContent;\nDialog.Title = DialogTitle;\nDialog.Description = DialogDescription;\nDialog.Close = DialogClose;\n\n// Type augmentation for compound components\nexport interface DialogComponent extends React.FC<DialogProps> {\n Trigger: typeof DialogTrigger;\n Portal: typeof DialogPortal;\n Overlay: typeof DialogOverlay;\n Content: typeof DialogContent;\n Title: typeof DialogTitle;\n Description: typeof DialogDescription;\n Close: typeof DialogClose;\n}\n\nexport default Dialog as DialogComponent;\n","import * as React from 'react';\nimport { Slot } from '../../primitives/slot';\nimport { ButtonProps } from './types';\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n return <Comp ref={ref} {...props} />;\n }\n);\n\nButton.displayName = 'Button';\n\nexport default Button;\n","import { useEffect } from 'react';\n\ntype Handler = (event: MouseEvent | TouchEvent) => void;\n\nexport function useClickOutside(\n ref: React.RefObject<HTMLElement | null>,\n handler: Handler,\n enabled: boolean = true\n) {\n useEffect(() => {\n if (!enabled) return;\n\n const listener = (event: MouseEvent | TouchEvent) => {\n const el = ref.current;\n if (!el || el.contains(event.target as Node)) {\n return;\n }\n handler(event);\n };\n\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n\n return () => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n };\n }, [ref, handler, enabled]);\n}\n","import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { useControlled } from '../../hooks/use-controlled';\nimport { useClickOutside } from '../../hooks/use-click-outside';\nimport { useEscapeKeydown } from '../../hooks/use-escape-keydown';\nimport { Slot } from '../../primitives/slot';\nimport { composeRefs } from '../../utils/compose-refs';\nimport {\n DropdownProps,\n DropdownTriggerProps,\n DropdownContentProps,\n DropdownItemProps,\n DropdownContextValue,\n} from './types';\n\nconst DropdownContext = React.createContext<DropdownContextValue | undefined>(undefined);\n\nconst useDropdown = () => {\n const context = React.useContext(DropdownContext);\n if (!context) {\n throw new Error('useDropdown must be used within a Dropdown');\n }\n return context;\n};\n\nexport function Dropdown({\n children,\n open: openProp,\n onOpenChange: setOpenProp,\n defaultOpen = false,\n}: DropdownProps) {\n const [open, setOpen] = useControlled({\n value: openProp,\n onChange: setOpenProp,\n defaultValue: defaultOpen,\n });\n\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n\n const contextValue = React.useMemo(\n () => ({\n open: !!open,\n onOpenChange: setOpen,\n triggerRef,\n }),\n [open, setOpen]\n );\n\n return (\n <DropdownContext.Provider value={contextValue}>\n {children}\n </DropdownContext.Provider>\n );\n}\n\nconst DropdownTrigger = React.forwardRef<HTMLButtonElement, DropdownTriggerProps>(\n ({ asChild, onClick, ...props }, ref) => {\n const { open, onOpenChange, triggerRef } = useDropdown();\n const Comp = asChild ? Slot : 'button';\n const composedRef = composeRefs(ref, triggerRef);\n\n return (\n <Comp\n ref={composedRef}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n data-state={open ? 'open' : 'closed'}\n onClick={(e) => {\n onClick?.(e);\n onOpenChange(!open);\n }}\n {...props}\n />\n );\n }\n);\nDropdownTrigger.displayName = 'Dropdown.Trigger';\n\nconst DropdownContent = React.forwardRef<HTMLDivElement, DropdownContentProps>(\n ({ children, style, sideOffset = 4, align = 'center', ...props }, ref) => {\n const { open, onOpenChange, triggerRef } = useDropdown();\n const contentRef = React.useRef<HTMLDivElement>(null);\n const composedRef = composeRefs(ref, contentRef);\n const [position, setPosition] = React.useState<{ top: number; left: number }>({ top: 0, left: 0 });\n\n useClickOutside(contentRef, (e) => {\n // Ignore clicks on the trigger to avoid double-toggling\n if (triggerRef.current?.contains(e.target as Node)) {\n return;\n }\n onOpenChange(false);\n }, open);\n\n useEscapeKeydown(() => onOpenChange(false));\n\n React.useEffect(() => {\n if (open && triggerRef.current && contentRef.current) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n \n let top = triggerRect.bottom + sideOffset + window.scrollY;\n let left = triggerRect.left + window.scrollX;\n \n if (align === 'center') {\n left = triggerRect.left + window.scrollX + (triggerRect.width / 2) - (contentRect.width / 2);\n } else if (align === 'end') {\n left = triggerRect.right + window.scrollX - contentRect.width;\n }\n \n // Basic boundary check (optional, can be improved)\n // if (left < 0) left = 10;\n \n setPosition({ top, left });\n }\n }, [open, sideOffset, align]);\n\n if (!open) return null;\n\n return createPortal(\n <div\n ref={composedRef}\n role=\"menu\"\n style={{\n position: 'absolute',\n top: position.top,\n left: position.left,\n zIndex: 50,\n ...style,\n }}\n data-state={open ? 'open' : 'closed'}\n {...props}\n >\n {children}\n </div>,\n document.body\n );\n }\n);\nDropdownContent.displayName = 'Dropdown.Content';\n\nconst DropdownItem = React.forwardRef<HTMLDivElement, DropdownItemProps>(\n ({ asChild, onClick, onSelect, disabled, ...props }, ref) => {\n const { onOpenChange } = useDropdown();\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp\n ref={ref}\n role=\"menuitem\"\n aria-disabled={disabled}\n data-disabled={disabled}\n onClick={(e) => {\n if (disabled) return;\n onClick?.(e);\n onSelect?.(e);\n onOpenChange(false);\n }}\n {...props}\n />\n );\n }\n);\nDropdownItem.displayName = 'Dropdown.Item';\n\n// Attach subcomponents\nconst DropdownRoot = Dropdown as any;\nDropdownRoot.Trigger = DropdownTrigger;\nDropdownRoot.Content = DropdownContent;\nDropdownRoot.Item = DropdownItem;\n\nexport default DropdownRoot;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-controlled.ts","../src/hooks/use-focus-trap.ts","../src/hooks/use-escape-keydown.ts","../src/hooks/use-body-scroll-lock.ts","../src/hooks/use-id.ts","../src/utils/compose-refs.ts","../src/primitives/slot.tsx","../src/components/dialog/dialog-context.ts","../src/components/dialog/dialog.tsx","../src/components/button/button.tsx","../src/hooks/use-click-outside.ts","../src/components/dropdown/dropdown.tsx","../src/components/tabs/tabs.tsx","../src/components/toggle/toggle.tsx"],"names":["React","React2","React3","React4","React5","React6","React7","React8","jsx","ReactDOM","React9","useEffect","React10","createPortal","createContext","useContext","useId"],"mappings":"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","file":"index.js","sourcesContent":["import * as React from 'react';\n\ninterface UseControlledOptions<T> {\n /** Controlled value */\n value?: T;\n /** Default value for uncontrolled mode */\n defaultValue?: T;\n /** Change handler */\n onChange?: (value: T) => void;\n}\n\n/**\n * Hook for managing controlled/uncontrolled state pattern.\n * Supports both controlled (value + onChange) and uncontrolled (defaultValue) modes.\n * \n * @example\n * // Controlled\n * const [value, setValue] = useControlled({ value: externalValue, onChange: setExternalValue });\n * \n * // Uncontrolled\n * const [value, setValue] = useControlled({ defaultValue: false });\n */\nexport function useControlled<T>({\n value: valueProp,\n defaultValue,\n onChange,\n}: UseControlledOptions<T>): [T, (newValue: T) => void] {\n const [valueState, setValueState] = React.useState<T>(defaultValue as T);\n const isControlled = valueProp !== undefined;\n\n const value = isControlled ? valueProp : valueState;\n\n const setValue = React.useCallback(\n (newValue: T) => {\n if (!isControlled) {\n setValueState(newValue);\n }\n onChange?.(newValue);\n },\n [isControlled, onChange]\n );\n\n return [value as T, setValue];\n}\n","import * as React from 'react';\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'textarea:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\n/**\n * Hook for trapping focus within a container.\n * Handles Tab/Shift+Tab cycling and prevents focus escape.\n * \n * @param containerRef - Ref to the container element\n * @param enabled - Whether the focus trap is active\n * @param autoFocus - Whether to auto-focus the first element on mount\n */\nexport function useFocusTrap(\n containerRef: React.RefObject<HTMLElement | null>,\n enabled = true,\n autoFocus = true\n) {\n const previouslyFocusedElement = React.useRef<HTMLElement | null>(null);\n\n React.useEffect(() => {\n if (!enabled || !containerRef.current) return;\n\n const container = containerRef.current;\n\n // Store the previously focused element\n previouslyFocusedElement.current = document.activeElement as HTMLElement;\n\n // Get all focusable elements\n const getFocusableElements = (): HTMLElement[] => {\n return Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)\n );\n };\n\n // Auto-focus first element if enabled\n if (autoFocus) {\n const focusableElements = getFocusableElements();\n if (focusableElements.length > 0) {\n focusableElements[0].focus();\n }\n }\n\n // Handle Tab key to cycle focus\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return;\n\n const focusableElements = getFocusableElements();\n if (focusableElements.length === 0) return;\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n if (event.shiftKey) {\n // Shift + Tab: move focus to last element if on first\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement.focus();\n }\n } else {\n // Tab: move focus to first element if on last\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement.focus();\n }\n }\n };\n\n container.addEventListener('keydown', handleKeyDown);\n\n return () => {\n container.removeEventListener('keydown', handleKeyDown);\n\n // Restore focus to previously focused element\n if (previouslyFocusedElement.current) {\n previouslyFocusedElement.current.focus();\n }\n };\n }, [enabled, autoFocus, containerRef]);\n}\n","import * as React from 'react';\n\n/**\n * Hook for handling Escape key press events.\n * Automatically cleans up event listener on unmount.\n */\nexport function useEscapeKeydown(\n handler: (event: KeyboardEvent) => void,\n enabled = true\n) {\n React.useEffect(() => {\n if (!enabled) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n handler(event);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [handler, enabled]);\n}\n","import * as React from 'react';\n\n/**\n * Hook for preventing body scroll when a modal/dialog is open.\n * This is an accessibility requirement to prevent background scrolling.\n */\nexport function useBodyScrollLock(enabled = true) {\n React.useEffect(() => {\n if (!enabled) return;\n\n const originalOverflow = document.body.style.overflow;\n const originalPaddingRight = document.body.style.paddingRight;\n\n // Prevent scroll\n document.body.style.overflow = 'hidden';\n\n // Prevent layout shift by adding padding to compensate for scrollbar\n const scrollbarWidth =\n window.innerWidth - document.documentElement.clientWidth;\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n\n return () => {\n document.body.style.overflow = originalOverflow;\n document.body.style.paddingRight = originalPaddingRight;\n };\n }, [enabled]);\n}\n","import * as React from 'react';\n\nlet count = 0;\nfunction generateId() {\n return `headless-ui-${++count}`;\n}\n\n/**\n * Hook for generating stable, unique IDs.\n * Uses React's useId when available, with a fallback for older versions.\n */\nexport function useStableId(idProp?: string): string {\n const [id] = React.useState(() => idProp || generateId());\n return idProp || id;\n}\n","/**\n * Composes multiple refs into a single ref callback.\n * Useful when you need to forward a ref while also using it internally.\n */\nexport function composeRefs<T>(...refs: Array<React.Ref<T> | undefined>) {\n return (node: T | null) => {\n refs.forEach((ref) => {\n if (!ref) return;\n\n if (typeof ref === 'function') {\n ref(node);\n } else {\n (ref as React.MutableRefObject<T | null>).current = node;\n }\n });\n };\n}\n","import * as React from 'react';\nimport { composeRefs } from '../utils/compose-refs';\n\ninterface SlotProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode;\n}\n\n/**\n * Slot component for the asChild pattern.\n * When asChild is true, merges props with the child element instead of rendering a wrapper.\n */\nexport const Slot = React.forwardRef<HTMLElement, SlotProps>(\n (props, forwardedRef) => {\n const { children, ...slotProps } = props;\n\n if (!React.isValidElement(children)) {\n return null;\n }\n\n return React.cloneElement(children, {\n ...mergeProps(slotProps, children.props),\n ref: forwardedRef\n ? composeRefs(forwardedRef, (children as any).ref)\n : (children as any).ref,\n });\n }\n);\n\nSlot.displayName = 'Slot';\n\n/**\n * Merges props from the Slot with props from the child element.\n * Event handlers are composed, other props from child take precedence.\n */\nfunction mergeProps(slotProps: any, childProps: any) {\n const merged = { ...childProps };\n\n for (const key in childProps) {\n const slotValue = slotProps[key];\n const childValue = childProps[key];\n\n // Compose event handlers\n if (/^on[A-Z]/.test(key)) {\n if (slotValue && childValue) {\n merged[key] = (...args: any[]) => {\n childValue(...args);\n slotValue(...args);\n };\n } else if (slotValue) {\n merged[key] = slotValue;\n }\n }\n // Child props take precedence for non-event handlers\n else if (key === 'style') {\n merged[key] = { ...slotValue, ...childValue };\n } else if (key === 'className') {\n merged[key] = [slotValue, childValue].filter(Boolean).join(' ');\n }\n }\n\n // Add slot props that don't exist in child\n for (const key in slotProps) {\n if (!(key in childProps)) {\n merged[key] = slotProps[key];\n }\n }\n\n return merged;\n}\n","import * as React from 'react';\n\nexport interface DialogContextValue {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n triggerRef: React.RefObject<HTMLElement | null>;\n contentRef: React.RefObject<HTMLElement | null>;\n titleId: string;\n descriptionId: string;\n}\n\nexport const DialogContext = React.createContext<DialogContextValue | null>(\n null\n);\n\n/**\n * Hook to access Dialog context.\n * Throws an error if used outside of a Dialog component.\n */\nexport function useDialogContext(componentName: string): DialogContextValue {\n const context = React.useContext(DialogContext);\n\n if (!context) {\n throw new Error(\n `<${componentName}> must be used within a <Dialog> component.`\n );\n }\n\n return context;\n}\n","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { useControlled } from '../../hooks/use-controlled';\nimport { useFocusTrap } from '../../hooks/use-focus-trap';\nimport { useEscapeKeydown } from '../../hooks/use-escape-keydown';\nimport { useBodyScrollLock } from '../../hooks/use-body-scroll-lock';\nimport { useStableId } from '../../hooks/use-id';\nimport { Slot } from '../../primitives/slot';\nimport { DialogContext, useDialogContext } from './dialog-context';\nimport type {\n DialogProps,\n DialogTriggerProps,\n DialogPortalProps,\n DialogOverlayProps,\n DialogContentProps,\n DialogTitleProps,\n DialogDescriptionProps,\n DialogCloseProps,\n} from './types';\n\n/**\n * Dialog Root Component\n * \n * Provides context for all Dialog sub-components.\n * Supports both controlled and uncontrolled state.\n * \n * @example\n * // Controlled\n * <Dialog open={open} onOpenChange={setOpen}>\n * ...\n * </Dialog>\n * \n * // Uncontrolled\n * <Dialog defaultOpen={false}>\n * ...\n * </Dialog>\n */\nexport function Dialog({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n children,\n}: DialogProps) {\n const [open, setOpen] = useControlled({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const triggerRef = React.useRef<HTMLElement>(null);\n const contentRef = React.useRef<HTMLElement>(null);\n const titleId = useStableId();\n const descriptionId = useStableId();\n\n const contextValue = React.useMemo(\n () => ({\n open,\n onOpenChange: setOpen,\n triggerRef,\n contentRef,\n titleId,\n descriptionId,\n }),\n [open, setOpen, titleId, descriptionId]\n );\n\n return (\n <DialogContext.Provider value={contextValue}>\n {children}\n </DialogContext.Provider>\n );\n}\n\n/**\n * Dialog Trigger Component\n * \n * Button that opens the dialog when clicked.\n * Supports asChild pattern for custom elements.\n * \n * @example\n * <Dialog.Trigger>Open Dialog</Dialog.Trigger>\n * \n * // With asChild\n * <Dialog.Trigger asChild>\n * <button className=\"custom-button\">Open</button>\n * </Dialog.Trigger>\n */\nconst DialogTrigger = React.forwardRef<HTMLButtonElement, DialogTriggerProps>(\n ({ asChild = false, children, onClick, ...props }, forwardedRef) => {\n const { onOpenChange, triggerRef } = useDialogContext('Dialog.Trigger');\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n onOpenChange(true);\n };\n\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n ref={(node: any) => {\n if (forwardedRef) {\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else {\n forwardedRef.current = node;\n }\n }\n (triggerRef as React.MutableRefObject<HTMLElement | null>).current =\n node;\n }}\n type={asChild ? undefined : 'button'}\n onClick={handleClick}\n {...props}\n >\n {children}\n </Comp>\n );\n }\n);\n\nDialogTrigger.displayName = 'Dialog.Trigger';\n\n/**\n * Dialog Portal Component\n * \n * Renders children in a portal outside the DOM hierarchy.\n * Only renders when dialog is open.\n * \n * @example\n * <Dialog.Portal>\n * <Dialog.Overlay />\n * <Dialog.Content>...</Dialog.Content>\n * </Dialog.Portal>\n */\nfunction DialogPortal({ container, children }: DialogPortalProps) {\n const { open } = useDialogContext('Dialog.Portal');\n const [mounted, setMounted] = React.useState(false);\n\n React.useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!open || !mounted) return null;\n\n return ReactDOM.createPortal(\n children,\n container || document.body\n );\n}\n\n/**\n * Dialog Overlay Component\n * \n * Semi-transparent backdrop behind the dialog.\n * Clicking it closes the dialog.\n * \n * @example\n * <Dialog.Overlay style={{ backgroundColor: 'rgba(0, 0, 0, 0.5)' }} />\n */\nconst DialogOverlay = React.forwardRef<HTMLDivElement, DialogOverlayProps>(\n ({ onClick, ...props }, forwardedRef) => {\n const { onOpenChange } = useDialogContext('Dialog.Overlay');\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n onOpenChange(false);\n };\n\n return (\n <div\n ref={forwardedRef}\n onClick={handleClick}\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 9998,\n }}\n {...props}\n />\n );\n }\n);\n\nDialogOverlay.displayName = 'Dialog.Overlay';\n\n/**\n * Dialog Content Component\n * \n * Main container for dialog content.\n * Implements focus trap, keyboard handling, and ARIA attributes.\n * \n * @example\n * <Dialog.Content>\n * <Dialog.Title>Title</Dialog.Title>\n * <Dialog.Description>Description</Dialog.Description>\n * <Dialog.Close>Close</Dialog.Close>\n * </Dialog.Content>\n */\nconst DialogContent = React.forwardRef<HTMLDivElement, DialogContentProps>(\n (\n { onEscapeKeyDown, onOverlayClick, children, ...props },\n forwardedRef\n ) => {\n const { open, onOpenChange, contentRef, titleId, descriptionId } =\n useDialogContext('Dialog.Content');\n\n // Focus trap\n useFocusTrap(contentRef, open, true);\n\n // Body scroll lock\n useBodyScrollLock(open);\n\n // Escape key handling\n useEscapeKeydown(\n (event) => {\n onEscapeKeyDown?.(event);\n onOpenChange(false);\n },\n open\n );\n\n // Prevent clicks inside content from closing dialog\n const handleContentClick = (event: React.MouseEvent<HTMLDivElement>) => {\n event.stopPropagation();\n };\n\n return (\n <div\n ref={(node) => {\n if (forwardedRef) {\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else {\n forwardedRef.current = node;\n }\n }\n (contentRef as React.MutableRefObject<HTMLDivElement | null>).current =\n node;\n }}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n onClick={handleContentClick}\n style={{\n position: 'fixed',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 9999,\n }}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nDialogContent.displayName = 'Dialog.Content';\n\n/**\n * Dialog Title Component\n * \n * Title for the dialog, linked via aria-labelledby.\n * \n * @example\n * <Dialog.Title>Confirm Action</Dialog.Title>\n */\nconst DialogTitle = React.forwardRef<HTMLHeadingElement, DialogTitleProps>(\n ({ children, ...props }, forwardedRef) => {\n const { titleId } = useDialogContext('Dialog.Title');\n\n return (\n <h2 ref={forwardedRef} id={titleId} {...props}>\n {children}\n </h2>\n );\n }\n);\n\nDialogTitle.displayName = 'Dialog.Title';\n\n/**\n * Dialog Description Component\n * \n * Description for the dialog, linked via aria-describedby.\n * \n * @example\n * <Dialog.Description>This action cannot be undone.</Dialog.Description>\n */\nconst DialogDescription = React.forwardRef<\n HTMLParagraphElement,\n DialogDescriptionProps\n>(({ children, ...props }, forwardedRef) => {\n const { descriptionId } = useDialogContext('Dialog.Description');\n\n return (\n <p ref={forwardedRef} id={descriptionId} {...props}>\n {children}\n </p>\n );\n});\n\nDialogDescription.displayName = 'Dialog.Description';\n\n/**\n * Dialog Close Component\n * \n * Button that closes the dialog when clicked.\n * Supports asChild pattern for custom elements.\n * \n * @example\n * <Dialog.Close>Cancel</Dialog.Close>\n * \n * // With asChild\n * <Dialog.Close asChild>\n * <button className=\"custom-button\">Close</button>\n * </Dialog.Close>\n */\nconst DialogClose = React.forwardRef<HTMLButtonElement, DialogCloseProps>(\n ({ asChild = false, children, onClick, ...props }, forwardedRef) => {\n const { onOpenChange } = useDialogContext('Dialog.Close');\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n onOpenChange(false);\n };\n\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n ref={forwardedRef}\n type={asChild ? undefined : 'button'}\n onClick={handleClick}\n {...props}\n >\n {children}\n </Comp>\n );\n }\n);\n\nDialogClose.displayName = 'Dialog.Close';\n\n// Attach sub-components to Dialog\nDialog.Trigger = DialogTrigger;\nDialog.Portal = DialogPortal;\nDialog.Overlay = DialogOverlay;\nDialog.Content = DialogContent;\nDialog.Title = DialogTitle;\nDialog.Description = DialogDescription;\nDialog.Close = DialogClose;\n\n// Type augmentation for compound components\nexport interface DialogComponent extends React.FC<DialogProps> {\n Trigger: typeof DialogTrigger;\n Portal: typeof DialogPortal;\n Overlay: typeof DialogOverlay;\n Content: typeof DialogContent;\n Title: typeof DialogTitle;\n Description: typeof DialogDescription;\n Close: typeof DialogClose;\n}\n\nexport default Dialog as DialogComponent;\n","import * as React from 'react';\nimport { Slot } from '../../primitives/slot';\nimport { ButtonProps } from './types';\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n return <Comp ref={ref} {...props} />;\n }\n);\n\nButton.displayName = 'Button';\n\nexport default Button;\n","import { useEffect } from 'react';\n\ntype Handler = (event: MouseEvent | TouchEvent) => void;\n\nexport function useClickOutside(\n ref: React.RefObject<HTMLElement | null>,\n handler: Handler,\n enabled: boolean = true\n) {\n useEffect(() => {\n if (!enabled) return;\n\n const listener = (event: MouseEvent | TouchEvent) => {\n const el = ref.current;\n if (!el || el.contains(event.target as Node)) {\n return;\n }\n handler(event);\n };\n\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n\n return () => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n };\n }, [ref, handler, enabled]);\n}\n","import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { useControlled } from '../../hooks/use-controlled';\nimport { useClickOutside } from '../../hooks/use-click-outside';\nimport { useEscapeKeydown } from '../../hooks/use-escape-keydown';\nimport { Slot } from '../../primitives/slot';\nimport { composeRefs } from '../../utils/compose-refs';\nimport {\n DropdownProps,\n DropdownTriggerProps,\n DropdownContentProps,\n DropdownItemProps,\n DropdownContextValue,\n} from './types';\n\nconst DropdownContext = React.createContext<DropdownContextValue | undefined>(undefined);\n\nconst useDropdown = () => {\n const context = React.useContext(DropdownContext);\n if (!context) {\n throw new Error('useDropdown must be used within a Dropdown');\n }\n return context;\n};\n\nexport function Dropdown({\n children,\n open: openProp,\n onOpenChange: setOpenProp,\n defaultOpen = false,\n}: DropdownProps) {\n const [open, setOpen] = useControlled({\n value: openProp,\n onChange: setOpenProp,\n defaultValue: defaultOpen,\n });\n\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n\n const contextValue = React.useMemo(\n () => ({\n open: !!open,\n onOpenChange: setOpen,\n triggerRef,\n }),\n [open, setOpen]\n );\n\n return (\n <DropdownContext.Provider value={contextValue}>\n {children}\n </DropdownContext.Provider>\n );\n}\n\nconst DropdownTrigger = React.forwardRef<HTMLButtonElement, DropdownTriggerProps>(\n ({ asChild, onClick, ...props }, ref) => {\n const { open, onOpenChange, triggerRef } = useDropdown();\n const Comp = asChild ? Slot : 'button';\n const composedRef = composeRefs(ref, triggerRef);\n\n return (\n <Comp\n ref={composedRef}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n data-state={open ? 'open' : 'closed'}\n onClick={(e) => {\n onClick?.(e);\n onOpenChange(!open);\n }}\n {...props}\n />\n );\n }\n);\nDropdownTrigger.displayName = 'Dropdown.Trigger';\n\nconst DropdownContent = React.forwardRef<HTMLDivElement, DropdownContentProps>(\n ({ children, style, sideOffset = 4, align = 'center', ...props }, ref) => {\n const { open, onOpenChange, triggerRef } = useDropdown();\n const contentRef = React.useRef<HTMLDivElement>(null);\n const composedRef = composeRefs(ref, contentRef);\n const [position, setPosition] = React.useState<{ top: number; left: number }>({ top: 0, left: 0 });\n\n useClickOutside(contentRef, (e) => {\n // Ignore clicks on the trigger to avoid double-toggling\n if (triggerRef.current?.contains(e.target as Node)) {\n return;\n }\n onOpenChange(false);\n }, open);\n\n useEscapeKeydown(() => onOpenChange(false));\n\n React.useEffect(() => {\n if (open && triggerRef.current && contentRef.current) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n \n let top = triggerRect.bottom + sideOffset + window.scrollY;\n let left = triggerRect.left + window.scrollX;\n \n if (align === 'center') {\n left = triggerRect.left + window.scrollX + (triggerRect.width / 2) - (contentRect.width / 2);\n } else if (align === 'end') {\n left = triggerRect.right + window.scrollX - contentRect.width;\n }\n \n // Basic boundary check (optional, can be improved)\n // if (left < 0) left = 10;\n \n setPosition({ top, left });\n }\n }, [open, sideOffset, align]);\n\n if (!open) return null;\n\n return createPortal(\n <div\n ref={composedRef}\n role=\"menu\"\n style={{\n position: 'absolute',\n top: position.top,\n left: position.left,\n zIndex: 50,\n ...style,\n }}\n data-state={open ? 'open' : 'closed'}\n {...props}\n >\n {children}\n </div>,\n document.body\n );\n }\n);\nDropdownContent.displayName = 'Dropdown.Content';\n\nconst DropdownItem = React.forwardRef<HTMLDivElement, DropdownItemProps>(\n ({ asChild, onClick, onSelect, disabled, ...props }, ref) => {\n const { onOpenChange } = useDropdown();\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp\n ref={ref}\n role=\"menuitem\"\n aria-disabled={disabled}\n data-disabled={disabled}\n onClick={(e) => {\n if (disabled) return;\n onClick?.(e);\n onSelect?.(e);\n onOpenChange(false);\n }}\n {...props}\n />\n );\n }\n);\nDropdownItem.displayName = 'Dropdown.Item';\n\n// Attach subcomponents\nconst DropdownRoot = Dropdown as any;\nDropdownRoot.Trigger = DropdownTrigger;\nDropdownRoot.Content = DropdownContent;\nDropdownRoot.Item = DropdownItem;\n\nexport default DropdownRoot;\n","\nimport React, { createContext, useContext, useId } from \"react\";\nimport { useControlled } from \"../../hooks/use-controlled\";\nimport {\n TabsContentProps,\n TabsContextValue,\n TabsListProps,\n TabsProps,\n TabsTriggerProps,\n} from \"./types\";\n\nconst TabsContext = createContext<TabsContextValue | undefined>(undefined);\n\nfunction useTabsContext() {\n const context = useContext(TabsContext);\n if (!context) {\n throw new Error(\"Tabs compound components must be used within a Tabs component\");\n }\n return context;\n}\n\nconst Tabs = ({\n defaultValue,\n value: valueProp,\n onValueChange,\n children,\n className,\n}: TabsProps) => {\n const [value, setValue] = useControlled({\n value: valueProp,\n defaultValue,\n onChange: onValueChange,\n });\n\n return (\n <TabsContext.Provider value={{ value, onValueChange: setValue }}>\n <div className={className} data-value={value}>\n {children}\n </div>\n </TabsContext.Provider>\n );\n};\n\nconst TabsList = ({ children, className }: TabsListProps) => {\n return (\n <div role=\"tablist\" className={className}>\n {children}\n </div>\n );\n};\n\nconst TabsTrigger = ({\n value,\n children,\n className,\n disabled,\n}: TabsTriggerProps) => {\n const context = useTabsContext();\n const isActive = context.value === value;\n const id = useId();\n\n return (\n <button\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`tabpanel-${value}`}\n id={`tab-${value}`}\n disabled={disabled}\n data-state={isActive ? \"active\" : \"inactive\"}\n data-disabled={disabled ? \"\" : undefined}\n className={className}\n onClick={() => {\n if (!disabled) {\n context.onValueChange(value);\n }\n }}\n tabIndex={isActive ? 0 : -1}\n >\n {children}\n </button>\n );\n};\n\nconst TabsContent = ({ value, children, className }: TabsContentProps) => {\n const context = useTabsContext();\n const isActive = context.value === value;\n\n if (!isActive) return null;\n\n return (\n <div\n role=\"tabpanel\"\n id={`tabpanel-${value}`}\n aria-labelledby={`tab-${value}`}\n className={className}\n data-state={isActive ? \"active\" : \"inactive\"}\n tabIndex={0}\n >\n {children}\n </div>\n );\n};\n\nTabs.List = TabsList;\nTabs.Trigger = TabsTrigger;\nTabs.Content = TabsContent;\n\nexport { Tabs };\n","\nimport React from \"react\";\nimport { useControlled } from \"../../hooks/use-controlled\";\nimport { ToggleProps } from \"./types\";\nimport { Slot } from \"../../primitives/slot\";\n\nconst Toggle = React.forwardRef<HTMLButtonElement, ToggleProps>(\n (\n {\n defaultPressed = false,\n pressed: pressedProp,\n onPressedChange,\n disabled = false,\n className,\n children,\n asChild = false,\n \"aria-label\": ariaLabel,\n ...props\n },\n ref\n ) => {\n const [pressed, setPressed] = useControlled({\n value: pressedProp,\n defaultValue: defaultPressed,\n onChange: onPressedChange,\n });\n\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n ref={ref}\n type=\"button\"\n aria-pressed={pressed}\n data-state={pressed ? \"on\" : \"off\"}\n data-disabled={disabled ? \"\" : undefined}\n disabled={disabled}\n className={className}\n aria-label={ariaLabel}\n onClick={() => {\n if (!disabled) {\n setPressed(!pressed);\n }\n }}\n {...props}\n >\n {children}\n </Comp>\n );\n }\n);\n\nToggle.displayName = \"Toggle\";\n\nexport { Toggle };\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React8 from 'react';
|
|
2
|
-
import { useEffect } from 'react';
|
|
2
|
+
import React8__default, { createContext, useEffect, useId, useContext } from 'react';
|
|
3
3
|
import * as ReactDOM from 'react-dom';
|
|
4
4
|
import { createPortal } from 'react-dom';
|
|
5
5
|
import { jsx } from 'react/jsx-runtime';
|
|
@@ -518,7 +518,123 @@ DropdownRoot.Trigger = DropdownTrigger;
|
|
|
518
518
|
DropdownRoot.Content = DropdownContent;
|
|
519
519
|
DropdownRoot.Item = DropdownItem;
|
|
520
520
|
var dropdown_default = DropdownRoot;
|
|
521
|
+
var TabsContext = createContext(void 0);
|
|
522
|
+
function useTabsContext() {
|
|
523
|
+
const context = useContext(TabsContext);
|
|
524
|
+
if (!context) {
|
|
525
|
+
throw new Error("Tabs compound components must be used within a Tabs component");
|
|
526
|
+
}
|
|
527
|
+
return context;
|
|
528
|
+
}
|
|
529
|
+
var Tabs = ({
|
|
530
|
+
defaultValue,
|
|
531
|
+
value: valueProp,
|
|
532
|
+
onValueChange,
|
|
533
|
+
children,
|
|
534
|
+
className
|
|
535
|
+
}) => {
|
|
536
|
+
const [value, setValue] = useControlled({
|
|
537
|
+
value: valueProp,
|
|
538
|
+
defaultValue,
|
|
539
|
+
onChange: onValueChange
|
|
540
|
+
});
|
|
541
|
+
return /* @__PURE__ */ jsx(TabsContext.Provider, { value: { value, onValueChange: setValue }, children: /* @__PURE__ */ jsx("div", { className, "data-value": value, children }) });
|
|
542
|
+
};
|
|
543
|
+
var TabsList = ({ children, className }) => {
|
|
544
|
+
return /* @__PURE__ */ jsx("div", { role: "tablist", className, children });
|
|
545
|
+
};
|
|
546
|
+
var TabsTrigger = ({
|
|
547
|
+
value,
|
|
548
|
+
children,
|
|
549
|
+
className,
|
|
550
|
+
disabled
|
|
551
|
+
}) => {
|
|
552
|
+
const context = useTabsContext();
|
|
553
|
+
const isActive = context.value === value;
|
|
554
|
+
useId();
|
|
555
|
+
return /* @__PURE__ */ jsx(
|
|
556
|
+
"button",
|
|
557
|
+
{
|
|
558
|
+
role: "tab",
|
|
559
|
+
"aria-selected": isActive,
|
|
560
|
+
"aria-controls": `tabpanel-${value}`,
|
|
561
|
+
id: `tab-${value}`,
|
|
562
|
+
disabled,
|
|
563
|
+
"data-state": isActive ? "active" : "inactive",
|
|
564
|
+
"data-disabled": disabled ? "" : void 0,
|
|
565
|
+
className,
|
|
566
|
+
onClick: () => {
|
|
567
|
+
if (!disabled) {
|
|
568
|
+
context.onValueChange(value);
|
|
569
|
+
}
|
|
570
|
+
},
|
|
571
|
+
tabIndex: isActive ? 0 : -1,
|
|
572
|
+
children
|
|
573
|
+
}
|
|
574
|
+
);
|
|
575
|
+
};
|
|
576
|
+
var TabsContent = ({ value, children, className }) => {
|
|
577
|
+
const context = useTabsContext();
|
|
578
|
+
const isActive = context.value === value;
|
|
579
|
+
if (!isActive) return null;
|
|
580
|
+
return /* @__PURE__ */ jsx(
|
|
581
|
+
"div",
|
|
582
|
+
{
|
|
583
|
+
role: "tabpanel",
|
|
584
|
+
id: `tabpanel-${value}`,
|
|
585
|
+
"aria-labelledby": `tab-${value}`,
|
|
586
|
+
className,
|
|
587
|
+
"data-state": isActive ? "active" : "inactive",
|
|
588
|
+
tabIndex: 0,
|
|
589
|
+
children
|
|
590
|
+
}
|
|
591
|
+
);
|
|
592
|
+
};
|
|
593
|
+
Tabs.List = TabsList;
|
|
594
|
+
Tabs.Trigger = TabsTrigger;
|
|
595
|
+
Tabs.Content = TabsContent;
|
|
596
|
+
var Toggle = React8__default.forwardRef(
|
|
597
|
+
({
|
|
598
|
+
defaultPressed = false,
|
|
599
|
+
pressed: pressedProp,
|
|
600
|
+
onPressedChange,
|
|
601
|
+
disabled = false,
|
|
602
|
+
className,
|
|
603
|
+
children,
|
|
604
|
+
asChild = false,
|
|
605
|
+
"aria-label": ariaLabel,
|
|
606
|
+
...props
|
|
607
|
+
}, ref) => {
|
|
608
|
+
const [pressed, setPressed] = useControlled({
|
|
609
|
+
value: pressedProp,
|
|
610
|
+
defaultValue: defaultPressed,
|
|
611
|
+
onChange: onPressedChange
|
|
612
|
+
});
|
|
613
|
+
const Comp = asChild ? Slot : "button";
|
|
614
|
+
return /* @__PURE__ */ jsx(
|
|
615
|
+
Comp,
|
|
616
|
+
{
|
|
617
|
+
ref,
|
|
618
|
+
type: "button",
|
|
619
|
+
"aria-pressed": pressed,
|
|
620
|
+
"data-state": pressed ? "on" : "off",
|
|
621
|
+
"data-disabled": disabled ? "" : void 0,
|
|
622
|
+
disabled,
|
|
623
|
+
className,
|
|
624
|
+
"aria-label": ariaLabel,
|
|
625
|
+
onClick: () => {
|
|
626
|
+
if (!disabled) {
|
|
627
|
+
setPressed(!pressed);
|
|
628
|
+
}
|
|
629
|
+
},
|
|
630
|
+
...props,
|
|
631
|
+
children
|
|
632
|
+
}
|
|
633
|
+
);
|
|
634
|
+
}
|
|
635
|
+
);
|
|
636
|
+
Toggle.displayName = "Toggle";
|
|
521
637
|
|
|
522
|
-
export { button_default as Button, dialog_default as Dialog, dropdown_default as Dropdown, Slot, composeRefs, useBodyScrollLock, useClickOutside, useControlled, useEscapeKeydown, useFocusTrap, useStableId };
|
|
638
|
+
export { button_default as Button, dialog_default as Dialog, dropdown_default as Dropdown, Slot, Tabs, Toggle, composeRefs, useBodyScrollLock, useClickOutside, useControlled, useEscapeKeydown, useFocusTrap, useStableId };
|
|
523
639
|
//# sourceMappingURL=index.mjs.map
|
|
524
640
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/use-controlled.ts","../src/hooks/use-focus-trap.ts","../src/hooks/use-escape-keydown.ts","../src/hooks/use-body-scroll-lock.ts","../src/hooks/use-id.ts","../src/utils/compose-refs.ts","../src/primitives/slot.tsx","../src/components/dialog/dialog-context.ts","../src/components/dialog/dialog.tsx","../src/components/button/button.tsx","../src/hooks/use-click-outside.ts","../src/components/dropdown/dropdown.tsx"],"names":["React","React2","React3","React4","React5","React6","React7","React9","jsx","useEffect","React10","createPortal"],"mappings":"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","file":"index.mjs","sourcesContent":["import * as React from 'react';\n\ninterface UseControlledOptions<T> {\n /** Controlled value */\n value?: T;\n /** Default value for uncontrolled mode */\n defaultValue?: T;\n /** Change handler */\n onChange?: (value: T) => void;\n}\n\n/**\n * Hook for managing controlled/uncontrolled state pattern.\n * Supports both controlled (value + onChange) and uncontrolled (defaultValue) modes.\n * \n * @example\n * // Controlled\n * const [value, setValue] = useControlled({ value: externalValue, onChange: setExternalValue });\n * \n * // Uncontrolled\n * const [value, setValue] = useControlled({ defaultValue: false });\n */\nexport function useControlled<T>({\n value: valueProp,\n defaultValue,\n onChange,\n}: UseControlledOptions<T>): [T, (newValue: T) => void] {\n const [valueState, setValueState] = React.useState<T>(defaultValue as T);\n const isControlled = valueProp !== undefined;\n\n const value = isControlled ? valueProp : valueState;\n\n const setValue = React.useCallback(\n (newValue: T) => {\n if (!isControlled) {\n setValueState(newValue);\n }\n onChange?.(newValue);\n },\n [isControlled, onChange]\n );\n\n return [value as T, setValue];\n}\n","import * as React from 'react';\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'textarea:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\n/**\n * Hook for trapping focus within a container.\n * Handles Tab/Shift+Tab cycling and prevents focus escape.\n * \n * @param containerRef - Ref to the container element\n * @param enabled - Whether the focus trap is active\n * @param autoFocus - Whether to auto-focus the first element on mount\n */\nexport function useFocusTrap(\n containerRef: React.RefObject<HTMLElement | null>,\n enabled = true,\n autoFocus = true\n) {\n const previouslyFocusedElement = React.useRef<HTMLElement | null>(null);\n\n React.useEffect(() => {\n if (!enabled || !containerRef.current) return;\n\n const container = containerRef.current;\n\n // Store the previously focused element\n previouslyFocusedElement.current = document.activeElement as HTMLElement;\n\n // Get all focusable elements\n const getFocusableElements = (): HTMLElement[] => {\n return Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)\n );\n };\n\n // Auto-focus first element if enabled\n if (autoFocus) {\n const focusableElements = getFocusableElements();\n if (focusableElements.length > 0) {\n focusableElements[0].focus();\n }\n }\n\n // Handle Tab key to cycle focus\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return;\n\n const focusableElements = getFocusableElements();\n if (focusableElements.length === 0) return;\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n if (event.shiftKey) {\n // Shift + Tab: move focus to last element if on first\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement.focus();\n }\n } else {\n // Tab: move focus to first element if on last\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement.focus();\n }\n }\n };\n\n container.addEventListener('keydown', handleKeyDown);\n\n return () => {\n container.removeEventListener('keydown', handleKeyDown);\n\n // Restore focus to previously focused element\n if (previouslyFocusedElement.current) {\n previouslyFocusedElement.current.focus();\n }\n };\n }, [enabled, autoFocus, containerRef]);\n}\n","import * as React from 'react';\n\n/**\n * Hook for handling Escape key press events.\n * Automatically cleans up event listener on unmount.\n */\nexport function useEscapeKeydown(\n handler: (event: KeyboardEvent) => void,\n enabled = true\n) {\n React.useEffect(() => {\n if (!enabled) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n handler(event);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [handler, enabled]);\n}\n","import * as React from 'react';\n\n/**\n * Hook for preventing body scroll when a modal/dialog is open.\n * This is an accessibility requirement to prevent background scrolling.\n */\nexport function useBodyScrollLock(enabled = true) {\n React.useEffect(() => {\n if (!enabled) return;\n\n const originalOverflow = document.body.style.overflow;\n const originalPaddingRight = document.body.style.paddingRight;\n\n // Prevent scroll\n document.body.style.overflow = 'hidden';\n\n // Prevent layout shift by adding padding to compensate for scrollbar\n const scrollbarWidth =\n window.innerWidth - document.documentElement.clientWidth;\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n\n return () => {\n document.body.style.overflow = originalOverflow;\n document.body.style.paddingRight = originalPaddingRight;\n };\n }, [enabled]);\n}\n","import * as React from 'react';\n\nlet count = 0;\nfunction generateId() {\n return `headless-ui-${++count}`;\n}\n\n/**\n * Hook for generating stable, unique IDs.\n * Uses React's useId when available, with a fallback for older versions.\n */\nexport function useStableId(idProp?: string): string {\n const [id] = React.useState(() => idProp || generateId());\n return idProp || id;\n}\n","/**\n * Composes multiple refs into a single ref callback.\n * Useful when you need to forward a ref while also using it internally.\n */\nexport function composeRefs<T>(...refs: Array<React.Ref<T> | undefined>) {\n return (node: T | null) => {\n refs.forEach((ref) => {\n if (!ref) return;\n\n if (typeof ref === 'function') {\n ref(node);\n } else {\n (ref as React.MutableRefObject<T | null>).current = node;\n }\n });\n };\n}\n","import * as React from 'react';\nimport { composeRefs } from '../utils/compose-refs';\n\ninterface SlotProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode;\n}\n\n/**\n * Slot component for the asChild pattern.\n * When asChild is true, merges props with the child element instead of rendering a wrapper.\n */\nexport const Slot = React.forwardRef<HTMLElement, SlotProps>(\n (props, forwardedRef) => {\n const { children, ...slotProps } = props;\n\n if (!React.isValidElement(children)) {\n return null;\n }\n\n return React.cloneElement(children, {\n ...mergeProps(slotProps, children.props),\n ref: forwardedRef\n ? composeRefs(forwardedRef, (children as any).ref)\n : (children as any).ref,\n });\n }\n);\n\nSlot.displayName = 'Slot';\n\n/**\n * Merges props from the Slot with props from the child element.\n * Event handlers are composed, other props from child take precedence.\n */\nfunction mergeProps(slotProps: any, childProps: any) {\n const merged = { ...childProps };\n\n for (const key in childProps) {\n const slotValue = slotProps[key];\n const childValue = childProps[key];\n\n // Compose event handlers\n if (/^on[A-Z]/.test(key)) {\n if (slotValue && childValue) {\n merged[key] = (...args: any[]) => {\n childValue(...args);\n slotValue(...args);\n };\n } else if (slotValue) {\n merged[key] = slotValue;\n }\n }\n // Child props take precedence for non-event handlers\n else if (key === 'style') {\n merged[key] = { ...slotValue, ...childValue };\n } else if (key === 'className') {\n merged[key] = [slotValue, childValue].filter(Boolean).join(' ');\n }\n }\n\n // Add slot props that don't exist in child\n for (const key in slotProps) {\n if (!(key in childProps)) {\n merged[key] = slotProps[key];\n }\n }\n\n return merged;\n}\n","import * as React from 'react';\n\nexport interface DialogContextValue {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n triggerRef: React.RefObject<HTMLElement | null>;\n contentRef: React.RefObject<HTMLElement | null>;\n titleId: string;\n descriptionId: string;\n}\n\nexport const DialogContext = React.createContext<DialogContextValue | null>(\n null\n);\n\n/**\n * Hook to access Dialog context.\n * Throws an error if used outside of a Dialog component.\n */\nexport function useDialogContext(componentName: string): DialogContextValue {\n const context = React.useContext(DialogContext);\n\n if (!context) {\n throw new Error(\n `<${componentName}> must be used within a <Dialog> component.`\n );\n }\n\n return context;\n}\n","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { useControlled } from '../../hooks/use-controlled';\nimport { useFocusTrap } from '../../hooks/use-focus-trap';\nimport { useEscapeKeydown } from '../../hooks/use-escape-keydown';\nimport { useBodyScrollLock } from '../../hooks/use-body-scroll-lock';\nimport { useStableId } from '../../hooks/use-id';\nimport { Slot } from '../../primitives/slot';\nimport { DialogContext, useDialogContext } from './dialog-context';\nimport type {\n DialogProps,\n DialogTriggerProps,\n DialogPortalProps,\n DialogOverlayProps,\n DialogContentProps,\n DialogTitleProps,\n DialogDescriptionProps,\n DialogCloseProps,\n} from './types';\n\n/**\n * Dialog Root Component\n * \n * Provides context for all Dialog sub-components.\n * Supports both controlled and uncontrolled state.\n * \n * @example\n * // Controlled\n * <Dialog open={open} onOpenChange={setOpen}>\n * ...\n * </Dialog>\n * \n * // Uncontrolled\n * <Dialog defaultOpen={false}>\n * ...\n * </Dialog>\n */\nexport function Dialog({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n children,\n}: DialogProps) {\n const [open, setOpen] = useControlled({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const triggerRef = React.useRef<HTMLElement>(null);\n const contentRef = React.useRef<HTMLElement>(null);\n const titleId = useStableId();\n const descriptionId = useStableId();\n\n const contextValue = React.useMemo(\n () => ({\n open,\n onOpenChange: setOpen,\n triggerRef,\n contentRef,\n titleId,\n descriptionId,\n }),\n [open, setOpen, titleId, descriptionId]\n );\n\n return (\n <DialogContext.Provider value={contextValue}>\n {children}\n </DialogContext.Provider>\n );\n}\n\n/**\n * Dialog Trigger Component\n * \n * Button that opens the dialog when clicked.\n * Supports asChild pattern for custom elements.\n * \n * @example\n * <Dialog.Trigger>Open Dialog</Dialog.Trigger>\n * \n * // With asChild\n * <Dialog.Trigger asChild>\n * <button className=\"custom-button\">Open</button>\n * </Dialog.Trigger>\n */\nconst DialogTrigger = React.forwardRef<HTMLButtonElement, DialogTriggerProps>(\n ({ asChild = false, children, onClick, ...props }, forwardedRef) => {\n const { onOpenChange, triggerRef } = useDialogContext('Dialog.Trigger');\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n onOpenChange(true);\n };\n\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n ref={(node: any) => {\n if (forwardedRef) {\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else {\n forwardedRef.current = node;\n }\n }\n (triggerRef as React.MutableRefObject<HTMLElement | null>).current =\n node;\n }}\n type={asChild ? undefined : 'button'}\n onClick={handleClick}\n {...props}\n >\n {children}\n </Comp>\n );\n }\n);\n\nDialogTrigger.displayName = 'Dialog.Trigger';\n\n/**\n * Dialog Portal Component\n * \n * Renders children in a portal outside the DOM hierarchy.\n * Only renders when dialog is open.\n * \n * @example\n * <Dialog.Portal>\n * <Dialog.Overlay />\n * <Dialog.Content>...</Dialog.Content>\n * </Dialog.Portal>\n */\nfunction DialogPortal({ container, children }: DialogPortalProps) {\n const { open } = useDialogContext('Dialog.Portal');\n const [mounted, setMounted] = React.useState(false);\n\n React.useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!open || !mounted) return null;\n\n return ReactDOM.createPortal(\n children,\n container || document.body\n );\n}\n\n/**\n * Dialog Overlay Component\n * \n * Semi-transparent backdrop behind the dialog.\n * Clicking it closes the dialog.\n * \n * @example\n * <Dialog.Overlay style={{ backgroundColor: 'rgba(0, 0, 0, 0.5)' }} />\n */\nconst DialogOverlay = React.forwardRef<HTMLDivElement, DialogOverlayProps>(\n ({ onClick, ...props }, forwardedRef) => {\n const { onOpenChange } = useDialogContext('Dialog.Overlay');\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n onOpenChange(false);\n };\n\n return (\n <div\n ref={forwardedRef}\n onClick={handleClick}\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 9998,\n }}\n {...props}\n />\n );\n }\n);\n\nDialogOverlay.displayName = 'Dialog.Overlay';\n\n/**\n * Dialog Content Component\n * \n * Main container for dialog content.\n * Implements focus trap, keyboard handling, and ARIA attributes.\n * \n * @example\n * <Dialog.Content>\n * <Dialog.Title>Title</Dialog.Title>\n * <Dialog.Description>Description</Dialog.Description>\n * <Dialog.Close>Close</Dialog.Close>\n * </Dialog.Content>\n */\nconst DialogContent = React.forwardRef<HTMLDivElement, DialogContentProps>(\n (\n { onEscapeKeyDown, onOverlayClick, children, ...props },\n forwardedRef\n ) => {\n const { open, onOpenChange, contentRef, titleId, descriptionId } =\n useDialogContext('Dialog.Content');\n\n // Focus trap\n useFocusTrap(contentRef, open, true);\n\n // Body scroll lock\n useBodyScrollLock(open);\n\n // Escape key handling\n useEscapeKeydown(\n (event) => {\n onEscapeKeyDown?.(event);\n onOpenChange(false);\n },\n open\n );\n\n // Prevent clicks inside content from closing dialog\n const handleContentClick = (event: React.MouseEvent<HTMLDivElement>) => {\n event.stopPropagation();\n };\n\n return (\n <div\n ref={(node) => {\n if (forwardedRef) {\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else {\n forwardedRef.current = node;\n }\n }\n (contentRef as React.MutableRefObject<HTMLDivElement | null>).current =\n node;\n }}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n onClick={handleContentClick}\n style={{\n position: 'fixed',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 9999,\n }}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nDialogContent.displayName = 'Dialog.Content';\n\n/**\n * Dialog Title Component\n * \n * Title for the dialog, linked via aria-labelledby.\n * \n * @example\n * <Dialog.Title>Confirm Action</Dialog.Title>\n */\nconst DialogTitle = React.forwardRef<HTMLHeadingElement, DialogTitleProps>(\n ({ children, ...props }, forwardedRef) => {\n const { titleId } = useDialogContext('Dialog.Title');\n\n return (\n <h2 ref={forwardedRef} id={titleId} {...props}>\n {children}\n </h2>\n );\n }\n);\n\nDialogTitle.displayName = 'Dialog.Title';\n\n/**\n * Dialog Description Component\n * \n * Description for the dialog, linked via aria-describedby.\n * \n * @example\n * <Dialog.Description>This action cannot be undone.</Dialog.Description>\n */\nconst DialogDescription = React.forwardRef<\n HTMLParagraphElement,\n DialogDescriptionProps\n>(({ children, ...props }, forwardedRef) => {\n const { descriptionId } = useDialogContext('Dialog.Description');\n\n return (\n <p ref={forwardedRef} id={descriptionId} {...props}>\n {children}\n </p>\n );\n});\n\nDialogDescription.displayName = 'Dialog.Description';\n\n/**\n * Dialog Close Component\n * \n * Button that closes the dialog when clicked.\n * Supports asChild pattern for custom elements.\n * \n * @example\n * <Dialog.Close>Cancel</Dialog.Close>\n * \n * // With asChild\n * <Dialog.Close asChild>\n * <button className=\"custom-button\">Close</button>\n * </Dialog.Close>\n */\nconst DialogClose = React.forwardRef<HTMLButtonElement, DialogCloseProps>(\n ({ asChild = false, children, onClick, ...props }, forwardedRef) => {\n const { onOpenChange } = useDialogContext('Dialog.Close');\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n onOpenChange(false);\n };\n\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n ref={forwardedRef}\n type={asChild ? undefined : 'button'}\n onClick={handleClick}\n {...props}\n >\n {children}\n </Comp>\n );\n }\n);\n\nDialogClose.displayName = 'Dialog.Close';\n\n// Attach sub-components to Dialog\nDialog.Trigger = DialogTrigger;\nDialog.Portal = DialogPortal;\nDialog.Overlay = DialogOverlay;\nDialog.Content = DialogContent;\nDialog.Title = DialogTitle;\nDialog.Description = DialogDescription;\nDialog.Close = DialogClose;\n\n// Type augmentation for compound components\nexport interface DialogComponent extends React.FC<DialogProps> {\n Trigger: typeof DialogTrigger;\n Portal: typeof DialogPortal;\n Overlay: typeof DialogOverlay;\n Content: typeof DialogContent;\n Title: typeof DialogTitle;\n Description: typeof DialogDescription;\n Close: typeof DialogClose;\n}\n\nexport default Dialog as DialogComponent;\n","import * as React from 'react';\nimport { Slot } from '../../primitives/slot';\nimport { ButtonProps } from './types';\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n return <Comp ref={ref} {...props} />;\n }\n);\n\nButton.displayName = 'Button';\n\nexport default Button;\n","import { useEffect } from 'react';\n\ntype Handler = (event: MouseEvent | TouchEvent) => void;\n\nexport function useClickOutside(\n ref: React.RefObject<HTMLElement | null>,\n handler: Handler,\n enabled: boolean = true\n) {\n useEffect(() => {\n if (!enabled) return;\n\n const listener = (event: MouseEvent | TouchEvent) => {\n const el = ref.current;\n if (!el || el.contains(event.target as Node)) {\n return;\n }\n handler(event);\n };\n\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n\n return () => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n };\n }, [ref, handler, enabled]);\n}\n","import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { useControlled } from '../../hooks/use-controlled';\nimport { useClickOutside } from '../../hooks/use-click-outside';\nimport { useEscapeKeydown } from '../../hooks/use-escape-keydown';\nimport { Slot } from '../../primitives/slot';\nimport { composeRefs } from '../../utils/compose-refs';\nimport {\n DropdownProps,\n DropdownTriggerProps,\n DropdownContentProps,\n DropdownItemProps,\n DropdownContextValue,\n} from './types';\n\nconst DropdownContext = React.createContext<DropdownContextValue | undefined>(undefined);\n\nconst useDropdown = () => {\n const context = React.useContext(DropdownContext);\n if (!context) {\n throw new Error('useDropdown must be used within a Dropdown');\n }\n return context;\n};\n\nexport function Dropdown({\n children,\n open: openProp,\n onOpenChange: setOpenProp,\n defaultOpen = false,\n}: DropdownProps) {\n const [open, setOpen] = useControlled({\n value: openProp,\n onChange: setOpenProp,\n defaultValue: defaultOpen,\n });\n\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n\n const contextValue = React.useMemo(\n () => ({\n open: !!open,\n onOpenChange: setOpen,\n triggerRef,\n }),\n [open, setOpen]\n );\n\n return (\n <DropdownContext.Provider value={contextValue}>\n {children}\n </DropdownContext.Provider>\n );\n}\n\nconst DropdownTrigger = React.forwardRef<HTMLButtonElement, DropdownTriggerProps>(\n ({ asChild, onClick, ...props }, ref) => {\n const { open, onOpenChange, triggerRef } = useDropdown();\n const Comp = asChild ? Slot : 'button';\n const composedRef = composeRefs(ref, triggerRef);\n\n return (\n <Comp\n ref={composedRef}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n data-state={open ? 'open' : 'closed'}\n onClick={(e) => {\n onClick?.(e);\n onOpenChange(!open);\n }}\n {...props}\n />\n );\n }\n);\nDropdownTrigger.displayName = 'Dropdown.Trigger';\n\nconst DropdownContent = React.forwardRef<HTMLDivElement, DropdownContentProps>(\n ({ children, style, sideOffset = 4, align = 'center', ...props }, ref) => {\n const { open, onOpenChange, triggerRef } = useDropdown();\n const contentRef = React.useRef<HTMLDivElement>(null);\n const composedRef = composeRefs(ref, contentRef);\n const [position, setPosition] = React.useState<{ top: number; left: number }>({ top: 0, left: 0 });\n\n useClickOutside(contentRef, (e) => {\n // Ignore clicks on the trigger to avoid double-toggling\n if (triggerRef.current?.contains(e.target as Node)) {\n return;\n }\n onOpenChange(false);\n }, open);\n\n useEscapeKeydown(() => onOpenChange(false));\n\n React.useEffect(() => {\n if (open && triggerRef.current && contentRef.current) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n \n let top = triggerRect.bottom + sideOffset + window.scrollY;\n let left = triggerRect.left + window.scrollX;\n \n if (align === 'center') {\n left = triggerRect.left + window.scrollX + (triggerRect.width / 2) - (contentRect.width / 2);\n } else if (align === 'end') {\n left = triggerRect.right + window.scrollX - contentRect.width;\n }\n \n // Basic boundary check (optional, can be improved)\n // if (left < 0) left = 10;\n \n setPosition({ top, left });\n }\n }, [open, sideOffset, align]);\n\n if (!open) return null;\n\n return createPortal(\n <div\n ref={composedRef}\n role=\"menu\"\n style={{\n position: 'absolute',\n top: position.top,\n left: position.left,\n zIndex: 50,\n ...style,\n }}\n data-state={open ? 'open' : 'closed'}\n {...props}\n >\n {children}\n </div>,\n document.body\n );\n }\n);\nDropdownContent.displayName = 'Dropdown.Content';\n\nconst DropdownItem = React.forwardRef<HTMLDivElement, DropdownItemProps>(\n ({ asChild, onClick, onSelect, disabled, ...props }, ref) => {\n const { onOpenChange } = useDropdown();\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp\n ref={ref}\n role=\"menuitem\"\n aria-disabled={disabled}\n data-disabled={disabled}\n onClick={(e) => {\n if (disabled) return;\n onClick?.(e);\n onSelect?.(e);\n onOpenChange(false);\n }}\n {...props}\n />\n );\n }\n);\nDropdownItem.displayName = 'Dropdown.Item';\n\n// Attach subcomponents\nconst DropdownRoot = Dropdown as any;\nDropdownRoot.Trigger = DropdownTrigger;\nDropdownRoot.Content = DropdownContent;\nDropdownRoot.Item = DropdownItem;\n\nexport default DropdownRoot;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-controlled.ts","../src/hooks/use-focus-trap.ts","../src/hooks/use-escape-keydown.ts","../src/hooks/use-body-scroll-lock.ts","../src/hooks/use-id.ts","../src/utils/compose-refs.ts","../src/primitives/slot.tsx","../src/components/dialog/dialog-context.ts","../src/components/dialog/dialog.tsx","../src/components/button/button.tsx","../src/hooks/use-click-outside.ts","../src/components/dropdown/dropdown.tsx","../src/components/tabs/tabs.tsx","../src/components/toggle/toggle.tsx"],"names":["React","React2","React3","React4","React5","React6","React7","React9","jsx","useEffect","React10","createPortal","createContext","useContext"],"mappings":"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","file":"index.mjs","sourcesContent":["import * as React from 'react';\n\ninterface UseControlledOptions<T> {\n /** Controlled value */\n value?: T;\n /** Default value for uncontrolled mode */\n defaultValue?: T;\n /** Change handler */\n onChange?: (value: T) => void;\n}\n\n/**\n * Hook for managing controlled/uncontrolled state pattern.\n * Supports both controlled (value + onChange) and uncontrolled (defaultValue) modes.\n * \n * @example\n * // Controlled\n * const [value, setValue] = useControlled({ value: externalValue, onChange: setExternalValue });\n * \n * // Uncontrolled\n * const [value, setValue] = useControlled({ defaultValue: false });\n */\nexport function useControlled<T>({\n value: valueProp,\n defaultValue,\n onChange,\n}: UseControlledOptions<T>): [T, (newValue: T) => void] {\n const [valueState, setValueState] = React.useState<T>(defaultValue as T);\n const isControlled = valueProp !== undefined;\n\n const value = isControlled ? valueProp : valueState;\n\n const setValue = React.useCallback(\n (newValue: T) => {\n if (!isControlled) {\n setValueState(newValue);\n }\n onChange?.(newValue);\n },\n [isControlled, onChange]\n );\n\n return [value as T, setValue];\n}\n","import * as React from 'react';\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'textarea:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\n/**\n * Hook for trapping focus within a container.\n * Handles Tab/Shift+Tab cycling and prevents focus escape.\n * \n * @param containerRef - Ref to the container element\n * @param enabled - Whether the focus trap is active\n * @param autoFocus - Whether to auto-focus the first element on mount\n */\nexport function useFocusTrap(\n containerRef: React.RefObject<HTMLElement | null>,\n enabled = true,\n autoFocus = true\n) {\n const previouslyFocusedElement = React.useRef<HTMLElement | null>(null);\n\n React.useEffect(() => {\n if (!enabled || !containerRef.current) return;\n\n const container = containerRef.current;\n\n // Store the previously focused element\n previouslyFocusedElement.current = document.activeElement as HTMLElement;\n\n // Get all focusable elements\n const getFocusableElements = (): HTMLElement[] => {\n return Array.from(\n container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)\n );\n };\n\n // Auto-focus first element if enabled\n if (autoFocus) {\n const focusableElements = getFocusableElements();\n if (focusableElements.length > 0) {\n focusableElements[0].focus();\n }\n }\n\n // Handle Tab key to cycle focus\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return;\n\n const focusableElements = getFocusableElements();\n if (focusableElements.length === 0) return;\n\n const firstElement = focusableElements[0];\n const lastElement = focusableElements[focusableElements.length - 1];\n\n if (event.shiftKey) {\n // Shift + Tab: move focus to last element if on first\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement.focus();\n }\n } else {\n // Tab: move focus to first element if on last\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement.focus();\n }\n }\n };\n\n container.addEventListener('keydown', handleKeyDown);\n\n return () => {\n container.removeEventListener('keydown', handleKeyDown);\n\n // Restore focus to previously focused element\n if (previouslyFocusedElement.current) {\n previouslyFocusedElement.current.focus();\n }\n };\n }, [enabled, autoFocus, containerRef]);\n}\n","import * as React from 'react';\n\n/**\n * Hook for handling Escape key press events.\n * Automatically cleans up event listener on unmount.\n */\nexport function useEscapeKeydown(\n handler: (event: KeyboardEvent) => void,\n enabled = true\n) {\n React.useEffect(() => {\n if (!enabled) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n handler(event);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [handler, enabled]);\n}\n","import * as React from 'react';\n\n/**\n * Hook for preventing body scroll when a modal/dialog is open.\n * This is an accessibility requirement to prevent background scrolling.\n */\nexport function useBodyScrollLock(enabled = true) {\n React.useEffect(() => {\n if (!enabled) return;\n\n const originalOverflow = document.body.style.overflow;\n const originalPaddingRight = document.body.style.paddingRight;\n\n // Prevent scroll\n document.body.style.overflow = 'hidden';\n\n // Prevent layout shift by adding padding to compensate for scrollbar\n const scrollbarWidth =\n window.innerWidth - document.documentElement.clientWidth;\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n\n return () => {\n document.body.style.overflow = originalOverflow;\n document.body.style.paddingRight = originalPaddingRight;\n };\n }, [enabled]);\n}\n","import * as React from 'react';\n\nlet count = 0;\nfunction generateId() {\n return `headless-ui-${++count}`;\n}\n\n/**\n * Hook for generating stable, unique IDs.\n * Uses React's useId when available, with a fallback for older versions.\n */\nexport function useStableId(idProp?: string): string {\n const [id] = React.useState(() => idProp || generateId());\n return idProp || id;\n}\n","/**\n * Composes multiple refs into a single ref callback.\n * Useful when you need to forward a ref while also using it internally.\n */\nexport function composeRefs<T>(...refs: Array<React.Ref<T> | undefined>) {\n return (node: T | null) => {\n refs.forEach((ref) => {\n if (!ref) return;\n\n if (typeof ref === 'function') {\n ref(node);\n } else {\n (ref as React.MutableRefObject<T | null>).current = node;\n }\n });\n };\n}\n","import * as React from 'react';\nimport { composeRefs } from '../utils/compose-refs';\n\ninterface SlotProps extends React.HTMLAttributes<HTMLElement> {\n children?: React.ReactNode;\n}\n\n/**\n * Slot component for the asChild pattern.\n * When asChild is true, merges props with the child element instead of rendering a wrapper.\n */\nexport const Slot = React.forwardRef<HTMLElement, SlotProps>(\n (props, forwardedRef) => {\n const { children, ...slotProps } = props;\n\n if (!React.isValidElement(children)) {\n return null;\n }\n\n return React.cloneElement(children, {\n ...mergeProps(slotProps, children.props),\n ref: forwardedRef\n ? composeRefs(forwardedRef, (children as any).ref)\n : (children as any).ref,\n });\n }\n);\n\nSlot.displayName = 'Slot';\n\n/**\n * Merges props from the Slot with props from the child element.\n * Event handlers are composed, other props from child take precedence.\n */\nfunction mergeProps(slotProps: any, childProps: any) {\n const merged = { ...childProps };\n\n for (const key in childProps) {\n const slotValue = slotProps[key];\n const childValue = childProps[key];\n\n // Compose event handlers\n if (/^on[A-Z]/.test(key)) {\n if (slotValue && childValue) {\n merged[key] = (...args: any[]) => {\n childValue(...args);\n slotValue(...args);\n };\n } else if (slotValue) {\n merged[key] = slotValue;\n }\n }\n // Child props take precedence for non-event handlers\n else if (key === 'style') {\n merged[key] = { ...slotValue, ...childValue };\n } else if (key === 'className') {\n merged[key] = [slotValue, childValue].filter(Boolean).join(' ');\n }\n }\n\n // Add slot props that don't exist in child\n for (const key in slotProps) {\n if (!(key in childProps)) {\n merged[key] = slotProps[key];\n }\n }\n\n return merged;\n}\n","import * as React from 'react';\n\nexport interface DialogContextValue {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n triggerRef: React.RefObject<HTMLElement | null>;\n contentRef: React.RefObject<HTMLElement | null>;\n titleId: string;\n descriptionId: string;\n}\n\nexport const DialogContext = React.createContext<DialogContextValue | null>(\n null\n);\n\n/**\n * Hook to access Dialog context.\n * Throws an error if used outside of a Dialog component.\n */\nexport function useDialogContext(componentName: string): DialogContextValue {\n const context = React.useContext(DialogContext);\n\n if (!context) {\n throw new Error(\n `<${componentName}> must be used within a <Dialog> component.`\n );\n }\n\n return context;\n}\n","import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { useControlled } from '../../hooks/use-controlled';\nimport { useFocusTrap } from '../../hooks/use-focus-trap';\nimport { useEscapeKeydown } from '../../hooks/use-escape-keydown';\nimport { useBodyScrollLock } from '../../hooks/use-body-scroll-lock';\nimport { useStableId } from '../../hooks/use-id';\nimport { Slot } from '../../primitives/slot';\nimport { DialogContext, useDialogContext } from './dialog-context';\nimport type {\n DialogProps,\n DialogTriggerProps,\n DialogPortalProps,\n DialogOverlayProps,\n DialogContentProps,\n DialogTitleProps,\n DialogDescriptionProps,\n DialogCloseProps,\n} from './types';\n\n/**\n * Dialog Root Component\n * \n * Provides context for all Dialog sub-components.\n * Supports both controlled and uncontrolled state.\n * \n * @example\n * // Controlled\n * <Dialog open={open} onOpenChange={setOpen}>\n * ...\n * </Dialog>\n * \n * // Uncontrolled\n * <Dialog defaultOpen={false}>\n * ...\n * </Dialog>\n */\nexport function Dialog({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n children,\n}: DialogProps) {\n const [open, setOpen] = useControlled({\n value: openProp,\n defaultValue: defaultOpen,\n onChange: onOpenChange,\n });\n\n const triggerRef = React.useRef<HTMLElement>(null);\n const contentRef = React.useRef<HTMLElement>(null);\n const titleId = useStableId();\n const descriptionId = useStableId();\n\n const contextValue = React.useMemo(\n () => ({\n open,\n onOpenChange: setOpen,\n triggerRef,\n contentRef,\n titleId,\n descriptionId,\n }),\n [open, setOpen, titleId, descriptionId]\n );\n\n return (\n <DialogContext.Provider value={contextValue}>\n {children}\n </DialogContext.Provider>\n );\n}\n\n/**\n * Dialog Trigger Component\n * \n * Button that opens the dialog when clicked.\n * Supports asChild pattern for custom elements.\n * \n * @example\n * <Dialog.Trigger>Open Dialog</Dialog.Trigger>\n * \n * // With asChild\n * <Dialog.Trigger asChild>\n * <button className=\"custom-button\">Open</button>\n * </Dialog.Trigger>\n */\nconst DialogTrigger = React.forwardRef<HTMLButtonElement, DialogTriggerProps>(\n ({ asChild = false, children, onClick, ...props }, forwardedRef) => {\n const { onOpenChange, triggerRef } = useDialogContext('Dialog.Trigger');\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n onOpenChange(true);\n };\n\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n ref={(node: any) => {\n if (forwardedRef) {\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else {\n forwardedRef.current = node;\n }\n }\n (triggerRef as React.MutableRefObject<HTMLElement | null>).current =\n node;\n }}\n type={asChild ? undefined : 'button'}\n onClick={handleClick}\n {...props}\n >\n {children}\n </Comp>\n );\n }\n);\n\nDialogTrigger.displayName = 'Dialog.Trigger';\n\n/**\n * Dialog Portal Component\n * \n * Renders children in a portal outside the DOM hierarchy.\n * Only renders when dialog is open.\n * \n * @example\n * <Dialog.Portal>\n * <Dialog.Overlay />\n * <Dialog.Content>...</Dialog.Content>\n * </Dialog.Portal>\n */\nfunction DialogPortal({ container, children }: DialogPortalProps) {\n const { open } = useDialogContext('Dialog.Portal');\n const [mounted, setMounted] = React.useState(false);\n\n React.useEffect(() => {\n setMounted(true);\n }, []);\n\n if (!open || !mounted) return null;\n\n return ReactDOM.createPortal(\n children,\n container || document.body\n );\n}\n\n/**\n * Dialog Overlay Component\n * \n * Semi-transparent backdrop behind the dialog.\n * Clicking it closes the dialog.\n * \n * @example\n * <Dialog.Overlay style={{ backgroundColor: 'rgba(0, 0, 0, 0.5)' }} />\n */\nconst DialogOverlay = React.forwardRef<HTMLDivElement, DialogOverlayProps>(\n ({ onClick, ...props }, forwardedRef) => {\n const { onOpenChange } = useDialogContext('Dialog.Overlay');\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n onOpenChange(false);\n };\n\n return (\n <div\n ref={forwardedRef}\n onClick={handleClick}\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 9998,\n }}\n {...props}\n />\n );\n }\n);\n\nDialogOverlay.displayName = 'Dialog.Overlay';\n\n/**\n * Dialog Content Component\n * \n * Main container for dialog content.\n * Implements focus trap, keyboard handling, and ARIA attributes.\n * \n * @example\n * <Dialog.Content>\n * <Dialog.Title>Title</Dialog.Title>\n * <Dialog.Description>Description</Dialog.Description>\n * <Dialog.Close>Close</Dialog.Close>\n * </Dialog.Content>\n */\nconst DialogContent = React.forwardRef<HTMLDivElement, DialogContentProps>(\n (\n { onEscapeKeyDown, onOverlayClick, children, ...props },\n forwardedRef\n ) => {\n const { open, onOpenChange, contentRef, titleId, descriptionId } =\n useDialogContext('Dialog.Content');\n\n // Focus trap\n useFocusTrap(contentRef, open, true);\n\n // Body scroll lock\n useBodyScrollLock(open);\n\n // Escape key handling\n useEscapeKeydown(\n (event) => {\n onEscapeKeyDown?.(event);\n onOpenChange(false);\n },\n open\n );\n\n // Prevent clicks inside content from closing dialog\n const handleContentClick = (event: React.MouseEvent<HTMLDivElement>) => {\n event.stopPropagation();\n };\n\n return (\n <div\n ref={(node) => {\n if (forwardedRef) {\n if (typeof forwardedRef === 'function') {\n forwardedRef(node);\n } else {\n forwardedRef.current = node;\n }\n }\n (contentRef as React.MutableRefObject<HTMLDivElement | null>).current =\n node;\n }}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={descriptionId}\n onClick={handleContentClick}\n style={{\n position: 'fixed',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 9999,\n }}\n {...props}\n >\n {children}\n </div>\n );\n }\n);\n\nDialogContent.displayName = 'Dialog.Content';\n\n/**\n * Dialog Title Component\n * \n * Title for the dialog, linked via aria-labelledby.\n * \n * @example\n * <Dialog.Title>Confirm Action</Dialog.Title>\n */\nconst DialogTitle = React.forwardRef<HTMLHeadingElement, DialogTitleProps>(\n ({ children, ...props }, forwardedRef) => {\n const { titleId } = useDialogContext('Dialog.Title');\n\n return (\n <h2 ref={forwardedRef} id={titleId} {...props}>\n {children}\n </h2>\n );\n }\n);\n\nDialogTitle.displayName = 'Dialog.Title';\n\n/**\n * Dialog Description Component\n * \n * Description for the dialog, linked via aria-describedby.\n * \n * @example\n * <Dialog.Description>This action cannot be undone.</Dialog.Description>\n */\nconst DialogDescription = React.forwardRef<\n HTMLParagraphElement,\n DialogDescriptionProps\n>(({ children, ...props }, forwardedRef) => {\n const { descriptionId } = useDialogContext('Dialog.Description');\n\n return (\n <p ref={forwardedRef} id={descriptionId} {...props}>\n {children}\n </p>\n );\n});\n\nDialogDescription.displayName = 'Dialog.Description';\n\n/**\n * Dialog Close Component\n * \n * Button that closes the dialog when clicked.\n * Supports asChild pattern for custom elements.\n * \n * @example\n * <Dialog.Close>Cancel</Dialog.Close>\n * \n * // With asChild\n * <Dialog.Close asChild>\n * <button className=\"custom-button\">Close</button>\n * </Dialog.Close>\n */\nconst DialogClose = React.forwardRef<HTMLButtonElement, DialogCloseProps>(\n ({ asChild = false, children, onClick, ...props }, forwardedRef) => {\n const { onOpenChange } = useDialogContext('Dialog.Close');\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n onOpenChange(false);\n };\n\n const Comp = asChild ? Slot : 'button';\n\n return (\n <Comp\n ref={forwardedRef}\n type={asChild ? undefined : 'button'}\n onClick={handleClick}\n {...props}\n >\n {children}\n </Comp>\n );\n }\n);\n\nDialogClose.displayName = 'Dialog.Close';\n\n// Attach sub-components to Dialog\nDialog.Trigger = DialogTrigger;\nDialog.Portal = DialogPortal;\nDialog.Overlay = DialogOverlay;\nDialog.Content = DialogContent;\nDialog.Title = DialogTitle;\nDialog.Description = DialogDescription;\nDialog.Close = DialogClose;\n\n// Type augmentation for compound components\nexport interface DialogComponent extends React.FC<DialogProps> {\n Trigger: typeof DialogTrigger;\n Portal: typeof DialogPortal;\n Overlay: typeof DialogOverlay;\n Content: typeof DialogContent;\n Title: typeof DialogTitle;\n Description: typeof DialogDescription;\n Close: typeof DialogClose;\n}\n\nexport default Dialog as DialogComponent;\n","import * as React from 'react';\nimport { Slot } from '../../primitives/slot';\nimport { ButtonProps } from './types';\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button';\n return <Comp ref={ref} {...props} />;\n }\n);\n\nButton.displayName = 'Button';\n\nexport default Button;\n","import { useEffect } from 'react';\n\ntype Handler = (event: MouseEvent | TouchEvent) => void;\n\nexport function useClickOutside(\n ref: React.RefObject<HTMLElement | null>,\n handler: Handler,\n enabled: boolean = true\n) {\n useEffect(() => {\n if (!enabled) return;\n\n const listener = (event: MouseEvent | TouchEvent) => {\n const el = ref.current;\n if (!el || el.contains(event.target as Node)) {\n return;\n }\n handler(event);\n };\n\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n\n return () => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n };\n }, [ref, handler, enabled]);\n}\n","import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { useControlled } from '../../hooks/use-controlled';\nimport { useClickOutside } from '../../hooks/use-click-outside';\nimport { useEscapeKeydown } from '../../hooks/use-escape-keydown';\nimport { Slot } from '../../primitives/slot';\nimport { composeRefs } from '../../utils/compose-refs';\nimport {\n DropdownProps,\n DropdownTriggerProps,\n DropdownContentProps,\n DropdownItemProps,\n DropdownContextValue,\n} from './types';\n\nconst DropdownContext = React.createContext<DropdownContextValue | undefined>(undefined);\n\nconst useDropdown = () => {\n const context = React.useContext(DropdownContext);\n if (!context) {\n throw new Error('useDropdown must be used within a Dropdown');\n }\n return context;\n};\n\nexport function Dropdown({\n children,\n open: openProp,\n onOpenChange: setOpenProp,\n defaultOpen = false,\n}: DropdownProps) {\n const [open, setOpen] = useControlled({\n value: openProp,\n onChange: setOpenProp,\n defaultValue: defaultOpen,\n });\n\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n\n const contextValue = React.useMemo(\n () => ({\n open: !!open,\n onOpenChange: setOpen,\n triggerRef,\n }),\n [open, setOpen]\n );\n\n return (\n <DropdownContext.Provider value={contextValue}>\n {children}\n </DropdownContext.Provider>\n );\n}\n\nconst DropdownTrigger = React.forwardRef<HTMLButtonElement, DropdownTriggerProps>(\n ({ asChild, onClick, ...props }, ref) => {\n const { open, onOpenChange, triggerRef } = useDropdown();\n const Comp = asChild ? Slot : 'button';\n const composedRef = composeRefs(ref, triggerRef);\n\n return (\n <Comp\n ref={composedRef}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n data-state={open ? 'open' : 'closed'}\n onClick={(e) => {\n onClick?.(e);\n onOpenChange(!open);\n }}\n {...props}\n />\n );\n }\n);\nDropdownTrigger.displayName = 'Dropdown.Trigger';\n\nconst DropdownContent = React.forwardRef<HTMLDivElement, DropdownContentProps>(\n ({ children, style, sideOffset = 4, align = 'center', ...props }, ref) => {\n const { open, onOpenChange, triggerRef } = useDropdown();\n const contentRef = React.useRef<HTMLDivElement>(null);\n const composedRef = composeRefs(ref, contentRef);\n const [position, setPosition] = React.useState<{ top: number; left: number }>({ top: 0, left: 0 });\n\n useClickOutside(contentRef, (e) => {\n // Ignore clicks on the trigger to avoid double-toggling\n if (triggerRef.current?.contains(e.target as Node)) {\n return;\n }\n onOpenChange(false);\n }, open);\n\n useEscapeKeydown(() => onOpenChange(false));\n\n React.useEffect(() => {\n if (open && triggerRef.current && contentRef.current) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n \n let top = triggerRect.bottom + sideOffset + window.scrollY;\n let left = triggerRect.left + window.scrollX;\n \n if (align === 'center') {\n left = triggerRect.left + window.scrollX + (triggerRect.width / 2) - (contentRect.width / 2);\n } else if (align === 'end') {\n left = triggerRect.right + window.scrollX - contentRect.width;\n }\n \n // Basic boundary check (optional, can be improved)\n // if (left < 0) left = 10;\n \n setPosition({ top, left });\n }\n }, [open, sideOffset, align]);\n\n if (!open) return null;\n\n return createPortal(\n <div\n ref={composedRef}\n role=\"menu\"\n style={{\n position: 'absolute',\n top: position.top,\n left: position.left,\n zIndex: 50,\n ...style,\n }}\n data-state={open ? 'open' : 'closed'}\n {...props}\n >\n {children}\n </div>,\n document.body\n );\n }\n);\nDropdownContent.displayName = 'Dropdown.Content';\n\nconst DropdownItem = React.forwardRef<HTMLDivElement, DropdownItemProps>(\n ({ asChild, onClick, onSelect, disabled, ...props }, ref) => {\n const { onOpenChange } = useDropdown();\n const Comp = asChild ? Slot : 'div';\n\n return (\n <Comp\n ref={ref}\n role=\"menuitem\"\n aria-disabled={disabled}\n data-disabled={disabled}\n onClick={(e) => {\n if (disabled) return;\n onClick?.(e);\n onSelect?.(e);\n onOpenChange(false);\n }}\n {...props}\n />\n );\n }\n);\nDropdownItem.displayName = 'Dropdown.Item';\n\n// Attach subcomponents\nconst DropdownRoot = Dropdown as any;\nDropdownRoot.Trigger = DropdownTrigger;\nDropdownRoot.Content = DropdownContent;\nDropdownRoot.Item = DropdownItem;\n\nexport default DropdownRoot;\n","\nimport React, { createContext, useContext, useId } from \"react\";\nimport { useControlled } from \"../../hooks/use-controlled\";\nimport {\n TabsContentProps,\n TabsContextValue,\n TabsListProps,\n TabsProps,\n TabsTriggerProps,\n} from \"./types\";\n\nconst TabsContext = createContext<TabsContextValue | undefined>(undefined);\n\nfunction useTabsContext() {\n const context = useContext(TabsContext);\n if (!context) {\n throw new Error(\"Tabs compound components must be used within a Tabs component\");\n }\n return context;\n}\n\nconst Tabs = ({\n defaultValue,\n value: valueProp,\n onValueChange,\n children,\n className,\n}: TabsProps) => {\n const [value, setValue] = useControlled({\n value: valueProp,\n defaultValue,\n onChange: onValueChange,\n });\n\n return (\n <TabsContext.Provider value={{ value, onValueChange: setValue }}>\n <div className={className} data-value={value}>\n {children}\n </div>\n </TabsContext.Provider>\n );\n};\n\nconst TabsList = ({ children, className }: TabsListProps) => {\n return (\n <div role=\"tablist\" className={className}>\n {children}\n </div>\n );\n};\n\nconst TabsTrigger = ({\n value,\n children,\n className,\n disabled,\n}: TabsTriggerProps) => {\n const context = useTabsContext();\n const isActive = context.value === value;\n const id = useId();\n\n return (\n <button\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`tabpanel-${value}`}\n id={`tab-${value}`}\n disabled={disabled}\n data-state={isActive ? \"active\" : \"inactive\"}\n data-disabled={disabled ? \"\" : undefined}\n className={className}\n onClick={() => {\n if (!disabled) {\n context.onValueChange(value);\n }\n }}\n tabIndex={isActive ? 0 : -1}\n >\n {children}\n </button>\n );\n};\n\nconst TabsContent = ({ value, children, className }: TabsContentProps) => {\n const context = useTabsContext();\n const isActive = context.value === value;\n\n if (!isActive) return null;\n\n return (\n <div\n role=\"tabpanel\"\n id={`tabpanel-${value}`}\n aria-labelledby={`tab-${value}`}\n className={className}\n data-state={isActive ? \"active\" : \"inactive\"}\n tabIndex={0}\n >\n {children}\n </div>\n );\n};\n\nTabs.List = TabsList;\nTabs.Trigger = TabsTrigger;\nTabs.Content = TabsContent;\n\nexport { Tabs };\n","\nimport React from \"react\";\nimport { useControlled } from \"../../hooks/use-controlled\";\nimport { ToggleProps } from \"./types\";\nimport { Slot } from \"../../primitives/slot\";\n\nconst Toggle = React.forwardRef<HTMLButtonElement, ToggleProps>(\n (\n {\n defaultPressed = false,\n pressed: pressedProp,\n onPressedChange,\n disabled = false,\n className,\n children,\n asChild = false,\n \"aria-label\": ariaLabel,\n ...props\n },\n ref\n ) => {\n const [pressed, setPressed] = useControlled({\n value: pressedProp,\n defaultValue: defaultPressed,\n onChange: onPressedChange,\n });\n\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n ref={ref}\n type=\"button\"\n aria-pressed={pressed}\n data-state={pressed ? \"on\" : \"off\"}\n data-disabled={disabled ? \"\" : undefined}\n disabled={disabled}\n className={className}\n aria-label={ariaLabel}\n onClick={() => {\n if (!disabled) {\n setPressed(!pressed);\n }\n }}\n {...props}\n >\n {children}\n </Comp>\n );\n }\n);\n\nToggle.displayName = \"Toggle\";\n\nexport { Toggle };\n"]}
|