@nori-ui/core 1.0.6 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-2UXKXUX2.js +286 -0
- package/dist/chunk-2UXKXUX2.js.map +1 -0
- package/dist/{chunk-DDGMLLS3.js → chunk-46OT4PA6.js} +3 -3
- package/dist/{chunk-DDGMLLS3.js.map → chunk-46OT4PA6.js.map} +1 -1
- package/dist/{chunk-SFNDR6DI.js → chunk-5BM6H2CD.js} +3 -3
- package/dist/{chunk-SFNDR6DI.js.map → chunk-5BM6H2CD.js.map} +1 -1
- package/dist/{chunk-EWWQQ5DB.js → chunk-6JVUVBZH.js} +5 -5
- package/dist/{chunk-EWWQQ5DB.js.map → chunk-6JVUVBZH.js.map} +1 -1
- package/dist/{chunk-FT2XBBQJ.js → chunk-6PO2IWB3.js} +8 -5
- package/dist/chunk-6PO2IWB3.js.map +1 -0
- package/dist/{chunk-YNKKEO2A.js → chunk-7D2BHQ6M.js} +3 -3
- package/dist/{chunk-YNKKEO2A.js.map → chunk-7D2BHQ6M.js.map} +1 -1
- package/dist/{chunk-MRJWPRCX.js → chunk-AFQIK6JI.js} +3 -3
- package/dist/{chunk-MRJWPRCX.js.map → chunk-AFQIK6JI.js.map} +1 -1
- package/dist/{chunk-IKLA2CVQ.js → chunk-C6TRLHMW.js} +21 -5
- package/dist/chunk-C6TRLHMW.js.map +1 -0
- package/dist/{chunk-NRYWNOG5.js → chunk-CGQIVFCN.js} +3 -3
- package/dist/{chunk-NRYWNOG5.js.map → chunk-CGQIVFCN.js.map} +1 -1
- package/dist/chunk-EFK7726V.js +104 -0
- package/dist/chunk-EFK7726V.js.map +1 -0
- package/dist/{chunk-3BDDPFCI.js → chunk-FDBQOQMW.js} +3 -3
- package/dist/{chunk-3BDDPFCI.js.map → chunk-FDBQOQMW.js.map} +1 -1
- package/dist/{chunk-XALU6LOT.js → chunk-GELLSU64.js} +3 -3
- package/dist/{chunk-XALU6LOT.js.map → chunk-GELLSU64.js.map} +1 -1
- package/dist/{chunk-BZLT6R62.js → chunk-GRDVE3IR.js} +3 -3
- package/dist/{chunk-BZLT6R62.js.map → chunk-GRDVE3IR.js.map} +1 -1
- package/dist/{chunk-OMU4R4Y5.js → chunk-HTF6FDB6.js} +3 -3
- package/dist/{chunk-OMU4R4Y5.js.map → chunk-HTF6FDB6.js.map} +1 -1
- package/dist/{chunk-X7APG7G2.js → chunk-HZKXPN6B.js} +154 -34
- package/dist/chunk-HZKXPN6B.js.map +1 -0
- package/dist/{chunk-WGT345SV.js → chunk-IGLMPAWE.js} +3 -3
- package/dist/{chunk-WGT345SV.js.map → chunk-IGLMPAWE.js.map} +1 -1
- package/dist/{chunk-5XEGZFG5.js → chunk-LWQZ257T.js} +3 -3
- package/dist/{chunk-5XEGZFG5.js.map → chunk-LWQZ257T.js.map} +1 -1
- package/dist/{chunk-RFW5SRZA.js → chunk-MJ4AGXS7.js} +3 -3
- package/dist/{chunk-RFW5SRZA.js.map → chunk-MJ4AGXS7.js.map} +1 -1
- package/dist/{chunk-PNP7L4TA.js → chunk-RM5TSXVE.js} +3 -3
- package/dist/{chunk-PNP7L4TA.js.map → chunk-RM5TSXVE.js.map} +1 -1
- package/dist/{chunk-MKSDYRWQ.js → chunk-SINLREQV.js} +3 -3
- package/dist/{chunk-MKSDYRWQ.js.map → chunk-SINLREQV.js.map} +1 -1
- package/dist/{chunk-TLS54G6Y.js → chunk-UF5OENHV.js} +3 -3
- package/dist/{chunk-TLS54G6Y.js.map → chunk-UF5OENHV.js.map} +1 -1
- package/dist/{chunk-ZQMNGPLE.js → chunk-UJ5KFRDE.js} +18 -6
- package/dist/chunk-UJ5KFRDE.js.map +1 -0
- package/dist/{chunk-SWC5CNKE.js → chunk-UPVNZPFV.js} +3 -3
- package/dist/{chunk-SWC5CNKE.js.map → chunk-UPVNZPFV.js.map} +1 -1
- package/dist/{chunk-3F4TXKDY.js → chunk-UUXWRDWW.js} +3 -3
- package/dist/chunk-UUXWRDWW.js.map +1 -0
- package/dist/{chunk-7GPDNQSX.js → chunk-V2AWSDDZ.js} +5 -5
- package/dist/{chunk-7GPDNQSX.js.map → chunk-V2AWSDDZ.js.map} +1 -1
- package/dist/{chunk-JQQ3FBN7.js → chunk-VCJF75T2.js} +3 -3
- package/dist/{chunk-JQQ3FBN7.js.map → chunk-VCJF75T2.js.map} +1 -1
- package/dist/{chunk-ZBW3BA5R.js → chunk-VMAGFYHG.js} +39 -4
- package/dist/chunk-VMAGFYHG.js.map +1 -0
- package/dist/{chunk-JZ774T7U.js → chunk-W3HMOOON.js} +3 -3
- package/dist/{chunk-JZ774T7U.js.map → chunk-W3HMOOON.js.map} +1 -1
- package/dist/{chunk-6AD6KCVB.js → chunk-WAKKQROH.js} +3 -3
- package/dist/{chunk-6AD6KCVB.js.map → chunk-WAKKQROH.js.map} +1 -1
- package/dist/{chunk-LVWNMQGR.js → chunk-WDNDTSNX.js} +5 -5
- package/dist/{chunk-LVWNMQGR.js.map → chunk-WDNDTSNX.js.map} +1 -1
- package/dist/chunk-WOF67PKT.js +60 -0
- package/dist/chunk-WOF67PKT.js.map +1 -0
- package/dist/{chunk-QJNV7YQP.js → chunk-WTNDPO2V.js} +39 -4
- package/dist/chunk-WTNDPO2V.js.map +1 -0
- package/dist/{chunk-FEPTH5RV.js → chunk-XP55RZ3D.js} +3 -3
- package/dist/{chunk-FEPTH5RV.js.map → chunk-XP55RZ3D.js.map} +1 -1
- package/dist/{chunk-CCUXO2HN.js → chunk-Y4ZRSW35.js} +3 -3
- package/dist/{chunk-CCUXO2HN.js.map → chunk-Y4ZRSW35.js.map} +1 -1
- package/dist/client.cjs +619 -123
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +2 -0
- package/dist/client.d.ts +2 -0
- package/dist/client.js +40 -38
- 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 +6 -3
- 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 +170 -35
- 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.cjs +36 -1
- package/dist/components/Checkbox/index.cjs.map +1 -1
- package/dist/components/Checkbox/index.d.cts +17 -1
- package/dist/components/Checkbox/index.d.ts +17 -1
- package/dist/components/Checkbox/index.js +2 -2
- package/dist/components/Dialog/index.js +2 -2
- package/dist/components/Field/index.cjs +703 -0
- package/dist/components/Field/index.cjs.map +1 -0
- package/dist/components/Field/index.d.cts +51 -0
- package/dist/components/Field/index.d.ts +51 -0
- package/dist/components/Field/index.js +9 -0
- package/dist/components/Field/index.js.map +1 -0
- package/dist/components/FloatButton/index.cjs +6 -3
- 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.cjs.map +1 -1
- package/dist/components/InputGroup/index.d.cts +8 -1
- package/dist/components/InputGroup/index.d.ts +8 -1
- package/dist/components/InputGroup/index.js +2 -2
- package/dist/components/Label/index.cjs +458 -0
- package/dist/components/Label/index.cjs.map +1 -0
- package/dist/components/Label/index.d.cts +14 -0
- package/dist/components/Label/index.d.ts +14 -0
- package/dist/components/Label/index.js +8 -0
- package/dist/components/Label/index.js.map +1 -0
- package/dist/components/Pagination/index.cjs +21 -6
- package/dist/components/Pagination/index.cjs.map +1 -1
- package/dist/components/Pagination/index.js +5 -5
- package/dist/components/Popover/index.js +2 -2
- package/dist/components/Progress/index.js +2 -2
- package/dist/components/Radio/index.cjs +18 -2
- package/dist/components/Radio/index.cjs.map +1 -1
- package/dist/components/Radio/index.d.cts +17 -1
- package/dist/components/Radio/index.d.ts +17 -1
- package/dist/components/Radio/index.js +2 -2
- package/dist/components/SegmentedControl/index.js +2 -2
- package/dist/components/Select/index.cjs +15 -3
- package/dist/components/Select/index.cjs.map +1 -1
- package/dist/components/Select/index.d.cts +6 -0
- package/dist/components/Select/index.d.ts +6 -0
- package/dist/components/Select/index.js +2 -2
- package/dist/components/Switch/index.cjs +36 -1
- package/dist/components/Switch/index.cjs.map +1 -1
- package/dist/components/Switch/index.d.cts +17 -1
- package/dist/components/Switch/index.d.ts +17 -1
- package/dist/components/Switch/index.js +2 -2
- package/dist/components/Tabs/index.js +2 -2
- package/dist/components/Text/index.js +2 -2
- package/dist/components/TextArea/index.cjs +35 -84
- package/dist/components/TextArea/index.cjs.map +1 -1
- package/dist/components/TextArea/index.js +3 -3
- package/dist/components/TextInput/index.cjs +35 -84
- package/dist/components/TextInput/index.cjs.map +1 -1
- package/dist/components/TextInput/index.d.cts +7 -8
- package/dist/components/TextInput/index.d.ts +7 -8
- 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 +6 -3
- package/dist/i18n/index.cjs.map +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/index.cjs +619 -123
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +37 -35
- package/package.json +8 -1
- package/dist/chunk-3F4TXKDY.js.map +0 -1
- package/dist/chunk-FT2XBBQJ.js.map +0 -1
- package/dist/chunk-IKLA2CVQ.js.map +0 -1
- package/dist/chunk-QJNV7YQP.js.map +0 -1
- package/dist/chunk-X7APG7G2.js.map +0 -1
- package/dist/chunk-ZBW3BA5R.js.map +0 -1
- package/dist/chunk-ZQMNGPLE.js.map +0 -1
- package/dist/chunk-ZRD4FQBT.js +0 -153
- package/dist/chunk-ZRD4FQBT.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/AlertDialog/AlertDialog.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-SFNDR6DI.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 { Modal, Platform, Pressable, Text as RNText, StyleSheet, View } from 'react-native';\nimport { Slot } from '../../slot';\nimport { px } from '../../theme/px';\nimport { useColorScheme } from '../../theme/use-color-scheme';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\nimport { BlurBackdrop } from '../Dialog/blur-backdrop';\n\ntype AlertDialogContextValue = {\n open: boolean;\n setOpen: (next: boolean) => void;\n titleId: string;\n descriptionId: string;\n triggerRef: { current: HTMLElement | null };\n cancelRef: { current: HTMLElement | null };\n};\n\nconst AlertDialogContext = createContext<AlertDialogContextValue | null>(null);\n\nconst useAlertDialogContext = (label: string): AlertDialogContextValue => {\n const ctx = useContext(AlertDialogContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside an <AlertDialog>.`);\n }\n return ctx;\n};\n\nexport type AlertDialogProps = {\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 children?: ReactNode;\n};\n\n/**\n * Confirmation dialog that **forces a user response**. Use for destructive\n * or otherwise irreversible actions (\"Delete project?\", \"Sign out everyone?\").\n *\n * Differs from `Dialog` in two important ways:\n * - The backdrop click does **not** dismiss.\n * - The Escape key does **not** dismiss.\n *\n * The user must press `AlertDialogCancel` or `AlertDialogAction` to close.\n * Initial focus lands on Cancel — the less destructive choice — so a stray\n * Enter keypress doesn't fire the destructive action.\n *\n * For non-destructive content (forms, info, settings), prefer `Dialog` —\n * it allows Escape and click-outside to dismiss, which is the expected\n * affordance for forgettable interactions.\n */\nconst AlertDialogRoot = ({ open, defaultOpen = false, onOpenChange, children }: AlertDialogProps) => {\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 const baseId = useId();\n const triggerRef = useRef<HTMLElement | null>(null);\n const cancelRef = useRef<HTMLElement | null>(null);\n\n const ctxValue: AlertDialogContextValue = {\n open: current,\n setOpen,\n titleId: `${baseId}-title`,\n descriptionId: `${baseId}-description`,\n triggerRef,\n cancelRef,\n };\n\n return <AlertDialogContext.Provider value={ctxValue}>{children}</AlertDialogContext.Provider>;\n};\n\nexport type AlertDialogTriggerProps = {\n /** Render the child as the trigger (Slot pattern). Default true. */\n asChild?: boolean;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Element that opens the alert dialog when activated. `asChild` by default\n * so any element (Button, Link, custom Pressable) becomes the trigger.\n */\nexport const AlertDialogTrigger = ({ asChild = true, children, className, testID }: AlertDialogTriggerProps) => {\n const ctx = useAlertDialogContext('AlertDialogTrigger');\n const onPress = useCallback(() => ctx.setOpen(true), [ctx]);\n\n if (asChild && isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n // Pass both onClick (web HTML button) and onPress (RN Pressable / our\n // own Button) so the trigger fires regardless of the wrapped child's\n // event model.\n const fire = (existing: ((e: unknown) => void) | undefined) => (event: unknown) => {\n existing?.(event);\n ctx.setOpen(true);\n };\n return (\n <Slot\n ref={(node: HTMLElement | null) => {\n ctx.triggerRef.current = node;\n }}\n onClick={fire(child.props.onClick as ((e: unknown) => void) | undefined)}\n onPress={fire(child.props.onPress as ((e: unknown) => void) | 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 onPress={onPress}\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\n// Same scrim + blur recipe as Dialog (see Dialog.tsx). 24% black + 4px\n// blur leaves the page text \"almost readable\" behind the dialog rather\n// than fully obscured. Native keeps a flat scrim — RN doesn't have\n// backdrop-filter and the native shim would be an extra peer dep.\nconst SCRIM_COLOR = 'rgba(0, 0, 0, 0.24)';\nconst BLUR_AMOUNT = 4;\n\n// Static overlay layout. The animatable scrim color + backdrop-filter\n// are pushed onto the overlay's DOM ref via useEffect inside the\n// component because rn-web's style filter drops keys it doesn't\n// recognise as RN style props (backdropFilter, transitionProperty).\n// See the Dialog backdrop-blur implementation for the same trick.\nconst OVERLAY_LAYOUT_BASE: ViewStyle = {\n position: Platform.OS === 'web' ? ('fixed' as unknown as 'absolute') : 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n alignItems: 'center',\n justifyContent: 'center',\n // Native overlay stays transparent — the BlurBackdrop sibling renders\n // dim + frosted-glass via expo-blur, and a SCRIM_COLOR layer on top\n // would hide the blur. Web keeps its CSS overlay path (the imperative\n // useEffect below sets backgroundColor + backdrop-filter on web).\n ...(Platform.OS === 'web' ? ({ zIndex: 50 } as ViewStyle) : { backgroundColor: 'transparent' }),\n};\n\n// Layout / animation only; theme-driven dimensions are merged inside\n// AlertDialogContent.\nconst CONTENT_LAYOUT_BASE: ViewStyle = {\n width: '100%',\n maxWidth: 480, // component-density literal — not from theme\n ...(Platform.OS === 'web'\n ? ({\n boxShadow: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)',\n // Subtle scale-in: 0.95 → 1 over 150ms. Honors prefers-reduced-motion\n // via the media query below — set as a CSS variable so the keyframe\n // can be disabled without remounting.\n animationName: 'nori-alert-dialog-in',\n animationDuration: '150ms',\n animationTimingFunction: 'cubic-bezier(0.16, 1, 0.3, 1)',\n animationFillMode: 'both',\n } as ViewStyle)\n : { elevation: 24 }),\n};\n\nconst FOCUSABLE_SELECTOR =\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]):not([type=\"hidden\"]), select:not([disabled]), [role=\"button\"]:not([aria-disabled=\"true\"]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * react-native-web renders our `<Button>` (which wraps `Pressable`) as a\n * `<div role=\"button\">` without a tabindex. That's invisible to native focus\n * APIs in browsers AND jsdom. Poke a `tabindex=\"0\"` onto the node so\n * `.focus()` actually sets `document.activeElement`.\n *\n * Idempotent — only sets it when missing.\n */\nfunction ensureFocusable(node: HTMLElement | null): void {\n if (!node) {\n return;\n }\n if (node.hasAttribute('tabindex')) {\n return;\n }\n node.setAttribute('tabindex', '0');\n}\n\nconst KEYFRAMES_STYLE_ID = 'nori-alert-dialog-keyframes';\nconst KEYFRAMES_CSS = `\n@keyframes nori-alert-dialog-in {\n from { opacity: 0; transform: scale(0.95); }\n to { opacity: 1; transform: scale(1); }\n}\n@media (prefers-reduced-motion: reduce) {\n [data-nori-alert-dialog-content] { animation: none !important; }\n}\n`;\n\nfunction ensureKeyframesInjected(): void {\n if (Platform.OS !== 'web') {\n return;\n }\n if (typeof document === 'undefined') {\n return;\n }\n if (document.getElementById(KEYFRAMES_STYLE_ID)) {\n return;\n }\n const style = document.createElement('style');\n style.id = KEYFRAMES_STYLE_ID;\n style.textContent = KEYFRAMES_CSS;\n document.head.appendChild(style);\n}\n\nexport type AlertDialogContentProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * The visible alert dialog surface — overlay + centered card. Renders only\n * while open. On web: traps focus inside, locks body scroll, restores focus\n * on close. Crucially, neither overlay click nor Escape closes — the user\n * MUST press an explicit Cancel/Action button.\n */\nexport const AlertDialogContent = ({ children, className, testID }: AlertDialogContentProps) => {\n const ctx = useAlertDialogContext('AlertDialogContent');\n const colors = useThemeColors();\n const scheme = useColorScheme();\n const contentRef = useRef<HTMLDivElement | null>(null);\n const overlayDomRef = useRef<HTMLElement | null>(null);\n const overlayStyle: ViewStyle = {\n ...OVERLAY_LAYOUT_BASE,\n padding: px(colors.spacing['4']),\n };\n const contentStyle: ViewStyle = {\n ...CONTENT_LAYOUT_BASE,\n borderRadius: px(colors.radius.xl),\n padding: px(colors.spacing['6']),\n gap: px(colors.spacing['3']),\n };\n // Two-phase mount: render overlay at scrim 0 / blur 0 first, then\n // flip to target values on the next frame so CSS transitions have a\n // start state to interpolate from. Same pattern as Dialog.\n const [entered, setEntered] = useState(false);\n useEffect(() => {\n if (Platform.OS !== 'web') {\n setEntered(true);\n return;\n }\n if (!ctx.open) {\n setEntered(false);\n return;\n }\n const id = requestAnimationFrame(() => setEntered(true));\n return () => cancelAnimationFrame(id);\n }, [ctx.open]);\n\n // Animated scrim + backdrop-filter — pushed onto the overlay's DOM\n // node directly because rn-web's style filter drops the\n // transition/backdrop-filter keys when passed via the View's `style`\n // prop. Web only; native uses the flat scrim baked into\n // OVERLAY_BASE_STYLE.\n useEffect(() => {\n if (Platform.OS !== 'web') {\n return;\n }\n const node = overlayDomRef.current;\n if (!node) {\n return;\n }\n node.style.transitionProperty = 'background-color, backdrop-filter, -webkit-backdrop-filter';\n node.style.transitionDuration = '150ms, 200ms, 200ms';\n node.style.transitionTimingFunction = 'ease-out';\n if (entered) {\n node.style.backgroundColor = SCRIM_COLOR;\n node.style.backdropFilter = `blur(${BLUR_AMOUNT}px)`;\n node.style.setProperty('-webkit-backdrop-filter', `blur(${BLUR_AMOUNT}px)`);\n } else {\n node.style.backgroundColor = 'rgba(0, 0, 0, 0)';\n node.style.backdropFilter = 'blur(0px)';\n node.style.setProperty('-webkit-backdrop-filter', 'blur(0px)');\n }\n }, [entered]);\n\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 ensureKeyframesInjected();\n\n const previouslyFocused = document.activeElement as HTMLElement | null;\n\n // Lock body scroll. Preserve the previous inline value so we don't\n // clobber a consumer-set lock.\n const prevBodyOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n\n // Initial focus: prefer the Cancel button (least destructive default).\n // Fall back to first focusable. Only fall back to the container if\n // there's nothing focusable at all (an alertdialog with no actions\n // is a misuse — we still want it to receive keydown for the trap).\n const focusInitial = () => {\n const node = contentRef.current;\n if (!node) {\n return;\n }\n // Make every focusable target reachable up front. RN-Web Pressables\n // render as `<div role=\"button\">` without tabindex; without this\n // poke, programmatic `.focus()` on them is a no-op.\n const focusable = node.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR);\n for (const el of focusable) {\n ensureFocusable(el);\n }\n const cancel = ctx.cancelRef.current;\n if (cancel?.focus) {\n ensureFocusable(cancel);\n cancel.focus();\n return;\n }\n const first = focusable[0];\n if (first) {\n first.focus();\n } else {\n node.setAttribute('tabindex', '-1');\n node.focus();\n }\n };\n focusInitial();\n\n // Focus trap only — Escape does NOT close (alert dialog contract).\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') {\n return;\n }\n const node = contentRef.current;\n if (!node) {\n return;\n }\n // Don't filter by `offsetParent` here: jsdom always reports `null`\n // for it (no layout engine), which would collapse the trap to the\n // currently focused element only. AlertDialog's content surface is\n // tightly controlled; trust the selector.\n const focusable = Array.from(node.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\n if (focusable.length === 0) {\n event.preventDefault();\n return;\n }\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (!first || !last) {\n return;\n }\n // Make every focusable target reachable from jsdom too.\n for (const el of focusable) {\n ensureFocusable(el);\n }\n if (event.shiftKey) {\n if (document.activeElement === first || !node.contains(document.activeElement)) {\n event.preventDefault();\n last.focus();\n }\n } else if (document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n };\n document.addEventListener('keydown', onKeyDown);\n\n return () => {\n document.removeEventListener('keydown', onKeyDown);\n document.body.style.overflow = prevBodyOverflow;\n const restoreTo = ctx.triggerRef.current ?? previouslyFocused;\n restoreTo?.focus?.();\n };\n }, [ctx.open, ctx.triggerRef, ctx.cancelRef]);\n\n // RN Modal's `onRequestClose` fires on Android hardware back. We\n // intentionally make it a no-op: an alert dialog cannot be backed out\n // of without an explicit choice. A consumer that needs Android back to\n // mean \"cancel\" should wire it via their own action.\n const onRequestClose = useCallback(() => {\n /* intentional no-op — alert dialog requires explicit action */\n }, []);\n\n return (\n <Modal\n visible={ctx.open}\n transparent\n // Web: 'none' so RN's built-in fade doesn't fight our own\n // overlay/content transitions (its layer-level fade caused\n // backdrop-filter to \"snap in\" at the end on Dialog — same\n // failure mode applies here). Native keeps 'fade' since we\n // have no CSS transition path there.\n animationType={Platform.OS === 'web' ? 'none' : 'fade'}\n onRequestClose={onRequestClose}\n >\n {/* Native blur layer; renders nothing on web (CSS handles\n it) or when expo-blur isn't installed. */}\n <BlurBackdrop intensity={60} tint={scheme === 'dark' ? 'dark' : 'light'} style={StyleSheet.absoluteFill} />\n <View\n ref={(node) => {\n overlayDomRef.current = node as unknown as HTMLElement | null;\n }}\n accessibilityRole=\"none\"\n aria-hidden={true}\n style={overlayStyle}\n // Note: this is a <View>, not a <Pressable>. The overlay must NOT\n // dismiss on click for an alert dialog.\n >\n <View\n ref={(node) => {\n contentRef.current = node as unknown as HTMLDivElement | null;\n }}\n role=\"alertdialog\"\n accessibilityRole=\"alert\"\n aria-modal={true}\n aria-labelledby={ctx.titleId}\n aria-describedby={ctx.descriptionId}\n {...(testID !== undefined ? { testID } : {})}\n {...({ 'data-nori-alert-dialog-content': 'true' } as Record<string, string>)}\n className={cn('w-full max-w-md rounded-xl bg-semantic-background-elevated p-6 gap-3', className)}\n style={[contentStyle, { backgroundColor: colors.semantic.background.elevated }]}\n >\n <View\n className=\"flex-col gap-1.5\"\n style={{ flexDirection: 'column', gap: px(colors.spacing['2']) - 2 }}\n >\n {children}\n </View>\n </View>\n </View>\n </Modal>\n );\n};\n\nexport type AlertDialogTextProps = {\n children?: ReactNode;\n className?: string;\n};\n\n/** Heading inside AlertDialogContent. Wires `aria-labelledby`. */\nexport const AlertDialogTitle = ({ children, className }: AlertDialogTextProps) => {\n const ctx = useAlertDialogContext('AlertDialogTitle');\n const colors = useThemeColors();\n return (\n <RNText\n nativeID={ctx.titleId}\n id={ctx.titleId}\n role=\"heading\"\n aria-level={2}\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/** Body description inside AlertDialogContent. Wires `aria-describedby`. */\nexport const AlertDialogDescription = ({ children, className }: AlertDialogTextProps) => {\n const ctx = useAlertDialogContext('AlertDialogDescription');\n const colors = useThemeColors();\n return (\n <RNText\n nativeID={ctx.descriptionId}\n id={ctx.descriptionId}\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 lineHeight: px(colors.fontSize.sm) * Number(colors.lineHeight.normal),\n }}\n >\n {children}\n </RNText>\n );\n};\n\nexport type AlertDialogActionProps = {\n /** Render the child as the action (Slot pattern). Default true. */\n asChild?: boolean;\n children?: ReactNode;\n className?: string;\n testID?: string;\n /** Forwarded to the wrapped child / fallback Pressable. Fires before close. */\n onPress?: (event?: unknown) => void;\n};\n\n/**\n * The destructive / confirming action. Closes the dialog AND forwards\n * `onPress` to the consumer's handler so they can run the side effect.\n */\nexport const AlertDialogAction = ({ asChild = true, children, className, testID, onPress }: AlertDialogActionProps) => {\n const ctx = useAlertDialogContext('AlertDialogAction');\n const handle = useCallback(\n (event?: unknown) => {\n onPress?.(event);\n ctx.setOpen(false);\n },\n [ctx, onPress]\n );\n\n if (asChild && isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n // Wrap both event names so an HTML button (onClick) and an RN\n // Pressable / Button (onPress) both fire — and both still call the\n // child's own handler if present.\n const fire = (existing: ((e: unknown) => void) | undefined) => (event: unknown) => {\n existing?.(event);\n handle(event);\n };\n return (\n <Slot\n onClick={fire(child.props.onClick as ((e: unknown) => void) | undefined)}\n onPress={fire(child.props.onPress as ((e: unknown) => void) | undefined)}\n {...(testID !== undefined ? { 'data-testid': testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {child}\n </Slot>\n );\n }\n\n return (\n <Pressable\n onPress={handle}\n role=\"button\"\n accessibilityRole=\"button\"\n {...(testID !== undefined ? { testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {wrapStringChildren(children)}\n </Pressable>\n );\n};\n\nexport type AlertDialogCancelProps = {\n /** Render the child as the cancel button (Slot pattern). Default true. */\n asChild?: boolean;\n children?: ReactNode;\n className?: string;\n testID?: string;\n /** Forwarded to the wrapped child / fallback Pressable. Fires before close. */\n onPress?: (event?: unknown) => void;\n};\n\n/**\n * The cancel / dismiss action. Closes the dialog AND forwards `onPress`.\n * Receives initial focus inside `AlertDialogContent` — Cancel is the\n * least destructive default, so a stray Enter keypress can't fire the\n * destructive action.\n */\nexport const AlertDialogCancel = ({ asChild = true, children, className, testID, onPress }: AlertDialogCancelProps) => {\n const ctx = useAlertDialogContext('AlertDialogCancel');\n const handle = useCallback(\n (event?: unknown) => {\n onPress?.(event);\n ctx.setOpen(false);\n },\n [ctx, onPress]\n );\n\n if (asChild && isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n const fire = (existing: ((e: unknown) => void) | undefined) => (event: unknown) => {\n existing?.(event);\n handle(event);\n };\n return (\n <Slot\n ref={(node: HTMLElement | null) => {\n ctx.cancelRef.current = node;\n }}\n onClick={fire(child.props.onClick as ((e: unknown) => void) | undefined)}\n onPress={fire(child.props.onPress as ((e: unknown) => void) | 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.cancelRef.current = node as unknown as HTMLElement | null;\n }}\n onPress={handle}\n role=\"button\"\n accessibilityRole=\"button\"\n {...(testID !== undefined ? { testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {wrapStringChildren(children)}\n </Pressable>\n );\n};\n\nexport type AlertDialogFooterProps = {\n children?: ReactNode;\n className?: string;\n};\n\n/** Convenience row for action buttons (right-aligned). */\nexport const AlertDialogFooter = ({ children, className }: AlertDialogFooterProps) => {\n const colors = useThemeColors();\n return (\n <View\n className={cn('mt-4 flex-row items-center justify-end gap-2', className)}\n style={{\n marginTop: px(colors.spacing['4']),\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: px(colors.spacing['2']),\n }}\n >\n {children}\n </View>\n );\n};\n\n/**\n * Public `AlertDialog` value — the root function plus its `.Trigger`,\n * `.Content`, `.Title`, `.Description`, `.Footer`, `.Action`, and `.Cancel`\n * static members. `Object.assign` produces a value whose inferred type carries\n * the static properties, so `.d.ts` consumers can write `<AlertDialog.Content>`\n * without a separate import.\n */\nexport const AlertDialog = Object.assign(AlertDialogRoot, {\n Trigger: AlertDialogTrigger,\n Content: AlertDialogContent,\n Title: AlertDialogTitle,\n Description: AlertDialogDescription,\n Footer: AlertDialogFooter,\n Action: AlertDialogAction,\n Cancel: AlertDialogCancel,\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/AlertDialog/AlertDialog.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-5BM6H2CD.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 { Modal, Platform, Pressable, Text as RNText, StyleSheet, View } from 'react-native';\nimport { Slot } from '../../slot';\nimport { px } from '../../theme/px';\nimport { useColorScheme } from '../../theme/use-color-scheme';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\nimport { BlurBackdrop } from '../Dialog/blur-backdrop';\n\ntype AlertDialogContextValue = {\n open: boolean;\n setOpen: (next: boolean) => void;\n titleId: string;\n descriptionId: string;\n triggerRef: { current: HTMLElement | null };\n cancelRef: { current: HTMLElement | null };\n};\n\nconst AlertDialogContext = createContext<AlertDialogContextValue | null>(null);\n\nconst useAlertDialogContext = (label: string): AlertDialogContextValue => {\n const ctx = useContext(AlertDialogContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside an <AlertDialog>.`);\n }\n return ctx;\n};\n\nexport type AlertDialogProps = {\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 children?: ReactNode;\n};\n\n/**\n * Confirmation dialog that **forces a user response**. Use for destructive\n * or otherwise irreversible actions (\"Delete project?\", \"Sign out everyone?\").\n *\n * Differs from `Dialog` in two important ways:\n * - The backdrop click does **not** dismiss.\n * - The Escape key does **not** dismiss.\n *\n * The user must press `AlertDialogCancel` or `AlertDialogAction` to close.\n * Initial focus lands on Cancel — the less destructive choice — so a stray\n * Enter keypress doesn't fire the destructive action.\n *\n * For non-destructive content (forms, info, settings), prefer `Dialog` —\n * it allows Escape and click-outside to dismiss, which is the expected\n * affordance for forgettable interactions.\n */\nconst AlertDialogRoot = ({ open, defaultOpen = false, onOpenChange, children }: AlertDialogProps) => {\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 const baseId = useId();\n const triggerRef = useRef<HTMLElement | null>(null);\n const cancelRef = useRef<HTMLElement | null>(null);\n\n const ctxValue: AlertDialogContextValue = {\n open: current,\n setOpen,\n titleId: `${baseId}-title`,\n descriptionId: `${baseId}-description`,\n triggerRef,\n cancelRef,\n };\n\n return <AlertDialogContext.Provider value={ctxValue}>{children}</AlertDialogContext.Provider>;\n};\n\nexport type AlertDialogTriggerProps = {\n /** Render the child as the trigger (Slot pattern). Default true. */\n asChild?: boolean;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Element that opens the alert dialog when activated. `asChild` by default\n * so any element (Button, Link, custom Pressable) becomes the trigger.\n */\nexport const AlertDialogTrigger = ({ asChild = true, children, className, testID }: AlertDialogTriggerProps) => {\n const ctx = useAlertDialogContext('AlertDialogTrigger');\n const onPress = useCallback(() => ctx.setOpen(true), [ctx]);\n\n if (asChild && isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n // Pass both onClick (web HTML button) and onPress (RN Pressable / our\n // own Button) so the trigger fires regardless of the wrapped child's\n // event model.\n const fire = (existing: ((e: unknown) => void) | undefined) => (event: unknown) => {\n existing?.(event);\n ctx.setOpen(true);\n };\n return (\n <Slot\n ref={(node: HTMLElement | null) => {\n ctx.triggerRef.current = node;\n }}\n onClick={fire(child.props.onClick as ((e: unknown) => void) | undefined)}\n onPress={fire(child.props.onPress as ((e: unknown) => void) | 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 onPress={onPress}\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\n// Same scrim + blur recipe as Dialog (see Dialog.tsx). 24% black + 4px\n// blur leaves the page text \"almost readable\" behind the dialog rather\n// than fully obscured. Native keeps a flat scrim — RN doesn't have\n// backdrop-filter and the native shim would be an extra peer dep.\nconst SCRIM_COLOR = 'rgba(0, 0, 0, 0.24)';\nconst BLUR_AMOUNT = 4;\n\n// Static overlay layout. The animatable scrim color + backdrop-filter\n// are pushed onto the overlay's DOM ref via useEffect inside the\n// component because rn-web's style filter drops keys it doesn't\n// recognise as RN style props (backdropFilter, transitionProperty).\n// See the Dialog backdrop-blur implementation for the same trick.\nconst OVERLAY_LAYOUT_BASE: ViewStyle = {\n position: Platform.OS === 'web' ? ('fixed' as unknown as 'absolute') : 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n alignItems: 'center',\n justifyContent: 'center',\n // Native overlay stays transparent — the BlurBackdrop sibling renders\n // dim + frosted-glass via expo-blur, and a SCRIM_COLOR layer on top\n // would hide the blur. Web keeps its CSS overlay path (the imperative\n // useEffect below sets backgroundColor + backdrop-filter on web).\n ...(Platform.OS === 'web' ? ({ zIndex: 50 } as ViewStyle) : { backgroundColor: 'transparent' }),\n};\n\n// Layout / animation only; theme-driven dimensions are merged inside\n// AlertDialogContent.\nconst CONTENT_LAYOUT_BASE: ViewStyle = {\n width: '100%',\n maxWidth: 480, // component-density literal — not from theme\n ...(Platform.OS === 'web'\n ? ({\n boxShadow: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)',\n // Subtle scale-in: 0.95 → 1 over 150ms. Honors prefers-reduced-motion\n // via the media query below — set as a CSS variable so the keyframe\n // can be disabled without remounting.\n animationName: 'nori-alert-dialog-in',\n animationDuration: '150ms',\n animationTimingFunction: 'cubic-bezier(0.16, 1, 0.3, 1)',\n animationFillMode: 'both',\n } as ViewStyle)\n : { elevation: 24 }),\n};\n\nconst FOCUSABLE_SELECTOR =\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]):not([type=\"hidden\"]), select:not([disabled]), [role=\"button\"]:not([aria-disabled=\"true\"]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * react-native-web renders our `<Button>` (which wraps `Pressable`) as a\n * `<div role=\"button\">` without a tabindex. That's invisible to native focus\n * APIs in browsers AND jsdom. Poke a `tabindex=\"0\"` onto the node so\n * `.focus()` actually sets `document.activeElement`.\n *\n * Idempotent — only sets it when missing.\n */\nfunction ensureFocusable(node: HTMLElement | null): void {\n if (!node) {\n return;\n }\n if (node.hasAttribute('tabindex')) {\n return;\n }\n node.setAttribute('tabindex', '0');\n}\n\nconst KEYFRAMES_STYLE_ID = 'nori-alert-dialog-keyframes';\nconst KEYFRAMES_CSS = `\n@keyframes nori-alert-dialog-in {\n from { opacity: 0; transform: scale(0.95); }\n to { opacity: 1; transform: scale(1); }\n}\n@media (prefers-reduced-motion: reduce) {\n [data-nori-alert-dialog-content] { animation: none !important; }\n}\n`;\n\nfunction ensureKeyframesInjected(): void {\n if (Platform.OS !== 'web') {\n return;\n }\n if (typeof document === 'undefined') {\n return;\n }\n if (document.getElementById(KEYFRAMES_STYLE_ID)) {\n return;\n }\n const style = document.createElement('style');\n style.id = KEYFRAMES_STYLE_ID;\n style.textContent = KEYFRAMES_CSS;\n document.head.appendChild(style);\n}\n\nexport type AlertDialogContentProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * The visible alert dialog surface — overlay + centered card. Renders only\n * while open. On web: traps focus inside, locks body scroll, restores focus\n * on close. Crucially, neither overlay click nor Escape closes — the user\n * MUST press an explicit Cancel/Action button.\n */\nexport const AlertDialogContent = ({ children, className, testID }: AlertDialogContentProps) => {\n const ctx = useAlertDialogContext('AlertDialogContent');\n const colors = useThemeColors();\n const scheme = useColorScheme();\n const contentRef = useRef<HTMLDivElement | null>(null);\n const overlayDomRef = useRef<HTMLElement | null>(null);\n const overlayStyle: ViewStyle = {\n ...OVERLAY_LAYOUT_BASE,\n padding: px(colors.spacing['4']),\n };\n const contentStyle: ViewStyle = {\n ...CONTENT_LAYOUT_BASE,\n borderRadius: px(colors.radius.xl),\n padding: px(colors.spacing['6']),\n gap: px(colors.spacing['3']),\n };\n // Two-phase mount: render overlay at scrim 0 / blur 0 first, then\n // flip to target values on the next frame so CSS transitions have a\n // start state to interpolate from. Same pattern as Dialog.\n const [entered, setEntered] = useState(false);\n useEffect(() => {\n if (Platform.OS !== 'web') {\n setEntered(true);\n return;\n }\n if (!ctx.open) {\n setEntered(false);\n return;\n }\n const id = requestAnimationFrame(() => setEntered(true));\n return () => cancelAnimationFrame(id);\n }, [ctx.open]);\n\n // Animated scrim + backdrop-filter — pushed onto the overlay's DOM\n // node directly because rn-web's style filter drops the\n // transition/backdrop-filter keys when passed via the View's `style`\n // prop. Web only; native uses the flat scrim baked into\n // OVERLAY_BASE_STYLE.\n useEffect(() => {\n if (Platform.OS !== 'web') {\n return;\n }\n const node = overlayDomRef.current;\n if (!node) {\n return;\n }\n node.style.transitionProperty = 'background-color, backdrop-filter, -webkit-backdrop-filter';\n node.style.transitionDuration = '150ms, 200ms, 200ms';\n node.style.transitionTimingFunction = 'ease-out';\n if (entered) {\n node.style.backgroundColor = SCRIM_COLOR;\n node.style.backdropFilter = `blur(${BLUR_AMOUNT}px)`;\n node.style.setProperty('-webkit-backdrop-filter', `blur(${BLUR_AMOUNT}px)`);\n } else {\n node.style.backgroundColor = 'rgba(0, 0, 0, 0)';\n node.style.backdropFilter = 'blur(0px)';\n node.style.setProperty('-webkit-backdrop-filter', 'blur(0px)');\n }\n }, [entered]);\n\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 ensureKeyframesInjected();\n\n const previouslyFocused = document.activeElement as HTMLElement | null;\n\n // Lock body scroll. Preserve the previous inline value so we don't\n // clobber a consumer-set lock.\n const prevBodyOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n\n // Initial focus: prefer the Cancel button (least destructive default).\n // Fall back to first focusable. Only fall back to the container if\n // there's nothing focusable at all (an alertdialog with no actions\n // is a misuse — we still want it to receive keydown for the trap).\n const focusInitial = () => {\n const node = contentRef.current;\n if (!node) {\n return;\n }\n // Make every focusable target reachable up front. RN-Web Pressables\n // render as `<div role=\"button\">` without tabindex; without this\n // poke, programmatic `.focus()` on them is a no-op.\n const focusable = node.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR);\n for (const el of focusable) {\n ensureFocusable(el);\n }\n const cancel = ctx.cancelRef.current;\n if (cancel?.focus) {\n ensureFocusable(cancel);\n cancel.focus();\n return;\n }\n const first = focusable[0];\n if (first) {\n first.focus();\n } else {\n node.setAttribute('tabindex', '-1');\n node.focus();\n }\n };\n focusInitial();\n\n // Focus trap only — Escape does NOT close (alert dialog contract).\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') {\n return;\n }\n const node = contentRef.current;\n if (!node) {\n return;\n }\n // Don't filter by `offsetParent` here: jsdom always reports `null`\n // for it (no layout engine), which would collapse the trap to the\n // currently focused element only. AlertDialog's content surface is\n // tightly controlled; trust the selector.\n const focusable = Array.from(node.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\n if (focusable.length === 0) {\n event.preventDefault();\n return;\n }\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (!first || !last) {\n return;\n }\n // Make every focusable target reachable from jsdom too.\n for (const el of focusable) {\n ensureFocusable(el);\n }\n if (event.shiftKey) {\n if (document.activeElement === first || !node.contains(document.activeElement)) {\n event.preventDefault();\n last.focus();\n }\n } else if (document.activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n };\n document.addEventListener('keydown', onKeyDown);\n\n return () => {\n document.removeEventListener('keydown', onKeyDown);\n document.body.style.overflow = prevBodyOverflow;\n const restoreTo = ctx.triggerRef.current ?? previouslyFocused;\n restoreTo?.focus?.();\n };\n }, [ctx.open, ctx.triggerRef, ctx.cancelRef]);\n\n // RN Modal's `onRequestClose` fires on Android hardware back. We\n // intentionally make it a no-op: an alert dialog cannot be backed out\n // of without an explicit choice. A consumer that needs Android back to\n // mean \"cancel\" should wire it via their own action.\n const onRequestClose = useCallback(() => {\n /* intentional no-op — alert dialog requires explicit action */\n }, []);\n\n return (\n <Modal\n visible={ctx.open}\n transparent\n // Web: 'none' so RN's built-in fade doesn't fight our own\n // overlay/content transitions (its layer-level fade caused\n // backdrop-filter to \"snap in\" at the end on Dialog — same\n // failure mode applies here). Native keeps 'fade' since we\n // have no CSS transition path there.\n animationType={Platform.OS === 'web' ? 'none' : 'fade'}\n onRequestClose={onRequestClose}\n >\n {/* Native blur layer; renders nothing on web (CSS handles\n it) or when expo-blur isn't installed. */}\n <BlurBackdrop intensity={60} tint={scheme === 'dark' ? 'dark' : 'light'} style={StyleSheet.absoluteFill} />\n <View\n ref={(node) => {\n overlayDomRef.current = node as unknown as HTMLElement | null;\n }}\n accessibilityRole=\"none\"\n aria-hidden={true}\n style={overlayStyle}\n // Note: this is a <View>, not a <Pressable>. The overlay must NOT\n // dismiss on click for an alert dialog.\n >\n <View\n ref={(node) => {\n contentRef.current = node as unknown as HTMLDivElement | null;\n }}\n role=\"alertdialog\"\n accessibilityRole=\"alert\"\n aria-modal={true}\n aria-labelledby={ctx.titleId}\n aria-describedby={ctx.descriptionId}\n {...(testID !== undefined ? { testID } : {})}\n {...({ 'data-nori-alert-dialog-content': 'true' } as Record<string, string>)}\n className={cn('w-full max-w-md rounded-xl bg-semantic-background-elevated p-6 gap-3', className)}\n style={[contentStyle, { backgroundColor: colors.semantic.background.elevated }]}\n >\n <View\n className=\"flex-col gap-1.5\"\n style={{ flexDirection: 'column', gap: px(colors.spacing['2']) - 2 }}\n >\n {children}\n </View>\n </View>\n </View>\n </Modal>\n );\n};\n\nexport type AlertDialogTextProps = {\n children?: ReactNode;\n className?: string;\n};\n\n/** Heading inside AlertDialogContent. Wires `aria-labelledby`. */\nexport const AlertDialogTitle = ({ children, className }: AlertDialogTextProps) => {\n const ctx = useAlertDialogContext('AlertDialogTitle');\n const colors = useThemeColors();\n return (\n <RNText\n nativeID={ctx.titleId}\n id={ctx.titleId}\n role=\"heading\"\n aria-level={2}\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/** Body description inside AlertDialogContent. Wires `aria-describedby`. */\nexport const AlertDialogDescription = ({ children, className }: AlertDialogTextProps) => {\n const ctx = useAlertDialogContext('AlertDialogDescription');\n const colors = useThemeColors();\n return (\n <RNText\n nativeID={ctx.descriptionId}\n id={ctx.descriptionId}\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 lineHeight: px(colors.fontSize.sm) * Number(colors.lineHeight.normal),\n }}\n >\n {children}\n </RNText>\n );\n};\n\nexport type AlertDialogActionProps = {\n /** Render the child as the action (Slot pattern). Default true. */\n asChild?: boolean;\n children?: ReactNode;\n className?: string;\n testID?: string;\n /** Forwarded to the wrapped child / fallback Pressable. Fires before close. */\n onPress?: (event?: unknown) => void;\n};\n\n/**\n * The destructive / confirming action. Closes the dialog AND forwards\n * `onPress` to the consumer's handler so they can run the side effect.\n */\nexport const AlertDialogAction = ({ asChild = true, children, className, testID, onPress }: AlertDialogActionProps) => {\n const ctx = useAlertDialogContext('AlertDialogAction');\n const handle = useCallback(\n (event?: unknown) => {\n onPress?.(event);\n ctx.setOpen(false);\n },\n [ctx, onPress]\n );\n\n if (asChild && isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n // Wrap both event names so an HTML button (onClick) and an RN\n // Pressable / Button (onPress) both fire — and both still call the\n // child's own handler if present.\n const fire = (existing: ((e: unknown) => void) | undefined) => (event: unknown) => {\n existing?.(event);\n handle(event);\n };\n return (\n <Slot\n onClick={fire(child.props.onClick as ((e: unknown) => void) | undefined)}\n onPress={fire(child.props.onPress as ((e: unknown) => void) | undefined)}\n {...(testID !== undefined ? { 'data-testid': testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {child}\n </Slot>\n );\n }\n\n return (\n <Pressable\n onPress={handle}\n role=\"button\"\n accessibilityRole=\"button\"\n {...(testID !== undefined ? { testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {wrapStringChildren(children)}\n </Pressable>\n );\n};\n\nexport type AlertDialogCancelProps = {\n /** Render the child as the cancel button (Slot pattern). Default true. */\n asChild?: boolean;\n children?: ReactNode;\n className?: string;\n testID?: string;\n /** Forwarded to the wrapped child / fallback Pressable. Fires before close. */\n onPress?: (event?: unknown) => void;\n};\n\n/**\n * The cancel / dismiss action. Closes the dialog AND forwards `onPress`.\n * Receives initial focus inside `AlertDialogContent` — Cancel is the\n * least destructive default, so a stray Enter keypress can't fire the\n * destructive action.\n */\nexport const AlertDialogCancel = ({ asChild = true, children, className, testID, onPress }: AlertDialogCancelProps) => {\n const ctx = useAlertDialogContext('AlertDialogCancel');\n const handle = useCallback(\n (event?: unknown) => {\n onPress?.(event);\n ctx.setOpen(false);\n },\n [ctx, onPress]\n );\n\n if (asChild && isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n const fire = (existing: ((e: unknown) => void) | undefined) => (event: unknown) => {\n existing?.(event);\n handle(event);\n };\n return (\n <Slot\n ref={(node: HTMLElement | null) => {\n ctx.cancelRef.current = node;\n }}\n onClick={fire(child.props.onClick as ((e: unknown) => void) | undefined)}\n onPress={fire(child.props.onPress as ((e: unknown) => void) | 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.cancelRef.current = node as unknown as HTMLElement | null;\n }}\n onPress={handle}\n role=\"button\"\n accessibilityRole=\"button\"\n {...(testID !== undefined ? { testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {wrapStringChildren(children)}\n </Pressable>\n );\n};\n\nexport type AlertDialogFooterProps = {\n children?: ReactNode;\n className?: string;\n};\n\n/** Convenience row for action buttons (right-aligned). */\nexport const AlertDialogFooter = ({ children, className }: AlertDialogFooterProps) => {\n const colors = useThemeColors();\n return (\n <View\n className={cn('mt-4 flex-row items-center justify-end gap-2', className)}\n style={{\n marginTop: px(colors.spacing['4']),\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-end',\n gap: px(colors.spacing['2']),\n }}\n >\n {children}\n </View>\n );\n};\n\n/**\n * Public `AlertDialog` value — the root function plus its `.Trigger`,\n * `.Content`, `.Title`, `.Description`, `.Footer`, `.Action`, and `.Cancel`\n * static members. `Object.assign` produces a value whose inferred type carries\n * the static properties, so `.d.ts` consumers can write `<AlertDialog.Content>`\n * without a separate import.\n */\nexport const AlertDialog = Object.assign(AlertDialogRoot, {\n Trigger: AlertDialogTrigger,\n Content: AlertDialogContent,\n Title: AlertDialogTitle,\n Description: AlertDialogDescription,\n Footer: AlertDialogFooter,\n Action: AlertDialogAction,\n Cancel: AlertDialogCancel,\n});\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { useTranslation } from './chunk-
|
|
1
|
+
import { useTranslation } from './chunk-MJ4AGXS7.js';
|
|
2
2
|
import { defaultSemanticIcons } from './chunk-7Z4NMNX6.js';
|
|
3
|
-
import { Badge } from './chunk-
|
|
4
|
-
import { px } from './chunk-5A2QOOVN.js';
|
|
3
|
+
import { Badge } from './chunk-FDBQOQMW.js';
|
|
5
4
|
import { cn } from './chunk-CHXHRJNZ.js';
|
|
5
|
+
import { px } from './chunk-5A2QOOVN.js';
|
|
6
6
|
import { useThemeColors } from './chunk-R5JMDDCB.js';
|
|
7
7
|
import { __name } from './chunk-WCQVDF3K.js';
|
|
8
8
|
import * as React from 'react';
|
|
@@ -650,5 +650,5 @@ function withAlpha(color, alpha) {
|
|
|
650
650
|
__name(withAlpha, "withAlpha");
|
|
651
651
|
|
|
652
652
|
export { FloatButton };
|
|
653
|
-
//# sourceMappingURL=chunk-
|
|
654
|
-
//# sourceMappingURL=chunk-
|
|
653
|
+
//# sourceMappingURL=chunk-6JVUVBZH.js.map
|
|
654
|
+
//# sourceMappingURL=chunk-6JVUVBZH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/react-native-safe-area-context/SafeAreaContext.tsx","../src/components/FloatButton/FloatButton.tsx"],"names":["isDev","process","env","NODE_ENV","SafeAreaInsetsContext","createContext","displayName","SafeAreaFrameContext","StyleSheet","create","fill","flex","Consumer","useContext","useState","useCallback","RNText"],"mappings":"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","file":"chunk-EWWQQ5DB.js","sourcesContent":[null,"'use client';\n\n// =============================================================================\n// FloatButton — cross-platform Floating Action Button (FAB)\n//\n// Two-component public surface:\n// <FloatButton> — standalone FAB\n// <FloatButton.Group> — cluster with click/long-press expansion\n// <FloatButton.BackToTop> — preset that scrolls a target ref to top\n//\n// Design direction: restrained-editorial (Linear/Stripe energy). Two-layer\n// brand-tinted shadows, subtle hover lift, snappy press scale, no bouncy\n// physics. Cross-platform via the same Pressable + inline style pattern\n// used in Pagination.\n// =============================================================================\n\nimport {\n type ComponentProps,\n cloneElement,\n createContext,\n type FC,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { GestureResponderEvent, ViewStyle } from 'react-native';\nimport { Platform, Pressable, Text as RNText, type ScrollView, useWindowDimensions, View } from 'react-native';\nimport { SafeAreaInsetsContext } from 'react-native-safe-area-context';\nimport { useTranslation } from '../../i18n/use-translation';\nimport { defaultSemanticIcons } from '../../icons/default-semantic-icons';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\nimport { Badge, type BadgeProps } from '../Badge';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type FloatButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'surface';\nexport type FloatButtonShape = 'circle' | 'square' | 'extended';\nexport type FloatButtonSize = 'small' | 'medium' | 'large';\nexport type FloatButtonPlacement = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\nexport type FloatButtonGroupTrigger = 'click' | 'longPress' | 'manual';\nexport type FloatButtonGroupDirection = 'up' | 'down' | 'left' | 'right';\n\n/** Badge passthrough — same shape as our `<Badge>` accepts. */\nexport type FloatButtonBadge = {\n /** Numeric badge — render the number inside a small pill. */\n count?: number;\n /** Show a dot instead of a count (overrides `count`). */\n dot?: boolean;\n /** Badge tone — defaults to `'danger'` (the canonical \"unread\" red). */\n tone?: BadgeProps['tone'];\n};\n\ntype FloatButtonBaseProps = {\n /** Required unless `label` is set. */\n icon?: ReactNode;\n /** Inline label — turns the button extended (auto-sets `shape='extended'`). */\n label?: string;\n /** A11y label — falls back to `label`; required when icon-only. */\n accessibilityLabel?: string;\n /** Visual shape. @defaultValue 'circle' (or 'extended' when both icon + label are set) */\n shape?: FloatButtonShape;\n /** Size — sm=40, md=56, lg=72. @defaultValue 'medium' */\n size?: FloatButtonSize;\n /** Color/tone variant. @defaultValue 'primary' */\n variant?: FloatButtonVariant;\n /** Tooltip — web: hover/focus tooltip; native (in a group): always-visible label chip. */\n tooltip?: string;\n /** Badge — count, dot, or tone passthrough. */\n badge?: FloatButtonBadge;\n /** Disable interaction. */\n disabled?: boolean;\n /** Show a spinner in place of the icon. */\n loading?: boolean;\n /** Animate in/out. @defaultValue true */\n visible?: boolean;\n /** Where to anchor the FAB on the screen. @defaultValue 'bottom-right' */\n placement?: FloatButtonPlacement;\n /**\n * Positioning strategy. `'fixed'` pins to the viewport (web `position: fixed`,\n * native absolute-on-root); `'absolute'` pins to the nearest positioned\n * ancestor — useful for docs previews and any contained-canvas layout.\n * @defaultValue 'fixed'\n */\n positioning?: 'fixed' | 'absolute';\n /** Additional offset from the placement corner (px). @defaultValue { x: 24, y: 24 } web; { x: 16, y: 16 } native */\n offset?: { x?: number; y?: number };\n /**\n * On native, auto-add the device's bottom safe-area inset to the offset.\n * **Default is `false`** because RN has no `position: 'fixed'` — every\n * `FloatButton` is parent-relative, and adding the screen-bottom inset\n * to a card-relative offset pushes the button up by ~34pt for no reason.\n * Set this to `true` only when you're certain the FAB's parent reaches\n * the screen edge (e.g. a root-level container without `SafeAreaView`).\n * @defaultValue false\n */\n respectSafeArea?: boolean;\n /** Anchor link — renders as an `<a>` on web. */\n href?: string;\n /** RTL flips left/right placements. @defaultValue 'ltr' */\n dir?: 'ltr' | 'rtl';\n /** Long-press handler — native first-class, web maps to contextmenu. */\n onLongPress?: (event: GestureResponderEvent) => void;\n /** Forward ARIA attributes (used internally by Group for `aria-haspopup`/`aria-expanded`). */\n 'aria-haspopup'?: 'menu' | 'true' | boolean;\n 'aria-expanded'?: boolean;\n /**\n * Press handler. We're React-Native-first, so `onPress` is the primary\n * surface and works on both platforms. `onClick` is also accepted for\n * web-mental-model consumers; if BOTH are defined, `onPress` wins (and\n * a dev-only warning fires).\n */\n onPress?: (event: GestureResponderEvent) => void;\n /** Web-y alias for `onPress` — same handler, mapped at the call site. */\n onClick?: (event: { preventDefault?: () => void }) => void;\n className?: string;\n testID?: string;\n /** Set internally when the button lives inside a `<FloatButton.Group>`. */\n children?: ReactNode;\n};\n\nexport type FloatButtonProps = FloatButtonBaseProps;\n\n// =============================================================================\n// Context — shared by Group and its children\n// =============================================================================\n\ntype FloatButtonGroupContextValue = {\n /** Whether the group is expanded. */\n open: boolean;\n /** Close the group programmatically (used by action items after press). */\n close: () => void;\n /** Direction of expansion. */\n direction: FloatButtonGroupDirection;\n /** Whether items are inside a group — used to skip per-item positioning. */\n insideGroup: true;\n /** Index of the action item, used for staggered animation. */\n indexRef: { next: number };\n};\n\nconst FloatButtonGroupContext = createContext<FloatButtonGroupContextValue | null>(null);\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst SIZE_MAP: Record<FloatButtonSize, { diameter: number; iconSize: number; fontSize: number; padX: number }> = {\n small: { diameter: 40, iconSize: 18, fontSize: 14, padX: 16 },\n medium: { diameter: 56, iconSize: 22, fontSize: 14, padX: 20 },\n large: { diameter: 72, iconSize: 28, fontSize: 16, padX: 28 },\n};\n\nconst DEFAULT_OFFSET_WEB = 24;\nconst DEFAULT_OFFSET_NATIVE = 16;\n\n// =============================================================================\n// Standalone FloatButton\n// =============================================================================\n\n/**\n * Floating Action Button — a fixed-position button that hovers above page\n * content. Cross-platform (web + native), badge-aware, link-capable, and\n * safe-area-aware on native.\n *\n * @example\n * <FloatButton icon={<Plus />} accessibilityLabel=\"New item\" onPress={...} />\n *\n * @example\n * <FloatButton icon={<Help />} label=\"Help\" shape=\"extended\" />\n */\n// Defined here as a plain function; the Group / BackToTop static properties\n// are attached at the bottom of the file via `Object.assign` so the dist\n// `.d.ts` surface preserves them (a bare type cast on the const doesn't\n// propagate through tsup's declaration emitter).\nconst FloatButtonRoot = (props: FloatButtonProps) => {\n const groupCtx = useContext(FloatButtonGroupContext);\n const colors = useThemeColors();\n // Read the context directly (instead of `useSafeAreaInsets()`) so the\n // component degrades silently when no `<SafeAreaProvider>` is mounted —\n // the canonical case on web. With a provider, real insets flow through;\n // without one, we get zeros and no console warning.\n const insets = useContext(SafeAreaInsetsContext) ?? { top: 0, right: 0, bottom: 0, left: 0 };\n const { width: viewportWidth } = useWindowDimensions();\n\n const {\n icon,\n label,\n accessibilityLabel,\n shape: shapeProp,\n size = groupCtx ? 'small' : 'medium',\n variant = 'primary',\n tooltip,\n badge,\n disabled = false,\n loading = false,\n visible = true,\n placement = 'bottom-right',\n positioning = 'fixed',\n offset,\n respectSafeArea = false,\n href,\n dir = 'ltr',\n onLongPress,\n className,\n testID,\n children,\n onPress,\n onClick,\n 'aria-haspopup': ariaHasPopup,\n 'aria-expanded': ariaExpanded,\n } = props;\n\n // `onPress` wins when both are defined — emit a dev-only warning so the\n // intent is unambiguous. (We can't make this a TS error because\n // exactOptionalPropertyTypes + spread in FloatButton.Group fights\n // discriminated unions.)\n if (process.env.NODE_ENV !== 'production' && onPress && onClick) {\n console.warn('<FloatButton>: both `onPress` and `onClick` defined — `onPress` will be used. Pick one.');\n }\n const onPressFn = onPress ?? onClick;\n\n // Auto-extend when both icon + label are present and shape is unset.\n const shape: FloatButtonShape = shapeProp ?? (label && icon ? 'extended' : 'circle');\n const sizeTokens = SIZE_MAP[size];\n\n // Tooltip visibility (web: hover/focus; native-in-group: always when group open)\n const [tooltipVisible, setTooltipVisible] = useState(false);\n\n // Track press-tap separately so we don't run onLongPress -> onPress.\n const longPressFiredRef = useRef(false);\n\n const handlePress = useCallback(\n (event: GestureResponderEvent) => {\n if (disabled || loading) {\n return;\n }\n if (longPressFiredRef.current) {\n longPressFiredRef.current = false;\n return;\n }\n // If we're inside a Group, close it after a press (unless this IS the\n // group's trigger — group trigger is rendered from inside Group itself,\n // not by a child FloatButton).\n if (groupCtx) {\n groupCtx.close();\n }\n (onPressFn as ((e: GestureResponderEvent) => void) | undefined)?.(event);\n },\n [disabled, loading, groupCtx, onPressFn]\n );\n\n const handleLongPress = useCallback(\n (event: GestureResponderEvent) => {\n if (disabled || loading) {\n return;\n }\n longPressFiredRef.current = true;\n onLongPress?.(event);\n },\n [disabled, loading, onLongPress]\n );\n\n // ----- variant resolution -----\n const variantStyle = useMemo(() => resolveVariantStyle(variant, colors), [variant, colors]);\n\n // ----- positioning -----\n const positionStyle: ViewStyle | null = groupCtx\n ? null // children of a group don't position themselves; the group handles layout\n : resolvePositionStyle({\n placement,\n positioning,\n offset: offset ?? {},\n dir,\n insets,\n viewportWidth,\n respectSafeArea,\n });\n\n // ----- visibility / disabled opacity -----\n const containerOpacity = visible ? (disabled ? 0.4 : 1) : 0;\n\n // ----- shape dimensions -----\n const isExtended = shape === 'extended' && Boolean(label);\n const containerDimensions: ViewStyle = isExtended\n ? {\n minWidth: sizeTokens.diameter,\n height: sizeTokens.diameter,\n paddingHorizontal: sizeTokens.padX,\n borderRadius: sizeTokens.diameter / 2,\n }\n : {\n width: sizeTokens.diameter,\n height: sizeTokens.diameter,\n borderRadius: shape === 'square' ? px(colors.radius.lg) : sizeTokens.diameter / 2,\n };\n\n const a11yLabel = accessibilityLabel ?? label ?? tooltip;\n\n if (process.env.NODE_ENV !== 'production' && !a11yLabel && icon) {\n console.warn('<FloatButton>: provide `accessibilityLabel` or `label` for icon-only buttons (WCAG 2.2).');\n }\n\n // ----- shadow tokens (brand-tinted on primary) -----\n const shadowStyle = useMemo(() => resolveShadowStyle(variant, colors), [variant, colors]);\n\n // ----- inner content (icon + optional label) -----\n const contentNode = (\n <>\n {loading ? (\n <SmallSpinner color={variantStyle.fg} size={sizeTokens.iconSize} />\n ) : (\n <View\n style={\n {\n width: sizeTokens.iconSize,\n height: sizeTokens.iconSize,\n alignItems: 'center',\n justifyContent: 'center',\n // Sets CSS `color` on the wrapper div under RN-Web\n // so any nested SVG using `stroke=\"currentColor\"`\n // or `fill=\"currentColor\"` inherits the variant fg.\n // RN ignores `color` on a View (it's only valid on\n // Text) — silently dropped on native.\n color: variantStyle.fg,\n } as unknown as ViewStyle\n }\n >\n {tintIcon(icon, variantStyle.fg)}\n </View>\n )}\n {isExtended ? (\n <RNText\n style={{\n marginLeft: px(colors.spacing['2']),\n color: variantStyle.fg,\n fontFamily: colors.fontFamily.body,\n fontSize: sizeTokens.fontSize,\n fontWeight: colors.fontWeight.medium as '500',\n letterSpacing: -0.1,\n fontVariant: ['tabular-nums'],\n }}\n numberOfLines={1}\n >\n {label}\n </RNText>\n ) : null}\n </>\n );\n\n // ----- wrapper: positioning + opacity transitions -----\n const wrapperStyle: ViewStyle = {\n ...(positionStyle ?? {}),\n opacity: containerOpacity,\n // Web-only transitions for visibility/scale (silently dropped on native).\n ...(Platform.OS === 'web'\n ? ({\n transitionProperty: 'opacity, transform',\n transitionDuration: '180ms',\n transitionTimingFunction: 'cubic-bezier(0.16, 1, 0.3, 1)',\n pointerEvents: visible ? 'auto' : 'none',\n } as ViewStyle)\n : null),\n };\n\n // ----- the button itself (Pressable + visual style) -----\n const buttonNode = (\n <Pressable\n {...(testID !== undefined ? { testID } : {})}\n role=\"button\"\n accessibilityRole=\"button\"\n accessibilityLabel={a11yLabel}\n aria-label={a11yLabel}\n disabled={disabled || loading}\n aria-disabled={disabled || undefined}\n aria-busy={loading || undefined}\n {...(ariaHasPopup !== undefined ? { 'aria-haspopup': ariaHasPopup } : {})}\n {...(ariaExpanded !== undefined ? { 'aria-expanded': ariaExpanded } : {})}\n onPress={handlePress}\n onLongPress={onLongPress ? handleLongPress : undefined}\n // Web hover/focus reveals the tooltip; rely on Pressable's hover state.\n onHoverIn={() => setTooltipVisible(true)}\n onHoverOut={() => setTooltipVisible(false)}\n onFocus={() => setTooltipVisible(true)}\n onBlur={() => setTooltipVisible(false)}\n // Pre-compute the static style; iOS's Pressable renderer was\n // observed to drop properties from function-form `style` returns\n // intermittently — same bug we hit on the Pagination selected pill.\n // The function form is web-only (where it reads `hovered`); on\n // native we pass a plain object that always renders.\n style={\n Platform.OS === 'web'\n ? (state) => {\n const { pressed, hovered } = state as { pressed: boolean; hovered?: boolean };\n return {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: pressed\n ? variantStyle.bgPressed\n : hovered\n ? variantStyle.bgHover\n : variantStyle.bg,\n ...(variantStyle.borderColor\n ? { borderWidth: 1, borderColor: variantStyle.borderColor }\n : null),\n ...containerDimensions,\n ...shadowStyle.resting,\n ...(pressed ? { transform: [{ scale: 0.96 }], ...shadowStyle.pressed } : null),\n ...(hovered && !pressed\n ? { transform: [{ translateY: -1 }], ...shadowStyle.hover }\n : null),\n ...({\n transitionProperty: 'background-color, box-shadow, transform',\n transitionDuration: '150ms',\n transitionTimingFunction: 'cubic-bezier(0.16, 1, 0.3, 1)',\n cursor: disabled || loading ? 'not-allowed' : 'pointer',\n outlineWidth: 0,\n } as object),\n } as ViewStyle;\n }\n : ({\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: variantStyle.bg,\n ...(variantStyle.borderColor\n ? { borderWidth: 1, borderColor: variantStyle.borderColor }\n : null),\n ...containerDimensions,\n ...shadowStyle.resting,\n } as ViewStyle)\n }\n >\n {contentNode}\n </Pressable>\n );\n\n // Web `<a>` wrapper for href integration. Non-anchor on native.\n const linkedButton =\n href && Platform.OS === 'web' ? (\n <a\n href={href}\n aria-label={a11yLabel}\n style={{ textDecoration: 'none', color: 'inherit', display: 'inline-flex' }}\n onClick={(e) => {\n if (onPressFn) {\n // Let consumer's handler decide; if they call preventDefault we honor it.\n (onPressFn as (e: { preventDefault?: () => void }) => void)({\n preventDefault: () => e.preventDefault(),\n });\n }\n }}\n >\n {buttonNode}\n </a>\n ) : (\n buttonNode\n );\n\n // Tooltip chip — always visible on native when inside an open group;\n // hover/focus on web. Skipped if no tooltip text.\n const showTooltip = tooltip && (Platform.OS === 'web' ? tooltipVisible : (groupCtx?.open ?? false));\n\n return (\n <View className={cn(className)} style={wrapperStyle}>\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: px(colors.spacing['2']) }}>\n {showTooltip ? <TooltipChip text={tooltip!} /> : null}\n <View style={{ position: 'relative' }}>\n {linkedButton}\n {badge ? <BadgeOverlay badge={badge} size={size} /> : null}\n </View>\n </View>\n {children}\n </View>\n );\n};\n\n// =============================================================================\n// FloatButton.Group\n// =============================================================================\n\nexport type FloatButtonGroupProps = Omit<FloatButtonProps, 'onPress' | 'onClick' | 'onLongPress'> & {\n /** Trigger mode — `manual` requires `open` to be controlled. @defaultValue 'click' */\n trigger?: FloatButtonGroupTrigger;\n /** Controlled open state. */\n open?: boolean;\n /** Initial open state when uncontrolled. @defaultValue false */\n defaultOpen?: boolean;\n /** Fires whenever the group opens or closes. */\n onOpenChange?: (open: boolean) => void;\n /** Direction the action items expand. @defaultValue 'up' */\n direction?: FloatButtonGroupDirection;\n /** Render a scrim/backdrop behind the open group. @defaultValue false */\n backdrop?: boolean;\n /** Override the trigger icon when collapsed. */\n expandIcon?: ReactNode;\n /** Override the trigger icon when expanded. @defaultValue rotated `expandIcon` (or `icon`) */\n collapseIcon?: ReactNode;\n /** Action items declared as data — alternative to children. */\n actions?: ReadonlyArray<FloatButtonProps>;\n};\n\nconst FloatButtonGroup: FC<FloatButtonGroupProps> = ({\n trigger = 'click',\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n direction = 'up',\n backdrop = false,\n expandIcon,\n collapseIcon,\n actions,\n children,\n ...buttonProps\n}) => {\n const isControlled = openProp !== undefined;\n const [innerOpen, setInnerOpen] = useState(defaultOpen);\n const open = isControlled ? (openProp as boolean) : innerOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setInnerOpen(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n const close = useCallback(() => setOpen(false), [setOpen]);\n const toggle = useCallback(() => setOpen(!open), [setOpen, open]);\n\n // Action items: flatten `actions` array into FloatButton children if given.\n const actionItems: ReactNode = actions\n ? actions.map((action, idx) => {\n // biome-ignore lint/suspicious/noArrayIndexKey: deterministic order from caller's array\n return <FloatButton key={`fab-action-${idx}`} {...(action as FloatButtonProps)} />;\n })\n : children;\n\n // The group's outer container handles positioning; children render inline.\n const groupCtxValue = useMemo<FloatButtonGroupContextValue>(\n () => ({\n open,\n close,\n direction,\n insideGroup: true as const,\n indexRef: { next: 0 },\n }),\n [open, close, direction]\n );\n\n // Trigger button (uses the same FloatButton render path but without\n // group-context positioning so it stays in the corner).\n const triggerIcon = open\n ? (collapseIcon ?? <RotatedIcon node={expandIcon ?? buttonProps.icon} />)\n : (expandIcon ?? buttonProps.icon);\n\n return (\n <FloatButtonGroupContext.Provider value={groupCtxValue}>\n {backdrop && open ? <Backdrop onPress={close} positioning={buttonProps.positioning ?? 'fixed'} /> : null}\n <GroupLayout\n direction={direction}\n placement={buttonProps.placement ?? 'bottom-right'}\n positioning={buttonProps.positioning ?? 'fixed'}\n offset={buttonProps.offset ?? {}}\n dir={buttonProps.dir ?? 'ltr'}\n >\n {open ? <View style={groupActionsLayoutStyle(direction)}>{actionItems}</View> : null}\n <FloatButton\n {...(buttonProps as FloatButtonProps)}\n icon={triggerIcon}\n {...(trigger === 'click' ? { onPress: toggle } : {})}\n {...(trigger === 'longPress' ? { onLongPress: toggle } : {})}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n />\n </GroupLayout>\n </FloatButtonGroupContext.Provider>\n );\n};\n\n// (assignment moved to the bottom-of-file Object.assign)\n\n// =============================================================================\n// FloatButton.BackToTop\n// =============================================================================\n\nexport type FloatButtonBackToTopProps = Omit<FloatButtonProps, 'icon' | 'onPress' | 'onClick' | 'visible'> & {\n /** Scroll target ref — RN ScrollView. Defaults to window on web. */\n scrollRef?: { current: ScrollView | null };\n /** Show only when the scroll target is past this many px from the top. @defaultValue 400 */\n visibilityThreshold?: number;\n};\n\nconst FloatButtonBackToTop: FC<FloatButtonBackToTopProps> = ({\n scrollRef,\n visibilityThreshold = 400,\n variant = 'surface',\n ...rest\n}) => {\n const { t } = useTranslation();\n const [visible, setVisible] = useState(false);\n\n // Web: bind to window scroll. Native: caller wires onScroll on their\n // ScrollView and updates an external state — we expose a passive read here.\n useEffect(() => {\n if (Platform.OS !== 'web' || typeof window === 'undefined') {\n return;\n }\n const onScroll = () => setVisible(window.scrollY > visibilityThreshold);\n onScroll();\n window.addEventListener('scroll', onScroll, { passive: true });\n return () => window.removeEventListener('scroll', onScroll);\n }, [visibilityThreshold]);\n\n const onPress = useCallback(() => {\n if (Platform.OS === 'web' && typeof window !== 'undefined') {\n window.scrollTo({ top: 0, behavior: 'smooth' });\n return;\n }\n scrollRef?.current?.scrollTo?.({ y: 0, animated: true });\n }, [scrollRef]);\n\n return (\n <FloatButton\n {...(rest as FloatButtonProps)}\n variant={variant}\n visible={visible}\n icon={<defaultSemanticIcons.chevronUp size={20} />}\n accessibilityLabel={rest.accessibilityLabel ?? t('floatButton.backToTop', { defaultValue: 'Back to top' })}\n onPress={onPress}\n />\n );\n};\n\n// (assignment moved to the bottom-of-file Object.assign)\n\n/**\n * Public `FloatButton` value — the root function plus its `.Group` and\n * `.BackToTop` static members. `Object.assign` produces a value whose\n * inferred type carries the static properties, so `.d.ts` consumers can\n * write `<FloatButton.Group>` without a separate import.\n */\nexport const FloatButton = Object.assign(FloatButtonRoot, {\n Group: FloatButtonGroup,\n BackToTop: FloatButtonBackToTop,\n});\n\n// =============================================================================\n// Subcomponents\n// =============================================================================\n\nconst TooltipChip = ({ text }: { text: string }) => {\n const colors = useThemeColors();\n return (\n <View\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n style={{\n backgroundColor: colors.semantic.background.elevated,\n borderRadius: px(colors.radius.sm) + 2,\n borderWidth: 1,\n borderColor: colors.semantic.border.default,\n paddingHorizontal: px(colors.spacing['2']),\n paddingVertical: 4,\n ...(Platform.OS === 'web' ? ({ boxShadow: '0 1px 2px rgba(0,0,0,0.06)' } as object) : null),\n }}\n >\n <RNText\n style={{\n color: colors.semantic.text.default,\n fontFamily: colors.fontFamily.body,\n fontSize: 13,\n lineHeight: 16,\n }}\n >\n {text}\n </RNText>\n </View>\n );\n};\n\nconst BadgeOverlay = ({ badge, size }: { badge: FloatButtonBadge; size: FloatButtonSize }) => {\n const offsetTop = size === 'large' ? -6 : -4;\n const offsetRight = size === 'large' ? -6 : -4;\n return (\n <View\n pointerEvents=\"none\"\n style={{\n position: 'absolute',\n top: offsetTop,\n right: offsetRight,\n zIndex: 1,\n }}\n >\n {badge.dot ? (\n <Badge tone={badge.tone ?? 'danger'} appearance=\"solid\">\n {' '}\n </Badge>\n ) : (\n <Badge tone={badge.tone ?? 'danger'} appearance=\"solid\">\n {String(badge.count ?? 0)}\n </Badge>\n )}\n </View>\n );\n};\n\nconst SmallSpinner = ({ color, size }: { color: string; size: number }) => {\n // Tiny CSS spinner on web; on native, defer to an opacity pulse for v1\n // (avoids importing the spinner component into the FloatButton bundle).\n if (Platform.OS === 'web') {\n return (\n <View\n style={\n {\n width: size,\n height: size,\n borderRadius: size / 2,\n borderWidth: 2,\n borderColor: 'transparent',\n borderTopColor: color,\n animationName: 'fb-spin',\n animationDuration: '700ms',\n animationIterationCount: 'infinite',\n animationTimingFunction: 'linear',\n } as unknown as ViewStyle\n }\n />\n );\n }\n return (\n <View\n style={{\n width: size,\n height: size,\n borderRadius: size / 2,\n borderWidth: 2,\n borderColor: color,\n opacity: 0.6,\n }}\n />\n );\n};\n\nconst Backdrop = ({ onPress, positioning }: { onPress: () => void; positioning: 'fixed' | 'absolute' }) => {\n return (\n <Pressable\n onPress={onPress}\n accessibilityLabel=\"Close\"\n style={{\n position:\n Platform.OS === 'web' && positioning === 'fixed' ? ('fixed' as unknown as 'absolute') : 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.32)',\n zIndex: 49,\n }}\n />\n );\n};\n\nconst RotatedIcon = ({ node, color }: { node: ReactNode; color?: string }) => {\n // Forward the color from the outer `tintIcon` clone down to the inner\n // node — otherwise the morph-to-X icon stays at its default tint while\n // the surrounding FAB icons inherit the variant fg.\n const tintedNode =\n color && isValidElement(node) ? cloneElement(node as ReactElement<{ color?: string }>, { color }) : node;\n return (\n <View\n style={\n {\n transform: [{ rotate: '45deg' }],\n // CSS `color` cascades to nested `currentColor` SVGs on web.\n ...(color ? { color } : null),\n ...(Platform.OS === 'web'\n ? {\n transitionProperty: 'transform',\n transitionDuration: '200ms',\n transitionTimingFunction: 'cubic-bezier(0.16, 1, 0.3, 1)',\n }\n : null),\n } as unknown as ViewStyle\n }\n >\n {tintedNode}\n </View>\n );\n};\n\nconst GroupLayout = ({\n direction,\n placement,\n positioning,\n offset,\n dir,\n children,\n}: {\n direction: FloatButtonGroupDirection;\n placement: FloatButtonPlacement;\n positioning: 'fixed' | 'absolute';\n offset: { x?: number; y?: number };\n dir: 'ltr' | 'rtl';\n children: ReactNode;\n}) => {\n // Read the context directly (instead of `useSafeAreaInsets()`) so the\n // component degrades silently when no `<SafeAreaProvider>` is mounted —\n // the canonical case on web. With a provider, real insets flow through;\n // without one, we get zeros and no console warning.\n const insets = useContext(SafeAreaInsetsContext) ?? { top: 0, right: 0, bottom: 0, left: 0 };\n const { width: viewportWidth } = useWindowDimensions();\n const positionStyle = resolvePositionStyle({\n placement,\n positioning,\n offset,\n dir,\n insets,\n viewportWidth,\n respectSafeArea: false,\n });\n return (\n <View\n style={{\n ...positionStyle,\n flexDirection: direction === 'left' || direction === 'right' ? 'row' : 'column',\n alignItems: direction === 'left' || direction === 'right' ? 'center' : 'flex-end',\n justifyContent: direction === 'up' ? 'flex-end' : 'flex-start',\n }}\n >\n {direction === 'up' || direction === 'left'\n ? children\n : Array.isArray(children)\n ? [...children].reverse()\n : children}\n </View>\n );\n};\n\nfunction groupActionsLayoutStyle(direction: FloatButtonGroupDirection): ViewStyle {\n const isVertical = direction === 'up' || direction === 'down';\n return {\n flexDirection: isVertical ? 'column' : 'row',\n alignItems: 'flex-end',\n gap: 12,\n marginBottom: direction === 'up' ? 12 : 0,\n marginTop: direction === 'down' ? 12 : 0,\n marginRight: direction === 'left' ? 12 : 0,\n marginLeft: direction === 'right' ? 12 : 0,\n };\n}\n\n// =============================================================================\n// Style resolvers\n// =============================================================================\n\nfunction resolveVariantStyle(\n variant: FloatButtonVariant,\n colors: ReturnType<typeof useThemeColors>\n): { bg: string; bgHover: string; bgPressed: string; fg: string; borderColor?: string } {\n switch (variant) {\n case 'primary':\n return {\n bg: colors.semantic.interactive.primary,\n bgHover: colors.semantic.interactive.primaryHover,\n bgPressed: colors.semantic.interactive.primaryPressed,\n fg: colors.semantic.text.inverted,\n };\n case 'secondary':\n return {\n bg: colors.semantic.background.subtle,\n bgHover: colors.semantic.background.elevated,\n bgPressed: colors.semantic.background.subtle,\n fg: colors.semantic.text.default,\n borderColor: colors.semantic.border.default,\n };\n case 'tertiary':\n return {\n bg: 'transparent',\n bgHover: withAlpha(colors.semantic.interactive.primary, 0.08),\n bgPressed: withAlpha(colors.semantic.interactive.primary, 0.12),\n fg: colors.semantic.interactive.primary,\n borderColor: colors.semantic.interactive.primary,\n };\n case 'surface':\n return {\n bg: colors.semantic.background.elevated,\n bgHover: colors.semantic.background.subtle,\n bgPressed: colors.semantic.background.subtle,\n fg: colors.semantic.text.default,\n borderColor: colors.semantic.border.default,\n };\n }\n}\n\nfunction resolveShadowStyle(\n variant: FloatButtonVariant,\n colors: ReturnType<typeof useThemeColors>\n): { resting: ViewStyle; hover: ViewStyle; pressed: ViewStyle } {\n if (Platform.OS !== 'web') {\n // RN's elevation prop on Android maps via boxShadow polyfill; keep\n // it minimal to avoid the chunky M3 look. On iOS we rely on RN's\n // native shadow* props.\n return {\n resting: {\n shadowColor: variant === 'primary' ? colors.semantic.interactive.primary : '#000',\n shadowOffset: { width: 0, height: 6 },\n shadowOpacity: variant === 'primary' ? 0.25 : 0.12,\n shadowRadius: 16,\n elevation: 6,\n } as unknown as ViewStyle,\n hover: {} as ViewStyle,\n pressed: {\n shadowOffset: { width: 0, height: 2 },\n shadowRadius: 6,\n elevation: 2,\n } as unknown as ViewStyle,\n };\n }\n const tint = variant === 'primary' ? colors.semantic.interactive.primary : '#000';\n return {\n resting: {\n ...({\n boxShadow: `0 1px 2px rgba(0,0,0,0.06), 0 8px 24px -6px ${withAlpha(tint, variant === 'primary' ? 0.32 : 0.08)}`,\n } as unknown as ViewStyle),\n },\n hover: {\n ...({\n boxShadow: `0 2px 4px rgba(0,0,0,0.08), 0 12px 28px -6px ${withAlpha(tint, variant === 'primary' ? 0.4 : 0.12)}`,\n } as unknown as ViewStyle),\n },\n pressed: {\n ...({ boxShadow: `0 1px 2px rgba(0,0,0,0.06)` } as unknown as ViewStyle),\n },\n };\n}\n\nfunction resolvePositionStyle({\n placement,\n positioning = 'fixed',\n offset,\n dir,\n insets,\n viewportWidth,\n respectSafeArea,\n}: {\n placement: FloatButtonPlacement;\n positioning?: 'fixed' | 'absolute';\n offset: { x?: number; y?: number };\n dir: 'ltr' | 'rtl';\n insets: { top: number; right: number; bottom: number; left: number };\n viewportWidth: number;\n respectSafeArea: boolean;\n}): ViewStyle {\n const defaultOffset = Platform.OS === 'web' ? DEFAULT_OFFSET_WEB : DEFAULT_OFFSET_NATIVE;\n const x = offset.x ?? defaultOffset;\n const y = offset.y ?? defaultOffset;\n const safeBottom = Platform.OS !== 'web' && respectSafeArea ? insets.bottom : 0;\n const safeTop = Platform.OS !== 'web' && respectSafeArea ? insets.top : 0;\n\n // RTL flips left/right placements.\n const flippedPlacement: FloatButtonPlacement =\n dir === 'rtl'\n ? placement === 'bottom-right'\n ? 'bottom-left'\n : placement === 'bottom-left'\n ? 'bottom-right'\n : placement === 'top-right'\n ? 'top-left'\n : 'top-right'\n : placement;\n\n // RN doesn't have `position: 'fixed'` — only `'absolute'`. On web RN-Web\n // accepts the cast. The `positioning` prop also lets consumers force\n // `'absolute'` so the FAB pins to a positioned ancestor (docs previews).\n const cssPosition: ViewStyle['position'] =\n Platform.OS === 'web' && positioning === 'fixed' ? ('fixed' as unknown as 'absolute') : 'absolute';\n const base: ViewStyle = {\n position: cssPosition,\n zIndex: 50,\n };\n\n switch (flippedPlacement) {\n case 'bottom-right':\n return { ...base, bottom: y + safeBottom, right: x };\n case 'bottom-left':\n return { ...base, bottom: y + safeBottom, left: x };\n case 'top-right':\n return { ...base, top: y + safeTop, right: x };\n case 'top-left':\n return { ...base, top: y + safeTop, left: x };\n }\n // Suppress viewportWidth warning — reserved for future RTL/horizontal logic.\n void viewportWidth;\n return base;\n}\n\n/**\n * Force the icon's color to match the FAB's variant fg. Works for our\n * `IconComponentProps`-shaped icons (which accept `{ size, color }`) by\n * cloning the element with the resolved color; raw nodes pass through\n * unchanged and rely on the wrapper's CSS `color` for `currentColor`-based\n * SVGs. Consumer-supplied colors are intentionally overridden — inside a\n * primary FAB the icon should always read against the primary surface.\n */\nfunction tintIcon(icon: ReactNode, color: string): ReactNode {\n if (!isValidElement(icon)) {\n return icon;\n }\n return cloneElement(icon as ReactElement<{ color?: string }>, { color });\n}\n\nfunction withAlpha(color: string, alpha: number): string {\n if (color.startsWith('#') && (color.length === 7 || color.length === 4)) {\n const expanded =\n color.length === 4 ? `#${color[1]}${color[1]}${color[2]}${color[2]}${color[3]}${color[3]}` : color;\n const r = Number.parseInt(expanded.slice(1, 3), 16);\n const g = Number.parseInt(expanded.slice(3, 5), 16);\n const b = Number.parseInt(expanded.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n }\n return color;\n}\n\n// Suppress unused — ComponentProps reserved for future href-prop polymorphism.\ntype _Unused = ComponentProps<'button'>;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/react-native-safe-area-context/SafeAreaContext.tsx","../src/components/FloatButton/FloatButton.tsx"],"names":["isDev","process","env","NODE_ENV","SafeAreaInsetsContext","createContext","displayName","SafeAreaFrameContext","StyleSheet","create","fill","flex","Consumer","useContext","useState","useCallback","RNText"],"mappings":"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","file":"chunk-6JVUVBZH.js","sourcesContent":[null,"'use client';\n\n// =============================================================================\n// FloatButton — cross-platform Floating Action Button (FAB)\n//\n// Two-component public surface:\n// <FloatButton> — standalone FAB\n// <FloatButton.Group> — cluster with click/long-press expansion\n// <FloatButton.BackToTop> — preset that scrolls a target ref to top\n//\n// Design direction: restrained-editorial (Linear/Stripe energy). Two-layer\n// brand-tinted shadows, subtle hover lift, snappy press scale, no bouncy\n// physics. Cross-platform via the same Pressable + inline style pattern\n// used in Pagination.\n// =============================================================================\n\nimport {\n type ComponentProps,\n cloneElement,\n createContext,\n type FC,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { GestureResponderEvent, ViewStyle } from 'react-native';\nimport { Platform, Pressable, Text as RNText, type ScrollView, useWindowDimensions, View } from 'react-native';\nimport { SafeAreaInsetsContext } from 'react-native-safe-area-context';\nimport { useTranslation } from '../../i18n/use-translation';\nimport { defaultSemanticIcons } from '../../icons/default-semantic-icons';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\nimport { Badge, type BadgeProps } from '../Badge';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type FloatButtonVariant = 'primary' | 'secondary' | 'tertiary' | 'surface';\nexport type FloatButtonShape = 'circle' | 'square' | 'extended';\nexport type FloatButtonSize = 'small' | 'medium' | 'large';\nexport type FloatButtonPlacement = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';\nexport type FloatButtonGroupTrigger = 'click' | 'longPress' | 'manual';\nexport type FloatButtonGroupDirection = 'up' | 'down' | 'left' | 'right';\n\n/** Badge passthrough — same shape as our `<Badge>` accepts. */\nexport type FloatButtonBadge = {\n /** Numeric badge — render the number inside a small pill. */\n count?: number;\n /** Show a dot instead of a count (overrides `count`). */\n dot?: boolean;\n /** Badge tone — defaults to `'danger'` (the canonical \"unread\" red). */\n tone?: BadgeProps['tone'];\n};\n\ntype FloatButtonBaseProps = {\n /** Required unless `label` is set. */\n icon?: ReactNode;\n /** Inline label — turns the button extended (auto-sets `shape='extended'`). */\n label?: string;\n /** A11y label — falls back to `label`; required when icon-only. */\n accessibilityLabel?: string;\n /** Visual shape. @defaultValue 'circle' (or 'extended' when both icon + label are set) */\n shape?: FloatButtonShape;\n /** Size — sm=40, md=56, lg=72. @defaultValue 'medium' */\n size?: FloatButtonSize;\n /** Color/tone variant. @defaultValue 'primary' */\n variant?: FloatButtonVariant;\n /** Tooltip — web: hover/focus tooltip; native (in a group): always-visible label chip. */\n tooltip?: string;\n /** Badge — count, dot, or tone passthrough. */\n badge?: FloatButtonBadge;\n /** Disable interaction. */\n disabled?: boolean;\n /** Show a spinner in place of the icon. */\n loading?: boolean;\n /** Animate in/out. @defaultValue true */\n visible?: boolean;\n /** Where to anchor the FAB on the screen. @defaultValue 'bottom-right' */\n placement?: FloatButtonPlacement;\n /**\n * Positioning strategy. `'fixed'` pins to the viewport (web `position: fixed`,\n * native absolute-on-root); `'absolute'` pins to the nearest positioned\n * ancestor — useful for docs previews and any contained-canvas layout.\n * @defaultValue 'fixed'\n */\n positioning?: 'fixed' | 'absolute';\n /** Additional offset from the placement corner (px). @defaultValue { x: 24, y: 24 } web; { x: 16, y: 16 } native */\n offset?: { x?: number; y?: number };\n /**\n * On native, auto-add the device's bottom safe-area inset to the offset.\n * **Default is `false`** because RN has no `position: 'fixed'` — every\n * `FloatButton` is parent-relative, and adding the screen-bottom inset\n * to a card-relative offset pushes the button up by ~34pt for no reason.\n * Set this to `true` only when you're certain the FAB's parent reaches\n * the screen edge (e.g. a root-level container without `SafeAreaView`).\n * @defaultValue false\n */\n respectSafeArea?: boolean;\n /** Anchor link — renders as an `<a>` on web. */\n href?: string;\n /** RTL flips left/right placements. @defaultValue 'ltr' */\n dir?: 'ltr' | 'rtl';\n /** Long-press handler — native first-class, web maps to contextmenu. */\n onLongPress?: (event: GestureResponderEvent) => void;\n /** Forward ARIA attributes (used internally by Group for `aria-haspopup`/`aria-expanded`). */\n 'aria-haspopup'?: 'menu' | 'true' | boolean;\n 'aria-expanded'?: boolean;\n /**\n * Press handler. We're React-Native-first, so `onPress` is the primary\n * surface and works on both platforms. `onClick` is also accepted for\n * web-mental-model consumers; if BOTH are defined, `onPress` wins (and\n * a dev-only warning fires).\n */\n onPress?: (event: GestureResponderEvent) => void;\n /** Web-y alias for `onPress` — same handler, mapped at the call site. */\n onClick?: (event: { preventDefault?: () => void }) => void;\n className?: string;\n testID?: string;\n /** Set internally when the button lives inside a `<FloatButton.Group>`. */\n children?: ReactNode;\n};\n\nexport type FloatButtonProps = FloatButtonBaseProps;\n\n// =============================================================================\n// Context — shared by Group and its children\n// =============================================================================\n\ntype FloatButtonGroupContextValue = {\n /** Whether the group is expanded. */\n open: boolean;\n /** Close the group programmatically (used by action items after press). */\n close: () => void;\n /** Direction of expansion. */\n direction: FloatButtonGroupDirection;\n /** Whether items are inside a group — used to skip per-item positioning. */\n insideGroup: true;\n /** Index of the action item, used for staggered animation. */\n indexRef: { next: number };\n};\n\nconst FloatButtonGroupContext = createContext<FloatButtonGroupContextValue | null>(null);\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst SIZE_MAP: Record<FloatButtonSize, { diameter: number; iconSize: number; fontSize: number; padX: number }> = {\n small: { diameter: 40, iconSize: 18, fontSize: 14, padX: 16 },\n medium: { diameter: 56, iconSize: 22, fontSize: 14, padX: 20 },\n large: { diameter: 72, iconSize: 28, fontSize: 16, padX: 28 },\n};\n\nconst DEFAULT_OFFSET_WEB = 24;\nconst DEFAULT_OFFSET_NATIVE = 16;\n\n// =============================================================================\n// Standalone FloatButton\n// =============================================================================\n\n/**\n * Floating Action Button — a fixed-position button that hovers above page\n * content. Cross-platform (web + native), badge-aware, link-capable, and\n * safe-area-aware on native.\n *\n * @example\n * <FloatButton icon={<Plus />} accessibilityLabel=\"New item\" onPress={...} />\n *\n * @example\n * <FloatButton icon={<Help />} label=\"Help\" shape=\"extended\" />\n */\n// Defined here as a plain function; the Group / BackToTop static properties\n// are attached at the bottom of the file via `Object.assign` so the dist\n// `.d.ts` surface preserves them (a bare type cast on the const doesn't\n// propagate through tsup's declaration emitter).\nconst FloatButtonRoot = (props: FloatButtonProps) => {\n const groupCtx = useContext(FloatButtonGroupContext);\n const colors = useThemeColors();\n // Read the context directly (instead of `useSafeAreaInsets()`) so the\n // component degrades silently when no `<SafeAreaProvider>` is mounted —\n // the canonical case on web. With a provider, real insets flow through;\n // without one, we get zeros and no console warning.\n const insets = useContext(SafeAreaInsetsContext) ?? { top: 0, right: 0, bottom: 0, left: 0 };\n const { width: viewportWidth } = useWindowDimensions();\n\n const {\n icon,\n label,\n accessibilityLabel,\n shape: shapeProp,\n size = groupCtx ? 'small' : 'medium',\n variant = 'primary',\n tooltip,\n badge,\n disabled = false,\n loading = false,\n visible = true,\n placement = 'bottom-right',\n positioning = 'fixed',\n offset,\n respectSafeArea = false,\n href,\n dir = 'ltr',\n onLongPress,\n className,\n testID,\n children,\n onPress,\n onClick,\n 'aria-haspopup': ariaHasPopup,\n 'aria-expanded': ariaExpanded,\n } = props;\n\n // `onPress` wins when both are defined — emit a dev-only warning so the\n // intent is unambiguous. (We can't make this a TS error because\n // exactOptionalPropertyTypes + spread in FloatButton.Group fights\n // discriminated unions.)\n if (process.env.NODE_ENV !== 'production' && onPress && onClick) {\n console.warn('<FloatButton>: both `onPress` and `onClick` defined — `onPress` will be used. Pick one.');\n }\n const onPressFn = onPress ?? onClick;\n\n // Auto-extend when both icon + label are present and shape is unset.\n const shape: FloatButtonShape = shapeProp ?? (label && icon ? 'extended' : 'circle');\n const sizeTokens = SIZE_MAP[size];\n\n // Tooltip visibility (web: hover/focus; native-in-group: always when group open)\n const [tooltipVisible, setTooltipVisible] = useState(false);\n\n // Track press-tap separately so we don't run onLongPress -> onPress.\n const longPressFiredRef = useRef(false);\n\n const handlePress = useCallback(\n (event: GestureResponderEvent) => {\n if (disabled || loading) {\n return;\n }\n if (longPressFiredRef.current) {\n longPressFiredRef.current = false;\n return;\n }\n // If we're inside a Group, close it after a press (unless this IS the\n // group's trigger — group trigger is rendered from inside Group itself,\n // not by a child FloatButton).\n if (groupCtx) {\n groupCtx.close();\n }\n (onPressFn as ((e: GestureResponderEvent) => void) | undefined)?.(event);\n },\n [disabled, loading, groupCtx, onPressFn]\n );\n\n const handleLongPress = useCallback(\n (event: GestureResponderEvent) => {\n if (disabled || loading) {\n return;\n }\n longPressFiredRef.current = true;\n onLongPress?.(event);\n },\n [disabled, loading, onLongPress]\n );\n\n // ----- variant resolution -----\n const variantStyle = useMemo(() => resolveVariantStyle(variant, colors), [variant, colors]);\n\n // ----- positioning -----\n const positionStyle: ViewStyle | null = groupCtx\n ? null // children of a group don't position themselves; the group handles layout\n : resolvePositionStyle({\n placement,\n positioning,\n offset: offset ?? {},\n dir,\n insets,\n viewportWidth,\n respectSafeArea,\n });\n\n // ----- visibility / disabled opacity -----\n const containerOpacity = visible ? (disabled ? 0.4 : 1) : 0;\n\n // ----- shape dimensions -----\n const isExtended = shape === 'extended' && Boolean(label);\n const containerDimensions: ViewStyle = isExtended\n ? {\n minWidth: sizeTokens.diameter,\n height: sizeTokens.diameter,\n paddingHorizontal: sizeTokens.padX,\n borderRadius: sizeTokens.diameter / 2,\n }\n : {\n width: sizeTokens.diameter,\n height: sizeTokens.diameter,\n borderRadius: shape === 'square' ? px(colors.radius.lg) : sizeTokens.diameter / 2,\n };\n\n const a11yLabel = accessibilityLabel ?? label ?? tooltip;\n\n if (process.env.NODE_ENV !== 'production' && !a11yLabel && icon) {\n console.warn('<FloatButton>: provide `accessibilityLabel` or `label` for icon-only buttons (WCAG 2.2).');\n }\n\n // ----- shadow tokens (brand-tinted on primary) -----\n const shadowStyle = useMemo(() => resolveShadowStyle(variant, colors), [variant, colors]);\n\n // ----- inner content (icon + optional label) -----\n const contentNode = (\n <>\n {loading ? (\n <SmallSpinner color={variantStyle.fg} size={sizeTokens.iconSize} />\n ) : (\n <View\n style={\n {\n width: sizeTokens.iconSize,\n height: sizeTokens.iconSize,\n alignItems: 'center',\n justifyContent: 'center',\n // Sets CSS `color` on the wrapper div under RN-Web\n // so any nested SVG using `stroke=\"currentColor\"`\n // or `fill=\"currentColor\"` inherits the variant fg.\n // RN ignores `color` on a View (it's only valid on\n // Text) — silently dropped on native.\n color: variantStyle.fg,\n } as unknown as ViewStyle\n }\n >\n {tintIcon(icon, variantStyle.fg)}\n </View>\n )}\n {isExtended ? (\n <RNText\n style={{\n marginLeft: px(colors.spacing['2']),\n color: variantStyle.fg,\n fontFamily: colors.fontFamily.body,\n fontSize: sizeTokens.fontSize,\n fontWeight: colors.fontWeight.medium as '500',\n letterSpacing: -0.1,\n fontVariant: ['tabular-nums'],\n }}\n numberOfLines={1}\n >\n {label}\n </RNText>\n ) : null}\n </>\n );\n\n // ----- wrapper: positioning + opacity transitions -----\n const wrapperStyle: ViewStyle = {\n ...(positionStyle ?? {}),\n opacity: containerOpacity,\n // Web-only transitions for visibility/scale (silently dropped on native).\n ...(Platform.OS === 'web'\n ? ({\n transitionProperty: 'opacity, transform',\n transitionDuration: '180ms',\n transitionTimingFunction: 'cubic-bezier(0.16, 1, 0.3, 1)',\n pointerEvents: visible ? 'auto' : 'none',\n } as ViewStyle)\n : null),\n };\n\n // ----- the button itself (Pressable + visual style) -----\n const buttonNode = (\n <Pressable\n {...(testID !== undefined ? { testID } : {})}\n role=\"button\"\n accessibilityRole=\"button\"\n accessibilityLabel={a11yLabel}\n aria-label={a11yLabel}\n disabled={disabled || loading}\n aria-disabled={disabled || undefined}\n aria-busy={loading || undefined}\n {...(ariaHasPopup !== undefined ? { 'aria-haspopup': ariaHasPopup } : {})}\n {...(ariaExpanded !== undefined ? { 'aria-expanded': ariaExpanded } : {})}\n onPress={handlePress}\n onLongPress={onLongPress ? handleLongPress : undefined}\n // Web hover/focus reveals the tooltip; rely on Pressable's hover state.\n onHoverIn={() => setTooltipVisible(true)}\n onHoverOut={() => setTooltipVisible(false)}\n onFocus={() => setTooltipVisible(true)}\n onBlur={() => setTooltipVisible(false)}\n // Pre-compute the static style; iOS's Pressable renderer was\n // observed to drop properties from function-form `style` returns\n // intermittently — same bug we hit on the Pagination selected pill.\n // The function form is web-only (where it reads `hovered`); on\n // native we pass a plain object that always renders.\n style={\n Platform.OS === 'web'\n ? (state) => {\n const { pressed, hovered } = state as { pressed: boolean; hovered?: boolean };\n return {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: pressed\n ? variantStyle.bgPressed\n : hovered\n ? variantStyle.bgHover\n : variantStyle.bg,\n ...(variantStyle.borderColor\n ? { borderWidth: 1, borderColor: variantStyle.borderColor }\n : null),\n ...containerDimensions,\n ...shadowStyle.resting,\n ...(pressed ? { transform: [{ scale: 0.96 }], ...shadowStyle.pressed } : null),\n ...(hovered && !pressed\n ? { transform: [{ translateY: -1 }], ...shadowStyle.hover }\n : null),\n ...({\n transitionProperty: 'background-color, box-shadow, transform',\n transitionDuration: '150ms',\n transitionTimingFunction: 'cubic-bezier(0.16, 1, 0.3, 1)',\n cursor: disabled || loading ? 'not-allowed' : 'pointer',\n outlineWidth: 0,\n } as object),\n } as ViewStyle;\n }\n : ({\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: variantStyle.bg,\n ...(variantStyle.borderColor\n ? { borderWidth: 1, borderColor: variantStyle.borderColor }\n : null),\n ...containerDimensions,\n ...shadowStyle.resting,\n } as ViewStyle)\n }\n >\n {contentNode}\n </Pressable>\n );\n\n // Web `<a>` wrapper for href integration. Non-anchor on native.\n const linkedButton =\n href && Platform.OS === 'web' ? (\n <a\n href={href}\n aria-label={a11yLabel}\n style={{ textDecoration: 'none', color: 'inherit', display: 'inline-flex' }}\n onClick={(e) => {\n if (onPressFn) {\n // Let consumer's handler decide; if they call preventDefault we honor it.\n (onPressFn as (e: { preventDefault?: () => void }) => void)({\n preventDefault: () => e.preventDefault(),\n });\n }\n }}\n >\n {buttonNode}\n </a>\n ) : (\n buttonNode\n );\n\n // Tooltip chip — always visible on native when inside an open group;\n // hover/focus on web. Skipped if no tooltip text.\n const showTooltip = tooltip && (Platform.OS === 'web' ? tooltipVisible : (groupCtx?.open ?? false));\n\n return (\n <View className={cn(className)} style={wrapperStyle}>\n <View style={{ flexDirection: 'row', alignItems: 'center', gap: px(colors.spacing['2']) }}>\n {showTooltip ? <TooltipChip text={tooltip!} /> : null}\n <View style={{ position: 'relative' }}>\n {linkedButton}\n {badge ? <BadgeOverlay badge={badge} size={size} /> : null}\n </View>\n </View>\n {children}\n </View>\n );\n};\n\n// =============================================================================\n// FloatButton.Group\n// =============================================================================\n\nexport type FloatButtonGroupProps = Omit<FloatButtonProps, 'onPress' | 'onClick' | 'onLongPress'> & {\n /** Trigger mode — `manual` requires `open` to be controlled. @defaultValue 'click' */\n trigger?: FloatButtonGroupTrigger;\n /** Controlled open state. */\n open?: boolean;\n /** Initial open state when uncontrolled. @defaultValue false */\n defaultOpen?: boolean;\n /** Fires whenever the group opens or closes. */\n onOpenChange?: (open: boolean) => void;\n /** Direction the action items expand. @defaultValue 'up' */\n direction?: FloatButtonGroupDirection;\n /** Render a scrim/backdrop behind the open group. @defaultValue false */\n backdrop?: boolean;\n /** Override the trigger icon when collapsed. */\n expandIcon?: ReactNode;\n /** Override the trigger icon when expanded. @defaultValue rotated `expandIcon` (or `icon`) */\n collapseIcon?: ReactNode;\n /** Action items declared as data — alternative to children. */\n actions?: ReadonlyArray<FloatButtonProps>;\n};\n\nconst FloatButtonGroup: FC<FloatButtonGroupProps> = ({\n trigger = 'click',\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n direction = 'up',\n backdrop = false,\n expandIcon,\n collapseIcon,\n actions,\n children,\n ...buttonProps\n}) => {\n const isControlled = openProp !== undefined;\n const [innerOpen, setInnerOpen] = useState(defaultOpen);\n const open = isControlled ? (openProp as boolean) : innerOpen;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setInnerOpen(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n const close = useCallback(() => setOpen(false), [setOpen]);\n const toggle = useCallback(() => setOpen(!open), [setOpen, open]);\n\n // Action items: flatten `actions` array into FloatButton children if given.\n const actionItems: ReactNode = actions\n ? actions.map((action, idx) => {\n // biome-ignore lint/suspicious/noArrayIndexKey: deterministic order from caller's array\n return <FloatButton key={`fab-action-${idx}`} {...(action as FloatButtonProps)} />;\n })\n : children;\n\n // The group's outer container handles positioning; children render inline.\n const groupCtxValue = useMemo<FloatButtonGroupContextValue>(\n () => ({\n open,\n close,\n direction,\n insideGroup: true as const,\n indexRef: { next: 0 },\n }),\n [open, close, direction]\n );\n\n // Trigger button (uses the same FloatButton render path but without\n // group-context positioning so it stays in the corner).\n const triggerIcon = open\n ? (collapseIcon ?? <RotatedIcon node={expandIcon ?? buttonProps.icon} />)\n : (expandIcon ?? buttonProps.icon);\n\n return (\n <FloatButtonGroupContext.Provider value={groupCtxValue}>\n {backdrop && open ? <Backdrop onPress={close} positioning={buttonProps.positioning ?? 'fixed'} /> : null}\n <GroupLayout\n direction={direction}\n placement={buttonProps.placement ?? 'bottom-right'}\n positioning={buttonProps.positioning ?? 'fixed'}\n offset={buttonProps.offset ?? {}}\n dir={buttonProps.dir ?? 'ltr'}\n >\n {open ? <View style={groupActionsLayoutStyle(direction)}>{actionItems}</View> : null}\n <FloatButton\n {...(buttonProps as FloatButtonProps)}\n icon={triggerIcon}\n {...(trigger === 'click' ? { onPress: toggle } : {})}\n {...(trigger === 'longPress' ? { onLongPress: toggle } : {})}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n />\n </GroupLayout>\n </FloatButtonGroupContext.Provider>\n );\n};\n\n// (assignment moved to the bottom-of-file Object.assign)\n\n// =============================================================================\n// FloatButton.BackToTop\n// =============================================================================\n\nexport type FloatButtonBackToTopProps = Omit<FloatButtonProps, 'icon' | 'onPress' | 'onClick' | 'visible'> & {\n /** Scroll target ref — RN ScrollView. Defaults to window on web. */\n scrollRef?: { current: ScrollView | null };\n /** Show only when the scroll target is past this many px from the top. @defaultValue 400 */\n visibilityThreshold?: number;\n};\n\nconst FloatButtonBackToTop: FC<FloatButtonBackToTopProps> = ({\n scrollRef,\n visibilityThreshold = 400,\n variant = 'surface',\n ...rest\n}) => {\n const { t } = useTranslation();\n const [visible, setVisible] = useState(false);\n\n // Web: bind to window scroll. Native: caller wires onScroll on their\n // ScrollView and updates an external state — we expose a passive read here.\n useEffect(() => {\n if (Platform.OS !== 'web' || typeof window === 'undefined') {\n return;\n }\n const onScroll = () => setVisible(window.scrollY > visibilityThreshold);\n onScroll();\n window.addEventListener('scroll', onScroll, { passive: true });\n return () => window.removeEventListener('scroll', onScroll);\n }, [visibilityThreshold]);\n\n const onPress = useCallback(() => {\n if (Platform.OS === 'web' && typeof window !== 'undefined') {\n window.scrollTo({ top: 0, behavior: 'smooth' });\n return;\n }\n scrollRef?.current?.scrollTo?.({ y: 0, animated: true });\n }, [scrollRef]);\n\n return (\n <FloatButton\n {...(rest as FloatButtonProps)}\n variant={variant}\n visible={visible}\n icon={<defaultSemanticIcons.chevronUp size={20} />}\n accessibilityLabel={rest.accessibilityLabel ?? t('floatButton.backToTop', { defaultValue: 'Back to top' })}\n onPress={onPress}\n />\n );\n};\n\n// (assignment moved to the bottom-of-file Object.assign)\n\n/**\n * Public `FloatButton` value — the root function plus its `.Group` and\n * `.BackToTop` static members. `Object.assign` produces a value whose\n * inferred type carries the static properties, so `.d.ts` consumers can\n * write `<FloatButton.Group>` without a separate import.\n */\nexport const FloatButton = Object.assign(FloatButtonRoot, {\n Group: FloatButtonGroup,\n BackToTop: FloatButtonBackToTop,\n});\n\n// =============================================================================\n// Subcomponents\n// =============================================================================\n\nconst TooltipChip = ({ text }: { text: string }) => {\n const colors = useThemeColors();\n return (\n <View\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n style={{\n backgroundColor: colors.semantic.background.elevated,\n borderRadius: px(colors.radius.sm) + 2,\n borderWidth: 1,\n borderColor: colors.semantic.border.default,\n paddingHorizontal: px(colors.spacing['2']),\n paddingVertical: 4,\n ...(Platform.OS === 'web' ? ({ boxShadow: '0 1px 2px rgba(0,0,0,0.06)' } as object) : null),\n }}\n >\n <RNText\n style={{\n color: colors.semantic.text.default,\n fontFamily: colors.fontFamily.body,\n fontSize: 13,\n lineHeight: 16,\n }}\n >\n {text}\n </RNText>\n </View>\n );\n};\n\nconst BadgeOverlay = ({ badge, size }: { badge: FloatButtonBadge; size: FloatButtonSize }) => {\n const offsetTop = size === 'large' ? -6 : -4;\n const offsetRight = size === 'large' ? -6 : -4;\n return (\n <View\n pointerEvents=\"none\"\n style={{\n position: 'absolute',\n top: offsetTop,\n right: offsetRight,\n zIndex: 1,\n }}\n >\n {badge.dot ? (\n <Badge tone={badge.tone ?? 'danger'} appearance=\"solid\">\n {' '}\n </Badge>\n ) : (\n <Badge tone={badge.tone ?? 'danger'} appearance=\"solid\">\n {String(badge.count ?? 0)}\n </Badge>\n )}\n </View>\n );\n};\n\nconst SmallSpinner = ({ color, size }: { color: string; size: number }) => {\n // Tiny CSS spinner on web; on native, defer to an opacity pulse for v1\n // (avoids importing the spinner component into the FloatButton bundle).\n if (Platform.OS === 'web') {\n return (\n <View\n style={\n {\n width: size,\n height: size,\n borderRadius: size / 2,\n borderWidth: 2,\n borderColor: 'transparent',\n borderTopColor: color,\n animationName: 'fb-spin',\n animationDuration: '700ms',\n animationIterationCount: 'infinite',\n animationTimingFunction: 'linear',\n } as unknown as ViewStyle\n }\n />\n );\n }\n return (\n <View\n style={{\n width: size,\n height: size,\n borderRadius: size / 2,\n borderWidth: 2,\n borderColor: color,\n opacity: 0.6,\n }}\n />\n );\n};\n\nconst Backdrop = ({ onPress, positioning }: { onPress: () => void; positioning: 'fixed' | 'absolute' }) => {\n return (\n <Pressable\n onPress={onPress}\n accessibilityLabel=\"Close\"\n style={{\n position:\n Platform.OS === 'web' && positioning === 'fixed' ? ('fixed' as unknown as 'absolute') : 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'rgba(0, 0, 0, 0.32)',\n zIndex: 49,\n }}\n />\n );\n};\n\nconst RotatedIcon = ({ node, color }: { node: ReactNode; color?: string }) => {\n // Forward the color from the outer `tintIcon` clone down to the inner\n // node — otherwise the morph-to-X icon stays at its default tint while\n // the surrounding FAB icons inherit the variant fg.\n const tintedNode =\n color && isValidElement(node) ? cloneElement(node as ReactElement<{ color?: string }>, { color }) : node;\n return (\n <View\n style={\n {\n transform: [{ rotate: '45deg' }],\n // CSS `color` cascades to nested `currentColor` SVGs on web.\n ...(color ? { color } : null),\n ...(Platform.OS === 'web'\n ? {\n transitionProperty: 'transform',\n transitionDuration: '200ms',\n transitionTimingFunction: 'cubic-bezier(0.16, 1, 0.3, 1)',\n }\n : null),\n } as unknown as ViewStyle\n }\n >\n {tintedNode}\n </View>\n );\n};\n\nconst GroupLayout = ({\n direction,\n placement,\n positioning,\n offset,\n dir,\n children,\n}: {\n direction: FloatButtonGroupDirection;\n placement: FloatButtonPlacement;\n positioning: 'fixed' | 'absolute';\n offset: { x?: number; y?: number };\n dir: 'ltr' | 'rtl';\n children: ReactNode;\n}) => {\n // Read the context directly (instead of `useSafeAreaInsets()`) so the\n // component degrades silently when no `<SafeAreaProvider>` is mounted —\n // the canonical case on web. With a provider, real insets flow through;\n // without one, we get zeros and no console warning.\n const insets = useContext(SafeAreaInsetsContext) ?? { top: 0, right: 0, bottom: 0, left: 0 };\n const { width: viewportWidth } = useWindowDimensions();\n const positionStyle = resolvePositionStyle({\n placement,\n positioning,\n offset,\n dir,\n insets,\n viewportWidth,\n respectSafeArea: false,\n });\n return (\n <View\n style={{\n ...positionStyle,\n flexDirection: direction === 'left' || direction === 'right' ? 'row' : 'column',\n alignItems: direction === 'left' || direction === 'right' ? 'center' : 'flex-end',\n justifyContent: direction === 'up' ? 'flex-end' : 'flex-start',\n }}\n >\n {direction === 'up' || direction === 'left'\n ? children\n : Array.isArray(children)\n ? [...children].reverse()\n : children}\n </View>\n );\n};\n\nfunction groupActionsLayoutStyle(direction: FloatButtonGroupDirection): ViewStyle {\n const isVertical = direction === 'up' || direction === 'down';\n return {\n flexDirection: isVertical ? 'column' : 'row',\n alignItems: 'flex-end',\n gap: 12,\n marginBottom: direction === 'up' ? 12 : 0,\n marginTop: direction === 'down' ? 12 : 0,\n marginRight: direction === 'left' ? 12 : 0,\n marginLeft: direction === 'right' ? 12 : 0,\n };\n}\n\n// =============================================================================\n// Style resolvers\n// =============================================================================\n\nfunction resolveVariantStyle(\n variant: FloatButtonVariant,\n colors: ReturnType<typeof useThemeColors>\n): { bg: string; bgHover: string; bgPressed: string; fg: string; borderColor?: string } {\n switch (variant) {\n case 'primary':\n return {\n bg: colors.semantic.interactive.primary,\n bgHover: colors.semantic.interactive.primaryHover,\n bgPressed: colors.semantic.interactive.primaryPressed,\n fg: colors.semantic.text.inverted,\n };\n case 'secondary':\n return {\n bg: colors.semantic.background.subtle,\n bgHover: colors.semantic.background.elevated,\n bgPressed: colors.semantic.background.subtle,\n fg: colors.semantic.text.default,\n borderColor: colors.semantic.border.default,\n };\n case 'tertiary':\n return {\n bg: 'transparent',\n bgHover: withAlpha(colors.semantic.interactive.primary, 0.08),\n bgPressed: withAlpha(colors.semantic.interactive.primary, 0.12),\n fg: colors.semantic.interactive.primary,\n borderColor: colors.semantic.interactive.primary,\n };\n case 'surface':\n return {\n bg: colors.semantic.background.elevated,\n bgHover: colors.semantic.background.subtle,\n bgPressed: colors.semantic.background.subtle,\n fg: colors.semantic.text.default,\n borderColor: colors.semantic.border.default,\n };\n }\n}\n\nfunction resolveShadowStyle(\n variant: FloatButtonVariant,\n colors: ReturnType<typeof useThemeColors>\n): { resting: ViewStyle; hover: ViewStyle; pressed: ViewStyle } {\n if (Platform.OS !== 'web') {\n // RN's elevation prop on Android maps via boxShadow polyfill; keep\n // it minimal to avoid the chunky M3 look. On iOS we rely on RN's\n // native shadow* props.\n return {\n resting: {\n shadowColor: variant === 'primary' ? colors.semantic.interactive.primary : '#000',\n shadowOffset: { width: 0, height: 6 },\n shadowOpacity: variant === 'primary' ? 0.25 : 0.12,\n shadowRadius: 16,\n elevation: 6,\n } as unknown as ViewStyle,\n hover: {} as ViewStyle,\n pressed: {\n shadowOffset: { width: 0, height: 2 },\n shadowRadius: 6,\n elevation: 2,\n } as unknown as ViewStyle,\n };\n }\n const tint = variant === 'primary' ? colors.semantic.interactive.primary : '#000';\n return {\n resting: {\n ...({\n boxShadow: `0 1px 2px rgba(0,0,0,0.06), 0 8px 24px -6px ${withAlpha(tint, variant === 'primary' ? 0.32 : 0.08)}`,\n } as unknown as ViewStyle),\n },\n hover: {\n ...({\n boxShadow: `0 2px 4px rgba(0,0,0,0.08), 0 12px 28px -6px ${withAlpha(tint, variant === 'primary' ? 0.4 : 0.12)}`,\n } as unknown as ViewStyle),\n },\n pressed: {\n ...({ boxShadow: `0 1px 2px rgba(0,0,0,0.06)` } as unknown as ViewStyle),\n },\n };\n}\n\nfunction resolvePositionStyle({\n placement,\n positioning = 'fixed',\n offset,\n dir,\n insets,\n viewportWidth,\n respectSafeArea,\n}: {\n placement: FloatButtonPlacement;\n positioning?: 'fixed' | 'absolute';\n offset: { x?: number; y?: number };\n dir: 'ltr' | 'rtl';\n insets: { top: number; right: number; bottom: number; left: number };\n viewportWidth: number;\n respectSafeArea: boolean;\n}): ViewStyle {\n const defaultOffset = Platform.OS === 'web' ? DEFAULT_OFFSET_WEB : DEFAULT_OFFSET_NATIVE;\n const x = offset.x ?? defaultOffset;\n const y = offset.y ?? defaultOffset;\n const safeBottom = Platform.OS !== 'web' && respectSafeArea ? insets.bottom : 0;\n const safeTop = Platform.OS !== 'web' && respectSafeArea ? insets.top : 0;\n\n // RTL flips left/right placements.\n const flippedPlacement: FloatButtonPlacement =\n dir === 'rtl'\n ? placement === 'bottom-right'\n ? 'bottom-left'\n : placement === 'bottom-left'\n ? 'bottom-right'\n : placement === 'top-right'\n ? 'top-left'\n : 'top-right'\n : placement;\n\n // RN doesn't have `position: 'fixed'` — only `'absolute'`. On web RN-Web\n // accepts the cast. The `positioning` prop also lets consumers force\n // `'absolute'` so the FAB pins to a positioned ancestor (docs previews).\n const cssPosition: ViewStyle['position'] =\n Platform.OS === 'web' && positioning === 'fixed' ? ('fixed' as unknown as 'absolute') : 'absolute';\n const base: ViewStyle = {\n position: cssPosition,\n zIndex: 50,\n };\n\n switch (flippedPlacement) {\n case 'bottom-right':\n return { ...base, bottom: y + safeBottom, right: x };\n case 'bottom-left':\n return { ...base, bottom: y + safeBottom, left: x };\n case 'top-right':\n return { ...base, top: y + safeTop, right: x };\n case 'top-left':\n return { ...base, top: y + safeTop, left: x };\n }\n // Suppress viewportWidth warning — reserved for future RTL/horizontal logic.\n void viewportWidth;\n return base;\n}\n\n/**\n * Force the icon's color to match the FAB's variant fg. Works for our\n * `IconComponentProps`-shaped icons (which accept `{ size, color }`) by\n * cloning the element with the resolved color; raw nodes pass through\n * unchanged and rely on the wrapper's CSS `color` for `currentColor`-based\n * SVGs. Consumer-supplied colors are intentionally overridden — inside a\n * primary FAB the icon should always read against the primary surface.\n */\nfunction tintIcon(icon: ReactNode, color: string): ReactNode {\n if (!isValidElement(icon)) {\n return icon;\n }\n return cloneElement(icon as ReactElement<{ color?: string }>, { color });\n}\n\nfunction withAlpha(color: string, alpha: number): string {\n if (color.startsWith('#') && (color.length === 7 || color.length === 4)) {\n const expanded =\n color.length === 4 ? `#${color[1]}${color[1]}${color[2]}${color[2]}${color[3]}${color[3]}` : color;\n const r = Number.parseInt(expanded.slice(1, 3), 16);\n const g = Number.parseInt(expanded.slice(3, 5), 16);\n const b = Number.parseInt(expanded.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n }\n return color;\n}\n\n// Suppress unused — ComponentProps reserved for future href-prop polymorphism.\ntype _Unused = ComponentProps<'button'>;\n"]}
|
|
@@ -33,8 +33,8 @@ var defaultDictionary = {
|
|
|
33
33
|
// floatButton
|
|
34
34
|
"floatButton.backToTop": "Back to top",
|
|
35
35
|
// calendar
|
|
36
|
-
"calendar.header.previous": "Previous",
|
|
37
|
-
"calendar.header.next": "Next",
|
|
36
|
+
"calendar.header.previous": "Previous month",
|
|
37
|
+
"calendar.header.next": "Next month",
|
|
38
38
|
"calendar.header.openMonthView": "Open month picker",
|
|
39
39
|
"calendar.header.openYearView": "Open year picker",
|
|
40
40
|
"calendar.header.openDayView": "Open day picker",
|
|
@@ -50,7 +50,10 @@ var defaultDictionary = {
|
|
|
50
50
|
"checkbox.checked": "Checked",
|
|
51
51
|
"checkbox.unchecked": "Unchecked",
|
|
52
52
|
"switch.on": "On",
|
|
53
|
-
"switch.off": "Off"
|
|
53
|
+
"switch.off": "Off",
|
|
54
|
+
// field
|
|
55
|
+
"field.requiredIndicator": "*",
|
|
56
|
+
"field.requiredLabel": "required"
|
|
54
57
|
};
|
|
55
58
|
|
|
56
59
|
// src/i18n/resolve.ts
|
|
@@ -98,5 +101,5 @@ function interpolate(template, options) {
|
|
|
98
101
|
__name(interpolate, "interpolate");
|
|
99
102
|
|
|
100
103
|
export { defaultDictionary, resolveI18n };
|
|
101
|
-
//# sourceMappingURL=chunk-
|
|
102
|
-
//# sourceMappingURL=chunk-
|
|
104
|
+
//# sourceMappingURL=chunk-6PO2IWB3.js.map
|
|
105
|
+
//# sourceMappingURL=chunk-6PO2IWB3.js.map
|