@refraction-ui/react 0.22.0 → 0.23.1
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/dist/{chunk-V24GDHUX.js → chunk-4ACSHPCM.js} +2 -2
- package/dist/{chunk-SDAJVXD4.js → chunk-5P56PN3J.js} +2 -2
- package/dist/chunk-75BKRTPO.js +417 -0
- package/dist/{chunk-2Q6HHFAN.js.map → chunk-75BKRTPO.js.map} +1 -1
- package/dist/chunk-7P7EJ56S.js +7 -0
- package/dist/{chunk-QPCKJ2YR.js → chunk-GG6MZDGV.js} +2 -2
- package/dist/{chunk-QDMLIDYN.js → chunk-GU5MI7FX.js} +2 -2
- package/dist/{chunk-3Y2T26QD.js → chunk-JZQ5ZL46.js} +6 -4
- package/dist/{chunk-3Y2T26QD.js.map → chunk-JZQ5ZL46.js.map} +2 -2
- package/dist/{chunk-RSWOLRIC.js → chunk-KIZD73DK.js} +2 -2
- package/dist/{chunk-XMFNBOPO.js → chunk-PY2TIFCT.js} +2 -2
- package/dist/{chunk-XWP763SH.js → chunk-V727VZOE.js} +4 -2
- package/dist/{chunk-XWP763SH.js.map → chunk-V727VZOE.js.map} +2 -2
- package/dist/{chunk-3I3DYDHR.js → chunk-WNLYPQOS.js} +2 -2
- package/dist/{chunk-63N4PZUJ.js → chunk-X6HEKRWE.js} +2 -2
- package/dist/{chunk-WYKPPK3W.js → chunk-XAJDSVZR.js} +2 -2
- package/dist/faro-engine-VIUXJAPH-FSARIABU.js +3 -0
- package/dist/{faro-engine-47HGRAQH-JKINJPMH.js.map → faro-engine-VIUXJAPH-FSARIABU.js.map} +1 -1
- package/dist/index.cjs +736 -274
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/internal/avatar/index.d.cts +4 -1
- package/dist/internal/avatar/index.d.ts +4 -1
- package/dist/internal/data-table/index.d.cts +48 -3
- package/dist/internal/data-table/index.d.ts +48 -3
- package/dist/internal/line-chart/index.d.ts +17 -3
- package/dist/internal/native-select/index.d.ts +21 -0
- package/dist/internal/react-avatar/index.d.cts +4 -2
- package/dist/internal/react-avatar/index.d.ts +4 -2
- package/dist/internal/react-command/index.d.cts +13 -2
- package/dist/internal/react-command/index.d.ts +13 -2
- package/dist/internal/react-data-table/index.d.cts +27 -9
- package/dist/internal/react-data-table/index.d.ts +27 -9
- package/dist/internal/react-dialog/index.d.cts +5 -0
- package/dist/internal/react-dialog/index.d.ts +5 -0
- package/dist/internal/react-dropdown-menu/index.d.cts +19 -1
- package/dist/internal/react-dropdown-menu/index.d.ts +19 -1
- package/dist/internal/react-line-chart/index.d.ts +7 -2
- package/dist/internal/react-native-select/index.d.ts +19 -0
- package/dist/internal/react-stat-grid/index.d.ts +22 -11
- package/dist/internal/react-table/index.d.ts +39 -0
- package/dist/internal/stat-grid/index.d.ts +49 -7
- package/dist/internal/table/index.d.ts +46 -0
- package/dist/react-accordion.js +1 -1
- package/dist/react-action-list.js +1 -1
- package/dist/react-ai.js +1 -1
- package/dist/react-analytics.js +16 -4
- package/dist/react-analytics.js.map +2 -2
- package/dist/react-animated-text.js +1 -1
- package/dist/react-app-shell.js +1 -1
- package/dist/react-audience-feature-card.js +1 -1
- package/dist/react-audio-room.js +1 -1
- package/dist/react-auth.js +1 -1
- package/dist/react-avatar-group.js +1 -1
- package/dist/react-avatar.js +13 -9
- package/dist/react-avatar.js.map +2 -2
- package/dist/react-badge.js +1 -1
- package/dist/react-bottom-nav.js +1 -1
- package/dist/react-brand-network-cell.js +1 -1
- package/dist/react-breadcrumbs.js +1 -1
- package/dist/react-browser-chrome-mock.js +1 -1
- package/dist/react-button.js +3 -3
- package/dist/react-calendar.js +1 -1
- package/dist/react-call-controls.js +1 -1
- package/dist/react-callout.js +1 -1
- package/dist/react-card-grid.js +1 -1
- package/dist/react-card.js +1 -1
- package/dist/react-carousel.js +1 -1
- package/dist/react-charts.js +1 -1
- package/dist/react-checkbox.js +1 -1
- package/dist/react-checklist.js +1 -1
- package/dist/react-code-block.js +1 -1
- package/dist/react-code-editor.js +1 -1
- package/dist/react-collapsible.js +1 -1
- package/dist/react-combobox.js +1 -1
- package/dist/react-command-input.js +1 -1
- package/dist/react-command.js +115 -70
- package/dist/react-command.js.map +3 -3
- package/dist/react-composer.js +3 -3
- package/dist/react-content-protection.js +1 -1
- package/dist/react-conversation.js +5 -5
- package/dist/react-cookie-consent.js +1 -1
- package/dist/react-data-table.js +125 -114
- package/dist/react-data-table.js.map +2 -2
- package/dist/react-date-picker.js +1 -1
- package/dist/react-device-frame.js +1 -1
- package/dist/react-dialog.js +33 -9
- package/dist/react-dialog.js.map +2 -2
- package/dist/react-diff-viewer.js +1 -1
- package/dist/react-dropdown-menu.js +61 -8
- package/dist/react-dropdown-menu.js.map +3 -3
- package/dist/react-editor-status-bar.js +1 -1
- package/dist/react-editor-tabs.js +1 -1
- package/dist/react-emoji-picker.js +2 -2
- package/dist/react-empty-state.js +1 -1
- package/dist/react-feedback-dialog.js +2 -2
- package/dist/react-file-tree.js +1 -1
- package/dist/react-file-upload.js +1 -1
- package/dist/react-floating-reactions.js +1 -1
- package/dist/react-flow-editor.js +2 -2
- package/dist/react-footer.js +1 -1
- package/dist/react-funnel-chart.js +1 -1
- package/dist/react-graph-view.js +2 -2
- package/dist/react-infinite-canvas.js +2 -2
- package/dist/react-inline-editor.js +1 -1
- package/dist/react-input-group.js +1 -1
- package/dist/react-input.js +2 -2
- package/dist/react-install-prompt.js +1 -1
- package/dist/react-kanban-board.js +1 -1
- package/dist/react-keyboard-shortcut.js +2 -2
- package/dist/react-language-selector.js +1 -1
- package/dist/react-line-chart.js +49 -11
- package/dist/react-line-chart.js.map +2 -2
- package/dist/react-link-card.js +1 -1
- package/dist/react-live-captions.js +1 -1
- package/dist/react-live-cursors.js +1 -1
- package/dist/react-live-transcript.js +1 -1
- package/dist/react-location-selector.js +1 -1
- package/dist/react-logger.js +3 -3
- package/dist/react-markdown-renderer.js +2 -2
- package/dist/react-marquee-strip.js +1 -1
- package/dist/react-mascot.js +1 -1
- package/dist/react-mastery-bar.js +1 -1
- package/dist/react-mini-map.js +1 -1
- package/dist/react-mobile-nav.js +1 -1
- package/dist/react-native-select.js +52 -0
- package/dist/react-native-select.js.map +7 -0
- package/dist/react-navbar.js +1 -1
- package/dist/react-numbered-steps.js +1 -1
- package/dist/react-otp-input.js +1 -1
- package/dist/react-page-header.js +1 -1
- package/dist/react-pagination.js +1 -1
- package/dist/react-password-input.js +2 -2
- package/dist/react-payment.js +1 -1
- package/dist/react-popover.js +1 -1
- package/dist/react-pre-call-lobby.js +1 -1
- package/dist/react-presence-indicator.js +1 -1
- package/dist/react-pricing-card.js +1 -1
- package/dist/react-progress-display.js +1 -1
- package/dist/react-radial-gauge.js +1 -1
- package/dist/react-radio.js +1 -1
- package/dist/react-rating-scale.js +1 -1
- package/dist/react-reaction-bar.js +1 -1
- package/dist/react-resizable-layout.js +1 -1
- package/dist/react-search-bar.js +1 -1
- package/dist/react-section-head.js +1 -1
- package/dist/react-segmented-control.js +1 -1
- package/dist/react-select.js +1 -1
- package/dist/react-separator.js +1 -1
- package/dist/react-sheet.js +1 -1
- package/dist/react-sidebar.js +1 -1
- package/dist/react-skeleton.js +1 -1
- package/dist/react-skip-to-content.js +1 -1
- package/dist/react-slide-viewer.js +1 -1
- package/dist/react-slider.js +1 -1
- package/dist/react-slot-picker.js +1 -1
- package/dist/react-social-auth-button.js +3 -3
- package/dist/react-sortable-list.js +1 -1
- package/dist/react-stat-grid.js +91 -22
- package/dist/react-stat-grid.js.map +2 -2
- package/dist/react-status-indicator.js +1 -1
- package/dist/react-steps.js +1 -1
- package/dist/react-sticky-note.js +1 -1
- package/dist/react-switch.js +1 -1
- package/dist/react-table-of-contents.js +1 -1
- package/dist/react-table.js +148 -0
- package/dist/react-table.js.map +7 -0
- package/dist/react-tabs.js +35 -6
- package/dist/react-tabs.js.map +2 -2
- package/dist/react-terminal.js +1 -1
- package/dist/react-test-results.js +1 -1
- package/dist/react-textarea.js +1 -1
- package/dist/react-thread-view.js +2 -2
- package/dist/react-timeline.js +1 -1
- package/dist/react-toast.js +1 -1
- package/dist/react-tooltip.js +1 -1
- package/dist/react-version-selector.js +1 -1
- package/dist/react-video-grid.js +2 -2
- package/dist/react-video-player.js +1 -1
- package/dist/react-video-tile.js +2 -2
- package/dist/react-voice-pill.js +1 -1
- package/dist/react-waveform.js +1 -1
- package/dist/react-wizard.js +1 -1
- package/dist/shared.js +53 -0
- package/dist/shared.js.map +7 -0
- package/package.json +3 -1
- package/dist/chunk-2Q6HHFAN.js +0 -164
- package/dist/chunk-SDZ3LROZ.js +0 -7
- package/dist/faro-engine-47HGRAQH-JKINJPMH.js +0 -3
- /package/dist/{chunk-V24GDHUX.js.map → chunk-4ACSHPCM.js.map} +0 -0
- /package/dist/{chunk-SDAJVXD4.js.map → chunk-5P56PN3J.js.map} +0 -0
- /package/dist/{chunk-SDZ3LROZ.js.map → chunk-7P7EJ56S.js.map} +0 -0
- /package/dist/{chunk-QPCKJ2YR.js.map → chunk-GG6MZDGV.js.map} +0 -0
- /package/dist/{chunk-QDMLIDYN.js.map → chunk-GU5MI7FX.js.map} +0 -0
- /package/dist/{chunk-RSWOLRIC.js.map → chunk-KIZD73DK.js.map} +0 -0
- /package/dist/{chunk-XMFNBOPO.js.map → chunk-PY2TIFCT.js.map} +0 -0
- /package/dist/{chunk-3I3DYDHR.js.map → chunk-WNLYPQOS.js.map} +0 -0
- /package/dist/{chunk-63N4PZUJ.js.map → chunk-X6HEKRWE.js.map} +0 -0
- /package/dist/{chunk-WYKPPK3W.js.map → chunk-XAJDSVZR.js.map} +0 -0
package/dist/react-tabs.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../tabs/src/tabs.ts", "../../tabs/src/tabs.styles.ts", "../../react-tabs/src/tabs.tsx"],
|
|
4
|
-
"sourcesContent": ["import type { AccessibilityProps, KeyboardHandlerMap } from '@refraction-ui/shared'\nimport { Keys, generateId } from '@refraction-ui/shared'\n\nexport interface TabsProps {\n /** The active tab value (controlled) */\n value?: string\n /** The default active tab value (uncontrolled) */\n defaultValue?: string\n /** Callback when active tab changes */\n onValueChange?: (value: string) => void\n /** Orientation of the tab list */\n orientation?: 'horizontal' | 'vertical'\n}\n\nexport interface TabsState {\n activeValue: string\n}\n\nexport interface TabsAPI {\n /** Current tabs state */\n state: TabsState\n /** ARIA attributes for the tab list */\n listProps: Partial<AccessibilityProps> & Record<string, unknown>\n /** Factory for individual tab trigger props */\n getTabProps(value: string): Partial<AccessibilityProps> & Record<string, unknown>\n /** Factory for individual tab panel props */\n getPanelProps(value: string): Partial<AccessibilityProps> & Record<string, unknown>\n /** Select a tab by value */\n select(value: string): void\n /** Keyboard handlers for the tab list */\n keyboardHandlers: KeyboardHandlerMap\n /** Generated ID prefix for aria linking */\n idPrefix: string\n}\n\nexport function createTabs(props: TabsProps = {}): TabsAPI {\n const {\n value: controlledValue,\n defaultValue = '',\n onValueChange,\n orientation = 'horizontal',\n } = props\n\n let uncontrolledValue = controlledValue ?? defaultValue\n const idPrefix = generateId('rfr-tabs')\n\n function getActiveValue(): string {\n if (controlledValue !== undefined) return controlledValue\n return uncontrolledValue\n }\n\n function select(value: string): void {\n uncontrolledValue = value\n onValueChange?.(value)\n }\n\n function getTabId(value: string): string {\n return `${idPrefix}-tab-${value}`\n }\n\n function getPanelId(value: string): string {\n return `${idPrefix}-panel-${value}`\n }\n\n function getTabProps(value: string): Partial<AccessibilityProps> & Record<string, unknown> {\n const isSelected = getActiveValue() === value\n return {\n role: 'tab',\n 'aria-selected': isSelected,\n 'aria-controls': getPanelId(value),\n tabIndex: isSelected ? 0 : -1,\n id: getTabId(value),\n 'data-state': isSelected ? 'active' : 'inactive',\n }\n }\n\n function getPanelProps(value: string): Partial<AccessibilityProps> & Record<string, unknown> {\n const isSelected = getActiveValue() === value\n return {\n role: 'tabpanel',\n 'aria-labelledby': getTabId(value),\n id: getPanelId(value),\n hidden: !isSelected || undefined,\n tabIndex: 0,\n 'data-state': isSelected ? 'active' : 'inactive',\n }\n }\n\n const listProps: Partial<AccessibilityProps> & Record<string, unknown> = {\n role: 'tablist',\n 'aria-orientation': orientation,\n }\n\n const keyboardHandlers: KeyboardHandlerMap = orientation === 'horizontal'\n ? {\n [Keys.ArrowLeft]: (e) => {\n e.preventDefault()\n },\n [Keys.ArrowRight]: (e) => {\n e.preventDefault()\n },\n [Keys.Home]: (e) => {\n e.preventDefault()\n },\n [Keys.End]: (e) => {\n e.preventDefault()\n },\n }\n : {\n [Keys.ArrowUp]: (e) => {\n e.preventDefault()\n },\n [Keys.ArrowDown]: (e) => {\n e.preventDefault()\n },\n [Keys.Home]: (e) => {\n e.preventDefault()\n },\n [Keys.End]: (e) => {\n e.preventDefault()\n },\n }\n\n return {\n state: { activeValue: getActiveValue() },\n listProps,\n getTabProps,\n getPanelProps,\n select,\n keyboardHandlers,\n idPrefix,\n }\n}\n\n/**\n * Roving-focus target for a key press inside a tab list (WAI-ARIA Tabs\n * pattern). Given the index of the focused tab among the ENABLED tabs, returns\n * the index to move to, or `null` when the key is not a navigation key for this\n * orientation. Arrow keys wrap; Home/End jump to the ends.\n */\nexport function getNextTabIndex(\n current: number,\n key: string,\n count: number,\n orientation: 'horizontal' | 'vertical' = 'horizontal',\n): number | null {\n if (count === 0) return null\n const prev = orientation === 'horizontal' ? 'ArrowLeft' : 'ArrowUp'\n const next = orientation === 'horizontal' ? 'ArrowRight' : 'ArrowDown'\n switch (key) {\n case next:\n return current < 0 ? 0 : (current + 1) % count\n case prev:\n return current < 0 ? count - 1 : (current - 1 + count) % count\n case 'Home':\n return 0\n case 'End':\n return count - 1\n default:\n return null\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const tabsListVariants = cva({\n base: 'inline-flex max-w-full overflow-x-auto items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground',\n})\n\nexport const tabsTriggerVariants = cva({\n base: 'inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow',\n})\n", "import * as React from 'react'\nimport {\n createTabs,\n getNextTabIndex,\n tabsListVariants,\n tabsTriggerVariants,\n type TabsProps as CoreTabsProps,\n} from '@refraction-ui/tabs'\nimport { cn, createKeyboardHandler, Keys, devWarn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface TabsContextValue {\n value: string\n onValueChange: (value: string) => void\n orientation: 'horizontal' | 'vertical'\n idPrefix: string\n}\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null)\n\nfunction useTabsContext(): TabsContextValue {\n const ctx = React.useContext(TabsContext)\n if (!ctx) {\n devWarn(\n 'react-tabs/context-outside-provider',\n 'Tabs compound components (TabsList/TabsTrigger/TabsContent) must be rendered inside a <Tabs>. The missing TabsContext makes this throw.',\n )\n throw new Error('Tabs compound components must be used within <Tabs>')\n }\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// Tabs (root provider)\n// ---------------------------------------------------------------------------\n\nexport interface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n orientation?: 'horizontal' | 'vertical'\n className?: string\n children?: React.ReactNode\n}\n\nexport const Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\n function Tabs({ value: controlledValue, defaultValue = '', onValueChange, orientation = 'horizontal', className, children, ...props }: TabsProps, ref) {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue)\n const isControlled = controlledValue !== undefined\n const value = isControlled ? controlledValue : uncontrolledValue\n\n const handleValueChange = React.useCallback(\n (next: string) => {\n if (!isControlled) {\n setUncontrolledValue(next)\n }\n onValueChange?.(next)\n },\n [isControlled, onValueChange],\n )\n\n // Use the headless core to get stable IDs\n const apiRef = React.useRef<ReturnType<typeof createTabs> | null>(null)\n if (apiRef.current === null) {\n apiRef.current = createTabs({ value, orientation })\n }\n const api = apiRef.current\n\n const ctx = React.useMemo<TabsContextValue>(\n () => ({\n value,\n onValueChange: handleValueChange,\n orientation,\n idPrefix: api.idPrefix,\n }),\n [value, handleValueChange, orientation, api.idPrefix],\n )\n\n return React.createElement(\n 'div',\n { ref, className, 'data-orientation': orientation, ...props },\n React.createElement(TabsContext.Provider, { value: ctx }, children),\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// TabsList\n// ---------------------------------------------------------------------------\n\nexport interface TabsListProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const TabsList = React.forwardRef<HTMLDivElement, TabsListProps>(\n function TabsList({ className, onKeyDown, ...props }, forwardedRef) {\n const { orientation } = useTabsContext()\n const listRef = React.useRef<HTMLDivElement | null>(null)\n const ref = React.useCallback(\n (node: HTMLDivElement | null) => {\n listRef.current = node\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef) forwardedRef.current = node\n },\n [forwardedRef],\n )\n\n // Roving tabindex needs exactly one tab stop. A trigger only knows whether\n // IT is selected, so when no enabled trigger matches the value (no\n // defaultValue, or the selected tab is disabled) nothing would be\n // tabbable; make the first enabled tab the stop in that case.\n // This effect owns the final tabindex of every trigger (React leaves a\n // DOM value alone while its prop is unchanged, so patching only the\n // fallback would leave two tab stops after the next selection).\n React.useEffect(() => {\n const tabs = enabledTabs(listRef.current)\n const stop = tabs.find((tab) => tab.getAttribute('aria-selected') === 'true') ?? tabs[0]\n for (const tab of tabs) tab.tabIndex = tab === stop ? 0 : -1\n })\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(e)\n if (e.defaultPrevented) return\n const tabs = enabledTabs(listRef.current)\n const current = tabs.indexOf(e.target as HTMLButtonElement)\n if (current === -1) return\n const next = getNextTabIndex(current, e.key, tabs.length, orientation)\n if (next === null) return\n e.preventDefault()\n tabs[next].focus()\n // Automatic activation: moving focus selects the tab.\n tabs[next].click()\n }\n\n return React.createElement('div', {\n ref,\n role: 'tablist',\n 'aria-orientation': orientation,\n className: cn(tabsListVariants(), className),\n onKeyDown: handleKeyDown,\n ...props,\n })\n },\n)\n\nfunction enabledTabs(list: HTMLElement | null): HTMLButtonElement[] {\n if (!list) return []\n return Array.from(list.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]:not([disabled])'))\n}\n\n// ---------------------------------------------------------------------------\n// TabsTrigger\n// ---------------------------------------------------------------------------\n\nexport interface TabsTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n value: string\n}\n\nexport const TabsTrigger = React.forwardRef<HTMLButtonElement, TabsTriggerProps>(\n function TabsTrigger({ value, className, onClick, onKeyDown, children, ...props }, ref) {\n const { value: activeValue, onValueChange, orientation, idPrefix } = useTabsContext()\n\n const isSelected = activeValue === value\n const tabId = `${idPrefix}-tab-${value}`\n const panelId = `${idPrefix}-panel-${value}`\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onValueChange(value)\n onClick?.(e)\n }\n\n // Arrow / Home / End navigation is handled by TabsList (roving focus);\n // a consumer onKeyDown runs first and can preventDefault to opt out.\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(e)\n }\n\n return React.createElement(\n 'button',\n {\n ref,\n type: 'button',\n role: 'tab',\n 'aria-selected': isSelected,\n 'aria-controls': panelId,\n tabIndex: isSelected ? 0 : -1,\n id: tabId,\n 'data-state': isSelected ? 'active' : 'inactive',\n className: cn(tabsTriggerVariants(), className),\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n ...props,\n },\n children,\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// TabsContent\n// ---------------------------------------------------------------------------\n\nexport interface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string\n}\n\nexport const TabsContent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n function TabsContent({ value, className, children, ...props }, ref) {\n const { value: activeValue, idPrefix } = useTabsContext()\n\n const isSelected = activeValue === value\n const tabId = `${idPrefix}-tab-${value}`\n const panelId = `${idPrefix}-panel-${value}`\n\n if (!isSelected) return null\n\n return React.createElement(\n 'div',\n {\n ref,\n role: 'tabpanel',\n 'aria-labelledby': tabId,\n id: panelId,\n tabIndex: 0,\n 'data-state': 'active',\n className,\n ...props,\n },\n children,\n )\n },\n)\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;AAmCO,SAAS,WAAW,QAAmB,CAAA,GAAa;AACzD,QAAM;IACJ,OAAO;IACP,eAAe;IACf;IACA,cAAc;EAAA,IACZ;AAEJ,MAAI,oBAAoB,mBAAmB;AAC3C,QAAM,WAAW,WAAW,UAAU;AAEtC,WAAS,iBAAyB;AAChC,QAAI,oBAAoB,OAAW,QAAO;AAC1C,WAAO;EACT;AAEA,WAAS,OAAO,OAAqB;AACnC,wBAAoB;AACpB,oBAAgB,KAAK;EACvB;AAEA,WAAS,SAAS,OAAuB;AACvC,WAAO,GAAG,QAAQ,QAAQ,KAAK;EACjC;AAEA,WAAS,WAAW,OAAuB;AACzC,WAAO,GAAG,QAAQ,UAAU,KAAK;EACnC;AAEA,WAAS,YAAY,OAAsE;AACzF,UAAM,aAAa,eAAA,MAAqB;AACxC,WAAO;MACL,MAAM;MACN,iBAAiB;MACjB,iBAAiB,WAAW,KAAK;MACjC,UAAU,aAAa,IAAI;MAC3B,IAAI,SAAS,KAAK;MAClB,cAAc,aAAa,WAAW;IAAA;EAE1C;AAEA,WAAS,cAAc,OAAsE;AAC3F,UAAM,aAAa,eAAA,MAAqB;AACxC,WAAO;MACL,MAAM;MACN,mBAAmB,SAAS,KAAK;MACjC,IAAI,WAAW,KAAK;MACpB,QAAQ,CAAC,cAAc;MACvB,UAAU;MACV,cAAc,aAAa,WAAW;IAAA;EAE1C;AAEA,QAAM,YAAmE;IACvE,MAAM;IACN,oBAAoB;EAAA;AAGtB,QAAM,mBAAuC,gBAAgB,eACzD;IACE,CAAC,KAAK,SAAS,GAAG,CAAC,MAAM;AACvB,QAAE,eAAA;IACJ;IACA,CAAC,KAAK,UAAU,GAAG,CAAC,MAAM;AACxB,QAAE,eAAA;IACJ;IACA,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM;AAClB,QAAE,eAAA;IACJ;IACA,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM;AACjB,QAAE,eAAA;IACJ;EAAA,IAEF;IACE,CAAC,KAAK,OAAO,GAAG,CAAC,MAAM;AACrB,QAAE,eAAA;IACJ;IACA,CAAC,KAAK,SAAS,GAAG,CAAC,MAAM;AACvB,QAAE,eAAA;IACJ;IACA,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM;AAClB,QAAE,eAAA;IACJ;IACA,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM;AACjB,QAAE,eAAA;IACJ;EAAA;AAGN,SAAO;IACL,OAAO,EAAE,aAAa,eAAA,EAAe;IACrC;IACA;IACA;IACA;IACA;IACA;EAAA;AAEJ;AAQO,SAAS,gBACd,SACA,KACA,OACA,cAAyC,cAC1B;AACf,MAAI,UAAU,EAAG,QAAO;AACxB,QAAM,OAAO,gBAAgB,eAAe,cAAc;AAC1D,QAAM,OAAO,gBAAgB,eAAe,eAAe;AAC3D,UAAQ,KAAA;IACN,KAAK;AACH,aAAO,UAAU,IAAI,KAAK,UAAU,KAAK;IAC3C,KAAK;AACH,aAAO,UAAU,IAAI,QAAQ,KAAK,UAAU,IAAI,SAAS;IAC3D,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO,QAAQ;IACjB;AACE,aAAO;EAAA;AAEb;AC/JO,IAAM,mBAAmB,IAAI;EAClC,MAAM;AACR,CAAC;AAEM,IAAM,sBAAsB,IAAI;EACrC,MAAM;AACR,CAAC;;;
|
|
4
|
+
"sourcesContent": ["import type { AccessibilityProps, KeyboardHandlerMap } from '@refraction-ui/shared'\nimport { Keys, generateId } from '@refraction-ui/shared'\n\nexport interface TabsProps {\n /** The active tab value (controlled) */\n value?: string\n /** The default active tab value (uncontrolled) */\n defaultValue?: string\n /** Callback when active tab changes */\n onValueChange?: (value: string) => void\n /** Orientation of the tab list */\n orientation?: 'horizontal' | 'vertical'\n}\n\nexport interface TabsState {\n activeValue: string\n}\n\nexport interface TabsAPI {\n /** Current tabs state */\n state: TabsState\n /** ARIA attributes for the tab list */\n listProps: Partial<AccessibilityProps> & Record<string, unknown>\n /** Factory for individual tab trigger props */\n getTabProps(value: string): Partial<AccessibilityProps> & Record<string, unknown>\n /** Factory for individual tab panel props */\n getPanelProps(value: string): Partial<AccessibilityProps> & Record<string, unknown>\n /** Select a tab by value */\n select(value: string): void\n /** Keyboard handlers for the tab list */\n keyboardHandlers: KeyboardHandlerMap\n /** Generated ID prefix for aria linking */\n idPrefix: string\n}\n\nexport function createTabs(props: TabsProps = {}): TabsAPI {\n const {\n value: controlledValue,\n defaultValue = '',\n onValueChange,\n orientation = 'horizontal',\n } = props\n\n let uncontrolledValue = controlledValue ?? defaultValue\n const idPrefix = generateId('rfr-tabs')\n\n function getActiveValue(): string {\n if (controlledValue !== undefined) return controlledValue\n return uncontrolledValue\n }\n\n function select(value: string): void {\n uncontrolledValue = value\n onValueChange?.(value)\n }\n\n function getTabId(value: string): string {\n return `${idPrefix}-tab-${value}`\n }\n\n function getPanelId(value: string): string {\n return `${idPrefix}-panel-${value}`\n }\n\n function getTabProps(value: string): Partial<AccessibilityProps> & Record<string, unknown> {\n const isSelected = getActiveValue() === value\n return {\n role: 'tab',\n 'aria-selected': isSelected,\n 'aria-controls': getPanelId(value),\n tabIndex: isSelected ? 0 : -1,\n id: getTabId(value),\n 'data-state': isSelected ? 'active' : 'inactive',\n }\n }\n\n function getPanelProps(value: string): Partial<AccessibilityProps> & Record<string, unknown> {\n const isSelected = getActiveValue() === value\n return {\n role: 'tabpanel',\n 'aria-labelledby': getTabId(value),\n id: getPanelId(value),\n hidden: !isSelected || undefined,\n tabIndex: 0,\n 'data-state': isSelected ? 'active' : 'inactive',\n }\n }\n\n const listProps: Partial<AccessibilityProps> & Record<string, unknown> = {\n role: 'tablist',\n 'aria-orientation': orientation,\n }\n\n const keyboardHandlers: KeyboardHandlerMap = orientation === 'horizontal'\n ? {\n [Keys.ArrowLeft]: (e) => {\n e.preventDefault()\n },\n [Keys.ArrowRight]: (e) => {\n e.preventDefault()\n },\n [Keys.Home]: (e) => {\n e.preventDefault()\n },\n [Keys.End]: (e) => {\n e.preventDefault()\n },\n }\n : {\n [Keys.ArrowUp]: (e) => {\n e.preventDefault()\n },\n [Keys.ArrowDown]: (e) => {\n e.preventDefault()\n },\n [Keys.Home]: (e) => {\n e.preventDefault()\n },\n [Keys.End]: (e) => {\n e.preventDefault()\n },\n }\n\n return {\n state: { activeValue: getActiveValue() },\n listProps,\n getTabProps,\n getPanelProps,\n select,\n keyboardHandlers,\n idPrefix,\n }\n}\n\n/**\n * Roving-focus target for a key press inside a tab list (WAI-ARIA Tabs\n * pattern). Given the index of the focused tab among the ENABLED tabs, returns\n * the index to move to, or `null` when the key is not a navigation key for this\n * orientation. Arrow keys wrap; Home/End jump to the ends.\n */\nexport function getNextTabIndex(\n current: number,\n key: string,\n count: number,\n orientation: 'horizontal' | 'vertical' = 'horizontal',\n): number | null {\n if (count === 0) return null\n const prev = orientation === 'horizontal' ? 'ArrowLeft' : 'ArrowUp'\n const next = orientation === 'horizontal' ? 'ArrowRight' : 'ArrowDown'\n switch (key) {\n case next:\n return current < 0 ? 0 : (current + 1) % count\n case prev:\n return current < 0 ? count - 1 : (current - 1 + count) % count\n case 'Home':\n return 0\n case 'End':\n return count - 1\n default:\n return null\n }\n}\n", "import { cva } from '@refraction-ui/shared'\n\nexport const tabsListVariants = cva({\n base: 'inline-flex max-w-full overflow-x-auto items-center justify-center rounded-lg bg-muted p-1 text-muted-foreground',\n})\n\nexport const tabsTriggerVariants = cva({\n base: 'inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow',\n})\n", "import * as React from 'react'\nimport {\n createTabs,\n getNextTabIndex,\n tabsListVariants,\n tabsTriggerVariants,\n type TabsProps as CoreTabsProps,\n} from '@refraction-ui/tabs'\nimport { cn, createKeyboardHandler, Keys, devWarn } from '@refraction-ui/shared'\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\ninterface TabsContextValue {\n value: string\n onValueChange: (value: string) => void\n orientation: 'horizontal' | 'vertical'\n idPrefix: string\n /** Values that have a TabsContent, so triggers only reference real panels. */\n panels: ReadonlySet<string>\n registerPanel: (value: string) => () => void\n}\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null)\n\nfunction useTabsContext(): TabsContextValue {\n const ctx = React.useContext(TabsContext)\n if (!ctx) {\n devWarn(\n 'react-tabs/context-outside-provider',\n 'Tabs compound components (TabsList/TabsTrigger/TabsContent) must be rendered inside a <Tabs>. The missing TabsContext makes this throw.',\n )\n throw new Error('Tabs compound components must be used within <Tabs>')\n }\n return ctx\n}\n\n// ---------------------------------------------------------------------------\n// Tabs (root provider)\n// ---------------------------------------------------------------------------\n\nexport interface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: string\n defaultValue?: string\n onValueChange?: (value: string) => void\n orientation?: 'horizontal' | 'vertical'\n className?: string\n children?: React.ReactNode\n}\n\nexport const Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\n function Tabs({ value: controlledValue, defaultValue = '', onValueChange, orientation = 'horizontal', className, children, ...props }: TabsProps, ref) {\n const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue)\n const isControlled = controlledValue !== undefined\n const value = isControlled ? controlledValue : uncontrolledValue\n\n const handleValueChange = React.useCallback(\n (next: string) => {\n if (!isControlled) {\n setUncontrolledValue(next)\n }\n onValueChange?.(next)\n },\n [isControlled, onValueChange],\n )\n\n // Use the headless core to get stable IDs\n const apiRef = React.useRef<ReturnType<typeof createTabs> | null>(null)\n if (apiRef.current === null) {\n apiRef.current = createTabs({ value, orientation })\n }\n const api = apiRef.current\n\n const [panels, setPanels] = React.useState<ReadonlySet<string>>(() => new Set())\n const registerPanel = React.useCallback((panelValue: string) => {\n setPanels((prev) => (prev.has(panelValue) ? prev : new Set(prev).add(panelValue)))\n return () =>\n setPanels((prev) => {\n if (!prev.has(panelValue)) return prev\n const next = new Set(prev)\n next.delete(panelValue)\n return next\n })\n }, [])\n\n // Panels found in the element tree cover the first/server render; mounted\n // panels (possibly nested in custom components) register themselves.\n const allPanels = React.useMemo(() => {\n const found = new Set(panels)\n collectPanelValues(children, found)\n return found\n }, [children, panels])\n\n const ctx = React.useMemo<TabsContextValue>(\n () => ({\n value,\n onValueChange: handleValueChange,\n orientation,\n idPrefix: api.idPrefix,\n panels: allPanels,\n registerPanel,\n }),\n [value, handleValueChange, orientation, api.idPrefix, allPanels, registerPanel],\n )\n\n return React.createElement(\n 'div',\n { ref, className, 'data-orientation': orientation, ...props },\n React.createElement(TabsContext.Provider, { value: ctx }, children),\n )\n },\n)\n\nfunction collectPanelValues(node: React.ReactNode, into: Set<string>): void {\n React.Children.forEach(node, (child) => {\n if (!React.isValidElement<{ value?: unknown; children?: React.ReactNode }>(child)) return\n if (child.type === TabsContent && typeof child.props.value === 'string') {\n into.add(child.props.value)\n return\n }\n collectPanelValues(child.props.children, into)\n })\n}\n\n// ---------------------------------------------------------------------------\n// TabsList\n// ---------------------------------------------------------------------------\n\nexport interface TabsListProps extends React.HTMLAttributes<HTMLDivElement> {}\n\nexport const TabsList = React.forwardRef<HTMLDivElement, TabsListProps>(\n function TabsList({ className, onKeyDown, ...props }, forwardedRef) {\n const { orientation } = useTabsContext()\n const listRef = React.useRef<HTMLDivElement | null>(null)\n const ref = React.useCallback(\n (node: HTMLDivElement | null) => {\n listRef.current = node\n if (typeof forwardedRef === 'function') forwardedRef(node)\n else if (forwardedRef) forwardedRef.current = node\n },\n [forwardedRef],\n )\n\n // Roving tabindex needs exactly one tab stop. A trigger only knows whether\n // IT is selected, so when no enabled trigger matches the value (no\n // defaultValue, or the selected tab is disabled) nothing would be\n // tabbable; make the first enabled tab the stop in that case.\n // This effect owns the final tabindex of every trigger (React leaves a\n // DOM value alone while its prop is unchanged, so patching only the\n // fallback would leave two tab stops after the next selection).\n React.useEffect(() => {\n const tabs = enabledTabs(listRef.current)\n const stop = tabs.find((tab) => tab.getAttribute('aria-selected') === 'true') ?? tabs[0]\n for (const tab of tabs) tab.tabIndex = tab === stop ? 0 : -1\n })\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(e)\n if (e.defaultPrevented) return\n const tabs = enabledTabs(listRef.current)\n const current = tabs.indexOf(e.target as HTMLButtonElement)\n if (current === -1) return\n const next = getNextTabIndex(current, e.key, tabs.length, orientation)\n if (next === null) return\n e.preventDefault()\n tabs[next].focus()\n // Automatic activation: moving focus selects the tab.\n tabs[next].click()\n }\n\n return React.createElement('div', {\n ref,\n role: 'tablist',\n 'aria-orientation': orientation,\n className: cn(tabsListVariants(), className),\n onKeyDown: handleKeyDown,\n ...props,\n })\n },\n)\n\nfunction enabledTabs(list: HTMLElement | null): HTMLButtonElement[] {\n if (!list) return []\n return Array.from(list.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]:not([disabled])'))\n}\n\n// ---------------------------------------------------------------------------\n// TabsTrigger\n// ---------------------------------------------------------------------------\n\nexport interface TabsTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n value: string\n}\n\nexport const TabsTrigger = React.forwardRef<HTMLButtonElement, TabsTriggerProps>(\n function TabsTrigger({ value, className, onClick, onKeyDown, children, ...props }, ref) {\n const { value: activeValue, onValueChange, idPrefix, panels } = useTabsContext()\n\n const isSelected = activeValue === value\n const tabId = `${idPrefix}-tab-${value}`\n const panelId = `${idPrefix}-panel-${value}`\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onValueChange(value)\n onClick?.(e)\n }\n\n // Arrow / Home / End navigation is handled by TabsList (roving focus);\n // a consumer onKeyDown runs first and can preventDefault to opt out.\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(e)\n }\n\n return React.createElement(\n 'button',\n {\n ref,\n type: 'button',\n role: 'tab',\n 'aria-selected': isSelected,\n // Only the selected panel is rendered; never reference a missing element.\n 'aria-controls': isSelected && panels.has(value) ? panelId : undefined,\n tabIndex: isSelected ? 0 : -1,\n id: tabId,\n 'data-state': isSelected ? 'active' : 'inactive',\n className: cn(tabsTriggerVariants(), className),\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n ...props,\n },\n children,\n )\n },\n)\n\n// ---------------------------------------------------------------------------\n// TabsContent\n// ---------------------------------------------------------------------------\n\nexport interface TabsContentProps extends React.HTMLAttributes<HTMLDivElement> {\n value: string\n}\n\nexport const TabsContent = React.forwardRef<HTMLDivElement, TabsContentProps>(\n function TabsContent({ value, className, children, ...props }, ref) {\n const { value: activeValue, idPrefix, registerPanel } = useTabsContext()\n React.useEffect(() => registerPanel(value), [registerPanel, value])\n\n const isSelected = activeValue === value\n const tabId = `${idPrefix}-tab-${value}`\n const panelId = `${idPrefix}-panel-${value}`\n\n if (!isSelected) return null\n\n return React.createElement(\n 'div',\n {\n ref,\n role: 'tabpanel',\n 'aria-labelledby': tabId,\n id: panelId,\n tabIndex: 0,\n 'data-state': 'active',\n className,\n ...props,\n },\n children,\n )\n },\n)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["Tabs", "TabsList", "TabsTrigger", "TabsContent"]
|
|
7
7
|
}
|
package/dist/react-terminal.js
CHANGED
package/dist/react-textarea.js
CHANGED
|
@@ -14,10 +14,10 @@ import {
|
|
|
14
14
|
threadReactionsStyles,
|
|
15
15
|
threadReplyIndicatorStyles,
|
|
16
16
|
threadTimestampStyles
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-PY2TIFCT.js";
|
|
18
18
|
import {
|
|
19
19
|
cn
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-75BKRTPO.js";
|
|
21
21
|
|
|
22
22
|
// ../react-thread-view/dist/index.js
|
|
23
23
|
import * as React from "react";
|
package/dist/react-timeline.js
CHANGED
package/dist/react-toast.js
CHANGED
package/dist/react-tooltip.js
CHANGED
package/dist/react-video-grid.js
CHANGED
package/dist/react-video-tile.js
CHANGED
package/dist/react-voice-pill.js
CHANGED
package/dist/react-waveform.js
CHANGED
package/dist/react-wizard.js
CHANGED
package/dist/shared.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FOCUSABLE_SELECTOR,
|
|
3
|
+
Keys,
|
|
4
|
+
captureLibraryOriginError,
|
|
5
|
+
cn,
|
|
6
|
+
createFocusTrap,
|
|
7
|
+
createKeyboardHandler,
|
|
8
|
+
createLiveRegion,
|
|
9
|
+
createMachine,
|
|
10
|
+
createSkipLink,
|
|
11
|
+
cva,
|
|
12
|
+
devError,
|
|
13
|
+
devWarn,
|
|
14
|
+
generateId,
|
|
15
|
+
getAnimationDuration,
|
|
16
|
+
getFocusableElements,
|
|
17
|
+
isLibraryOriginError,
|
|
18
|
+
libraryOriginEnvelope,
|
|
19
|
+
libraryOriginError,
|
|
20
|
+
mergeAriaProps,
|
|
21
|
+
prefersReducedMotion,
|
|
22
|
+
resetDevFeedback,
|
|
23
|
+
resetIdCounter,
|
|
24
|
+
setDevFeedbackSink,
|
|
25
|
+
stackFingerprint
|
|
26
|
+
} from "./chunk-75BKRTPO.js";
|
|
27
|
+
export {
|
|
28
|
+
FOCUSABLE_SELECTOR,
|
|
29
|
+
Keys,
|
|
30
|
+
captureLibraryOriginError,
|
|
31
|
+
cn,
|
|
32
|
+
createFocusTrap,
|
|
33
|
+
createKeyboardHandler,
|
|
34
|
+
createLiveRegion,
|
|
35
|
+
createMachine,
|
|
36
|
+
createSkipLink,
|
|
37
|
+
cva,
|
|
38
|
+
devError,
|
|
39
|
+
devWarn,
|
|
40
|
+
generateId,
|
|
41
|
+
getAnimationDuration,
|
|
42
|
+
getFocusableElements,
|
|
43
|
+
isLibraryOriginError,
|
|
44
|
+
libraryOriginEnvelope,
|
|
45
|
+
libraryOriginError,
|
|
46
|
+
mergeAriaProps,
|
|
47
|
+
prefersReducedMotion,
|
|
48
|
+
resetDevFeedback,
|
|
49
|
+
resetIdCounter,
|
|
50
|
+
setDevFeedbackSink,
|
|
51
|
+
stackFingerprint
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=shared.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@refraction-ui/react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.23.1",
|
|
4
4
|
"description": "All Refraction UI React components in one package — headless, accessible, zero-dependency",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -126,6 +126,7 @@
|
|
|
126
126
|
"@refraction-ui/react-mastery-bar": "workspace:*",
|
|
127
127
|
"@refraction-ui/react-mini-map": "workspace:*",
|
|
128
128
|
"@refraction-ui/react-mobile-nav": "workspace:*",
|
|
129
|
+
"@refraction-ui/react-native-select": "workspace:*",
|
|
129
130
|
"@refraction-ui/react-navbar": "workspace:*",
|
|
130
131
|
"@refraction-ui/react-numbered-steps": "workspace:*",
|
|
131
132
|
"@refraction-ui/react-otp-input": "workspace:*",
|
|
@@ -164,6 +165,7 @@
|
|
|
164
165
|
"@refraction-ui/react-steps": "workspace:*",
|
|
165
166
|
"@refraction-ui/react-sticky-note": "workspace:*",
|
|
166
167
|
"@refraction-ui/react-switch": "workspace:*",
|
|
168
|
+
"@refraction-ui/react-table": "workspace:*",
|
|
167
169
|
"@refraction-ui/react-table-of-contents": "workspace:*",
|
|
168
170
|
"@refraction-ui/react-tabs": "workspace:*",
|
|
169
171
|
"@refraction-ui/react-terminal": "workspace:*",
|
package/dist/chunk-2Q6HHFAN.js
DELETED
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
// ../shared/dist/index.js
|
|
2
|
-
var idCounter = 0;
|
|
3
|
-
function generateId(prefix = "rfr") {
|
|
4
|
-
idCounter++;
|
|
5
|
-
return `${prefix}-${idCounter}`;
|
|
6
|
-
}
|
|
7
|
-
var Keys = {
|
|
8
|
-
Enter: "Enter",
|
|
9
|
-
Space: " ",
|
|
10
|
-
Escape: "Escape",
|
|
11
|
-
Tab: "Tab",
|
|
12
|
-
ArrowUp: "ArrowUp",
|
|
13
|
-
ArrowDown: "ArrowDown",
|
|
14
|
-
ArrowLeft: "ArrowLeft",
|
|
15
|
-
ArrowRight: "ArrowRight",
|
|
16
|
-
Home: "Home",
|
|
17
|
-
End: "End",
|
|
18
|
-
PageUp: "PageUp",
|
|
19
|
-
PageDown: "PageDown",
|
|
20
|
-
Backspace: "Backspace",
|
|
21
|
-
Delete: "Delete"
|
|
22
|
-
};
|
|
23
|
-
function createKeyboardHandler(handlers) {
|
|
24
|
-
return (event) => {
|
|
25
|
-
const handler = handlers[event.key];
|
|
26
|
-
if (handler) {
|
|
27
|
-
handler(event);
|
|
28
|
-
}
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
function createMachine(config) {
|
|
32
|
-
let current = config.initial;
|
|
33
|
-
const listeners = /* @__PURE__ */ new Set();
|
|
34
|
-
return {
|
|
35
|
-
get state() {
|
|
36
|
-
return current;
|
|
37
|
-
},
|
|
38
|
-
send(event) {
|
|
39
|
-
const stateConfig = config.states[current];
|
|
40
|
-
const next = stateConfig?.on?.[event];
|
|
41
|
-
if (next && next !== current) {
|
|
42
|
-
current = next;
|
|
43
|
-
for (const fn of listeners) {
|
|
44
|
-
fn(current);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
subscribe(fn) {
|
|
49
|
-
listeners.add(fn);
|
|
50
|
-
return () => {
|
|
51
|
-
listeners.delete(fn);
|
|
52
|
-
};
|
|
53
|
-
},
|
|
54
|
-
matches(state) {
|
|
55
|
-
return current === state;
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
function cn(...inputs) {
|
|
60
|
-
const classes = [];
|
|
61
|
-
for (const input of inputs) {
|
|
62
|
-
if (!input) continue;
|
|
63
|
-
if (typeof input === "string") {
|
|
64
|
-
classes.push(input);
|
|
65
|
-
} else if (typeof input === "number") {
|
|
66
|
-
classes.push(String(input));
|
|
67
|
-
} else if (Array.isArray(input)) {
|
|
68
|
-
const nested = cn(...input);
|
|
69
|
-
if (nested) classes.push(nested);
|
|
70
|
-
} else if (typeof input === "object") {
|
|
71
|
-
for (const [key, value] of Object.entries(input)) {
|
|
72
|
-
if (value) classes.push(key);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return classes.join(" ");
|
|
77
|
-
}
|
|
78
|
-
function cva(config) {
|
|
79
|
-
return (props) => {
|
|
80
|
-
const classes = [];
|
|
81
|
-
if (config.base) {
|
|
82
|
-
classes.push(config.base);
|
|
83
|
-
}
|
|
84
|
-
if (config.variants) {
|
|
85
|
-
for (const [variantKey, variantOptions] of Object.entries(config.variants)) {
|
|
86
|
-
const selectedValue = props?.[variantKey] ?? config.defaultVariants?.[variantKey];
|
|
87
|
-
if (selectedValue != null) {
|
|
88
|
-
const variantClass = variantOptions[selectedValue];
|
|
89
|
-
if (variantClass) {
|
|
90
|
-
classes.push(variantClass);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
if (config.compoundVariants) {
|
|
96
|
-
for (const compound of config.compoundVariants) {
|
|
97
|
-
const { class: compoundClass, ...conditions } = compound;
|
|
98
|
-
let matches = true;
|
|
99
|
-
for (const [key, value] of Object.entries(conditions)) {
|
|
100
|
-
const propValue = props?.[key] ?? config.defaultVariants?.[key];
|
|
101
|
-
if (propValue !== value) {
|
|
102
|
-
matches = false;
|
|
103
|
-
break;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
if (matches) {
|
|
107
|
-
classes.push(compoundClass);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
if (props?.className) {
|
|
112
|
-
classes.push(props.className);
|
|
113
|
-
}
|
|
114
|
-
return classes.filter(Boolean).join(" ");
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
function prefersReducedMotion() {
|
|
118
|
-
if (typeof window === "undefined") return false;
|
|
119
|
-
return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
120
|
-
}
|
|
121
|
-
var seen = /* @__PURE__ */ new Set();
|
|
122
|
-
var injectedSink = null;
|
|
123
|
-
function isDev() {
|
|
124
|
-
return typeof process === "undefined" || true;
|
|
125
|
-
}
|
|
126
|
-
function emit(level, code, message, detail) {
|
|
127
|
-
if (!isDev()) return;
|
|
128
|
-
const key = `${level}:${code}`;
|
|
129
|
-
if (seen.has(key)) return;
|
|
130
|
-
seen.add(key);
|
|
131
|
-
const text = `[refraction-ui] ${code}: ${message}`;
|
|
132
|
-
if (level === "error") {
|
|
133
|
-
console.error(text, detail ?? "");
|
|
134
|
-
} else {
|
|
135
|
-
console.warn(text, detail ?? "");
|
|
136
|
-
}
|
|
137
|
-
if (injectedSink) {
|
|
138
|
-
const record = {
|
|
139
|
-
level,
|
|
140
|
-
message: `${code}: ${message}`,
|
|
141
|
-
timestamp: Date.now(),
|
|
142
|
-
context: { code, ...detail ?? {} }
|
|
143
|
-
};
|
|
144
|
-
try {
|
|
145
|
-
injectedSink.log(record);
|
|
146
|
-
} catch {
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
function devWarn(code, message, detail) {
|
|
151
|
-
emit("warn", code, message, detail);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
export {
|
|
155
|
-
generateId,
|
|
156
|
-
Keys,
|
|
157
|
-
createKeyboardHandler,
|
|
158
|
-
createMachine,
|
|
159
|
-
cn,
|
|
160
|
-
cva,
|
|
161
|
-
prefersReducedMotion,
|
|
162
|
-
devWarn
|
|
163
|
-
};
|
|
164
|
-
//# sourceMappingURL=chunk-2Q6HHFAN.js.map
|
package/dist/chunk-SDZ3LROZ.js
DELETED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|