@nori-ui/core 1.5.0 → 1.6.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/dist/Table.shared-BymRgTnY.d.cts +54 -0
- package/dist/Table.shared-BymRgTnY.d.ts +54 -0
- package/dist/{chunk-ND7MRYW7.js → chunk-2HMQDJ22.js} +4 -4
- package/dist/{chunk-ND7MRYW7.js.map → chunk-2HMQDJ22.js.map} +1 -1
- package/dist/{chunk-KCLWPSV5.js → chunk-2RL6WCFC.js} +4 -4
- package/dist/{chunk-KCLWPSV5.js.map → chunk-2RL6WCFC.js.map} +1 -1
- package/dist/{chunk-FDBQOQMW.js → chunk-3BDDPFCI.js} +3 -3
- package/dist/{chunk-FDBQOQMW.js.map → chunk-3BDDPFCI.js.map} +1 -1
- package/dist/{chunk-WOF67PKT.js → chunk-3CEJ5TB4.js} +3 -3
- package/dist/{chunk-WOF67PKT.js.map → chunk-3CEJ5TB4.js.map} +1 -1
- package/dist/{chunk-BNDUQNG7.js → chunk-3OIWAS2P.js} +3 -3
- package/dist/{chunk-BNDUQNG7.js.map → chunk-3OIWAS2P.js.map} +1 -1
- package/dist/{chunk-6JVUVBZH.js → chunk-4PUPKWEP.js} +5 -5
- package/dist/{chunk-6JVUVBZH.js.map → chunk-4PUPKWEP.js.map} +1 -1
- package/dist/{chunk-6PO2IWB3.js → chunk-4UFAZLSZ.js} +5 -3
- package/dist/chunk-4UFAZLSZ.js.map +1 -0
- package/dist/{chunk-76FZF4GM.js → chunk-5PSC5HT4.js} +8 -125
- package/dist/chunk-5PSC5HT4.js.map +1 -0
- package/dist/{chunk-LWQZ257T.js → chunk-5XEGZFG5.js} +3 -3
- package/dist/{chunk-LWQZ257T.js.map → chunk-5XEGZFG5.js.map} +1 -1
- package/dist/{chunk-WAKKQROH.js → chunk-6AD6KCVB.js} +3 -3
- package/dist/{chunk-WAKKQROH.js.map → chunk-6AD6KCVB.js.map} +1 -1
- package/dist/chunk-73CUV7MW.js +125 -0
- package/dist/chunk-73CUV7MW.js.map +1 -0
- package/dist/{chunk-GRDVE3IR.js → chunk-BZLT6R62.js} +3 -3
- package/dist/{chunk-GRDVE3IR.js.map → chunk-BZLT6R62.js.map} +1 -1
- package/dist/{chunk-Y4ZRSW35.js → chunk-CCUXO2HN.js} +3 -3
- package/dist/{chunk-Y4ZRSW35.js.map → chunk-CCUXO2HN.js.map} +1 -1
- package/dist/{chunk-2UXKXUX2.js → chunk-CPIKN4BX.js} +3 -3
- package/dist/{chunk-2UXKXUX2.js.map → chunk-CPIKN4BX.js.map} +1 -1
- package/dist/{chunk-46OT4PA6.js → chunk-DDGMLLS3.js} +3 -3
- package/dist/{chunk-46OT4PA6.js.map → chunk-DDGMLLS3.js.map} +1 -1
- package/dist/{chunk-XP55RZ3D.js → chunk-FEPTH5RV.js} +3 -3
- package/dist/{chunk-XP55RZ3D.js.map → chunk-FEPTH5RV.js.map} +1 -1
- package/dist/{chunk-MJ4AGXS7.js → chunk-GJMHNEQ3.js} +3 -3
- package/dist/{chunk-MJ4AGXS7.js.map → chunk-GJMHNEQ3.js.map} +1 -1
- package/dist/{chunk-VCJF75T2.js → chunk-JQQ3FBN7.js} +3 -3
- package/dist/{chunk-VCJF75T2.js.map → chunk-JQQ3FBN7.js.map} +1 -1
- package/dist/{chunk-O4NMS3KB.js → chunk-JXLEMBDB.js} +3 -3
- package/dist/{chunk-O4NMS3KB.js.map → chunk-JXLEMBDB.js.map} +1 -1
- package/dist/{chunk-W3HMOOON.js → chunk-JZ774T7U.js} +3 -3
- package/dist/{chunk-W3HMOOON.js.map → chunk-JZ774T7U.js.map} +1 -1
- package/dist/{chunk-SINLREQV.js → chunk-MKSDYRWQ.js} +3 -3
- package/dist/{chunk-SINLREQV.js.map → chunk-MKSDYRWQ.js.map} +1 -1
- package/dist/{chunk-AFQIK6JI.js → chunk-MRJWPRCX.js} +3 -3
- package/dist/{chunk-AFQIK6JI.js.map → chunk-MRJWPRCX.js.map} +1 -1
- package/dist/{chunk-EFK7726V.js → chunk-NF7XG2FG.js} +3 -3
- package/dist/{chunk-EFK7726V.js.map → chunk-NF7XG2FG.js.map} +1 -1
- package/dist/{chunk-WTNDPO2V.js → chunk-NNFJKRXZ.js} +3 -3
- package/dist/{chunk-WTNDPO2V.js.map → chunk-NNFJKRXZ.js.map} +1 -1
- package/dist/{chunk-CGQIVFCN.js → chunk-NRYWNOG5.js} +3 -3
- package/dist/{chunk-CGQIVFCN.js.map → chunk-NRYWNOG5.js.map} +1 -1
- package/dist/{chunk-HTF6FDB6.js → chunk-OMU4R4Y5.js} +3 -3
- package/dist/{chunk-HTF6FDB6.js.map → chunk-OMU4R4Y5.js.map} +1 -1
- package/dist/{chunk-C6TRLHMW.js → chunk-PABG3IJ6.js} +3 -3
- package/dist/{chunk-C6TRLHMW.js.map → chunk-PABG3IJ6.js.map} +1 -1
- package/dist/{chunk-RM5TSXVE.js → chunk-PNP7L4TA.js} +3 -3
- package/dist/{chunk-RM5TSXVE.js.map → chunk-PNP7L4TA.js.map} +1 -1
- package/dist/{chunk-L5X4SYJ4.js → chunk-PZS4A4VQ.js} +3 -3
- package/dist/{chunk-L5X4SYJ4.js.map → chunk-PZS4A4VQ.js.map} +1 -1
- package/dist/{chunk-4I37QSEM.js → chunk-QJVS2VXS.js} +5 -5
- package/dist/{chunk-4I37QSEM.js.map → chunk-QJVS2VXS.js.map} +1 -1
- package/dist/{chunk-H7MFAFV4.js → chunk-RUWD35UI.js} +4 -4
- package/dist/{chunk-H7MFAFV4.js.map → chunk-RUWD35UI.js.map} +1 -1
- package/dist/{chunk-5BM6H2CD.js → chunk-SFNDR6DI.js} +3 -3
- package/dist/{chunk-5BM6H2CD.js.map → chunk-SFNDR6DI.js.map} +1 -1
- package/dist/{chunk-UF5OENHV.js → chunk-TLS54G6Y.js} +3 -3
- package/dist/{chunk-UF5OENHV.js.map → chunk-TLS54G6Y.js.map} +1 -1
- package/dist/{chunk-UUXWRDWW.js → chunk-UJWCEGQY.js} +3 -3
- package/dist/{chunk-UUXWRDWW.js.map → chunk-UJWCEGQY.js.map} +1 -1
- package/dist/{chunk-UJ5KFRDE.js → chunk-UZD77M3J.js} +3 -3
- package/dist/{chunk-UJ5KFRDE.js.map → chunk-UZD77M3J.js.map} +1 -1
- package/dist/chunk-VP7DRJUZ.js +3 -0
- package/dist/chunk-VP7DRJUZ.js.map +1 -0
- package/dist/{chunk-UPVNZPFV.js → chunk-VYRJ7OE5.js} +3 -3
- package/dist/{chunk-UPVNZPFV.js.map → chunk-VYRJ7OE5.js.map} +1 -1
- package/dist/{chunk-IGLMPAWE.js → chunk-WGT345SV.js} +3 -3
- package/dist/{chunk-IGLMPAWE.js.map → chunk-WGT345SV.js.map} +1 -1
- package/dist/{chunk-F7G6R373.js → chunk-WP2Z2ATO.js} +5 -5
- package/dist/{chunk-F7G6R373.js.map → chunk-WP2Z2ATO.js.map} +1 -1
- package/dist/chunk-WYPGQVDV.js +145 -0
- package/dist/chunk-WYPGQVDV.js.map +1 -0
- package/dist/{chunk-GELLSU64.js → chunk-XALU6LOT.js} +3 -3
- package/dist/{chunk-GELLSU64.js.map → chunk-XALU6LOT.js.map} +1 -1
- package/dist/{chunk-VMAGFYHG.js → chunk-Y5TJ7CAX.js} +3 -3
- package/dist/{chunk-VMAGFYHG.js.map → chunk-Y5TJ7CAX.js.map} +1 -1
- package/dist/chunk-YZ27OS2R.js +202 -0
- package/dist/chunk-YZ27OS2R.js.map +1 -0
- package/dist/client.cjs +449 -119
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +3 -0
- package/dist/client.d.ts +3 -0
- package/dist/client.js +50 -46
- package/dist/client.js.map +1 -1
- package/dist/components/Accordion/index.js +2 -2
- package/dist/components/Alert/index.js +2 -2
- package/dist/components/AlertDialog/index.js +2 -2
- package/dist/components/Avatar/index.js +2 -2
- package/dist/components/Badge/index.js +2 -2
- package/dist/components/Box/index.js +4 -4
- package/dist/components/Breadcrumb/index.cjs +3 -1
- package/dist/components/Breadcrumb/index.cjs.map +1 -1
- package/dist/components/Breadcrumb/index.js +5 -5
- package/dist/components/Button/index.js +2 -2
- package/dist/components/Calendar/index.cjs +3 -1
- package/dist/components/Calendar/index.cjs.map +1 -1
- package/dist/components/Calendar/index.js +5 -5
- package/dist/components/Card/index.js +2 -2
- package/dist/components/Checkbox/index.js +2 -2
- package/dist/components/Combobox/index.js +3 -3
- package/dist/components/ContextMenu/index.js +4 -4
- package/dist/components/DataTable/index.cjs +770 -0
- package/dist/components/DataTable/index.cjs.map +1 -0
- package/dist/components/DataTable/index.d.cts +53 -0
- package/dist/components/DataTable/index.d.ts +53 -0
- package/dist/components/DataTable/index.js +8 -0
- package/dist/components/DataTable/index.js.map +1 -0
- package/dist/components/DatePicker/index.cjs +3 -1
- package/dist/components/DatePicker/index.cjs.map +1 -1
- package/dist/components/DatePicker/index.js +7 -7
- package/dist/components/Dialog/index.js +2 -2
- package/dist/components/DropdownMenu/index.js +3 -3
- package/dist/components/Field/index.cjs +3 -1
- package/dist/components/Field/index.cjs.map +1 -1
- package/dist/components/Field/index.d.cts +2 -2
- package/dist/components/Field/index.d.ts +2 -2
- package/dist/components/Field/index.js +3 -3
- package/dist/components/FloatButton/index.cjs +3 -1
- package/dist/components/FloatButton/index.cjs.map +1 -1
- package/dist/components/FloatButton/index.js +5 -5
- package/dist/components/HStack/index.js +4 -4
- package/dist/components/InputGroup/index.js +2 -2
- package/dist/components/Label/index.cjs +3 -1
- package/dist/components/Label/index.cjs.map +1 -1
- package/dist/components/Label/index.js +3 -3
- package/dist/components/Pagination/index.cjs +3 -1
- package/dist/components/Pagination/index.cjs.map +1 -1
- package/dist/components/Pagination/index.js +6 -5
- package/dist/components/Popover/index.js +2 -2
- package/dist/components/Progress/index.js +2 -2
- package/dist/components/Radio/index.js +2 -2
- package/dist/components/SegmentedControl/index.js +2 -2
- package/dist/components/Select/index.js +2 -2
- package/dist/components/Sheet/index.js +2 -2
- package/dist/components/Switch/index.js +2 -2
- package/dist/components/Table/index.cjs +461 -0
- package/dist/components/Table/index.cjs.map +1 -0
- package/dist/components/Table/index.d.cts +16 -0
- package/dist/components/Table/index.d.ts +16 -0
- package/dist/components/Table/index.js +7 -0
- package/dist/components/Table/index.js.map +1 -0
- package/dist/components/Tabs/index.js +2 -2
- package/dist/components/Text/index.js +2 -2
- package/dist/components/TextArea/index.js +3 -3
- package/dist/components/TextInput/index.js +2 -2
- package/dist/components/Toggle/index.js +2 -2
- package/dist/components/Tooltip/index.js +2 -2
- package/dist/components/VStack/index.js +4 -4
- package/dist/i18n/index.cjs +3 -1
- package/dist/i18n/index.cjs.map +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/index.cjs +449 -119
- 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 +47 -43
- package/dist/slot/index.d.cts +2 -2
- package/dist/slot/index.d.ts +2 -2
- package/package.json +1 -1
- package/dist/chunk-6PO2IWB3.js.map +0 -1
- package/dist/chunk-76FZF4GM.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Tooltip/Tooltip.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-CGQIVFCN.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Platform, Pressable, Text as RNText, View } from 'react-native';\nimport { Slot } from '../../slot';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type TooltipSide = 'top' | 'right' | 'bottom' | 'left';\nexport type TooltipAlign = 'start' | 'center' | 'end';\n\ntype TriggerRect = { top: number; left: number; width: number; height: number };\n\ntype TooltipContextValue = {\n open: boolean;\n setOpen: (next: boolean) => void;\n /** Open after `delayMs` if still hovered/focused. */\n requestOpen: () => void;\n /** Close after `closeDelayMs`; cancellable. */\n requestClose: () => void;\n /** Cancel any pending open/close timers (e.g. when re-entering). */\n cancelTimers: () => void;\n contentId: string;\n triggerRef: { current: HTMLElement | null };\n contentRef: { current: HTMLDivElement | null };\n triggerRect: TriggerRect | null;\n measureTrigger: () => void;\n};\n\nconst TooltipContext = createContext<TooltipContextValue | null>(null);\n\nconst useTooltipContext = (label: string): TooltipContextValue => {\n const ctx = useContext(TooltipContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside a <Tooltip>.`);\n }\n return ctx;\n};\n\nconst DEFAULT_OPEN_DELAY_MS = 500;\nconst DEFAULT_CLOSE_DELAY_MS = 0;\n/** Long-press duration on native — matches platform defaults (iOS ~500ms). */\nconst LONG_PRESS_MS = 500;\n\nexport type TooltipProps = {\n /** Controlled open state. */\n open?: boolean;\n /** Uncontrolled initial open state. @defaultValue false */\n defaultOpen?: boolean;\n /** Fires with the new open state. */\n onOpenChange?: (open: boolean) => void;\n /**\n * Delay before the tooltip opens after hover/focus.\n * @defaultValue 500\n */\n delayMs?: number;\n /**\n * Delay before the tooltip closes after hover-out / blur. Useful for\n * giving users time to move into the tooltip if it ever becomes\n * interactive (it shouldn't — use Popover for that — but the knob is\n * here so the API matches Radix).\n * @defaultValue 0\n */\n closeDelayMs?: number;\n children?: ReactNode;\n};\n\n/**\n * Small floating label triggered by hover (web) or long-press (native).\n * Use for short contextual hints — most often on icon-only buttons. NOT\n * for rich interactive content; reach for `Popover` when the surface\n * needs to hold buttons, inputs, or links.\n *\n * Composition: `Tooltip` (root, owns open state and timers),\n * `TooltipTrigger` (forwards events to its child via Slot when\n * `asChild`), `TooltipContent` (the floating label).\n *\n * Accessibility: the trigger gets `aria-describedby` pointing at the\n * content id — tooltips augment the trigger's accessible name, they do\n * NOT replace it. The icon-only button still needs an `aria-label`.\n *\n * Behavior:\n * - Open on hover (web mouseover) or focus, after `delayMs`.\n * - Close on hover-out, blur, or Escape.\n * - Native: long-press the trigger (500ms) to reveal; tap-anywhere or\n * re-press to dismiss.\n *\n * Cross-platform: web renders the content inline with `position: fixed`\n * + a measured trigger rect so it escapes any ancestor `overflow:\n * hidden`. Native renders inline with `position: absolute` — the parent\n * needs to allow overflow for the chip to peek out.\n */\nconst TooltipRoot = ({\n open,\n defaultOpen = false,\n onOpenChange,\n delayMs = DEFAULT_OPEN_DELAY_MS,\n closeDelayMs = DEFAULT_CLOSE_DELAY_MS,\n children,\n}: TooltipProps) => {\n const [inner, setInner] = useState<boolean>(defaultOpen);\n const isControlled = open !== undefined;\n const current = isControlled ? open : inner;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setInner(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n // Open / close timers. Both are cleared on unmount and on every new\n // request — so rapid hover-in / hover-out doesn't leave a stale timer\n // about to flip state after the user has moved on.\n const openTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const cancelTimers = useCallback(() => {\n if (openTimer.current) {\n clearTimeout(openTimer.current);\n openTimer.current = null;\n }\n if (closeTimer.current) {\n clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n }, []);\n\n const requestOpen = useCallback(() => {\n if (closeTimer.current) {\n clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n if (openTimer.current) {\n return;\n }\n if (delayMs <= 0) {\n setOpen(true);\n return;\n }\n openTimer.current = setTimeout(() => {\n openTimer.current = null;\n setOpen(true);\n }, delayMs);\n }, [delayMs, setOpen]);\n\n const requestClose = useCallback(() => {\n if (openTimer.current) {\n clearTimeout(openTimer.current);\n openTimer.current = null;\n }\n if (closeTimer.current) {\n return;\n }\n if (closeDelayMs <= 0) {\n setOpen(false);\n return;\n }\n closeTimer.current = setTimeout(() => {\n closeTimer.current = null;\n setOpen(false);\n }, closeDelayMs);\n }, [closeDelayMs, setOpen]);\n\n useEffect(() => () => cancelTimers(), [cancelTimers]);\n\n const baseId = useId();\n const triggerRef = useRef<HTMLElement | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n\n // Measure the trigger so the content can render with `position: fixed` +\n // computed coords. position:fixed escapes any ancestor's overflow:hidden\n // (e.g. fumadocs Tabs panes, our Preview frame), which is the single\n // biggest source of \"the tooltip got cut off\" bugs.\n const [triggerRect, setTriggerRect] = useState<TriggerRect | null>(null);\n const measureTrigger = useCallback(() => {\n const node = triggerRef.current;\n if (!node || typeof node.getBoundingClientRect !== 'function') {\n return;\n }\n const rect = node.getBoundingClientRect();\n setTriggerRect({ top: rect.top, left: rect.left, width: rect.width, height: rect.height });\n }, []);\n\n const ctxValue: TooltipContextValue = {\n open: current,\n setOpen,\n requestOpen,\n requestClose,\n cancelTimers,\n contentId: `${baseId}-content`,\n triggerRef,\n contentRef,\n triggerRect,\n measureTrigger,\n };\n\n return <TooltipContext.Provider value={ctxValue}>{children}</TooltipContext.Provider>;\n};\n\nexport type TooltipTriggerProps = {\n /** Render the child as the trigger (Slot pattern). Default true — pass `false` for an inline pressable. */\n asChild?: boolean;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Element that reveals the tooltip. Uses `asChild` by default so any\n * element (Button, IconButton, custom Pressable) becomes the trigger.\n *\n * Wires `aria-describedby` to the content's id — assistive tech reads\n * the tooltip text in addition to the trigger's own accessible name.\n *\n * Web: opens on `mouseEnter` and `focus`; closes on `mouseLeave` and\n * `blur`, both honoring the configured delays. Native: opens on\n * `onLongPress` (500ms hold) and closes on the next press anywhere.\n */\nexport const TooltipTrigger = ({ asChild = true, children, className, testID }: TooltipTriggerProps) => {\n const ctx = useTooltipContext('TooltipTrigger');\n\n const handleMouseEnter = useCallback(() => {\n ctx.measureTrigger();\n ctx.requestOpen();\n }, [ctx]);\n const handleMouseLeave = useCallback(() => {\n ctx.requestClose();\n }, [ctx]);\n const handleFocus = useCallback(() => {\n ctx.measureTrigger();\n ctx.requestOpen();\n }, [ctx]);\n const handleBlur = useCallback(() => {\n ctx.requestClose();\n }, [ctx]);\n const handleLongPress = useCallback(() => {\n ctx.measureTrigger();\n ctx.setOpen(true);\n }, [ctx]);\n const handlePress = useCallback(() => {\n // Native: tap (after a long-press has revealed it) dismisses.\n if (Platform.OS !== 'web' && ctx.open) {\n ctx.setOpen(false);\n }\n }, [ctx]);\n\n if (asChild && isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n // Compose the wrapped child's existing handlers with ours so any\n // app-level onClick / onFocus / onPress still fires. The tooltip\n // event runs AFTER the child's so consumer code wins on conflict.\n const compose =\n <T,>(existing: ((e: T) => void) | undefined, next: (e: T) => void) =>\n (event: T) => {\n existing?.(event);\n next(event);\n };\n return (\n <Slot\n ref={(node: HTMLElement | null) => {\n ctx.triggerRef.current = node;\n }}\n onMouseEnter={compose(child.props.onMouseEnter as ((e: unknown) => void) | undefined, handleMouseEnter)}\n onMouseLeave={compose(child.props.onMouseLeave as ((e: unknown) => void) | undefined, handleMouseLeave)}\n onFocus={compose(child.props.onFocus as ((e: unknown) => void) | undefined, handleFocus)}\n onBlur={compose(child.props.onBlur as ((e: unknown) => void) | undefined, handleBlur)}\n {...(Platform.OS !== 'web'\n ? {\n onLongPress: compose(\n child.props.onLongPress as ((e: unknown) => void) | undefined,\n handleLongPress\n ),\n onPress: compose(child.props.onPress as ((e: unknown) => void) | undefined, handlePress),\n delayLongPress: LONG_PRESS_MS,\n }\n : {})}\n aria-describedby={ctx.open ? ctx.contentId : undefined}\n {...(testID !== undefined ? { 'data-testid': testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {child}\n </Slot>\n );\n }\n\n return (\n <Pressable\n ref={(node) => {\n ctx.triggerRef.current = node as unknown as HTMLElement | null;\n }}\n {...(Platform.OS !== 'web'\n ? { onLongPress: handleLongPress, onPress: handlePress, delayLongPress: LONG_PRESS_MS }\n : {})}\n {...({\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n onFocus: handleFocus,\n onBlur: handleBlur,\n 'aria-describedby': ctx.open ? ctx.contentId : undefined,\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {wrapStringChildren(children)}\n </Pressable>\n );\n};\n\n// On native, raw strings rendered as children of a non-Text component\n// throw \"Text strings must be rendered within a <Text> component\". On\n// web, react-native-web silently tolerates it. Wrap any string/number\n// children in an RNText so the same JSX renders cleanly on both\n// platforms. Non-string children are passed through unchanged.\nfunction wrapStringChildren(children: ReactNode): ReactNode {\n if (typeof children === 'string' || typeof children === 'number') {\n return <RNText>{children}</RNText>;\n }\n return children;\n}\n\nconst GAP = 4; // visual gap between trigger and content\nconst MIN_WIDTH = 0; // tooltips hug their text — no enforced minimum\n\nfunction computePosition(\n rect: TriggerRect,\n side: TooltipSide,\n align: TooltipAlign,\n contentSize: { width: number; height: number } | null\n): { top: number; left: number } {\n const cw = contentSize?.width ?? MIN_WIDTH;\n const ch = contentSize?.height ?? 0;\n\n let top = 0;\n let left = 0;\n\n switch (side) {\n case 'top':\n top = rect.top - GAP - ch;\n break;\n case 'bottom':\n top = rect.top + rect.height + GAP;\n break;\n case 'left':\n left = rect.left - GAP - cw;\n break;\n case 'right':\n left = rect.left + rect.width + GAP;\n break;\n }\n\n if (side === 'top' || side === 'bottom') {\n switch (align) {\n case 'start':\n left = rect.left;\n break;\n case 'center':\n left = rect.left + rect.width / 2 - cw / 2;\n break;\n case 'end':\n left = rect.left + rect.width - cw;\n break;\n }\n } else {\n switch (align) {\n case 'start':\n top = rect.top;\n break;\n case 'center':\n top = rect.top + rect.height / 2 - ch / 2;\n break;\n case 'end':\n top = rect.top + rect.height - ch;\n break;\n }\n }\n\n return { top, left };\n}\n\nexport type TooltipContentProps = {\n /** Side of the trigger to anchor on. @defaultValue 'top' */\n side?: TooltipSide;\n /** Alignment along the trigger edge. @defaultValue 'center' */\n align?: TooltipAlign;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * The floating tooltip surface. Renders only while open. On web uses\n * `position: fixed` with a measured trigger rect so it escapes any\n * ancestor `overflow: hidden`.\n *\n * ARIA: `role=\"tooltip\"` plus a unique id that the trigger's\n * `aria-describedby` points at.\n */\nexport const TooltipContent = ({\n side = 'top',\n align = 'center',\n children,\n className,\n testID,\n}: TooltipContentProps) => {\n const ctx = useTooltipContext('TooltipContent');\n const colors = useThemeColors();\n\n // Measure content size after first paint so we can anchor `top`-side\n // tooltips (which need to know content height to render above the trigger).\n const [contentSize, setContentSize] = useState<{ width: number; height: number } | null>(null);\n\n // Direct DOM ref for the entrance animation. We poke `transform`,\n // `opacity`, and `transition` straight onto node.style instead of\n // passing them through `<View style>`, because rn-web's style filter\n // drops keys it doesn't recognize as RN style props (`transitionProperty`,\n // `transitionDuration`, etc.) — so any style fragment containing them\n // gets discarded entirely. Same pattern as the Dialog backdrop-blur fix.\n const domRef = useRef<HTMLDivElement | null>(null);\n const [entered, setEntered] = useState(false);\n\n // Web-only: Escape closes. Re-measure trigger on resize/scroll so the\n // chip stays anchored during page motion.\n useEffect(() => {\n if (!ctx.open) {\n return;\n }\n if (Platform.OS !== 'web') {\n return;\n }\n if (typeof document === 'undefined') {\n return;\n }\n\n ctx.measureTrigger();\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n ctx.setOpen(false);\n }\n };\n const onResize = () => ctx.measureTrigger();\n const onScroll = () => ctx.measureTrigger();\n\n document.addEventListener('keydown', onKeyDown);\n window.addEventListener('resize', onResize);\n window.addEventListener('scroll', onScroll, true);\n return () => {\n document.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('resize', onResize);\n window.removeEventListener('scroll', onScroll, true);\n };\n }, [ctx.open, ctx.measureTrigger, ctx.setOpen]);\n\n // Reset measured size and entrance flag when tooltip closes so a\n // reopen re-measures and re-animates fresh.\n useEffect(() => {\n if (!ctx.open) {\n setContentSize(null);\n setEntered(false);\n }\n }, [ctx.open]);\n\n // Entrance animation. On the first paint we render at scale(0.95) +\n // opacity 0; the next frame we flip the styles to scale(1) + opacity\n // 1, and the CSS transition handles the in-between. Web only —\n // native renders without animation (an animated mount on RN would\n // require Reanimated for negligible visual gain on a hint chip).\n useEffect(() => {\n if (Platform.OS !== 'web') {\n return;\n }\n if (!ctx.open) {\n return;\n }\n const node = domRef.current;\n if (!node) {\n return;\n }\n // Initial values — explicitly set so the first frame is at the\n // pre-entrance state regardless of inherited styles.\n node.style.transformOrigin = 'center';\n node.style.transitionProperty = 'opacity, transform';\n node.style.transitionDuration = '100ms';\n node.style.transitionTimingFunction = 'ease-out';\n node.style.opacity = entered ? '1' : '0';\n node.style.transform = entered ? 'scale(1)' : 'scale(0.95)';\n }, [ctx.open, entered]);\n\n // Kick off the transition on the next frame after mount.\n useEffect(() => {\n if (Platform.OS !== 'web') {\n return;\n }\n if (!ctx.open) {\n return;\n }\n const id = requestAnimationFrame(() => setEntered(true));\n return () => cancelAnimationFrame(id);\n }, [ctx.open]);\n\n if (!ctx.open) {\n return null;\n }\n\n const position = ctx.triggerRect ? computePosition(ctx.triggerRect, side, align, contentSize) : null;\n\n const contentBaseStyle: ViewStyle = {\n borderRadius: px(colors.radius.md),\n backgroundColor: colors.semantic.text.default,\n paddingVertical: px(colors.spacing['2']) - 2, // closest theme-rooted approximation of legacy 6\n paddingHorizontal: px(colors.spacing['2']),\n ...(Platform.OS === 'web'\n ? ({\n boxShadow: '0 4px 6px -2px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.06)',\n } as ViewStyle)\n : { elevation: 4 }),\n };\n\n const positionedStyle: ViewStyle =\n Platform.OS === 'web'\n ? position\n ? ({\n position: 'fixed' as unknown as 'absolute',\n top: position.top,\n left: position.left,\n zIndex: 60,\n } as ViewStyle)\n : ({\n // Trigger not yet measured — render off-screen for a\n // frame to avoid a flash at (0,0).\n position: 'fixed' as unknown as 'absolute',\n top: -9999,\n left: -9999,\n zIndex: 60,\n } as ViewStyle)\n : ({\n // Native: rely on the parent allowing overflow. We anchor\n // by absolute positioning relative to wherever the\n // tooltip is mounted in the tree (typically right next\n // to the trigger).\n position: 'absolute',\n top: position?.top ?? 0,\n left: position?.left ?? 0,\n } as ViewStyle);\n\n return (\n <View\n ref={(node) => {\n ctx.contentRef.current = node as unknown as HTMLDivElement | null;\n domRef.current = node as unknown as HTMLDivElement | null;\n if (Platform.OS !== 'web') {\n return;\n }\n if (!node) {\n return;\n }\n if (typeof (node as unknown as HTMLDivElement).getBoundingClientRect !== 'function') {\n return;\n }\n const rect = (node as unknown as HTMLDivElement).getBoundingClientRect();\n if (!contentSize || contentSize.width !== rect.width || contentSize.height !== rect.height) {\n setContentSize({ width: rect.width, height: rect.height });\n }\n }}\n {...({\n role: 'tooltip',\n id: ctx.contentId,\n // Don't soak up pointer events — hovering the tooltip\n // itself should NOT block the trigger's mouse-leave from\n // firing. Tooltips are presentational; if you need\n // interactivity, reach for Popover.\n pointerEvents: 'none',\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n className={cn('rounded-md', className)}\n style={[contentBaseStyle, positionedStyle]}\n >\n <RNText\n className=\"text-xs\"\n style={{\n color: colors.semantic.text.inverted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n lineHeight: px(colors.fontSize.sm) * Number(colors.lineHeight.tight),\n }}\n >\n {children}\n </RNText>\n </View>\n );\n};\n\n/**\n * Public `Tooltip` value — the root function plus its `.Trigger` and\n * `.Content` static members. `Object.assign` produces a value whose inferred\n * type carries the static properties, so `.d.ts` consumers can write\n * `<Tooltip.Trigger>` without a separate import.\n */\nexport const Tooltip = Object.assign(TooltipRoot, {\n Trigger: TooltipTrigger,\n Content: TooltipContent,\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Tooltip/Tooltip.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-NRYWNOG5.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Platform, Pressable, Text as RNText, View } from 'react-native';\nimport { Slot } from '../../slot';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type TooltipSide = 'top' | 'right' | 'bottom' | 'left';\nexport type TooltipAlign = 'start' | 'center' | 'end';\n\ntype TriggerRect = { top: number; left: number; width: number; height: number };\n\ntype TooltipContextValue = {\n open: boolean;\n setOpen: (next: boolean) => void;\n /** Open after `delayMs` if still hovered/focused. */\n requestOpen: () => void;\n /** Close after `closeDelayMs`; cancellable. */\n requestClose: () => void;\n /** Cancel any pending open/close timers (e.g. when re-entering). */\n cancelTimers: () => void;\n contentId: string;\n triggerRef: { current: HTMLElement | null };\n contentRef: { current: HTMLDivElement | null };\n triggerRect: TriggerRect | null;\n measureTrigger: () => void;\n};\n\nconst TooltipContext = createContext<TooltipContextValue | null>(null);\n\nconst useTooltipContext = (label: string): TooltipContextValue => {\n const ctx = useContext(TooltipContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside a <Tooltip>.`);\n }\n return ctx;\n};\n\nconst DEFAULT_OPEN_DELAY_MS = 500;\nconst DEFAULT_CLOSE_DELAY_MS = 0;\n/** Long-press duration on native — matches platform defaults (iOS ~500ms). */\nconst LONG_PRESS_MS = 500;\n\nexport type TooltipProps = {\n /** Controlled open state. */\n open?: boolean;\n /** Uncontrolled initial open state. @defaultValue false */\n defaultOpen?: boolean;\n /** Fires with the new open state. */\n onOpenChange?: (open: boolean) => void;\n /**\n * Delay before the tooltip opens after hover/focus.\n * @defaultValue 500\n */\n delayMs?: number;\n /**\n * Delay before the tooltip closes after hover-out / blur. Useful for\n * giving users time to move into the tooltip if it ever becomes\n * interactive (it shouldn't — use Popover for that — but the knob is\n * here so the API matches Radix).\n * @defaultValue 0\n */\n closeDelayMs?: number;\n children?: ReactNode;\n};\n\n/**\n * Small floating label triggered by hover (web) or long-press (native).\n * Use for short contextual hints — most often on icon-only buttons. NOT\n * for rich interactive content; reach for `Popover` when the surface\n * needs to hold buttons, inputs, or links.\n *\n * Composition: `Tooltip` (root, owns open state and timers),\n * `TooltipTrigger` (forwards events to its child via Slot when\n * `asChild`), `TooltipContent` (the floating label).\n *\n * Accessibility: the trigger gets `aria-describedby` pointing at the\n * content id — tooltips augment the trigger's accessible name, they do\n * NOT replace it. The icon-only button still needs an `aria-label`.\n *\n * Behavior:\n * - Open on hover (web mouseover) or focus, after `delayMs`.\n * - Close on hover-out, blur, or Escape.\n * - Native: long-press the trigger (500ms) to reveal; tap-anywhere or\n * re-press to dismiss.\n *\n * Cross-platform: web renders the content inline with `position: fixed`\n * + a measured trigger rect so it escapes any ancestor `overflow:\n * hidden`. Native renders inline with `position: absolute` — the parent\n * needs to allow overflow for the chip to peek out.\n */\nconst TooltipRoot = ({\n open,\n defaultOpen = false,\n onOpenChange,\n delayMs = DEFAULT_OPEN_DELAY_MS,\n closeDelayMs = DEFAULT_CLOSE_DELAY_MS,\n children,\n}: TooltipProps) => {\n const [inner, setInner] = useState<boolean>(defaultOpen);\n const isControlled = open !== undefined;\n const current = isControlled ? open : inner;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setInner(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n // Open / close timers. Both are cleared on unmount and on every new\n // request — so rapid hover-in / hover-out doesn't leave a stale timer\n // about to flip state after the user has moved on.\n const openTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const cancelTimers = useCallback(() => {\n if (openTimer.current) {\n clearTimeout(openTimer.current);\n openTimer.current = null;\n }\n if (closeTimer.current) {\n clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n }, []);\n\n const requestOpen = useCallback(() => {\n if (closeTimer.current) {\n clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n if (openTimer.current) {\n return;\n }\n if (delayMs <= 0) {\n setOpen(true);\n return;\n }\n openTimer.current = setTimeout(() => {\n openTimer.current = null;\n setOpen(true);\n }, delayMs);\n }, [delayMs, setOpen]);\n\n const requestClose = useCallback(() => {\n if (openTimer.current) {\n clearTimeout(openTimer.current);\n openTimer.current = null;\n }\n if (closeTimer.current) {\n return;\n }\n if (closeDelayMs <= 0) {\n setOpen(false);\n return;\n }\n closeTimer.current = setTimeout(() => {\n closeTimer.current = null;\n setOpen(false);\n }, closeDelayMs);\n }, [closeDelayMs, setOpen]);\n\n useEffect(() => () => cancelTimers(), [cancelTimers]);\n\n const baseId = useId();\n const triggerRef = useRef<HTMLElement | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n\n // Measure the trigger so the content can render with `position: fixed` +\n // computed coords. position:fixed escapes any ancestor's overflow:hidden\n // (e.g. fumadocs Tabs panes, our Preview frame), which is the single\n // biggest source of \"the tooltip got cut off\" bugs.\n const [triggerRect, setTriggerRect] = useState<TriggerRect | null>(null);\n const measureTrigger = useCallback(() => {\n const node = triggerRef.current;\n if (!node || typeof node.getBoundingClientRect !== 'function') {\n return;\n }\n const rect = node.getBoundingClientRect();\n setTriggerRect({ top: rect.top, left: rect.left, width: rect.width, height: rect.height });\n }, []);\n\n const ctxValue: TooltipContextValue = {\n open: current,\n setOpen,\n requestOpen,\n requestClose,\n cancelTimers,\n contentId: `${baseId}-content`,\n triggerRef,\n contentRef,\n triggerRect,\n measureTrigger,\n };\n\n return <TooltipContext.Provider value={ctxValue}>{children}</TooltipContext.Provider>;\n};\n\nexport type TooltipTriggerProps = {\n /** Render the child as the trigger (Slot pattern). Default true — pass `false` for an inline pressable. */\n asChild?: boolean;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Element that reveals the tooltip. Uses `asChild` by default so any\n * element (Button, IconButton, custom Pressable) becomes the trigger.\n *\n * Wires `aria-describedby` to the content's id — assistive tech reads\n * the tooltip text in addition to the trigger's own accessible name.\n *\n * Web: opens on `mouseEnter` and `focus`; closes on `mouseLeave` and\n * `blur`, both honoring the configured delays. Native: opens on\n * `onLongPress` (500ms hold) and closes on the next press anywhere.\n */\nexport const TooltipTrigger = ({ asChild = true, children, className, testID }: TooltipTriggerProps) => {\n const ctx = useTooltipContext('TooltipTrigger');\n\n const handleMouseEnter = useCallback(() => {\n ctx.measureTrigger();\n ctx.requestOpen();\n }, [ctx]);\n const handleMouseLeave = useCallback(() => {\n ctx.requestClose();\n }, [ctx]);\n const handleFocus = useCallback(() => {\n ctx.measureTrigger();\n ctx.requestOpen();\n }, [ctx]);\n const handleBlur = useCallback(() => {\n ctx.requestClose();\n }, [ctx]);\n const handleLongPress = useCallback(() => {\n ctx.measureTrigger();\n ctx.setOpen(true);\n }, [ctx]);\n const handlePress = useCallback(() => {\n // Native: tap (after a long-press has revealed it) dismisses.\n if (Platform.OS !== 'web' && ctx.open) {\n ctx.setOpen(false);\n }\n }, [ctx]);\n\n if (asChild && isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n // Compose the wrapped child's existing handlers with ours so any\n // app-level onClick / onFocus / onPress still fires. The tooltip\n // event runs AFTER the child's so consumer code wins on conflict.\n const compose =\n <T,>(existing: ((e: T) => void) | undefined, next: (e: T) => void) =>\n (event: T) => {\n existing?.(event);\n next(event);\n };\n return (\n <Slot\n ref={(node: HTMLElement | null) => {\n ctx.triggerRef.current = node;\n }}\n onMouseEnter={compose(child.props.onMouseEnter as ((e: unknown) => void) | undefined, handleMouseEnter)}\n onMouseLeave={compose(child.props.onMouseLeave as ((e: unknown) => void) | undefined, handleMouseLeave)}\n onFocus={compose(child.props.onFocus as ((e: unknown) => void) | undefined, handleFocus)}\n onBlur={compose(child.props.onBlur as ((e: unknown) => void) | undefined, handleBlur)}\n {...(Platform.OS !== 'web'\n ? {\n onLongPress: compose(\n child.props.onLongPress as ((e: unknown) => void) | undefined,\n handleLongPress\n ),\n onPress: compose(child.props.onPress as ((e: unknown) => void) | undefined, handlePress),\n delayLongPress: LONG_PRESS_MS,\n }\n : {})}\n aria-describedby={ctx.open ? ctx.contentId : undefined}\n {...(testID !== undefined ? { 'data-testid': testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {child}\n </Slot>\n );\n }\n\n return (\n <Pressable\n ref={(node) => {\n ctx.triggerRef.current = node as unknown as HTMLElement | null;\n }}\n {...(Platform.OS !== 'web'\n ? { onLongPress: handleLongPress, onPress: handlePress, delayLongPress: LONG_PRESS_MS }\n : {})}\n {...({\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n onFocus: handleFocus,\n onBlur: handleBlur,\n 'aria-describedby': ctx.open ? ctx.contentId : undefined,\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {wrapStringChildren(children)}\n </Pressable>\n );\n};\n\n// On native, raw strings rendered as children of a non-Text component\n// throw \"Text strings must be rendered within a <Text> component\". On\n// web, react-native-web silently tolerates it. Wrap any string/number\n// children in an RNText so the same JSX renders cleanly on both\n// platforms. Non-string children are passed through unchanged.\nfunction wrapStringChildren(children: ReactNode): ReactNode {\n if (typeof children === 'string' || typeof children === 'number') {\n return <RNText>{children}</RNText>;\n }\n return children;\n}\n\nconst GAP = 4; // visual gap between trigger and content\nconst MIN_WIDTH = 0; // tooltips hug their text — no enforced minimum\n\nfunction computePosition(\n rect: TriggerRect,\n side: TooltipSide,\n align: TooltipAlign,\n contentSize: { width: number; height: number } | null\n): { top: number; left: number } {\n const cw = contentSize?.width ?? MIN_WIDTH;\n const ch = contentSize?.height ?? 0;\n\n let top = 0;\n let left = 0;\n\n switch (side) {\n case 'top':\n top = rect.top - GAP - ch;\n break;\n case 'bottom':\n top = rect.top + rect.height + GAP;\n break;\n case 'left':\n left = rect.left - GAP - cw;\n break;\n case 'right':\n left = rect.left + rect.width + GAP;\n break;\n }\n\n if (side === 'top' || side === 'bottom') {\n switch (align) {\n case 'start':\n left = rect.left;\n break;\n case 'center':\n left = rect.left + rect.width / 2 - cw / 2;\n break;\n case 'end':\n left = rect.left + rect.width - cw;\n break;\n }\n } else {\n switch (align) {\n case 'start':\n top = rect.top;\n break;\n case 'center':\n top = rect.top + rect.height / 2 - ch / 2;\n break;\n case 'end':\n top = rect.top + rect.height - ch;\n break;\n }\n }\n\n return { top, left };\n}\n\nexport type TooltipContentProps = {\n /** Side of the trigger to anchor on. @defaultValue 'top' */\n side?: TooltipSide;\n /** Alignment along the trigger edge. @defaultValue 'center' */\n align?: TooltipAlign;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * The floating tooltip surface. Renders only while open. On web uses\n * `position: fixed` with a measured trigger rect so it escapes any\n * ancestor `overflow: hidden`.\n *\n * ARIA: `role=\"tooltip\"` plus a unique id that the trigger's\n * `aria-describedby` points at.\n */\nexport const TooltipContent = ({\n side = 'top',\n align = 'center',\n children,\n className,\n testID,\n}: TooltipContentProps) => {\n const ctx = useTooltipContext('TooltipContent');\n const colors = useThemeColors();\n\n // Measure content size after first paint so we can anchor `top`-side\n // tooltips (which need to know content height to render above the trigger).\n const [contentSize, setContentSize] = useState<{ width: number; height: number } | null>(null);\n\n // Direct DOM ref for the entrance animation. We poke `transform`,\n // `opacity`, and `transition` straight onto node.style instead of\n // passing them through `<View style>`, because rn-web's style filter\n // drops keys it doesn't recognize as RN style props (`transitionProperty`,\n // `transitionDuration`, etc.) — so any style fragment containing them\n // gets discarded entirely. Same pattern as the Dialog backdrop-blur fix.\n const domRef = useRef<HTMLDivElement | null>(null);\n const [entered, setEntered] = useState(false);\n\n // Web-only: Escape closes. Re-measure trigger on resize/scroll so the\n // chip stays anchored during page motion.\n useEffect(() => {\n if (!ctx.open) {\n return;\n }\n if (Platform.OS !== 'web') {\n return;\n }\n if (typeof document === 'undefined') {\n return;\n }\n\n ctx.measureTrigger();\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n ctx.setOpen(false);\n }\n };\n const onResize = () => ctx.measureTrigger();\n const onScroll = () => ctx.measureTrigger();\n\n document.addEventListener('keydown', onKeyDown);\n window.addEventListener('resize', onResize);\n window.addEventListener('scroll', onScroll, true);\n return () => {\n document.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('resize', onResize);\n window.removeEventListener('scroll', onScroll, true);\n };\n }, [ctx.open, ctx.measureTrigger, ctx.setOpen]);\n\n // Reset measured size and entrance flag when tooltip closes so a\n // reopen re-measures and re-animates fresh.\n useEffect(() => {\n if (!ctx.open) {\n setContentSize(null);\n setEntered(false);\n }\n }, [ctx.open]);\n\n // Entrance animation. On the first paint we render at scale(0.95) +\n // opacity 0; the next frame we flip the styles to scale(1) + opacity\n // 1, and the CSS transition handles the in-between. Web only —\n // native renders without animation (an animated mount on RN would\n // require Reanimated for negligible visual gain on a hint chip).\n useEffect(() => {\n if (Platform.OS !== 'web') {\n return;\n }\n if (!ctx.open) {\n return;\n }\n const node = domRef.current;\n if (!node) {\n return;\n }\n // Initial values — explicitly set so the first frame is at the\n // pre-entrance state regardless of inherited styles.\n node.style.transformOrigin = 'center';\n node.style.transitionProperty = 'opacity, transform';\n node.style.transitionDuration = '100ms';\n node.style.transitionTimingFunction = 'ease-out';\n node.style.opacity = entered ? '1' : '0';\n node.style.transform = entered ? 'scale(1)' : 'scale(0.95)';\n }, [ctx.open, entered]);\n\n // Kick off the transition on the next frame after mount.\n useEffect(() => {\n if (Platform.OS !== 'web') {\n return;\n }\n if (!ctx.open) {\n return;\n }\n const id = requestAnimationFrame(() => setEntered(true));\n return () => cancelAnimationFrame(id);\n }, [ctx.open]);\n\n if (!ctx.open) {\n return null;\n }\n\n const position = ctx.triggerRect ? computePosition(ctx.triggerRect, side, align, contentSize) : null;\n\n const contentBaseStyle: ViewStyle = {\n borderRadius: px(colors.radius.md),\n backgroundColor: colors.semantic.text.default,\n paddingVertical: px(colors.spacing['2']) - 2, // closest theme-rooted approximation of legacy 6\n paddingHorizontal: px(colors.spacing['2']),\n ...(Platform.OS === 'web'\n ? ({\n boxShadow: '0 4px 6px -2px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.06)',\n } as ViewStyle)\n : { elevation: 4 }),\n };\n\n const positionedStyle: ViewStyle =\n Platform.OS === 'web'\n ? position\n ? ({\n position: 'fixed' as unknown as 'absolute',\n top: position.top,\n left: position.left,\n zIndex: 60,\n } as ViewStyle)\n : ({\n // Trigger not yet measured — render off-screen for a\n // frame to avoid a flash at (0,0).\n position: 'fixed' as unknown as 'absolute',\n top: -9999,\n left: -9999,\n zIndex: 60,\n } as ViewStyle)\n : ({\n // Native: rely on the parent allowing overflow. We anchor\n // by absolute positioning relative to wherever the\n // tooltip is mounted in the tree (typically right next\n // to the trigger).\n position: 'absolute',\n top: position?.top ?? 0,\n left: position?.left ?? 0,\n } as ViewStyle);\n\n return (\n <View\n ref={(node) => {\n ctx.contentRef.current = node as unknown as HTMLDivElement | null;\n domRef.current = node as unknown as HTMLDivElement | null;\n if (Platform.OS !== 'web') {\n return;\n }\n if (!node) {\n return;\n }\n if (typeof (node as unknown as HTMLDivElement).getBoundingClientRect !== 'function') {\n return;\n }\n const rect = (node as unknown as HTMLDivElement).getBoundingClientRect();\n if (!contentSize || contentSize.width !== rect.width || contentSize.height !== rect.height) {\n setContentSize({ width: rect.width, height: rect.height });\n }\n }}\n {...({\n role: 'tooltip',\n id: ctx.contentId,\n // Don't soak up pointer events — hovering the tooltip\n // itself should NOT block the trigger's mouse-leave from\n // firing. Tooltips are presentational; if you need\n // interactivity, reach for Popover.\n pointerEvents: 'none',\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n className={cn('rounded-md', className)}\n style={[contentBaseStyle, positionedStyle]}\n >\n <RNText\n className=\"text-xs\"\n style={{\n color: colors.semantic.text.inverted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n lineHeight: px(colors.fontSize.sm) * Number(colors.lineHeight.tight),\n }}\n >\n {children}\n </RNText>\n </View>\n );\n};\n\n/**\n * Public `Tooltip` value — the root function plus its `.Trigger` and\n * `.Content` static members. `Object.assign` produces a value whose inferred\n * type carries the static properties, so `.d.ts` consumers can write\n * `<Tooltip.Trigger>` without a separate import.\n */\nexport const Tooltip = Object.assign(TooltipRoot, {\n Trigger: TooltipTrigger,\n Content: TooltipContent,\n});\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { cn } from './chunk-CHXHRJNZ.js';
|
|
2
1
|
import { px } from './chunk-5A2QOOVN.js';
|
|
2
|
+
import { cn } from './chunk-CHXHRJNZ.js';
|
|
3
3
|
import { useThemeColors } from './chunk-R5JMDDCB.js';
|
|
4
4
|
import { __name } from './chunk-WCQVDF3K.js';
|
|
5
5
|
import { View, Text } from 'react-native';
|
|
@@ -140,5 +140,5 @@ var Card = Object.assign(CardRoot, {
|
|
|
140
140
|
});
|
|
141
141
|
|
|
142
142
|
export { Card };
|
|
143
|
-
//# sourceMappingURL=chunk-
|
|
144
|
-
//# sourceMappingURL=chunk-
|
|
143
|
+
//# sourceMappingURL=chunk-OMU4R4Y5.js.map
|
|
144
|
+
//# sourceMappingURL=chunk-OMU4R4Y5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Card/Card.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-HTF6FDB6.js","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport type { ViewProps, ViewStyle } from 'react-native';\nimport { Text as RNText, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\n// Layout-only bases; theme-driven dimensions are merged inside each\n// component below so a custom theme reshapes the card.\nconst SURFACE_LAYOUT_BASE: ViewStyle = {\n borderWidth: 1,\n overflow: 'hidden',\n};\n\nconst HEADER_LAYOUT_BASE: ViewStyle = {\n flexDirection: 'column',\n};\nconst CONTENT_LAYOUT_BASE: ViewStyle = {};\nconst FOOTER_LAYOUT_BASE: ViewStyle = {\n flexDirection: 'row',\n alignItems: 'center',\n borderTopWidth: 1,\n};\n\nexport type CardProps = Omit<ViewProps, 'children'> & {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Container surface for grouping related content. Pair with `Card.Header`,\n * `Card.Title`, `Card.Description`, `Card.Content`, and `Card.Footer` for\n * the conventional layout, or use any children directly.\n */\nconst CardRoot = ({ children, className, style, ...rest }: CardProps) => {\n const colors = useThemeColors();\n return (\n <View\n {...rest}\n className={cn(\n 'rounded-xl border border-semantic-border-default bg-semantic-background-elevated',\n className\n )}\n style={[\n SURFACE_LAYOUT_BASE,\n {\n borderRadius: px(colors.radius.xl),\n backgroundColor: colors.semantic.background.elevated,\n borderColor: colors.semantic.border.default,\n },\n style,\n ]}\n >\n {children}\n </View>\n );\n};\n\nexport type CardSectionProps = Omit<ViewProps, 'children'> & {\n children?: ReactNode;\n className?: string;\n};\n\n/** Header section — sits flush with the card top with comfortable padding. */\nexport const CardHeader = ({ children, className, style, ...rest }: CardSectionProps) => {\n const colors = useThemeColors();\n const headerStyle: ViewStyle = {\n ...HEADER_LAYOUT_BASE,\n paddingHorizontal: px(colors.spacing['6']),\n paddingTop: px(colors.spacing['5']),\n paddingBottom: px(colors.spacing['3']),\n gap: px(colors.spacing['1']),\n };\n return (\n <View {...rest} className={cn('flex-col gap-1 px-6 pt-5 pb-3', className)} style={[headerStyle, style]}>\n {children}\n </View>\n );\n};\n\n/** Body content — for arbitrary content between header and footer. */\nexport const CardContent = ({ children, className, style, ...rest }: CardSectionProps) => {\n const colors = useThemeColors();\n const contentStyle: ViewStyle = {\n ...CONTENT_LAYOUT_BASE,\n paddingHorizontal: px(colors.spacing['6']),\n paddingVertical: px(colors.spacing['4']),\n };\n // Auto-wrap raw string children in <Text>. RN refuses to render a\n // bare string inside a View in dev, and on rn-web it silently slips\n // through using whatever ambient color the surface has — which is\n // wrong in dark mode. Wrapping here matches the pattern other Card\n // subcomponents already follow.\n const wrapped =\n typeof children === 'string' ? (\n <RNText\n style={{\n color: colors.semantic.text.default,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.md),\n lineHeight: px(colors.fontSize.md) * Number(colors.lineHeight.normal),\n }}\n >\n {children}\n </RNText>\n ) : (\n children\n );\n return (\n <View {...rest} className={cn('px-6 py-4', className)} style={[contentStyle, style]}>\n {wrapped}\n </View>\n );\n};\n\n/** Footer with a top border and a row of actions (typically Buttons). */\nexport const CardFooter = ({ children, className, style, ...rest }: CardSectionProps) => {\n const colors = useThemeColors();\n const footerStyle: ViewStyle = {\n ...FOOTER_LAYOUT_BASE,\n paddingHorizontal: px(colors.spacing['6']),\n paddingTop: px(colors.spacing['3']),\n paddingBottom: px(colors.spacing['5']),\n gap: px(colors.spacing['2']),\n };\n return (\n <View\n {...rest}\n className={cn(\n 'flex-row items-center gap-2 px-6 pt-3 pb-5 border-t border-semantic-border-default',\n className\n )}\n style={[footerStyle, { borderTopColor: colors.semantic.border.default }, style]}\n >\n {children}\n </View>\n );\n};\n\nexport type CardTextProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/** Card title — heading-weight text. Renders as a heading on web. */\nexport const CardTitle = ({ children, className, testID }: CardTextProps) => {\n const colors = useThemeColors();\n return (\n <RNText\n {...(testID !== undefined ? { testID } : {})}\n accessibilityRole=\"header\"\n role=\"heading\"\n aria-level={3}\n className={cn('text-lg font-semibold text-semantic-text-default', className)}\n style={{\n color: colors.semantic.text.default,\n fontFamily: colors.fontFamily.display,\n fontSize: px(colors.fontSize.lg),\n fontWeight: colors.fontWeight.semibold as '600',\n }}\n >\n {children}\n </RNText>\n );\n};\n\n/** Muted subtitle that pairs with Card.Title. */\nexport const CardDescription = ({ children, className, testID }: CardTextProps) => {\n const colors = useThemeColors();\n return (\n <RNText\n {...(testID !== undefined ? { testID } : {})}\n className={cn('text-sm text-semantic-text-muted', className)}\n style={{\n color: colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n }}\n >\n {children}\n </RNText>\n );\n};\n\n/**\n * Public `Card` value — the root function plus its `.Header`, `.Title`,\n * `.Description`, `.Content`, and `.Footer` static members. `Object.assign`\n * produces a value whose inferred type carries the static properties, so\n * `.d.ts` consumers can write `<Card.Header>` without a separate import.\n */\nexport const Card = Object.assign(CardRoot, {\n Header: CardHeader,\n Title: CardTitle,\n Description: CardDescription,\n Content: CardContent,\n Footer: CardFooter,\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Card/Card.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-OMU4R4Y5.js","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport type { ViewProps, ViewStyle } from 'react-native';\nimport { Text as RNText, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\n// Layout-only bases; theme-driven dimensions are merged inside each\n// component below so a custom theme reshapes the card.\nconst SURFACE_LAYOUT_BASE: ViewStyle = {\n borderWidth: 1,\n overflow: 'hidden',\n};\n\nconst HEADER_LAYOUT_BASE: ViewStyle = {\n flexDirection: 'column',\n};\nconst CONTENT_LAYOUT_BASE: ViewStyle = {};\nconst FOOTER_LAYOUT_BASE: ViewStyle = {\n flexDirection: 'row',\n alignItems: 'center',\n borderTopWidth: 1,\n};\n\nexport type CardProps = Omit<ViewProps, 'children'> & {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Container surface for grouping related content. Pair with `Card.Header`,\n * `Card.Title`, `Card.Description`, `Card.Content`, and `Card.Footer` for\n * the conventional layout, or use any children directly.\n */\nconst CardRoot = ({ children, className, style, ...rest }: CardProps) => {\n const colors = useThemeColors();\n return (\n <View\n {...rest}\n className={cn(\n 'rounded-xl border border-semantic-border-default bg-semantic-background-elevated',\n className\n )}\n style={[\n SURFACE_LAYOUT_BASE,\n {\n borderRadius: px(colors.radius.xl),\n backgroundColor: colors.semantic.background.elevated,\n borderColor: colors.semantic.border.default,\n },\n style,\n ]}\n >\n {children}\n </View>\n );\n};\n\nexport type CardSectionProps = Omit<ViewProps, 'children'> & {\n children?: ReactNode;\n className?: string;\n};\n\n/** Header section — sits flush with the card top with comfortable padding. */\nexport const CardHeader = ({ children, className, style, ...rest }: CardSectionProps) => {\n const colors = useThemeColors();\n const headerStyle: ViewStyle = {\n ...HEADER_LAYOUT_BASE,\n paddingHorizontal: px(colors.spacing['6']),\n paddingTop: px(colors.spacing['5']),\n paddingBottom: px(colors.spacing['3']),\n gap: px(colors.spacing['1']),\n };\n return (\n <View {...rest} className={cn('flex-col gap-1 px-6 pt-5 pb-3', className)} style={[headerStyle, style]}>\n {children}\n </View>\n );\n};\n\n/** Body content — for arbitrary content between header and footer. */\nexport const CardContent = ({ children, className, style, ...rest }: CardSectionProps) => {\n const colors = useThemeColors();\n const contentStyle: ViewStyle = {\n ...CONTENT_LAYOUT_BASE,\n paddingHorizontal: px(colors.spacing['6']),\n paddingVertical: px(colors.spacing['4']),\n };\n // Auto-wrap raw string children in <Text>. RN refuses to render a\n // bare string inside a View in dev, and on rn-web it silently slips\n // through using whatever ambient color the surface has — which is\n // wrong in dark mode. Wrapping here matches the pattern other Card\n // subcomponents already follow.\n const wrapped =\n typeof children === 'string' ? (\n <RNText\n style={{\n color: colors.semantic.text.default,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.md),\n lineHeight: px(colors.fontSize.md) * Number(colors.lineHeight.normal),\n }}\n >\n {children}\n </RNText>\n ) : (\n children\n );\n return (\n <View {...rest} className={cn('px-6 py-4', className)} style={[contentStyle, style]}>\n {wrapped}\n </View>\n );\n};\n\n/** Footer with a top border and a row of actions (typically Buttons). */\nexport const CardFooter = ({ children, className, style, ...rest }: CardSectionProps) => {\n const colors = useThemeColors();\n const footerStyle: ViewStyle = {\n ...FOOTER_LAYOUT_BASE,\n paddingHorizontal: px(colors.spacing['6']),\n paddingTop: px(colors.spacing['3']),\n paddingBottom: px(colors.spacing['5']),\n gap: px(colors.spacing['2']),\n };\n return (\n <View\n {...rest}\n className={cn(\n 'flex-row items-center gap-2 px-6 pt-3 pb-5 border-t border-semantic-border-default',\n className\n )}\n style={[footerStyle, { borderTopColor: colors.semantic.border.default }, style]}\n >\n {children}\n </View>\n );\n};\n\nexport type CardTextProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/** Card title — heading-weight text. Renders as a heading on web. */\nexport const CardTitle = ({ children, className, testID }: CardTextProps) => {\n const colors = useThemeColors();\n return (\n <RNText\n {...(testID !== undefined ? { testID } : {})}\n accessibilityRole=\"header\"\n role=\"heading\"\n aria-level={3}\n className={cn('text-lg font-semibold text-semantic-text-default', className)}\n style={{\n color: colors.semantic.text.default,\n fontFamily: colors.fontFamily.display,\n fontSize: px(colors.fontSize.lg),\n fontWeight: colors.fontWeight.semibold as '600',\n }}\n >\n {children}\n </RNText>\n );\n};\n\n/** Muted subtitle that pairs with Card.Title. */\nexport const CardDescription = ({ children, className, testID }: CardTextProps) => {\n const colors = useThemeColors();\n return (\n <RNText\n {...(testID !== undefined ? { testID } : {})}\n className={cn('text-sm text-semantic-text-muted', className)}\n style={{\n color: colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n }}\n >\n {children}\n </RNText>\n );\n};\n\n/**\n * Public `Card` value — the root function plus its `.Header`, `.Title`,\n * `.Description`, `.Content`, and `.Footer` static members. `Object.assign`\n * produces a value whose inferred type carries the static properties, so\n * `.d.ts` consumers can write `<Card.Header>` without a separate import.\n */\nexport const Card = Object.assign(CardRoot, {\n Header: CardHeader,\n Title: CardTitle,\n Description: CardDescription,\n Content: CardContent,\n Footer: CardFooter,\n});\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { cn } from './chunk-CHXHRJNZ.js';
|
|
2
1
|
import { px } from './chunk-5A2QOOVN.js';
|
|
2
|
+
import { cn } from './chunk-CHXHRJNZ.js';
|
|
3
3
|
import { useThemeColors } from './chunk-R5JMDDCB.js';
|
|
4
4
|
import { __name } from './chunk-WCQVDF3K.js';
|
|
5
5
|
import { createContext, useRef, useEffect, useCallback, useState, useMemo, useContext } from 'react';
|
|
@@ -272,5 +272,5 @@ var Radio = Object.assign(RadioOption, {
|
|
|
272
272
|
});
|
|
273
273
|
|
|
274
274
|
export { Radio };
|
|
275
|
-
//# sourceMappingURL=chunk-
|
|
276
|
-
//# sourceMappingURL=chunk-
|
|
275
|
+
//# sourceMappingURL=chunk-PABG3IJ6.js.map
|
|
276
|
+
//# sourceMappingURL=chunk-PABG3IJ6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Radio/Radio.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-C6TRLHMW.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Pressable, Text as RNText, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type RadioGroupOrientation = 'horizontal' | 'vertical';\n\ntype RadioRefMap = Map<string, RefObject<HTMLElement | null>>;\n\ntype RadioGroupContextValue = {\n value: string | undefined;\n select: (next: string) => void;\n disabled: boolean;\n orientation: RadioGroupOrientation;\n name: string | undefined;\n register: (value: string, ref: RefObject<HTMLElement | null>) => void;\n unregister: (value: string) => void;\n};\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null);\n\nconst useRadioGroupContext = (): RadioGroupContextValue => {\n const ctx = useContext(RadioGroupContext);\n if (!ctx) {\n throw new Error('<Radio> must be rendered inside a <Radio.Group>.');\n }\n return ctx;\n};\n\nexport type RadioGroupProps = {\n /** Controlled selected value. */\n value?: string;\n /** Uncontrolled initial value. */\n defaultValue?: string;\n /** Fires with the new value when the selection changes. */\n onChange?: (next: string) => void;\n /** When true, every Radio inside is non-interactive. Individual Radios can also opt in. */\n disabled?: boolean;\n /**\n * Layout orientation. Drives the keyboard nav axis (Down/Up for vertical,\n * Right/Left for horizontal — both pairs work in either orientation as a\n * usability bonus).\n * @defaultValue 'vertical'\n */\n orientation?: RadioGroupOrientation;\n /** HTML `name` for form integration on web. Optional but recommended. */\n name?: string;\n children?: ReactNode;\n className?: string;\n testID?: string;\n // ── Accessibility / Field.Control injection ──────────────────────────────\n /** HTML id forwarded to the radiogroup container. Injected by Field.Control. */\n id?: string;\n /** React Native equivalent of `id`. Injected by Field.Control. */\n nativeID?: string;\n /** Points to the element that labels this group. Injected by Field.Control. */\n 'aria-labelledby'?: string;\n /** React Native equivalent of `aria-labelledby`. Injected by Field.Control. */\n accessibilityLabelledBy?: string;\n /** Points to description / error elements. Injected by Field.Control. */\n 'aria-describedby'?: string;\n /** React Native equivalent of `aria-describedby`. Injected by Field.Control. */\n accessibilityDescribedBy?: string;\n /** Marks the group as invalid. Injected by Field.Control when Field has an error. */\n 'aria-invalid'?: boolean;\n /** Marks the group as required. Injected by Field.Control when Field is required. */\n 'aria-required'?: boolean;\n};\n\nexport type RadioProps = {\n /** Unique value within the group. Required. */\n value: string;\n /** Visible label that doubles as the accessibility label. */\n label?: string;\n /** Disable just this option. */\n disabled?: boolean;\n /** Custom content rendered next to the radio dot. Overrides `label`. */\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n// Layout-only base; theme-driven gap is merged inside Radio. The dot\n// dimensions are component-density literals — not from theme — because the\n// radio dot has a fixed visual ramp independent of the spacing scale.\nconst ROW_LAYOUT_BASE: ViewStyle = { flexDirection: 'row', alignItems: 'center' };\nconst DOT_OUTER_BASE: ViewStyle = {\n width: 18, // component-density literal — not from theme\n height: 18, // component-density literal — not from theme\n borderRadius: 9, // perfect circle of dot diameter — not from theme\n borderWidth: 1.5,\n alignItems: 'center',\n justifyContent: 'center',\n};\nconst DOT_INNER_BASE: ViewStyle = {\n width: 8, // component-density literal — not from theme\n height: 8, // component-density literal — not from theme\n borderRadius: 4, // perfect circle — not from theme\n};\n\n/**\n * Single-selection group of radio buttons. Container owns the value;\n * children declare their `value` and any extra disabled state.\n *\n * Keyboard nav follows the WAI-ARIA radiogroup pattern:\n * - Tab into the group → focus lands on the selected option (or the\n * first when nothing is selected). Tab out leaves the group.\n * - ArrowDown / ArrowRight → next option (wraps).\n * - ArrowUp / ArrowLeft → previous option (wraps).\n * - Home / End → first / last.\n * - Selection follows focus, so an arrow key both moves focus and\n * activates the option (the standard radiogroup behavior).\n */\nexport const RadioGroup = ({\n value,\n defaultValue,\n onChange,\n disabled = false,\n orientation = 'vertical',\n name,\n children,\n className,\n testID,\n id,\n nativeID,\n 'aria-labelledby': ariaLabelledBy,\n accessibilityLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n accessibilityDescribedBy,\n 'aria-invalid': ariaInvalid,\n 'aria-required': ariaRequired,\n}: RadioGroupProps) => {\n const [inner, setInner] = useState<string | undefined>(defaultValue);\n const isControlled = value !== undefined;\n const current = isControlled ? value : inner;\n\n const refs = useRef<RadioRefMap>(new Map());\n const orderRef = useRef<string[]>([]);\n\n const register = useCallback((v: string, ref: RefObject<HTMLElement | null>) => {\n refs.current.set(v, ref);\n if (!orderRef.current.includes(v)) {\n orderRef.current.push(v);\n }\n }, []);\n\n const unregister = useCallback((v: string) => {\n refs.current.delete(v);\n orderRef.current = orderRef.current.filter((x) => x !== v);\n }, []);\n\n const select = useCallback(\n (next: string) => {\n if (disabled) {\n return;\n }\n if (!isControlled) {\n setInner(next);\n }\n onChange?.(next);\n },\n [disabled, isControlled, onChange]\n );\n\n const focusValue = useCallback((next: string) => {\n const ref = refs.current.get(next);\n ref?.current?.focus?.();\n }, []);\n\n const moveBy = useCallback(\n (offset: 1 | -1) => {\n const order = orderRef.current;\n if (order.length === 0) {\n return;\n }\n const idx = current ? order.indexOf(current) : -1;\n const start = idx === -1 ? (offset === 1 ? -1 : 0) : idx;\n const len = order.length;\n const next = order[(start + offset + len) % len];\n if (!next) {\n return;\n }\n select(next);\n focusValue(next);\n },\n [current, focusValue, select]\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n const order = orderRef.current;\n if (order.length === 0) {\n return;\n }\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowRight': {\n event.preventDefault();\n moveBy(1);\n return;\n }\n case 'ArrowUp':\n case 'ArrowLeft': {\n event.preventDefault();\n moveBy(-1);\n return;\n }\n case 'Home': {\n event.preventDefault();\n const first = order[0];\n if (first) {\n select(first);\n focusValue(first);\n }\n return;\n }\n case 'End': {\n event.preventDefault();\n const last = order[order.length - 1];\n if (last) {\n select(last);\n focusValue(last);\n }\n return;\n }\n }\n },\n [focusValue, moveBy, select]\n );\n\n const ctxValue = useMemo<RadioGroupContextValue>(\n () => ({ value: current, select, disabled, orientation, name, register, unregister }),\n [current, select, disabled, orientation, name, register, unregister]\n );\n\n // RN's View doesn't model onKeyDown in its TS surface but RN-Web passes\n // it through to the underlying div. Cast at the spread boundary.\n const groupProps: Record<string, unknown> = {\n role: 'radiogroup',\n accessibilityRole: 'radiogroup',\n 'aria-orientation': orientation,\n 'aria-disabled': disabled || undefined,\n onKeyDown: handleKeyDown,\n ...(testID !== undefined ? { testID } : {}),\n ...(id !== undefined ? { id } : {}),\n ...(nativeID !== undefined ? { nativeID } : {}),\n ...(ariaLabelledBy !== undefined ? { 'aria-labelledby': ariaLabelledBy } : {}),\n ...(accessibilityLabelledBy !== undefined ? { accessibilityLabelledBy } : {}),\n ...(ariaDescribedBy !== undefined ? { 'aria-describedby': ariaDescribedBy } : {}),\n ...(accessibilityDescribedBy !== undefined ? { accessibilityDescribedBy } : {}),\n ...(ariaInvalid ? { 'aria-invalid': true } : {}),\n ...(ariaRequired ? { 'aria-required': true } : {}),\n };\n\n return (\n <RadioGroupContext.Provider value={ctxValue}>\n <RadioGroupViewport\n groupProps={groupProps}\n orientation={orientation}\n disabled={disabled}\n {...(className !== undefined ? { className } : {})}\n >\n {children}\n </RadioGroupViewport>\n </RadioGroupContext.Provider>\n );\n};\n\n// Inner view so we can call useThemeColors() to source the orientation\n// gap from the spacing token scale (the parent owns hooks for state).\nconst RadioGroupViewport = ({\n groupProps,\n orientation,\n disabled,\n className,\n children,\n}: {\n groupProps: Record<string, unknown>;\n orientation: RadioGroupOrientation;\n disabled: boolean;\n className?: string;\n children?: ReactNode;\n}) => {\n const colors = useThemeColors();\n return (\n <View\n {...groupProps}\n className={cn(\n orientation === 'horizontal' ? 'flex-row gap-4' : 'flex-col gap-3',\n disabled ? 'opacity-60' : undefined,\n className\n )}\n style={[\n orientation === 'horizontal'\n ? { flexDirection: 'row', gap: px(colors.spacing['4']) }\n : { flexDirection: 'column', gap: px(colors.spacing['3']) },\n disabled ? { opacity: 0.6 } : null,\n ]}\n >\n {children}\n </View>\n );\n};\n\n/**\n * One option inside a `<Radio.Group>`. Must be rendered inside one — throws\n * with a clear message if not.\n */\nconst RadioOption = ({ value, label, disabled, children, className, testID }: RadioProps) => {\n const ctx = useRadioGroupContext();\n const colors = useThemeColors();\n const ownRef = useRef<HTMLElement | null>(null);\n const selected = ctx.value === value;\n const isDisabled = disabled || ctx.disabled;\n\n useEffect(() => {\n ctx.register(value, ownRef);\n return () => ctx.unregister(value);\n }, [ctx, value]);\n\n const onPress = useCallback(() => {\n if (isDisabled) {\n return;\n }\n ctx.select(value);\n }, [ctx, value, isDisabled]);\n\n // Roving tabindex: only the selected option (or the first when nothing\n // is selected) participates in the tab order.\n const tabIndex = selected || (ctx.value === undefined && isFirstOption(ctx, value)) ? 0 : -1;\n\n const accessibilityLabel = label ?? value;\n\n const radioProps: Record<string, unknown> = {\n ref: (node: HTMLElement | null) => {\n ownRef.current = node;\n },\n role: 'radio',\n accessibilityRole: 'radio',\n 'aria-checked': selected,\n accessibilityState: { checked: selected, disabled: Boolean(isDisabled) },\n accessibilityLabel,\n 'aria-label': accessibilityLabel,\n tabIndex,\n onPress,\n ...(isDisabled ? { 'aria-disabled': true, disabled: true } : {}),\n ...(testID !== undefined ? { testID } : {}),\n ...(ctx.name ? { name: ctx.name } : {}),\n };\n\n const dotOuterStyle: ViewStyle = {\n ...DOT_OUTER_BASE,\n backgroundColor: colors.semantic.background.elevated,\n borderColor: selected ? colors.semantic.interactive.primary : colors.color.neutral['400'],\n };\n const dotInnerStyle: ViewStyle = { ...DOT_INNER_BASE, backgroundColor: colors.semantic.interactive.primary };\n\n const rowStyle: ViewStyle = { ...ROW_LAYOUT_BASE, gap: px(colors.spacing['2']) };\n\n return (\n <Pressable\n {...radioProps}\n className={cn('flex-row items-center gap-2', isDisabled ? 'opacity-60' : undefined, className)}\n style={[rowStyle, isDisabled ? { opacity: 0.6 } : null]}\n >\n <View style={dotOuterStyle}>{selected ? <View style={dotInnerStyle} /> : null}</View>\n {children ??\n (label !== undefined ? (\n <RNText\n style={{\n color: colors.semantic.text.default,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.md),\n }}\n >\n {label}\n </RNText>\n ) : null)}\n </Pressable>\n );\n};\n\n// Tiny helper: when no value is selected yet, the first registered Radio is\n// the tabbable one. This is computed inside Radio (not the context) so we\n// don't have to re-render every Radio whenever the order changes.\nfunction isFirstOption(ctx: RadioGroupContextValue, value: string): boolean {\n // We only have access to register/unregister; Radio doesn't get a peek\n // at the order list. The simple-but-correct fallback: every Radio renders\n // tabIndex=0 when value is undefined, which is harmless for one-radio\n // groups and equivalent to the standard \"tab into the first\" for\n // multi-radio groups (browsers honor the first tabIndex=0 they hit).\n void ctx;\n void value;\n return true;\n}\n\n/**\n * Public `Radio` value — the per-option component plus its `.Group` static\n * member (the cluster). Use `<Radio.Group>` to wrap a list of `<Radio />`s.\n *\n * `Object.assign` produces a value whose inferred type carries the static\n * properties, so `.d.ts` consumers can write `<Radio.Group>` without a\n * separate import.\n */\nexport const Radio = Object.assign(RadioOption, {\n Group: RadioGroup,\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Radio/Radio.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-PABG3IJ6.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Pressable, Text as RNText, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type RadioGroupOrientation = 'horizontal' | 'vertical';\n\ntype RadioRefMap = Map<string, RefObject<HTMLElement | null>>;\n\ntype RadioGroupContextValue = {\n value: string | undefined;\n select: (next: string) => void;\n disabled: boolean;\n orientation: RadioGroupOrientation;\n name: string | undefined;\n register: (value: string, ref: RefObject<HTMLElement | null>) => void;\n unregister: (value: string) => void;\n};\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null);\n\nconst useRadioGroupContext = (): RadioGroupContextValue => {\n const ctx = useContext(RadioGroupContext);\n if (!ctx) {\n throw new Error('<Radio> must be rendered inside a <Radio.Group>.');\n }\n return ctx;\n};\n\nexport type RadioGroupProps = {\n /** Controlled selected value. */\n value?: string;\n /** Uncontrolled initial value. */\n defaultValue?: string;\n /** Fires with the new value when the selection changes. */\n onChange?: (next: string) => void;\n /** When true, every Radio inside is non-interactive. Individual Radios can also opt in. */\n disabled?: boolean;\n /**\n * Layout orientation. Drives the keyboard nav axis (Down/Up for vertical,\n * Right/Left for horizontal — both pairs work in either orientation as a\n * usability bonus).\n * @defaultValue 'vertical'\n */\n orientation?: RadioGroupOrientation;\n /** HTML `name` for form integration on web. Optional but recommended. */\n name?: string;\n children?: ReactNode;\n className?: string;\n testID?: string;\n // ── Accessibility / Field.Control injection ──────────────────────────────\n /** HTML id forwarded to the radiogroup container. Injected by Field.Control. */\n id?: string;\n /** React Native equivalent of `id`. Injected by Field.Control. */\n nativeID?: string;\n /** Points to the element that labels this group. Injected by Field.Control. */\n 'aria-labelledby'?: string;\n /** React Native equivalent of `aria-labelledby`. Injected by Field.Control. */\n accessibilityLabelledBy?: string;\n /** Points to description / error elements. Injected by Field.Control. */\n 'aria-describedby'?: string;\n /** React Native equivalent of `aria-describedby`. Injected by Field.Control. */\n accessibilityDescribedBy?: string;\n /** Marks the group as invalid. Injected by Field.Control when Field has an error. */\n 'aria-invalid'?: boolean;\n /** Marks the group as required. Injected by Field.Control when Field is required. */\n 'aria-required'?: boolean;\n};\n\nexport type RadioProps = {\n /** Unique value within the group. Required. */\n value: string;\n /** Visible label that doubles as the accessibility label. */\n label?: string;\n /** Disable just this option. */\n disabled?: boolean;\n /** Custom content rendered next to the radio dot. Overrides `label`. */\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n// Layout-only base; theme-driven gap is merged inside Radio. The dot\n// dimensions are component-density literals — not from theme — because the\n// radio dot has a fixed visual ramp independent of the spacing scale.\nconst ROW_LAYOUT_BASE: ViewStyle = { flexDirection: 'row', alignItems: 'center' };\nconst DOT_OUTER_BASE: ViewStyle = {\n width: 18, // component-density literal — not from theme\n height: 18, // component-density literal — not from theme\n borderRadius: 9, // perfect circle of dot diameter — not from theme\n borderWidth: 1.5,\n alignItems: 'center',\n justifyContent: 'center',\n};\nconst DOT_INNER_BASE: ViewStyle = {\n width: 8, // component-density literal — not from theme\n height: 8, // component-density literal — not from theme\n borderRadius: 4, // perfect circle — not from theme\n};\n\n/**\n * Single-selection group of radio buttons. Container owns the value;\n * children declare their `value` and any extra disabled state.\n *\n * Keyboard nav follows the WAI-ARIA radiogroup pattern:\n * - Tab into the group → focus lands on the selected option (or the\n * first when nothing is selected). Tab out leaves the group.\n * - ArrowDown / ArrowRight → next option (wraps).\n * - ArrowUp / ArrowLeft → previous option (wraps).\n * - Home / End → first / last.\n * - Selection follows focus, so an arrow key both moves focus and\n * activates the option (the standard radiogroup behavior).\n */\nexport const RadioGroup = ({\n value,\n defaultValue,\n onChange,\n disabled = false,\n orientation = 'vertical',\n name,\n children,\n className,\n testID,\n id,\n nativeID,\n 'aria-labelledby': ariaLabelledBy,\n accessibilityLabelledBy,\n 'aria-describedby': ariaDescribedBy,\n accessibilityDescribedBy,\n 'aria-invalid': ariaInvalid,\n 'aria-required': ariaRequired,\n}: RadioGroupProps) => {\n const [inner, setInner] = useState<string | undefined>(defaultValue);\n const isControlled = value !== undefined;\n const current = isControlled ? value : inner;\n\n const refs = useRef<RadioRefMap>(new Map());\n const orderRef = useRef<string[]>([]);\n\n const register = useCallback((v: string, ref: RefObject<HTMLElement | null>) => {\n refs.current.set(v, ref);\n if (!orderRef.current.includes(v)) {\n orderRef.current.push(v);\n }\n }, []);\n\n const unregister = useCallback((v: string) => {\n refs.current.delete(v);\n orderRef.current = orderRef.current.filter((x) => x !== v);\n }, []);\n\n const select = useCallback(\n (next: string) => {\n if (disabled) {\n return;\n }\n if (!isControlled) {\n setInner(next);\n }\n onChange?.(next);\n },\n [disabled, isControlled, onChange]\n );\n\n const focusValue = useCallback((next: string) => {\n const ref = refs.current.get(next);\n ref?.current?.focus?.();\n }, []);\n\n const moveBy = useCallback(\n (offset: 1 | -1) => {\n const order = orderRef.current;\n if (order.length === 0) {\n return;\n }\n const idx = current ? order.indexOf(current) : -1;\n const start = idx === -1 ? (offset === 1 ? -1 : 0) : idx;\n const len = order.length;\n const next = order[(start + offset + len) % len];\n if (!next) {\n return;\n }\n select(next);\n focusValue(next);\n },\n [current, focusValue, select]\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n const order = orderRef.current;\n if (order.length === 0) {\n return;\n }\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowRight': {\n event.preventDefault();\n moveBy(1);\n return;\n }\n case 'ArrowUp':\n case 'ArrowLeft': {\n event.preventDefault();\n moveBy(-1);\n return;\n }\n case 'Home': {\n event.preventDefault();\n const first = order[0];\n if (first) {\n select(first);\n focusValue(first);\n }\n return;\n }\n case 'End': {\n event.preventDefault();\n const last = order[order.length - 1];\n if (last) {\n select(last);\n focusValue(last);\n }\n return;\n }\n }\n },\n [focusValue, moveBy, select]\n );\n\n const ctxValue = useMemo<RadioGroupContextValue>(\n () => ({ value: current, select, disabled, orientation, name, register, unregister }),\n [current, select, disabled, orientation, name, register, unregister]\n );\n\n // RN's View doesn't model onKeyDown in its TS surface but RN-Web passes\n // it through to the underlying div. Cast at the spread boundary.\n const groupProps: Record<string, unknown> = {\n role: 'radiogroup',\n accessibilityRole: 'radiogroup',\n 'aria-orientation': orientation,\n 'aria-disabled': disabled || undefined,\n onKeyDown: handleKeyDown,\n ...(testID !== undefined ? { testID } : {}),\n ...(id !== undefined ? { id } : {}),\n ...(nativeID !== undefined ? { nativeID } : {}),\n ...(ariaLabelledBy !== undefined ? { 'aria-labelledby': ariaLabelledBy } : {}),\n ...(accessibilityLabelledBy !== undefined ? { accessibilityLabelledBy } : {}),\n ...(ariaDescribedBy !== undefined ? { 'aria-describedby': ariaDescribedBy } : {}),\n ...(accessibilityDescribedBy !== undefined ? { accessibilityDescribedBy } : {}),\n ...(ariaInvalid ? { 'aria-invalid': true } : {}),\n ...(ariaRequired ? { 'aria-required': true } : {}),\n };\n\n return (\n <RadioGroupContext.Provider value={ctxValue}>\n <RadioGroupViewport\n groupProps={groupProps}\n orientation={orientation}\n disabled={disabled}\n {...(className !== undefined ? { className } : {})}\n >\n {children}\n </RadioGroupViewport>\n </RadioGroupContext.Provider>\n );\n};\n\n// Inner view so we can call useThemeColors() to source the orientation\n// gap from the spacing token scale (the parent owns hooks for state).\nconst RadioGroupViewport = ({\n groupProps,\n orientation,\n disabled,\n className,\n children,\n}: {\n groupProps: Record<string, unknown>;\n orientation: RadioGroupOrientation;\n disabled: boolean;\n className?: string;\n children?: ReactNode;\n}) => {\n const colors = useThemeColors();\n return (\n <View\n {...groupProps}\n className={cn(\n orientation === 'horizontal' ? 'flex-row gap-4' : 'flex-col gap-3',\n disabled ? 'opacity-60' : undefined,\n className\n )}\n style={[\n orientation === 'horizontal'\n ? { flexDirection: 'row', gap: px(colors.spacing['4']) }\n : { flexDirection: 'column', gap: px(colors.spacing['3']) },\n disabled ? { opacity: 0.6 } : null,\n ]}\n >\n {children}\n </View>\n );\n};\n\n/**\n * One option inside a `<Radio.Group>`. Must be rendered inside one — throws\n * with a clear message if not.\n */\nconst RadioOption = ({ value, label, disabled, children, className, testID }: RadioProps) => {\n const ctx = useRadioGroupContext();\n const colors = useThemeColors();\n const ownRef = useRef<HTMLElement | null>(null);\n const selected = ctx.value === value;\n const isDisabled = disabled || ctx.disabled;\n\n useEffect(() => {\n ctx.register(value, ownRef);\n return () => ctx.unregister(value);\n }, [ctx, value]);\n\n const onPress = useCallback(() => {\n if (isDisabled) {\n return;\n }\n ctx.select(value);\n }, [ctx, value, isDisabled]);\n\n // Roving tabindex: only the selected option (or the first when nothing\n // is selected) participates in the tab order.\n const tabIndex = selected || (ctx.value === undefined && isFirstOption(ctx, value)) ? 0 : -1;\n\n const accessibilityLabel = label ?? value;\n\n const radioProps: Record<string, unknown> = {\n ref: (node: HTMLElement | null) => {\n ownRef.current = node;\n },\n role: 'radio',\n accessibilityRole: 'radio',\n 'aria-checked': selected,\n accessibilityState: { checked: selected, disabled: Boolean(isDisabled) },\n accessibilityLabel,\n 'aria-label': accessibilityLabel,\n tabIndex,\n onPress,\n ...(isDisabled ? { 'aria-disabled': true, disabled: true } : {}),\n ...(testID !== undefined ? { testID } : {}),\n ...(ctx.name ? { name: ctx.name } : {}),\n };\n\n const dotOuterStyle: ViewStyle = {\n ...DOT_OUTER_BASE,\n backgroundColor: colors.semantic.background.elevated,\n borderColor: selected ? colors.semantic.interactive.primary : colors.color.neutral['400'],\n };\n const dotInnerStyle: ViewStyle = { ...DOT_INNER_BASE, backgroundColor: colors.semantic.interactive.primary };\n\n const rowStyle: ViewStyle = { ...ROW_LAYOUT_BASE, gap: px(colors.spacing['2']) };\n\n return (\n <Pressable\n {...radioProps}\n className={cn('flex-row items-center gap-2', isDisabled ? 'opacity-60' : undefined, className)}\n style={[rowStyle, isDisabled ? { opacity: 0.6 } : null]}\n >\n <View style={dotOuterStyle}>{selected ? <View style={dotInnerStyle} /> : null}</View>\n {children ??\n (label !== undefined ? (\n <RNText\n style={{\n color: colors.semantic.text.default,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.md),\n }}\n >\n {label}\n </RNText>\n ) : null)}\n </Pressable>\n );\n};\n\n// Tiny helper: when no value is selected yet, the first registered Radio is\n// the tabbable one. This is computed inside Radio (not the context) so we\n// don't have to re-render every Radio whenever the order changes.\nfunction isFirstOption(ctx: RadioGroupContextValue, value: string): boolean {\n // We only have access to register/unregister; Radio doesn't get a peek\n // at the order list. The simple-but-correct fallback: every Radio renders\n // tabIndex=0 when value is undefined, which is harmless for one-radio\n // groups and equivalent to the standard \"tab into the first\" for\n // multi-radio groups (browsers honor the first tabIndex=0 they hit).\n void ctx;\n void value;\n return true;\n}\n\n/**\n * Public `Radio` value — the per-option component plus its `.Group` static\n * member (the cluster). Use `<Radio.Group>` to wrap a list of `<Radio />`s.\n *\n * `Object.assign` produces a value whose inferred type carries the static\n * properties, so `.d.ts` consumers can write `<Radio.Group>` without a\n * separate import.\n */\nexport const Radio = Object.assign(RadioOption, {\n Group: RadioGroup,\n});\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { cn } from './chunk-CHXHRJNZ.js';
|
|
2
1
|
import { px } from './chunk-5A2QOOVN.js';
|
|
2
|
+
import { cn } from './chunk-CHXHRJNZ.js';
|
|
3
3
|
import { useThemeColors } from './chunk-R5JMDDCB.js';
|
|
4
4
|
import { __name } from './chunk-WCQVDF3K.js';
|
|
5
5
|
import { useState } from 'react';
|
|
@@ -99,5 +99,5 @@ var Avatar = /* @__PURE__ */ __name(({ src, name, size = "md", fallback, classNa
|
|
|
99
99
|
}, "Avatar");
|
|
100
100
|
|
|
101
101
|
export { Avatar };
|
|
102
|
-
//# sourceMappingURL=chunk-
|
|
103
|
-
//# sourceMappingURL=chunk-
|
|
102
|
+
//# sourceMappingURL=chunk-PNP7L4TA.js.map
|
|
103
|
+
//# sourceMappingURL=chunk-PNP7L4TA.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Avatar/Avatar.tsx"],"names":["RNImage","RNText"],"mappings":";;;;;;;;AAuCA,IAAM,OAAA,GAAsC;AAAA,EACxC,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACR,CAAA;AAIA,IAAM,iBAAA,GAAmE;AAAA,EACrE,EAAA,EAAI,IAAA;AAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA;AAAA,EACJ,EAAA,EAAI;AAAA;AACR,CAAA;AAEA,IAAM,gBAAA,2BAAoB,IAAA,KAAqC;AAC3D,EAAA,IAAI,CAAC,IAAA,EAAM;AACP,IAAA,OAAO,EAAA;AAAA,EACX;AACA,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,CAAC,OAAA,EAAS;AACV,IAAA,OAAO,EAAA;AAAA,EACX;AACA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAK,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA,GAAM,EAAA;AACvE,EAAA,OAAA,CAAQ,KAAA,GAAQ,MAAM,WAAA,EAAY;AACtC,CAAA,EAZyB,kBAAA,CAAA;AAuBlB,IAAM,MAAA,mBAAS,MAAA,CAAA,CAAC,EAAE,GAAA,EAAK,IAAA,EAAM,OAAO,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,MAAA,EAAO,KAAmB;AAC5F,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,GAAA,GAAM,QAAQ,IAAI,CAAA;AACxB,EAAA,MAAM,YAAY,GAAA,KAAQ,MAAA,IAAa,GAAA,CAAI,MAAA,GAAS,KAAK,CAAC,WAAA;AAE1D,EAAA,MAAM,cAAA,GAA4B;AAAA,IAC9B,KAAA,EAAO,GAAA;AAAA,IACP,MAAA,EAAQ,GAAA;AAAA,IACR,cAAc,GAAA,GAAM,CAAA;AAAA,IACpB,eAAA,EAAiB,MAAA,CAAO,QAAA,CAAS,UAAA,CAAW,MAAA;AAAA,IAC5C,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,QAAA,EAAU;AAAA,GACd;AAEA,EAAA,MAAM,UAAA,GAAyB;AAAA,IAC3B,KAAA,EAAO,GAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACZ;AAEA,EAAA,MAAM,QAAA,GAAW,iBAAiB,IAAI,CAAA;AACtC,EAAA,MAAM,qBAAqB,IAAA,IAAQ,QAAA;AAEnC,EAAA,uBACI,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACI,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,MAC1C,iBAAA,EAAkB,OAAA;AAAA,MAClB,kBAAA;AAAA,MACA,YAAA,EAAY,kBAAA;AAAA,MACZ,SAAA,EAAW,EAAA,CAAG,yEAAA,EAA2E,SAAS,CAAA;AAAA,MAClG,KAAA,EAAO,cAAA;AAAA,MAEN,QAAA,EAAA,SAAA,mBACG,GAAA;AAAA,QAACA,KAAA;AAAA,QAAA;AAAA,UACG,MAAA,EAAQ,EAAE,GAAA,EAAK,GAAA,EAAI;AAAA,UACnB,KAAA,EAAO,UAAA;AAAA,UACP,kBAAA;AAAA,UACA,OAAA,EAAS,MAAM,cAAA,CAAe,IAAI;AAAA;AAAA,UAEtC,QAAA,KAAa,MAAA,GACb,QAAA,GACA,QAAA,CAAS,SAAS,CAAA,mBAClB,GAAA;AAAA,QAACC,IAAA;AAAA,QAAA;AAAA,UACG,KAAA,EAAO;AAAA,YACH,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,KAAA;AAAA,YAC5B,UAAA,EAAY,OAAO,UAAA,CAAW,IAAA;AAAA,YAC9B,UAAU,EAAA,CAAG,MAAA,CAAO,SAAS,iBAAA,CAAkB,IAAI,CAAC,CAAC,CAAA;AAAA,YACrD,UAAA,EAAY,OAAO,UAAA,CAAW;AAAA,WAClC;AAAA,UAEC,QAAA,EAAA;AAAA;AAAA,OACL,mBAEA,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACG,KAAA,EAAO;AAAA,YACH,OAAO,GAAA,GAAM,IAAA;AAAA,YACb,QAAQ,GAAA,GAAM,IAAA;AAAA,YACd,YAAA,EAAc,GAAA;AAAA,YACd,eAAA,EAAiB,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK;AAAA;AAC1C;AAAA;AACJ;AAAA,GAER;AAER,CAAA,EAjEsB,QAAA","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/Avatar/Avatar.tsx"],"names":["RNImage","RNText"],"mappings":"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","file":"chunk-PNP7L4TA.js","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport { useState } from 'react';\nimport type { ImageStyle, ViewStyle } from 'react-native';\nimport { Image as RNImage, Text as RNText, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type AvatarSize = 'sm' | 'md' | 'lg' | 'xl';\n\nexport type AvatarProps = {\n /** Image URL. When omitted or the load fails, the fallback renders instead. */\n src?: string;\n /**\n * Person/entity name. Used to derive initials for the fallback (first\n * letter of the first word + first letter of the last word, up to 2\n * characters). Also becomes the `alt` text on the image — set this\n * even when `src` loads cleanly.\n */\n name?: string;\n /**\n * Visual size. Maps to a fixed pixel diameter.\n * @defaultValue 'md'\n */\n size?: AvatarSize;\n /**\n * Custom fallback content shown when no `src` is provided or the image\n * fails to load. When omitted, initials derived from `name` render; if\n * `name` is also missing, a neutral placeholder shows.\n */\n fallback?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n// Diameter for each size — component-density literals — not from theme\n// (avatars have a tight visual ramp that doesn't tie to the spacing scale).\nconst SIZE_PX: Record<AvatarSize, number> = {\n sm: 32,\n md: 40,\n lg: 56,\n xl: 72,\n};\n\n// Maps each avatar size to the closest fontSize token key. Resolved to px\n// inside the component so theme overrides take effect.\nconst FALLBACK_FONT_KEY: Record<AvatarSize, 'xs' | 'sm' | 'lg' | 'xl'> = {\n sm: 'xs', // 12\n md: 'sm', // 14\n lg: 'lg', // 18\n xl: 'xl', // 20 (closest to legacy 22)\n};\n\nconst initialsFromName = (name: string | undefined): string => {\n if (!name) {\n return '';\n }\n const trimmed = name.trim();\n if (!trimmed) {\n return '';\n }\n const parts = trimmed.split(/\\s+/);\n const first = parts[0]?.[0] ?? '';\n const last = parts.length > 1 ? (parts[parts.length - 1]?.[0] ?? '') : '';\n return (first + last).toUpperCase();\n};\n\n/**\n * Circular profile picture with graceful fallback. Renders the image when\n * `src` is provided and loads cleanly; otherwise renders the supplied\n * `fallback`, derived initials from `name`, or a neutral placeholder.\n *\n * Why a single component instead of compound (`AvatarImage` + `AvatarFallback`):\n * the common case is a one-liner — `<Avatar src name />` — and the fallback\n * decision is internal state, not consumer-driven layout.\n */\nexport const Avatar = ({ src, name, size = 'md', fallback, className, testID }: AvatarProps) => {\n const colors = useThemeColors();\n const [imageFailed, setImageFailed] = useState(false);\n const dim = SIZE_PX[size];\n const showImage = src !== undefined && src.length > 0 && !imageFailed;\n\n const containerStyle: ViewStyle = {\n width: dim,\n height: dim,\n borderRadius: dim / 2,\n backgroundColor: colors.semantic.background.subtle,\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n };\n\n const imageStyle: ImageStyle = {\n width: dim,\n height: dim,\n };\n\n const initials = initialsFromName(name);\n const accessibilityLabel = name ?? 'Avatar';\n\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n accessibilityRole=\"image\"\n accessibilityLabel={accessibilityLabel}\n aria-label={accessibilityLabel}\n className={cn('rounded-full overflow-hidden bg-neutral-200 items-center justify-center', className)}\n style={containerStyle}\n >\n {showImage ? (\n <RNImage\n source={{ uri: src }}\n style={imageStyle}\n accessibilityLabel={accessibilityLabel}\n onError={() => setImageFailed(true)}\n />\n ) : fallback !== undefined ? (\n fallback\n ) : initials.length > 0 ? (\n <RNText\n style={{\n color: colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize[FALLBACK_FONT_KEY[size]]),\n fontWeight: colors.fontWeight.medium as '500',\n }}\n >\n {initials}\n </RNText>\n ) : (\n <View\n style={{\n width: dim * 0.45,\n height: dim * 0.45,\n borderRadius: dim,\n backgroundColor: colors.semantic.text.muted,\n }}\n />\n )}\n </View>\n );\n};\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Slot } from './chunk-ZIBNLXIV.js';
|
|
2
|
-
import { cn } from './chunk-CHXHRJNZ.js';
|
|
3
2
|
import { px } from './chunk-5A2QOOVN.js';
|
|
3
|
+
import { cn } from './chunk-CHXHRJNZ.js';
|
|
4
4
|
import { useThemeColors } from './chunk-R5JMDDCB.js';
|
|
5
5
|
import { __name } from './chunk-WCQVDF3K.js';
|
|
6
6
|
import { createContext, useState, useCallback, useId, useRef, useEffect, isValidElement, useContext } from 'react';
|
|
@@ -332,5 +332,5 @@ var Popover = Object.assign(PopoverRoot, {
|
|
|
332
332
|
});
|
|
333
333
|
|
|
334
334
|
export { Popover, usePopoverContext };
|
|
335
|
-
//# sourceMappingURL=chunk-
|
|
336
|
-
//# sourceMappingURL=chunk-
|
|
335
|
+
//# sourceMappingURL=chunk-PZS4A4VQ.js.map
|
|
336
|
+
//# sourceMappingURL=chunk-PZS4A4VQ.js.map
|