@nori-ui/core 1.9.1 → 1.9.2
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-O6M3F7BZ.js → chunk-34TKMNID.js} +5 -5
- package/dist/{chunk-O6M3F7BZ.js.map → chunk-34TKMNID.js.map} +1 -1
- package/dist/{chunk-KLK7OMFT.js → chunk-35DVHUUE.js} +3 -3
- package/dist/{chunk-KLK7OMFT.js.map → chunk-35DVHUUE.js.map} +1 -1
- package/dist/{chunk-M4BI63P6.js → chunk-3FRCTNQH.js} +3 -3
- package/dist/{chunk-M4BI63P6.js.map → chunk-3FRCTNQH.js.map} +1 -1
- package/dist/{chunk-3CEJ5TB4.js → chunk-3H7LF45D.js} +4 -4
- package/dist/{chunk-3CEJ5TB4.js.map → chunk-3H7LF45D.js.map} +1 -1
- package/dist/{chunk-PJTCO76H.js → chunk-3KK2TXVY.js} +4 -4
- package/dist/{chunk-PJTCO76H.js.map → chunk-3KK2TXVY.js.map} +1 -1
- package/dist/{chunk-QB6RH6UU.js → chunk-3QQXYL5L.js} +4 -4
- package/dist/{chunk-QB6RH6UU.js.map → chunk-3QQXYL5L.js.map} +1 -1
- package/dist/{chunk-OELY6K44.js → chunk-3RNRVMNS.js} +3 -3
- package/dist/{chunk-OELY6K44.js.map → chunk-3RNRVMNS.js.map} +1 -1
- package/dist/{chunk-R5JMDDCB.js → chunk-3W2O4OBL.js} +4 -2
- package/dist/chunk-3W2O4OBL.js.map +1 -0
- package/dist/{chunk-MDOZGILD.js → chunk-4NBJW2JZ.js} +3 -3
- package/dist/{chunk-MDOZGILD.js.map → chunk-4NBJW2JZ.js.map} +1 -1
- package/dist/{chunk-ZGFXKYA5.js → chunk-57AVXG7D.js} +3 -3
- package/dist/{chunk-ZGFXKYA5.js.map → chunk-57AVXG7D.js.map} +1 -1
- package/dist/{chunk-HXCETKCC.js → chunk-7TESZOYQ.js} +3 -3
- package/dist/{chunk-HXCETKCC.js.map → chunk-7TESZOYQ.js.map} +1 -1
- package/dist/{chunk-TSWPHJIU.js → chunk-7UTQKMTE.js} +4 -4
- package/dist/{chunk-TSWPHJIU.js.map → chunk-7UTQKMTE.js.map} +1 -1
- package/dist/{chunk-U2ZKY2CP.js → chunk-AUNLIED3.js} +3 -3
- package/dist/{chunk-U2ZKY2CP.js.map → chunk-AUNLIED3.js.map} +1 -1
- package/dist/{chunk-J5LK2XHE.js → chunk-BBPKG3NI.js} +3 -3
- package/dist/{chunk-J5LK2XHE.js.map → chunk-BBPKG3NI.js.map} +1 -1
- package/dist/{chunk-IGBXSBF7.js → chunk-BCOXHHHC.js} +3 -3
- package/dist/{chunk-IGBXSBF7.js.map → chunk-BCOXHHHC.js.map} +1 -1
- package/dist/{chunk-L6VYDM7S.js → chunk-BJARVBFN.js} +3 -3
- package/dist/{chunk-L6VYDM7S.js.map → chunk-BJARVBFN.js.map} +1 -1
- package/dist/{chunk-BVLOX4A3.js → chunk-BJHMAGOQ.js} +3 -3
- package/dist/{chunk-BVLOX4A3.js.map → chunk-BJHMAGOQ.js.map} +1 -1
- package/dist/{chunk-VOF3S5I4.js → chunk-BOHLDAMY.js} +4 -4
- package/dist/{chunk-VOF3S5I4.js.map → chunk-BOHLDAMY.js.map} +1 -1
- package/dist/{chunk-3W3XYULK.js → chunk-C4HP2D46.js} +4 -4
- package/dist/{chunk-3W3XYULK.js.map → chunk-C4HP2D46.js.map} +1 -1
- package/dist/{chunk-C5HQPXRI.js → chunk-CMA3ZFCG.js} +4 -4
- package/dist/{chunk-C5HQPXRI.js.map → chunk-CMA3ZFCG.js.map} +1 -1
- package/dist/{chunk-EN4CLDGZ.js → chunk-D4J24WDF.js} +3 -3
- package/dist/{chunk-EN4CLDGZ.js.map → chunk-D4J24WDF.js.map} +1 -1
- package/dist/{chunk-MOAIQHR7.js → chunk-DJ3XX3CV.js} +3 -3
- package/dist/{chunk-MOAIQHR7.js.map → chunk-DJ3XX3CV.js.map} +1 -1
- package/dist/{chunk-IIVTPN62.js → chunk-DVO556JH.js} +3 -3
- package/dist/{chunk-IIVTPN62.js.map → chunk-DVO556JH.js.map} +1 -1
- package/dist/{chunk-2XJCLPNH.js → chunk-EC5TKCWA.js} +3 -3
- package/dist/{chunk-2XJCLPNH.js.map → chunk-EC5TKCWA.js.map} +1 -1
- package/dist/{chunk-VLZANXRZ.js → chunk-EMU3GXKM.js} +3 -3
- package/dist/{chunk-VLZANXRZ.js.map → chunk-EMU3GXKM.js.map} +1 -1
- package/dist/{chunk-F5UKI7XD.js → chunk-ENPBMEUW.js} +3 -3
- package/dist/{chunk-F5UKI7XD.js.map → chunk-ENPBMEUW.js.map} +1 -1
- package/dist/{chunk-V75O7QQO.js → chunk-FQDCPWLX.js} +3 -3
- package/dist/{chunk-V75O7QQO.js.map → chunk-FQDCPWLX.js.map} +1 -1
- package/dist/{chunk-3B345SQU.js → chunk-FRL5SLFT.js} +4 -4
- package/dist/{chunk-3B345SQU.js.map → chunk-FRL5SLFT.js.map} +1 -1
- package/dist/{chunk-5YHT252H.js → chunk-GTDDUPTE.js} +3 -3
- package/dist/{chunk-5YHT252H.js.map → chunk-GTDDUPTE.js.map} +1 -1
- package/dist/{chunk-OIHX5B4R.js → chunk-GYFX2I6B.js} +3 -3
- package/dist/{chunk-OIHX5B4R.js.map → chunk-GYFX2I6B.js.map} +1 -1
- package/dist/{chunk-PQW5LKAI.js → chunk-J2FSGJ2P.js} +3 -3
- package/dist/{chunk-PQW5LKAI.js.map → chunk-J2FSGJ2P.js.map} +1 -1
- package/dist/{chunk-C32XGHWO.js → chunk-KE2TP5XZ.js} +3 -3
- package/dist/{chunk-C32XGHWO.js.map → chunk-KE2TP5XZ.js.map} +1 -1
- package/dist/{chunk-USFXANEU.js → chunk-LWW3FJHF.js} +3 -3
- package/dist/{chunk-USFXANEU.js.map → chunk-LWW3FJHF.js.map} +1 -1
- package/dist/{chunk-3IIIHZHT.js → chunk-MQZXQOGY.js} +3 -3
- package/dist/{chunk-3IIIHZHT.js.map → chunk-MQZXQOGY.js.map} +1 -1
- package/dist/{chunk-BOMPFNM4.js → chunk-NSLVUCYP.js} +3 -3
- package/dist/{chunk-BOMPFNM4.js.map → chunk-NSLVUCYP.js.map} +1 -1
- package/dist/{chunk-7Z4NMNX6.js → chunk-O656K7OS.js} +3 -3
- package/dist/{chunk-7Z4NMNX6.js.map → chunk-O656K7OS.js.map} +1 -1
- package/dist/{chunk-S763GTIZ.js → chunk-PCUWBRNT.js} +3 -3
- package/dist/{chunk-S763GTIZ.js.map → chunk-PCUWBRNT.js.map} +1 -1
- package/dist/{chunk-MK57AOTI.js → chunk-QNYGQYAO.js} +5 -5
- package/dist/{chunk-MK57AOTI.js.map → chunk-QNYGQYAO.js.map} +1 -1
- package/dist/{chunk-UKDDK42K.js → chunk-QOVLTVJN.js} +3 -3
- package/dist/{chunk-UKDDK42K.js.map → chunk-QOVLTVJN.js.map} +1 -1
- package/dist/{chunk-PJXVLE24.js → chunk-QYA7HYFI.js} +5 -5
- package/dist/{chunk-PJXVLE24.js.map → chunk-QYA7HYFI.js.map} +1 -1
- package/dist/{chunk-SF6WPUC5.js → chunk-QZ6T4R44.js} +3 -3
- package/dist/{chunk-SF6WPUC5.js.map → chunk-QZ6T4R44.js.map} +1 -1
- package/dist/{chunk-7FSFJA33.js → chunk-SNGWMCZH.js} +3 -3
- package/dist/{chunk-7FSFJA33.js.map → chunk-SNGWMCZH.js.map} +1 -1
- package/dist/{chunk-XQNVWHMN.js → chunk-UHAI3QOA.js} +3 -3
- package/dist/{chunk-XQNVWHMN.js.map → chunk-UHAI3QOA.js.map} +1 -1
- package/dist/{chunk-OHWRTHGL.js → chunk-UHHW7GZ4.js} +4 -4
- package/dist/{chunk-OHWRTHGL.js.map → chunk-UHHW7GZ4.js.map} +1 -1
- package/dist/{chunk-PGYEIXCO.js → chunk-UKYSXWTI.js} +4 -4
- package/dist/{chunk-PGYEIXCO.js.map → chunk-UKYSXWTI.js.map} +1 -1
- package/dist/{chunk-IWM2XDXH.js → chunk-UPSNKESO.js} +3 -3
- package/dist/{chunk-IWM2XDXH.js.map → chunk-UPSNKESO.js.map} +1 -1
- package/dist/{chunk-BXZGCOKT.js → chunk-WEHUVESG.js} +4 -4
- package/dist/{chunk-BXZGCOKT.js.map → chunk-WEHUVESG.js.map} +1 -1
- package/dist/{chunk-ISCJST4P.js → chunk-WFR55YKL.js} +3 -3
- package/dist/{chunk-ISCJST4P.js.map → chunk-WFR55YKL.js.map} +1 -1
- package/dist/{chunk-MYBBBLYE.js → chunk-WKQUCDGP.js} +3 -3
- package/dist/{chunk-MYBBBLYE.js.map → chunk-WKQUCDGP.js.map} +1 -1
- package/dist/{chunk-STX5UKYT.js → chunk-XAXIQ55K.js} +3 -3
- package/dist/{chunk-STX5UKYT.js.map → chunk-XAXIQ55K.js.map} +1 -1
- package/dist/{chunk-H2LHWJ52.js → chunk-YHQFS4ZF.js} +4 -4
- package/dist/{chunk-H2LHWJ52.js.map → chunk-YHQFS4ZF.js.map} +1 -1
- package/dist/{chunk-VL2WNGPF.js → chunk-YUYYAMLE.js} +3 -3
- package/dist/{chunk-VL2WNGPF.js.map → chunk-YUYYAMLE.js.map} +1 -1
- package/dist/{chunk-CPIKN4BX.js → chunk-YYVL2FWF.js} +5 -5
- package/dist/{chunk-CPIKN4BX.js.map → chunk-YYVL2FWF.js.map} +1 -1
- package/dist/client.cjs +7 -5
- package/dist/client.cjs.map +1 -1
- package/dist/client.js +56 -56
- package/dist/components/Accordion/index.cjs +2 -0
- package/dist/components/Accordion/index.cjs.map +1 -1
- package/dist/components/Accordion/index.js +3 -3
- package/dist/components/Alert/index.cjs +2 -0
- package/dist/components/Alert/index.cjs.map +1 -1
- package/dist/components/Alert/index.js +3 -3
- package/dist/components/AlertDialog/index.cjs +2 -0
- package/dist/components/AlertDialog/index.cjs.map +1 -1
- package/dist/components/AlertDialog/index.js +2 -2
- package/dist/components/Avatar/index.cjs +2 -0
- package/dist/components/Avatar/index.cjs.map +1 -1
- package/dist/components/Avatar/index.js +2 -2
- package/dist/components/Badge/index.cjs +2 -0
- package/dist/components/Badge/index.cjs.map +1 -1
- package/dist/components/Badge/index.js +2 -2
- package/dist/components/Box/index.cjs +2 -0
- package/dist/components/Box/index.cjs.map +1 -1
- package/dist/components/Box/index.js +4 -4
- package/dist/components/Breadcrumb/index.cjs +2 -0
- package/dist/components/Breadcrumb/index.cjs.map +1 -1
- package/dist/components/Breadcrumb/index.js +3 -3
- package/dist/components/Button/index.cjs +2 -0
- package/dist/components/Button/index.cjs.map +1 -1
- package/dist/components/Button/index.js +2 -2
- package/dist/components/Calendar/index.cjs +2 -0
- package/dist/components/Calendar/index.cjs.map +1 -1
- package/dist/components/Calendar/index.js +4 -4
- package/dist/components/Card/index.cjs +2 -0
- package/dist/components/Card/index.cjs.map +1 -1
- package/dist/components/Card/index.js +2 -2
- package/dist/components/Checkbox/index.cjs +2 -0
- package/dist/components/Checkbox/index.cjs.map +1 -1
- package/dist/components/Checkbox/index.js +3 -3
- package/dist/components/Collapsible/index.cjs +2 -0
- package/dist/components/Collapsible/index.cjs.map +1 -1
- package/dist/components/Collapsible/index.js +2 -2
- package/dist/components/Combobox/index.cjs +2 -0
- package/dist/components/Combobox/index.cjs.map +1 -1
- package/dist/components/Combobox/index.js +4 -4
- package/dist/components/Command/index.cjs +2 -0
- package/dist/components/Command/index.cjs.map +1 -1
- package/dist/components/Command/index.js +4 -4
- package/dist/components/ContextMenu/index.cjs +3 -1
- package/dist/components/ContextMenu/index.cjs.map +1 -1
- package/dist/components/ContextMenu/index.js +4 -4
- package/dist/components/DataTable/index.cjs +2 -0
- package/dist/components/DataTable/index.cjs.map +1 -1
- package/dist/components/DataTable/index.js +3 -3
- package/dist/components/DatePicker/index.cjs +2 -0
- package/dist/components/DatePicker/index.cjs.map +1 -1
- package/dist/components/DatePicker/index.js +6 -6
- package/dist/components/Dialog/index.cjs +2 -0
- package/dist/components/Dialog/index.cjs.map +1 -1
- package/dist/components/Dialog/index.js +3 -3
- package/dist/components/DropdownMenu/index.cjs +3 -1
- package/dist/components/DropdownMenu/index.cjs.map +1 -1
- package/dist/components/DropdownMenu/index.js +3 -3
- package/dist/components/Empty/index.cjs +2 -0
- package/dist/components/Empty/index.cjs.map +1 -1
- package/dist/components/Empty/index.js +2 -2
- package/dist/components/Field/index.cjs +4 -2
- package/dist/components/Field/index.cjs.map +1 -1
- package/dist/components/Field/index.js +2 -2
- package/dist/components/FloatButton/index.cjs +2 -0
- package/dist/components/FloatButton/index.cjs.map +1 -1
- package/dist/components/FloatButton/index.js +4 -4
- package/dist/components/HStack/index.cjs +2 -0
- package/dist/components/HStack/index.cjs.map +1 -1
- package/dist/components/HStack/index.js +4 -4
- package/dist/components/HoverCard/index.cjs +2 -0
- package/dist/components/HoverCard/index.cjs.map +1 -1
- package/dist/components/HoverCard/index.js +3 -3
- package/dist/components/InputGroup/index.cjs +3 -1
- package/dist/components/InputGroup/index.cjs.map +1 -1
- package/dist/components/InputGroup/index.js +2 -2
- package/dist/components/InputOTP/index.cjs +2 -0
- package/dist/components/InputOTP/index.cjs.map +1 -1
- package/dist/components/InputOTP/index.js +2 -2
- package/dist/components/Item/index.cjs +2 -0
- package/dist/components/Item/index.cjs.map +1 -1
- package/dist/components/Item/index.js +2 -2
- package/dist/components/Kbd/index.cjs +2 -0
- package/dist/components/Kbd/index.cjs.map +1 -1
- package/dist/components/Kbd/index.js +2 -2
- package/dist/components/Label/index.cjs +3 -1
- package/dist/components/Label/index.cjs.map +1 -1
- package/dist/components/Label/index.js +2 -2
- package/dist/components/Pagination/index.cjs +2 -0
- package/dist/components/Pagination/index.cjs.map +1 -1
- package/dist/components/Pagination/index.js +4 -4
- package/dist/components/Popover/index.cjs +2 -0
- package/dist/components/Popover/index.cjs.map +1 -1
- package/dist/components/Popover/index.js +2 -2
- package/dist/components/Progress/index.cjs +2 -0
- package/dist/components/Progress/index.cjs.map +1 -1
- package/dist/components/Progress/index.js +2 -2
- package/dist/components/Radio/index.cjs +2 -0
- package/dist/components/Radio/index.cjs.map +1 -1
- package/dist/components/Radio/index.js +2 -2
- package/dist/components/SegmentedControl/index.cjs +2 -0
- package/dist/components/SegmentedControl/index.cjs.map +1 -1
- package/dist/components/SegmentedControl/index.js +2 -2
- package/dist/components/Select/index.cjs +2 -0
- package/dist/components/Select/index.cjs.map +1 -1
- package/dist/components/Select/index.js +3 -3
- package/dist/components/Separator/index.cjs +2 -0
- package/dist/components/Separator/index.cjs.map +1 -1
- package/dist/components/Separator/index.js +2 -2
- package/dist/components/Sheet/index.cjs +2 -0
- package/dist/components/Sheet/index.cjs.map +1 -1
- package/dist/components/Sheet/index.js +2 -2
- package/dist/components/Sidebar/index.cjs +2 -0
- package/dist/components/Sidebar/index.cjs.map +1 -1
- package/dist/components/Sidebar/index.js +2 -2
- package/dist/components/Skeleton/index.cjs +2 -0
- package/dist/components/Skeleton/index.cjs.map +1 -1
- package/dist/components/Skeleton/index.js +2 -2
- package/dist/components/Slider/index.cjs +2 -0
- package/dist/components/Slider/index.cjs.map +1 -1
- package/dist/components/Slider/index.js +2 -2
- package/dist/components/Switch/index.cjs +2 -0
- package/dist/components/Switch/index.cjs.map +1 -1
- package/dist/components/Switch/index.js +2 -2
- package/dist/components/Table/index.cjs +2 -0
- package/dist/components/Table/index.cjs.map +1 -1
- package/dist/components/Table/index.js +2 -2
- package/dist/components/Tabs/index.cjs +2 -0
- package/dist/components/Tabs/index.cjs.map +1 -1
- package/dist/components/Tabs/index.js +2 -2
- package/dist/components/Text/index.cjs +2 -0
- package/dist/components/Text/index.cjs.map +1 -1
- package/dist/components/Text/index.js +2 -2
- package/dist/components/TextArea/index.cjs +2 -0
- package/dist/components/TextArea/index.cjs.map +1 -1
- package/dist/components/TextArea/index.js +3 -3
- package/dist/components/TextInput/index.cjs +2 -0
- package/dist/components/TextInput/index.cjs.map +1 -1
- package/dist/components/TextInput/index.js +2 -2
- package/dist/components/Toggle/index.cjs +2 -0
- package/dist/components/Toggle/index.cjs.map +1 -1
- package/dist/components/Toggle/index.js +2 -2
- package/dist/components/Tooltip/index.cjs +2 -0
- package/dist/components/Tooltip/index.cjs.map +1 -1
- package/dist/components/Tooltip/index.js +2 -2
- package/dist/components/VStack/index.cjs +2 -0
- package/dist/components/VStack/index.cjs.map +1 -1
- package/dist/components/VStack/index.js +4 -4
- package/dist/icons/index.cjs +2 -0
- package/dist/icons/index.cjs.map +1 -1
- package/dist/icons/index.js +2 -2
- package/dist/index.cjs +7 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +53 -53
- package/dist/theme/index.cjs +2 -0
- package/dist/theme/index.cjs.map +1 -1
- package/dist/theme/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunk-R5JMDDCB.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Accordion/Accordion.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-QB6RH6UU.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { LayoutChangeEvent, ViewStyle } from 'react-native';\nimport { Platform, Pressable, Text as RNText, View } from 'react-native';\nimport { AnimatedView } from '../../animation/animated-view';\nimport { useAnimatedNumber } from '../../animation/use-animated-number';\nimport { defaultSemanticIcons } from '../../icons/default-semantic-icons';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type AccordionType = 'single' | 'multiple';\n\ntype SingleProps = {\n /** One-at-a-time mode. */\n type: 'single';\n /** Controlled open value. Pass `null` (with `collapsible`) for \"nothing open\". */\n value?: string | null;\n /** Uncontrolled initial open value. */\n defaultValue?: string;\n /** Fires when the open value changes. Receives the new value (string), or `null` if collapsed. */\n onChange?: (next: string | null) => void;\n /** Allow closing the open item by clicking it again. @defaultValue false */\n collapsible?: boolean;\n};\n\ntype MultipleProps = {\n /** Any combination open. */\n type: 'multiple';\n /** Controlled list of open values. */\n value?: string[];\n /** Uncontrolled initial list of open values. */\n defaultValue?: string[];\n /** Fires when the open list changes. Receives the new list. */\n onChange?: (next: string[]) => void;\n /** No-op in `multiple` mode (items are always individually collapsible). */\n collapsible?: never;\n};\n\ntype CommonProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nexport type AccordionProps = (SingleProps | MultipleProps) & CommonProps;\n\ntype AccordionContextValue = {\n baseId: string;\n isOpen: (value: string) => boolean;\n toggle: (value: string) => void;\n register: (value: string, ref: RefObject<HTMLElement | null>) => void;\n unregister: (value: string) => void;\n moveFocus: (offset: 1 | -1, fromValue: string) => void;\n focusEdge: (edge: 'first' | 'last') => void;\n};\n\nconst AccordionContext = createContext<AccordionContextValue | null>(null);\n\nconst useAccordionContext = (label: string): AccordionContextValue => {\n const ctx = useContext(AccordionContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside an <Accordion>.`);\n }\n return ctx;\n};\n\ntype AccordionItemContextValue = {\n value: string;\n open: boolean;\n disabled: boolean;\n triggerId: string;\n contentId: string;\n};\n\nconst AccordionItemContext = createContext<AccordionItemContextValue | null>(null);\n\nconst useAccordionItemContext = (label: string): AccordionItemContextValue => {\n const ctx = useContext(AccordionItemContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside an <Accordion.Item>.`);\n }\n return ctx;\n};\n\n/**\n * Vertically stacked, individually expandable sections. Compose:\n *\n * <Accordion type=\"single\" defaultValue=\"overview\" collapsible>\n * <Accordion.Item value=\"overview\">\n * <Accordion.Trigger>Overview</Accordion.Trigger>\n * <Accordion.Content>...</Accordion.Content>\n * </Accordion.Item>\n * </Accordion>\n *\n * Modes:\n * - `single` — at most one item open. Pass `collapsible` to allow closing the\n * open item.\n * - `multiple` — any combination open. `value` / `defaultValue` are arrays.\n *\n * Controlled (`value` + `onChange`) and uncontrolled (`defaultValue`) both\n * supported. Triggers are real `<button>`s with full keyboard nav: ArrowDown /\n * ArrowUp move focus, Home / End jump to first / last, Enter / Space toggle.\n */\nconst AccordionRoot = (props: AccordionProps) => {\n const baseId = useId();\n const refs = useRef<Map<string, RefObject<HTMLElement | null>>>(new Map());\n const orderRef = useRef<string[]>([]);\n\n // Pull out the props we always need; the discriminated union handlers below\n // narrow on `type` for the actual state logic.\n const { type, children, className, testID } = props;\n\n // Single-mode internal state. We always allocate both state slots so the\n // hook order stays stable across re-renders regardless of `type`.\n const [singleInner, setSingleInner] = useState<string | null>(\n type === 'single' ? (props.defaultValue ?? null) : null\n );\n const [multipleInner, setMultipleInner] = useState<string[]>(type === 'multiple' ? (props.defaultValue ?? []) : []);\n\n const singleControlled = type === 'single' && props.value !== undefined;\n const multipleControlled = type === 'multiple' && props.value !== undefined;\n\n const singleCurrent = type === 'single' ? (singleControlled ? (props.value ?? null) : singleInner) : null;\n const multipleCurrent = type === 'multiple' ? (multipleControlled ? (props.value ?? []) : multipleInner) : [];\n\n const isOpen = useCallback(\n (v: string) => {\n if (type === 'single') {\n return singleCurrent === v;\n }\n return multipleCurrent.includes(v);\n },\n [type, singleCurrent, multipleCurrent]\n );\n\n const toggle = useCallback(\n (v: string) => {\n if (type === 'single') {\n const next = singleCurrent === v ? (props.collapsible ? null : singleCurrent) : v;\n if (next === singleCurrent) {\n return;\n }\n if (!singleControlled) {\n setSingleInner(next);\n }\n props.onChange?.(next);\n } else {\n const has = multipleCurrent.includes(v);\n const next = has ? multipleCurrent.filter((x) => x !== v) : [...multipleCurrent, v];\n if (!multipleControlled) {\n setMultipleInner(next);\n }\n props.onChange?.(next);\n }\n },\n // The handler needs the latest snapshot of every prop — `props` is a\n // discriminated union so spreading it into the deps is the cleanest\n // way to keep both branches honest.\n [type, singleCurrent, multipleCurrent, singleControlled, multipleControlled, props]\n );\n\n const register = useCallback((v: string, ref: RefObject<HTMLElement | null>) => {\n refs.current.set(v, ref);\n if (!orderRef.current.includes(v)) {\n orderRef.current.push(v);\n }\n }, []);\n\n const unregister = useCallback((v: string) => {\n refs.current.delete(v);\n orderRef.current = orderRef.current.filter((x) => x !== v);\n }, []);\n\n const moveFocus = useCallback((offset: 1 | -1, fromValue: string) => {\n const order = orderRef.current;\n if (order.length === 0) {\n return;\n }\n const idx = order.indexOf(fromValue);\n const start = idx === -1 ? 0 : idx;\n const len = order.length;\n const next = order[(start + offset + len) % len];\n if (!next) {\n return;\n }\n refs.current.get(next)?.current?.focus?.();\n }, []);\n\n const focusEdge = useCallback((edge: 'first' | 'last') => {\n const order = orderRef.current;\n if (order.length === 0) {\n return;\n }\n const target = edge === 'first' ? order[0] : order[order.length - 1];\n if (!target) {\n return;\n }\n refs.current.get(target)?.current?.focus?.();\n }, []);\n\n const ctxValue = useMemo<AccordionContextValue>(\n () => ({ baseId, isOpen, toggle, register, unregister, moveFocus, focusEdge }),\n [baseId, isOpen, toggle, register, unregister, moveFocus, focusEdge]\n );\n\n return (\n <AccordionContext.Provider value={ctxValue}>\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn('flex-col w-full', className)}\n style={{ flexDirection: 'column', width: '100%' }}\n >\n {children}\n </View>\n </AccordionContext.Provider>\n );\n};\n\nexport type AccordionItemProps = {\n /** Stable identifier — links the item to `value` / `defaultValue` on the parent. */\n value: string;\n /** Disable expansion of this item. The trigger remains focusable for nav consistency. */\n disabled?: boolean;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nconst ITEM_BASE: ViewStyle = {\n borderBottomWidth: 1,\n flexDirection: 'column',\n};\n\n// Layout-only constants for the trigger / content; theme-driven sizes are\n// merged in inside the component below.\nconst TRIGGER_LAYOUT_BASE: ViewStyle = {\n minHeight: 44, // component-density literal — not from theme\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n};\n\nconst CONTENT_INNER_LAYOUT_BASE: ViewStyle = {\n // Padding values come from theme inside AccordionContent.\n};\n\n/** A single expandable section. Wraps an `Accordion.Trigger` and `Accordion.Content`. */\nexport const AccordionItem = ({ value, disabled = false, children, className, testID }: AccordionItemProps) => {\n const ctx = useAccordionContext('Accordion.Item');\n const colors = useThemeColors();\n const open = ctx.isOpen(value);\n\n const itemCtx = useMemo<AccordionItemContextValue>(\n () => ({\n value,\n open,\n disabled,\n triggerId: `${ctx.baseId}-trigger-${value}`,\n contentId: `${ctx.baseId}-content-${value}`,\n }),\n [value, open, disabled, ctx.baseId]\n );\n\n return (\n <AccordionItemContext.Provider value={itemCtx}>\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn('flex-col border-b border-semantic-border-default', className)}\n style={[ITEM_BASE, { borderBottomColor: colors.semantic.border.default }]}\n >\n {children}\n </View>\n </AccordionItemContext.Provider>\n );\n};\n\nexport type AccordionTriggerProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * The clickable row that toggles its item open / closed. Renders a real\n * `<button>` (via Pressable) and wires `aria-expanded` + `aria-controls` to\n * the matching `Accordion.Content`.\n */\nexport const AccordionTrigger = ({ children, className, testID }: AccordionTriggerProps) => {\n const ctx = useAccordionContext('Accordion.Trigger');\n const item = useAccordionItemContext('Accordion.Trigger');\n const colors = useThemeColors();\n const ownRef = useRef<HTMLElement | null>(null);\n const triggerStyle: ViewStyle = {\n ...TRIGGER_LAYOUT_BASE,\n paddingHorizontal: px(colors.spacing['4']),\n paddingVertical: px(colors.spacing['3']),\n gap: px(colors.spacing['3']),\n };\n\n useEffect(() => {\n ctx.register(item.value, ownRef);\n return () => ctx.unregister(item.value);\n }, [ctx, item.value]);\n\n const onPress = useCallback(() => {\n if (item.disabled) {\n return;\n }\n ctx.toggle(item.value);\n }, [ctx, item.value, item.disabled]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n ctx.moveFocus(1, item.value);\n return;\n case 'ArrowUp':\n event.preventDefault();\n ctx.moveFocus(-1, item.value);\n return;\n case 'Home':\n event.preventDefault();\n ctx.focusEdge('first');\n return;\n case 'End':\n event.preventDefault();\n ctx.focusEdge('last');\n return;\n case 'Enter':\n case ' ': {\n event.preventDefault();\n if (!item.disabled) {\n ctx.toggle(item.value);\n }\n return;\n }\n }\n },\n [ctx, item.value, item.disabled]\n );\n\n // CSS transition for the chevron rotation on web. On native, RN expects\n // an array of transform objects (`[{ rotate: '180deg' }]`), so we branch\n // by platform to keep both ends rendering correctly. The web branch also\n // adds a CSS transition for a smooth rotation; native snaps (consumers\n // who want a spring can compose their own).\n const chevronStyle =\n Platform.OS === 'web'\n ? ({\n transition: 'transform 200ms ease',\n transform: `rotate(${item.open ? 180 : 0}deg)`,\n } as unknown as ViewStyle)\n : ({ transform: [{ rotate: item.open ? '180deg' : '0deg' }] } as ViewStyle);\n\n const triggerProps: Record<string, unknown> = {\n ref: (node: HTMLElement | null) => {\n ownRef.current = node;\n },\n role: 'button',\n accessibilityRole: 'button',\n 'aria-expanded': item.open,\n 'aria-controls': item.contentId,\n 'aria-disabled': item.disabled || undefined,\n id: item.triggerId,\n // Every trigger sits in the tab order — pressing Tab moves through\n // the accordion sequentially, then arrow keys take over once focused.\n tabIndex: 0,\n onPress,\n onKeyDown: handleKeyDown,\n ...(item.disabled ? { disabled: true } : {}),\n ...(testID !== undefined ? { testID } : {}),\n };\n\n return (\n <Pressable\n {...triggerProps}\n className={cn(\n 'flex-row items-center justify-between gap-3 px-4 py-3 min-h-[44px] hover:bg-semantic-background-subtle',\n item.disabled ? 'opacity-50' : 'opacity-100',\n className\n )}\n style={[triggerStyle, item.disabled ? { opacity: 0.5 } : null]}\n >\n {typeof children === 'string' ? (\n <RNText\n style={{\n color: colors.semantic.text.default,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n fontWeight: colors.fontWeight.medium as '500',\n flexShrink: 1,\n }}\n >\n {children}\n </RNText>\n ) : (\n children\n )}\n <View aria-hidden={true} style={chevronStyle}>\n <defaultSemanticIcons.chevronDown size={18} color={colors.semantic.text.muted} />\n </View>\n </Pressable>\n );\n};\n\nexport type AccordionContentProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n /**\n * Keep the content mounted even when collapsed. Useful for forms that\n * shouldn't lose state, or content that's expensive to mount.\n * @defaultValue false\n */\n forceMount?: boolean;\n};\n\n// Animation timing — mirrors the Switch slide and the web CSS\n// transition exactly so the accordion feels identical on web and native.\nconst ACCORDION_ANIM_DURATION_MS = 200;\n\n/**\n * The collapsible body. On web it always mounts but slides open / closed\n * via an animated max-height + opacity transition (200ms ease). On native\n * it mounts in a measure-pass on first render to capture the natural\n * content height, then animates `height` + `opacity` via the shared\n * `useAnimatedNumber` primitive (200ms, cubic-bezier(0.16, 1, 0.3, 1) —\n * matches the Switch thumb slide).\n *\n * Implementation note: the web-side height + transition styles are pushed\n * onto the outer wrapper's DOM node via a ref + useEffect rather than\n * through the View's `style` prop. Reason: rn-web's style filter drops\n * keys it doesn't recognise as RN style props (`transition`, `maxHeight`\n * shorthand, etc.), taking the whole fragment with them. Direct DOM\n * mutation bypasses that filter — same trick used by Dialog's backdrop\n * blur.\n */\nexport const AccordionContent = ({\n children,\n className,\n testID,\n forceMount: _forceMount = false,\n}: AccordionContentProps) => {\n const item = useAccordionItemContext('Accordion.Content');\n const colors = useThemeColors();\n const wrapperRef = useRef<HTMLElement | null>(null);\n const innerRef = useRef<HTMLElement | null>(null);\n // Natural (open-state) height of the content, captured on first\n // layout. Re-captured if the layout reports a different size while\n // open (e.g. dynamic content).\n const [measuredHeight, setMeasuredHeight] = useState<number | null>(null);\n const innerStyle: ViewStyle = {\n ...CONTENT_INNER_LAYOUT_BASE,\n paddingHorizontal: px(colors.spacing['4']),\n paddingTop: px(colors.spacing['1']),\n paddingBottom: px(colors.spacing['3']),\n };\n\n // Slide open/close on web. We measure the natural height of the inner\n // content each time the open state flips, then animate the wrapper's\n // maxHeight to/from 0. Setting maxHeight: 'none' after the transition\n // would let the content grow if it later changes — but for the v0\n // accordion we expect static content, so we leave maxHeight at the\n // measured value (good enough; resize observer can come later).\n useEffect(() => {\n if (Platform.OS !== 'web') {\n return;\n }\n const wrapper = wrapperRef.current;\n const inner = innerRef.current;\n if (!wrapper || !inner) {\n return;\n }\n\n // First-render shortcut: skip the animation when an item starts\n // already open (avoids the \"all items open then animate closed\"\n // flash on mount).\n const isFirstPaint = wrapper.dataset.noriPainted !== '1';\n wrapper.dataset.noriPainted = '1';\n\n wrapper.style.overflow = 'hidden';\n wrapper.style.transitionProperty = 'max-height, opacity';\n wrapper.style.transitionDuration = `${ACCORDION_ANIM_DURATION_MS}ms`;\n wrapper.style.transitionTimingFunction = 'cubic-bezier(0.16, 1, 0.3, 1)';\n\n if (item.open) {\n const target = inner.scrollHeight;\n if (isFirstPaint) {\n wrapper.style.maxHeight = `${target}px`;\n wrapper.style.opacity = '1';\n return;\n }\n // Animate from current measured 0px to the target height.\n wrapper.style.maxHeight = '0px';\n wrapper.style.opacity = '0';\n // Force a reflow so the start state actually applies before\n // we set the end state — otherwise the browser collapses\n // both into a single repaint and skips the animation.\n void wrapper.offsetHeight;\n requestAnimationFrame(() => {\n wrapper.style.maxHeight = `${target}px`;\n wrapper.style.opacity = '1';\n });\n } else {\n // Going from open → closed. Set the explicit current height\n // first so we have something to transition FROM (auto/none\n // doesn't transition).\n const current = inner.scrollHeight;\n wrapper.style.maxHeight = `${current}px`;\n wrapper.style.opacity = '1';\n void wrapper.offsetHeight;\n requestAnimationFrame(() => {\n wrapper.style.maxHeight = '0px';\n wrapper.style.opacity = '0';\n });\n }\n }, [item.open]);\n\n // Native height + opacity animation. Driven by `useAnimatedNumber`,\n // which dispatches per-property to a static-key reanimated worklet\n // (the plugin can't serialize closures over computed keys, so each\n // property gets its own static-key useAnimatedStyle inside the hook).\n //\n // Target values are derived from open + measured size. Before\n // measurement we still call the hooks (hook order must stay\n // stable); they animate to/from 0 which becomes a no-op until the\n // first onLayout fires.\n const targetHeight = item.open ? (measuredHeight ?? 0) : 0;\n const targetOpacity = item.open ? 1 : 0;\n const heightAnim = useAnimatedNumber('height', targetHeight, {\n duration: ACCORDION_ANIM_DURATION_MS,\n });\n const opacityAnim = useAnimatedNumber('opacity', targetOpacity, {\n duration: ACCORDION_ANIM_DURATION_MS,\n });\n\n const onInnerLayout = useCallback(\n (e: LayoutChangeEvent) => {\n if (Platform.OS === 'web') {\n return;\n }\n const next = e.nativeEvent.layout.height;\n if (next > 0 && next !== measuredHeight) {\n setMeasuredHeight(next);\n }\n },\n [measuredHeight]\n );\n\n // Native path: always mount the inner so we can measure its natural\n // height once. Before measurement, we render with `position:\n // absolute, opacity: 0` so the layout pass runs off-screen and\n // doesn't affect the surrounding flow (avoids the \"flash of fully-\n // open content\" on first paint of an initially-closed item).\n // After measurement, the outer Animated.View drives height +\n // opacity together.\n if (Platform.OS !== 'web') {\n const animatedWrapperStyle: ViewStyle = {\n overflow: 'hidden',\n };\n // Pre-measurement: render the inner off-screen for one layout\n // pass. The wrapper claims 0 height in the flow so the next\n // sibling is positioned correctly until we know the real size.\n if (measuredHeight === null) {\n return (\n <AnimatedView\n {...(testID !== undefined ? { testID } : {})}\n accessibilityRole=\"none\"\n aria-labelledby={item.triggerId}\n aria-hidden={!item.open}\n style={[animatedWrapperStyle, { height: 0 }]}\n className={cn('overflow-hidden', className)}\n >\n <View\n onLayout={onInnerLayout}\n className={cn('px-4 pt-1 pb-3')}\n // Absolute + left/right:0 stretches the measurement\n // pass to the parent's full width, so wrapping text\n // measures at its REAL natural height. Without\n // left/right, Yoga gives an absolute child width 0\n // and the measurement collapses to a few pixels.\n style={[innerStyle, { position: 'absolute', left: 0, right: 0, opacity: 0 }]}\n >\n {typeof children === 'string' ? (\n <RNText\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 children\n )}\n </View>\n </AnimatedView>\n );\n }\n return (\n <AnimatedView\n {...(testID !== undefined ? { testID } : {})}\n accessibilityRole=\"none\"\n aria-labelledby={item.triggerId}\n aria-hidden={!item.open}\n style={[animatedWrapperStyle, heightAnim as object]}\n className={cn('overflow-hidden', className)}\n >\n <AnimatedView style={opacityAnim as object}>\n {/* No `onLayout` on this inner — once we've captured\n the natural height in the measurement pass above,\n re-measuring here during the animation would see\n the CLIPPED height (the parent is mid-transition\n between 0 and the target) and clobber\n `measuredHeight` with that smaller value, freezing\n the open state at one line. Single-shot measurement\n is fine for static content; remeasuring on content\n change is a follow-up. */}\n <View className={cn('px-4 pt-1 pb-3')} style={innerStyle}>\n {typeof children === 'string' ? (\n <RNText\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 children\n )}\n </View>\n </AnimatedView>\n </AnimatedView>\n );\n }\n\n return (\n <View\n ref={(node: unknown) => {\n wrapperRef.current = node as HTMLElement | null;\n }}\n {...(testID !== undefined ? { testID } : {})}\n role=\"region\"\n accessibilityRole=\"none\"\n id={item.contentId}\n aria-labelledby={item.triggerId}\n aria-hidden={!item.open}\n className={cn('overflow-hidden', className)}\n >\n <View\n ref={(node: unknown) => {\n innerRef.current = node as HTMLElement | null;\n }}\n className={cn('px-4 pt-1 pb-3')}\n style={innerStyle}\n >\n {typeof children === 'string' ? (\n <RNText\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 children\n )}\n </View>\n </View>\n );\n};\n\n/**\n * Public `Accordion` value — the root function plus its `.Item`, `.Trigger`,\n * and `.Content` static members. `Object.assign` produces a value whose\n * inferred type carries the static properties, so `.d.ts` consumers can\n * write `<Accordion.Item>` without a separate import.\n */\nexport const Accordion = Object.assign(AccordionRoot, {\n Item: AccordionItem,\n Trigger: AccordionTrigger,\n Content: AccordionContent,\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Accordion/Accordion.tsx"],"names":["RNText"],"mappings":";;;;;;;;;;;AAsEA,IAAM,gBAAA,GAAmB,cAA4C,IAAI,CAAA;AAEzE,IAAM,mBAAA,2BAAuB,KAAA,KAAyC;AAClE,EAAA,MAAM,GAAA,GAAM,WAAW,gBAAgB,CAAA;AACvC,EAAA,IAAI,CAAC,GAAA,EAAK;AACN,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,CAAA,EAAI,KAAK,CAAA,yCAAA,CAA2C,CAAA;AAAA,EACxE;AACA,EAAA,OAAO,GAAA;AACX,CAAA,EAN4B,qBAAA,CAAA;AAgB5B,IAAM,oBAAA,GAAuB,cAAgD,IAAI,CAAA;AAEjF,IAAM,uBAAA,2BAA2B,KAAA,KAA6C;AAC1E,EAAA,MAAM,GAAA,GAAM,WAAW,oBAAoB,CAAA;AAC3C,EAAA,IAAI,CAAC,GAAA,EAAK;AACN,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,CAAA,EAAI,KAAK,CAAA,8CAAA,CAAgD,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,GAAA;AACX,CAAA,EANgC,yBAAA,CAAA;AA2BhC,IAAM,aAAA,2BAAiB,KAAA,KAA0B;AAC7C,EAAA,MAAM,SAAS,KAAA,EAAM;AACrB,EAAA,MAAM,IAAA,GAAO,MAAA,iBAAmD,IAAI,GAAA,EAAK,CAAA;AACzE,EAAA,MAAM,QAAA,GAAW,MAAA,CAAiB,EAAE,CAAA;AAIpC,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,QAAO,GAAI,KAAA;AAI9C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAA;AAAA,IAClC,IAAA,KAAS,QAAA,GAAY,KAAA,CAAM,YAAA,IAAgB,IAAA,GAAQ;AAAA,GACvD;AACA,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA,CAAmB,IAAA,KAAS,UAAA,GAAc,KAAA,CAAM,YAAA,IAAgB,EAAC,GAAK,EAAE,CAAA;AAElH,EAAA,MAAM,gBAAA,GAAmB,IAAA,KAAS,QAAA,IAAY,KAAA,CAAM,KAAA,KAAU,MAAA;AAC9D,EAAA,MAAM,kBAAA,GAAqB,IAAA,KAAS,UAAA,IAAc,KAAA,CAAM,KAAA,KAAU,MAAA;AAElE,EAAA,MAAM,gBAAgB,IAAA,KAAS,QAAA,GAAY,mBAAoB,KAAA,CAAM,KAAA,IAAS,OAAQ,WAAA,GAAe,IAAA;AACrG,EAAA,MAAM,eAAA,GAAkB,SAAS,UAAA,GAAc,kBAAA,GAAsB,MAAM,KAAA,IAAS,EAAC,GAAK,aAAA,GAAiB,EAAC;AAE5G,EAAA,MAAM,MAAA,GAAS,WAAA;AAAA,IACX,CAAC,CAAA,KAAc;AACX,MAAA,IAAI,SAAS,QAAA,EAAU;AACnB,QAAA,OAAO,aAAA,KAAkB,CAAA;AAAA,MAC7B;AACA,MAAA,OAAO,eAAA,CAAgB,SAAS,CAAC,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,CAAC,IAAA,EAAM,aAAA,EAAe,eAAe;AAAA,GACzC;AAEA,EAAA,MAAM,MAAA,GAAS,WAAA;AAAA,IACX,CAAC,CAAA,KAAc;AACX,MAAA,IAAI,SAAS,QAAA,EAAU;AACnB,QAAA,MAAM,OAAO,aAAA,KAAkB,CAAA,GAAK,KAAA,CAAM,WAAA,GAAc,OAAO,aAAA,GAAiB,CAAA;AAChF,QAAA,IAAI,SAAS,aAAA,EAAe;AACxB,UAAA;AAAA,QACJ;AACA,QAAA,IAAI,CAAC,gBAAA,EAAkB;AACnB,UAAA,cAAA,CAAe,IAAI,CAAA;AAAA,QACvB;AACA,QAAA,KAAA,CAAM,WAAW,IAAI,CAAA;AAAA,MACzB,CAAA,MAAO;AACH,QAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,QAAA,CAAS,CAAC,CAAA;AACtC,QAAA,MAAM,IAAA,GAAO,GAAA,GAAM,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,CAAC,CAAA,GAAI,CAAC,GAAG,eAAA,EAAiB,CAAC,CAAA;AAClF,QAAA,IAAI,CAAC,kBAAA,EAAoB;AACrB,UAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,QACzB;AACA,QAAA,KAAA,CAAM,WAAW,IAAI,CAAA;AAAA,MACzB;AAAA,IACJ,CAAA;AAAA;AAAA;AAAA;AAAA,IAIA,CAAC,IAAA,EAAM,aAAA,EAAe,eAAA,EAAiB,gBAAA,EAAkB,oBAAoB,KAAK;AAAA,GACtF;AAEA,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAC,CAAA,EAAW,GAAA,KAAuC;AAC5E,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA;AACvB,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,EAAG;AAC/B,MAAA,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAC3B;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,CAAC,CAAA,KAAc;AAC1C,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAC,CAAA;AACrB,IAAA,QAAA,CAAS,UAAU,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,MAAM,CAAC,CAAA;AAAA,EAC7D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,CAAC,MAAA,EAAgB,SAAA,KAAsB;AACjE,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACpB,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,GAAA,KAAQ,EAAA,GAAK,CAAA,GAAI,GAAA;AAC/B,IAAA,MAAM,MAAM,KAAA,CAAM,MAAA;AAClB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAA,CAAO,KAAA,GAAQ,MAAA,GAAS,OAAO,GAAG,CAAA;AAC/C,IAAA,IAAI,CAAC,IAAA,EAAM;AACP,MAAA;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG,SAAS,KAAA,IAAQ;AAAA,EAC7C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,CAAC,IAAA,KAA2B;AACtD,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACpB,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,MAAA,GAAS,SAAS,OAAA,GAAU,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACnE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACT,MAAA;AAAA,IACJ;AACA,IAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG,SAAS,KAAA,IAAQ;AAAA,EAC/C,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAW,OAAA;AAAA,IACb,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,QAAQ,QAAA,EAAU,UAAA,EAAY,WAAW,SAAA,EAAU,CAAA;AAAA,IAC5E,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ,QAAA,EAAU,UAAA,EAAY,WAAW,SAAS;AAAA,GACvE;AAEA,EAAA,uBACI,GAAA,CAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,OAAO,QAAA,EAC9B,QAAA,kBAAA,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACI,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,MAC1C,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,SAAS,CAAA;AAAA,MAC1C,KAAA,EAAO,EAAE,aAAA,EAAe,QAAA,EAAU,OAAO,MAAA,EAAO;AAAA,MAE/C;AAAA;AAAA,GACL,EACJ,CAAA;AAER,CAAA,EAjHsB,eAAA,CAAA;AA6HtB,IAAM,SAAA,GAAuB;AAAA,EACzB,iBAAA,EAAmB,CAAA;AAAA,EACnB,aAAA,EAAe;AACnB,CAAA;AAIA,IAAM,mBAAA,GAAiC;AAAA,EACnC,SAAA,EAAW,EAAA;AAAA;AAAA,EACX,aAAA,EAAe,KAAA;AAAA,EACf,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB;AACpB,CAAA;AAEA,IAAM,yBAAA,GAAuC;AAAA;AAE7C,CAAA;AAGO,IAAM,aAAA,2BAAiB,EAAE,KAAA,EAAO,WAAW,KAAA,EAAO,QAAA,EAAU,SAAA,EAAW,MAAA,EAAO,KAA0B;AAC3G,EAAA,MAAM,GAAA,GAAM,oBAAoB,gBAAgB,CAAA;AAChD,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA;AAE7B,EAAA,MAAM,OAAA,GAAU,OAAA;AAAA,IACZ,OAAO;AAAA,MACH,KAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,EAAW,CAAA,EAAG,GAAA,CAAI,MAAM,YAAY,KAAK,CAAA,CAAA;AAAA,MACzC,SAAA,EAAW,CAAA,EAAG,GAAA,CAAI,MAAM,YAAY,KAAK,CAAA;AAAA,KAC7C,CAAA;AAAA,IACA,CAAC,KAAA,EAAO,IAAA,EAAM,QAAA,EAAU,IAAI,MAAM;AAAA,GACtC;AAEA,EAAA,uBACI,GAAA,CAAC,oBAAA,CAAqB,QAAA,EAArB,EAA8B,OAAO,OAAA,EAClC,QAAA,kBAAA,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACI,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,MAC1C,SAAA,EAAW,EAAA,CAAG,kDAAA,EAAoD,SAAS,CAAA;AAAA,MAC3E,KAAA,EAAO,CAAC,SAAA,EAAW,EAAE,mBAAmB,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,OAAA,EAAS,CAAA;AAAA,MAEvE;AAAA;AAAA,GACL,EACJ,CAAA;AAER,CAAA,EA3B6B,eAAA,CAAA;AAwCtB,IAAM,mCAAmB,MAAA,CAAA,CAAC,EAAE,QAAA,EAAU,SAAA,EAAW,QAAO,KAA6B;AACxF,EAAA,MAAM,GAAA,GAAM,oBAAoB,mBAAmB,CAAA;AACnD,EAAA,MAAM,IAAA,GAAO,wBAAwB,mBAAmB,CAAA;AACxD,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,MAAA,GAAS,OAA2B,IAAI,CAAA;AAC9C,EAAA,MAAM,YAAA,GAA0B;AAAA,IAC5B,GAAG,mBAAA;AAAA,IACH,iBAAA,EAAmB,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IACzC,eAAA,EAAiB,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IACvC,GAAA,EAAK,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC;AAAA,GAC/B;AAEA,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA;AAC/B,IAAA,OAAO,MAAM,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,GAAA,EAAK,IAAA,CAAK,KAAK,CAAC,CAAA;AAEpB,EAAA,MAAM,OAAA,GAAU,YAAY,MAAM;AAC9B,IAAA,IAAI,KAAK,QAAA,EAAU;AACf,MAAA;AAAA,IACJ;AACA,IAAA,GAAA,CAAI,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,EACzB,GAAG,CAAC,GAAA,EAAK,KAAK,KAAA,EAAO,IAAA,CAAK,QAAQ,CAAC,CAAA;AAEnC,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IAClB,CAAC,KAAA,KAAsC;AACnC,MAAA,QAAQ,MAAM,GAAA;AAAK,QACf,KAAK,WAAA;AACD,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA;AAC3B,UAAA;AAAA,QACJ,KAAK,SAAA;AACD,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,GAAA,CAAI,SAAA,CAAU,EAAA,EAAI,IAAA,CAAK,KAAK,CAAA;AAC5B,UAAA;AAAA,QACJ,KAAK,MAAA;AACD,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,GAAA,CAAI,UAAU,OAAO,CAAA;AACrB,UAAA;AAAA,QACJ,KAAK,KAAA;AACD,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,GAAA,CAAI,UAAU,MAAM,CAAA;AACpB,UAAA;AAAA,QACJ,KAAK,OAAA;AAAA,QACL,KAAK,GAAA,EAAK;AACN,UAAA,KAAA,CAAM,cAAA,EAAe;AACrB,UAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAChB,YAAA,GAAA,CAAI,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,UACzB;AACA,UAAA;AAAA,QACJ;AAAA;AACJ,IACJ,CAAA;AAAA,IACA,CAAC,GAAA,EAAK,IAAA,CAAK,KAAA,EAAO,KAAK,QAAQ;AAAA,GACnC;AAOA,EAAA,MAAM,YAAA,GACF,QAAA,CAAS,EAAA,KAAO,KAAA,GACT;AAAA,IACG,UAAA,EAAY,sBAAA;AAAA,IACZ,SAAA,EAAW,CAAA,OAAA,EAAU,IAAA,CAAK,IAAA,GAAO,MAAM,CAAC,CAAA,IAAA;AAAA,GAC5C,GACC,EAAE,SAAA,EAAW,CAAC,EAAE,MAAA,EAAQ,IAAA,CAAK,IAAA,GAAO,QAAA,GAAW,MAAA,EAAQ,CAAA,EAAE;AAEpE,EAAA,MAAM,YAAA,GAAwC;AAAA,IAC1C,GAAA,0BAAM,IAAA,KAA6B;AAC/B,MAAA,MAAA,CAAO,OAAA,GAAU,IAAA;AAAA,IACrB,CAAA,EAFK,KAAA,CAAA;AAAA,IAGL,IAAA,EAAM,QAAA;AAAA,IACN,iBAAA,EAAmB,QAAA;AAAA,IACnB,iBAAiB,IAAA,CAAK,IAAA;AAAA,IACtB,iBAAiB,IAAA,CAAK,SAAA;AAAA,IACtB,eAAA,EAAiB,KAAK,QAAA,IAAY,MAAA;AAAA,IAClC,IAAI,IAAA,CAAK,SAAA;AAAA;AAAA;AAAA,IAGT,QAAA,EAAU,CAAA;AAAA,IACV,OAAA;AAAA,IACA,SAAA,EAAW,aAAA;AAAA,IACX,GAAI,IAAA,CAAK,QAAA,GAAW,EAAE,QAAA,EAAU,IAAA,KAAS,EAAC;AAAA,IAC1C,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW;AAAC,GAC7C;AAEA,EAAA,uBACI,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACI,GAAG,YAAA;AAAA,MACJ,SAAA,EAAW,EAAA;AAAA,QACP,wGAAA;AAAA,QACA,IAAA,CAAK,WAAW,YAAA,GAAe,aAAA;AAAA,QAC/B;AAAA,OACJ;AAAA,MACA,KAAA,EAAO,CAAC,YAAA,EAAc,IAAA,CAAK,WAAW,EAAE,OAAA,EAAS,GAAA,EAAI,GAAI,IAAI,CAAA;AAAA,MAE5D,QAAA,EAAA;AAAA,QAAA,OAAO,aAAa,QAAA,mBACjB,GAAA;AAAA,UAACA,IAAA;AAAA,UAAA;AAAA,YACG,KAAA,EAAO;AAAA,cACH,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,OAAA;AAAA,cAC5B,UAAA,EAAY,OAAO,UAAA,CAAW,IAAA;AAAA,cAC9B,QAAA,EAAU,EAAA,CAAG,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,cAC/B,UAAA,EAAY,OAAO,UAAA,CAAW,MAAA;AAAA,cAC9B,UAAA,EAAY;AAAA,aAChB;AAAA,YAEC;AAAA;AAAA,SACL,GAEA,QAAA;AAAA,4BAEH,IAAA,EAAA,EAAK,aAAA,EAAa,IAAA,EAAM,KAAA,EAAO,cAC5B,QAAA,kBAAA,GAAA,CAAC,oBAAA,CAAqB,WAAA,EAArB,EAAiC,MAAM,EAAA,EAAI,KAAA,EAAO,OAAO,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA,EACnF;AAAA;AAAA;AAAA,GACJ;AAER,CAAA,EAtHgC,kBAAA,CAAA;AAsIhC,IAAM,0BAAA,GAA6B,GAAA;AAkB5B,IAAM,mCAAmB,MAAA,CAAA,CAAC;AAAA,EAC7B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAY,WAAA,GAAc;AAC9B,CAAA,KAA6B;AACzB,EAAA,MAAM,IAAA,GAAO,wBAAwB,mBAAmB,CAAA;AACxD,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,UAAA,GAAa,OAA2B,IAAI,CAAA;AAClD,EAAA,MAAM,QAAA,GAAW,OAA2B,IAAI,CAAA;AAIhD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAwB,IAAI,CAAA;AACxE,EAAA,MAAM,UAAA,GAAwB;AAAA,IAC1B,GAAG,yBAAA;AAAA,IACH,iBAAA,EAAmB,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IACzC,UAAA,EAAY,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IAClC,aAAA,EAAe,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC;AAAA,GACzC;AAQA,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACvB,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,KAAA,EAAO;AACpB,MAAA;AAAA,IACJ;AAKA,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,CAAQ,WAAA,KAAgB,GAAA;AACrD,IAAA,OAAA,CAAQ,QAAQ,WAAA,GAAc,GAAA;AAE9B,IAAA,OAAA,CAAQ,MAAM,QAAA,GAAW,QAAA;AACzB,IAAA,OAAA,CAAQ,MAAM,kBAAA,GAAqB,qBAAA;AACnC,IAAA,OAAA,CAAQ,KAAA,CAAM,kBAAA,GAAqB,CAAA,EAAG,0BAA0B,CAAA,EAAA,CAAA;AAChE,IAAA,OAAA,CAAQ,MAAM,wBAAA,GAA2B,+BAAA;AAEzC,IAAA,IAAI,KAAK,IAAA,EAAM;AACX,MAAA,MAAM,SAAS,KAAA,CAAM,YAAA;AACrB,MAAA,IAAI,YAAA,EAAc;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,SAAA,GAAY,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA;AACnC,QAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AACxB,QAAA;AAAA,MACJ;AAEA,MAAA,OAAA,CAAQ,MAAM,SAAA,GAAY,KAAA;AAC1B,MAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AAIxB,MAAA,KAAK,OAAA,CAAQ,YAAA;AACb,MAAA,qBAAA,CAAsB,MAAM;AACxB,QAAA,OAAA,CAAQ,KAAA,CAAM,SAAA,GAAY,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA;AACnC,QAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AAAA,MAC5B,CAAC,CAAA;AAAA,IACL,CAAA,MAAO;AAIH,MAAA,MAAM,UAAU,KAAA,CAAM,YAAA;AACtB,MAAA,OAAA,CAAQ,KAAA,CAAM,SAAA,GAAY,CAAA,EAAG,OAAO,CAAA,EAAA,CAAA;AACpC,MAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AACxB,MAAA,KAAK,OAAA,CAAQ,YAAA;AACb,MAAA,qBAAA,CAAsB,MAAM;AACxB,QAAA,OAAA,CAAQ,MAAM,SAAA,GAAY,KAAA;AAC1B,QAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AAAA,MAC5B,CAAC,CAAA;AAAA,IACL;AAAA,EACJ,CAAA,EAAG,CAAC,IAAA,CAAK,IAAI,CAAC,CAAA;AAWd,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,IAAA,GAAQ,cAAA,IAAkB,CAAA,GAAK,CAAA;AACzD,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,IAAA,GAAO,CAAA,GAAI,CAAA;AACtC,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,QAAA,EAAU,YAAA,EAAc;AAAA,IACzD,QAAA,EAAU;AAAA,GACb,CAAA;AACD,EAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,SAAA,EAAW,aAAA,EAAe;AAAA,IAC5D,QAAA,EAAU;AAAA,GACb,CAAA;AAED,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IAClB,CAAC,CAAA,KAAyB;AACtB,MAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACvB,QAAA;AAAA,MACJ;AACA,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,WAAA,CAAY,MAAA,CAAO,MAAA;AAClC,MAAA,IAAI,IAAA,GAAO,CAAA,IAAK,IAAA,KAAS,cAAA,EAAgB;AACrC,QAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,MAC1B;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,cAAc;AAAA,GACnB;AASA,EAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACvB,IAAA,MAAM,oBAAA,GAAkC;AAAA,MACpC,QAAA,EAAU;AAAA,KACd;AAIA,IAAA,IAAI,mBAAmB,IAAA,EAAM;AACzB,MAAA,uBACI,GAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACI,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,UAC1C,iBAAA,EAAkB,MAAA;AAAA,UAClB,mBAAiB,IAAA,CAAK,SAAA;AAAA,UACtB,aAAA,EAAa,CAAC,IAAA,CAAK,IAAA;AAAA,UACnB,OAAO,CAAC,oBAAA,EAAsB,EAAE,MAAA,EAAQ,GAAG,CAAA;AAAA,UAC3C,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,SAAS,CAAA;AAAA,UAE1C,QAAA,kBAAA,GAAA;AAAA,YAAC,IAAA;AAAA,YAAA;AAAA,cACG,QAAA,EAAU,aAAA;AAAA,cACV,SAAA,EAAW,GAAG,gBAAgB,CAAA;AAAA,cAM9B,KAAA,EAAO,CAAC,UAAA,EAAY,EAAE,QAAA,EAAU,UAAA,EAAY,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,CAAA;AAAA,cAE1E,QAAA,EAAA,OAAO,aAAa,QAAA,mBACjB,GAAA;AAAA,gBAACA,IAAA;AAAA,gBAAA;AAAA,kBACG,KAAA,EAAO;AAAA,oBACH,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,KAAA;AAAA,oBAC5B,UAAA,EAAY,OAAO,UAAA,CAAW,IAAA;AAAA,oBAC9B,QAAA,EAAU,EAAA,CAAG,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,oBAC/B,UAAA,EAAY,GAAG,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,MAAM;AAAA,mBACxE;AAAA,kBAEC;AAAA;AAAA,eACL,GAEA;AAAA;AAAA;AAER;AAAA,OACJ;AAAA,IAER;AACA,IAAA,uBACI,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACI,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,QAC1C,iBAAA,EAAkB,MAAA;AAAA,QAClB,mBAAiB,IAAA,CAAK,SAAA;AAAA,QACtB,aAAA,EAAa,CAAC,IAAA,CAAK,IAAA;AAAA,QACnB,KAAA,EAAO,CAAC,oBAAA,EAAsB,UAAoB,CAAA;AAAA,QAClD,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,SAAS,CAAA;AAAA,QAE1C,QAAA,kBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAO,WAAA,EAUjB,8BAAC,IAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,gBAAgB,CAAA,EAAG,KAAA,EAAO,UAAA,EACzC,QAAA,EAAA,OAAO,aAAa,QAAA,mBACjB,GAAA;AAAA,UAACA,IAAA;AAAA,UAAA;AAAA,YACG,KAAA,EAAO;AAAA,cACH,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,KAAA;AAAA,cAC5B,UAAA,EAAY,OAAO,UAAA,CAAW,IAAA;AAAA,cAC9B,QAAA,EAAU,EAAA,CAAG,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,cAC/B,UAAA,EAAY,GAAG,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,MAAM;AAAA,aACxE;AAAA,YAEC;AAAA;AAAA,SACL,GAEA,UAER,CAAA,EACJ;AAAA;AAAA,KACJ;AAAA,EAER;AAEA,EAAA,uBACI,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACG,GAAA,EAAK,CAAC,IAAA,KAAkB;AACpB,QAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,MACzB,CAAA;AAAA,MACC,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,MAC1C,IAAA,EAAK,QAAA;AAAA,MACL,iBAAA,EAAkB,MAAA;AAAA,MAClB,IAAI,IAAA,CAAK,SAAA;AAAA,MACT,mBAAiB,IAAA,CAAK,SAAA;AAAA,MACtB,aAAA,EAAa,CAAC,IAAA,CAAK,IAAA;AAAA,MACnB,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,SAAS,CAAA;AAAA,MAE1C,QAAA,kBAAA,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UACG,GAAA,EAAK,CAAC,IAAA,KAAkB;AACpB,YAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,UACvB,CAAA;AAAA,UACA,SAAA,EAAW,GAAG,gBAAgB,CAAA;AAAA,UAC9B,KAAA,EAAO,UAAA;AAAA,UAEN,QAAA,EAAA,OAAO,aAAa,QAAA,mBACjB,GAAA;AAAA,YAACA,IAAA;AAAA,YAAA;AAAA,cACG,KAAA,EAAO;AAAA,gBACH,KAAA,EAAO,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,KAAA;AAAA,gBAC5B,UAAA,EAAY,OAAO,UAAA,CAAW,IAAA;AAAA,gBAC9B,QAAA,EAAU,EAAA,CAAG,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,gBAC/B,UAAA,EAAY,GAAG,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,MAAM;AAAA,eACxE;AAAA,cAEC;AAAA;AAAA,WACL,GAEA;AAAA;AAAA;AAER;AAAA,GACJ;AAER,CAAA,EAjPgC,kBAAA,CAAA;AAyPzB,IAAM,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,aAAA,EAAe;AAAA,EAClD,IAAA,EAAM,aAAA;AAAA,EACN,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS;AACb,CAAC","file":"chunk-3QQXYL5L.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { LayoutChangeEvent, ViewStyle } from 'react-native';\nimport { Platform, Pressable, Text as RNText, View } from 'react-native';\nimport { AnimatedView } from '../../animation/animated-view';\nimport { useAnimatedNumber } from '../../animation/use-animated-number';\nimport { defaultSemanticIcons } from '../../icons/default-semantic-icons';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type AccordionType = 'single' | 'multiple';\n\ntype SingleProps = {\n /** One-at-a-time mode. */\n type: 'single';\n /** Controlled open value. Pass `null` (with `collapsible`) for \"nothing open\". */\n value?: string | null;\n /** Uncontrolled initial open value. */\n defaultValue?: string;\n /** Fires when the open value changes. Receives the new value (string), or `null` if collapsed. */\n onChange?: (next: string | null) => void;\n /** Allow closing the open item by clicking it again. @defaultValue false */\n collapsible?: boolean;\n};\n\ntype MultipleProps = {\n /** Any combination open. */\n type: 'multiple';\n /** Controlled list of open values. */\n value?: string[];\n /** Uncontrolled initial list of open values. */\n defaultValue?: string[];\n /** Fires when the open list changes. Receives the new list. */\n onChange?: (next: string[]) => void;\n /** No-op in `multiple` mode (items are always individually collapsible). */\n collapsible?: never;\n};\n\ntype CommonProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nexport type AccordionProps = (SingleProps | MultipleProps) & CommonProps;\n\ntype AccordionContextValue = {\n baseId: string;\n isOpen: (value: string) => boolean;\n toggle: (value: string) => void;\n register: (value: string, ref: RefObject<HTMLElement | null>) => void;\n unregister: (value: string) => void;\n moveFocus: (offset: 1 | -1, fromValue: string) => void;\n focusEdge: (edge: 'first' | 'last') => void;\n};\n\nconst AccordionContext = createContext<AccordionContextValue | null>(null);\n\nconst useAccordionContext = (label: string): AccordionContextValue => {\n const ctx = useContext(AccordionContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside an <Accordion>.`);\n }\n return ctx;\n};\n\ntype AccordionItemContextValue = {\n value: string;\n open: boolean;\n disabled: boolean;\n triggerId: string;\n contentId: string;\n};\n\nconst AccordionItemContext = createContext<AccordionItemContextValue | null>(null);\n\nconst useAccordionItemContext = (label: string): AccordionItemContextValue => {\n const ctx = useContext(AccordionItemContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside an <Accordion.Item>.`);\n }\n return ctx;\n};\n\n/**\n * Vertically stacked, individually expandable sections. Compose:\n *\n * <Accordion type=\"single\" defaultValue=\"overview\" collapsible>\n * <Accordion.Item value=\"overview\">\n * <Accordion.Trigger>Overview</Accordion.Trigger>\n * <Accordion.Content>...</Accordion.Content>\n * </Accordion.Item>\n * </Accordion>\n *\n * Modes:\n * - `single` — at most one item open. Pass `collapsible` to allow closing the\n * open item.\n * - `multiple` — any combination open. `value` / `defaultValue` are arrays.\n *\n * Controlled (`value` + `onChange`) and uncontrolled (`defaultValue`) both\n * supported. Triggers are real `<button>`s with full keyboard nav: ArrowDown /\n * ArrowUp move focus, Home / End jump to first / last, Enter / Space toggle.\n */\nconst AccordionRoot = (props: AccordionProps) => {\n const baseId = useId();\n const refs = useRef<Map<string, RefObject<HTMLElement | null>>>(new Map());\n const orderRef = useRef<string[]>([]);\n\n // Pull out the props we always need; the discriminated union handlers below\n // narrow on `type` for the actual state logic.\n const { type, children, className, testID } = props;\n\n // Single-mode internal state. We always allocate both state slots so the\n // hook order stays stable across re-renders regardless of `type`.\n const [singleInner, setSingleInner] = useState<string | null>(\n type === 'single' ? (props.defaultValue ?? null) : null\n );\n const [multipleInner, setMultipleInner] = useState<string[]>(type === 'multiple' ? (props.defaultValue ?? []) : []);\n\n const singleControlled = type === 'single' && props.value !== undefined;\n const multipleControlled = type === 'multiple' && props.value !== undefined;\n\n const singleCurrent = type === 'single' ? (singleControlled ? (props.value ?? null) : singleInner) : null;\n const multipleCurrent = type === 'multiple' ? (multipleControlled ? (props.value ?? []) : multipleInner) : [];\n\n const isOpen = useCallback(\n (v: string) => {\n if (type === 'single') {\n return singleCurrent === v;\n }\n return multipleCurrent.includes(v);\n },\n [type, singleCurrent, multipleCurrent]\n );\n\n const toggle = useCallback(\n (v: string) => {\n if (type === 'single') {\n const next = singleCurrent === v ? (props.collapsible ? null : singleCurrent) : v;\n if (next === singleCurrent) {\n return;\n }\n if (!singleControlled) {\n setSingleInner(next);\n }\n props.onChange?.(next);\n } else {\n const has = multipleCurrent.includes(v);\n const next = has ? multipleCurrent.filter((x) => x !== v) : [...multipleCurrent, v];\n if (!multipleControlled) {\n setMultipleInner(next);\n }\n props.onChange?.(next);\n }\n },\n // The handler needs the latest snapshot of every prop — `props` is a\n // discriminated union so spreading it into the deps is the cleanest\n // way to keep both branches honest.\n [type, singleCurrent, multipleCurrent, singleControlled, multipleControlled, props]\n );\n\n const register = useCallback((v: string, ref: RefObject<HTMLElement | null>) => {\n refs.current.set(v, ref);\n if (!orderRef.current.includes(v)) {\n orderRef.current.push(v);\n }\n }, []);\n\n const unregister = useCallback((v: string) => {\n refs.current.delete(v);\n orderRef.current = orderRef.current.filter((x) => x !== v);\n }, []);\n\n const moveFocus = useCallback((offset: 1 | -1, fromValue: string) => {\n const order = orderRef.current;\n if (order.length === 0) {\n return;\n }\n const idx = order.indexOf(fromValue);\n const start = idx === -1 ? 0 : idx;\n const len = order.length;\n const next = order[(start + offset + len) % len];\n if (!next) {\n return;\n }\n refs.current.get(next)?.current?.focus?.();\n }, []);\n\n const focusEdge = useCallback((edge: 'first' | 'last') => {\n const order = orderRef.current;\n if (order.length === 0) {\n return;\n }\n const target = edge === 'first' ? order[0] : order[order.length - 1];\n if (!target) {\n return;\n }\n refs.current.get(target)?.current?.focus?.();\n }, []);\n\n const ctxValue = useMemo<AccordionContextValue>(\n () => ({ baseId, isOpen, toggle, register, unregister, moveFocus, focusEdge }),\n [baseId, isOpen, toggle, register, unregister, moveFocus, focusEdge]\n );\n\n return (\n <AccordionContext.Provider value={ctxValue}>\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn('flex-col w-full', className)}\n style={{ flexDirection: 'column', width: '100%' }}\n >\n {children}\n </View>\n </AccordionContext.Provider>\n );\n};\n\nexport type AccordionItemProps = {\n /** Stable identifier — links the item to `value` / `defaultValue` on the parent. */\n value: string;\n /** Disable expansion of this item. The trigger remains focusable for nav consistency. */\n disabled?: boolean;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nconst ITEM_BASE: ViewStyle = {\n borderBottomWidth: 1,\n flexDirection: 'column',\n};\n\n// Layout-only constants for the trigger / content; theme-driven sizes are\n// merged in inside the component below.\nconst TRIGGER_LAYOUT_BASE: ViewStyle = {\n minHeight: 44, // component-density literal — not from theme\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n};\n\nconst CONTENT_INNER_LAYOUT_BASE: ViewStyle = {\n // Padding values come from theme inside AccordionContent.\n};\n\n/** A single expandable section. Wraps an `Accordion.Trigger` and `Accordion.Content`. */\nexport const AccordionItem = ({ value, disabled = false, children, className, testID }: AccordionItemProps) => {\n const ctx = useAccordionContext('Accordion.Item');\n const colors = useThemeColors();\n const open = ctx.isOpen(value);\n\n const itemCtx = useMemo<AccordionItemContextValue>(\n () => ({\n value,\n open,\n disabled,\n triggerId: `${ctx.baseId}-trigger-${value}`,\n contentId: `${ctx.baseId}-content-${value}`,\n }),\n [value, open, disabled, ctx.baseId]\n );\n\n return (\n <AccordionItemContext.Provider value={itemCtx}>\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn('flex-col border-b border-semantic-border-default', className)}\n style={[ITEM_BASE, { borderBottomColor: colors.semantic.border.default }]}\n >\n {children}\n </View>\n </AccordionItemContext.Provider>\n );\n};\n\nexport type AccordionTriggerProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * The clickable row that toggles its item open / closed. Renders a real\n * `<button>` (via Pressable) and wires `aria-expanded` + `aria-controls` to\n * the matching `Accordion.Content`.\n */\nexport const AccordionTrigger = ({ children, className, testID }: AccordionTriggerProps) => {\n const ctx = useAccordionContext('Accordion.Trigger');\n const item = useAccordionItemContext('Accordion.Trigger');\n const colors = useThemeColors();\n const ownRef = useRef<HTMLElement | null>(null);\n const triggerStyle: ViewStyle = {\n ...TRIGGER_LAYOUT_BASE,\n paddingHorizontal: px(colors.spacing['4']),\n paddingVertical: px(colors.spacing['3']),\n gap: px(colors.spacing['3']),\n };\n\n useEffect(() => {\n ctx.register(item.value, ownRef);\n return () => ctx.unregister(item.value);\n }, [ctx, item.value]);\n\n const onPress = useCallback(() => {\n if (item.disabled) {\n return;\n }\n ctx.toggle(item.value);\n }, [ctx, item.value, item.disabled]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n ctx.moveFocus(1, item.value);\n return;\n case 'ArrowUp':\n event.preventDefault();\n ctx.moveFocus(-1, item.value);\n return;\n case 'Home':\n event.preventDefault();\n ctx.focusEdge('first');\n return;\n case 'End':\n event.preventDefault();\n ctx.focusEdge('last');\n return;\n case 'Enter':\n case ' ': {\n event.preventDefault();\n if (!item.disabled) {\n ctx.toggle(item.value);\n }\n return;\n }\n }\n },\n [ctx, item.value, item.disabled]\n );\n\n // CSS transition for the chevron rotation on web. On native, RN expects\n // an array of transform objects (`[{ rotate: '180deg' }]`), so we branch\n // by platform to keep both ends rendering correctly. The web branch also\n // adds a CSS transition for a smooth rotation; native snaps (consumers\n // who want a spring can compose their own).\n const chevronStyle =\n Platform.OS === 'web'\n ? ({\n transition: 'transform 200ms ease',\n transform: `rotate(${item.open ? 180 : 0}deg)`,\n } as unknown as ViewStyle)\n : ({ transform: [{ rotate: item.open ? '180deg' : '0deg' }] } as ViewStyle);\n\n const triggerProps: Record<string, unknown> = {\n ref: (node: HTMLElement | null) => {\n ownRef.current = node;\n },\n role: 'button',\n accessibilityRole: 'button',\n 'aria-expanded': item.open,\n 'aria-controls': item.contentId,\n 'aria-disabled': item.disabled || undefined,\n id: item.triggerId,\n // Every trigger sits in the tab order — pressing Tab moves through\n // the accordion sequentially, then arrow keys take over once focused.\n tabIndex: 0,\n onPress,\n onKeyDown: handleKeyDown,\n ...(item.disabled ? { disabled: true } : {}),\n ...(testID !== undefined ? { testID } : {}),\n };\n\n return (\n <Pressable\n {...triggerProps}\n className={cn(\n 'flex-row items-center justify-between gap-3 px-4 py-3 min-h-[44px] hover:bg-semantic-background-subtle',\n item.disabled ? 'opacity-50' : 'opacity-100',\n className\n )}\n style={[triggerStyle, item.disabled ? { opacity: 0.5 } : null]}\n >\n {typeof children === 'string' ? (\n <RNText\n style={{\n color: colors.semantic.text.default,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n fontWeight: colors.fontWeight.medium as '500',\n flexShrink: 1,\n }}\n >\n {children}\n </RNText>\n ) : (\n children\n )}\n <View aria-hidden={true} style={chevronStyle}>\n <defaultSemanticIcons.chevronDown size={18} color={colors.semantic.text.muted} />\n </View>\n </Pressable>\n );\n};\n\nexport type AccordionContentProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n /**\n * Keep the content mounted even when collapsed. Useful for forms that\n * shouldn't lose state, or content that's expensive to mount.\n * @defaultValue false\n */\n forceMount?: boolean;\n};\n\n// Animation timing — mirrors the Switch slide and the web CSS\n// transition exactly so the accordion feels identical on web and native.\nconst ACCORDION_ANIM_DURATION_MS = 200;\n\n/**\n * The collapsible body. On web it always mounts but slides open / closed\n * via an animated max-height + opacity transition (200ms ease). On native\n * it mounts in a measure-pass on first render to capture the natural\n * content height, then animates `height` + `opacity` via the shared\n * `useAnimatedNumber` primitive (200ms, cubic-bezier(0.16, 1, 0.3, 1) —\n * matches the Switch thumb slide).\n *\n * Implementation note: the web-side height + transition styles are pushed\n * onto the outer wrapper's DOM node via a ref + useEffect rather than\n * through the View's `style` prop. Reason: rn-web's style filter drops\n * keys it doesn't recognise as RN style props (`transition`, `maxHeight`\n * shorthand, etc.), taking the whole fragment with them. Direct DOM\n * mutation bypasses that filter — same trick used by Dialog's backdrop\n * blur.\n */\nexport const AccordionContent = ({\n children,\n className,\n testID,\n forceMount: _forceMount = false,\n}: AccordionContentProps) => {\n const item = useAccordionItemContext('Accordion.Content');\n const colors = useThemeColors();\n const wrapperRef = useRef<HTMLElement | null>(null);\n const innerRef = useRef<HTMLElement | null>(null);\n // Natural (open-state) height of the content, captured on first\n // layout. Re-captured if the layout reports a different size while\n // open (e.g. dynamic content).\n const [measuredHeight, setMeasuredHeight] = useState<number | null>(null);\n const innerStyle: ViewStyle = {\n ...CONTENT_INNER_LAYOUT_BASE,\n paddingHorizontal: px(colors.spacing['4']),\n paddingTop: px(colors.spacing['1']),\n paddingBottom: px(colors.spacing['3']),\n };\n\n // Slide open/close on web. We measure the natural height of the inner\n // content each time the open state flips, then animate the wrapper's\n // maxHeight to/from 0. Setting maxHeight: 'none' after the transition\n // would let the content grow if it later changes — but for the v0\n // accordion we expect static content, so we leave maxHeight at the\n // measured value (good enough; resize observer can come later).\n useEffect(() => {\n if (Platform.OS !== 'web') {\n return;\n }\n const wrapper = wrapperRef.current;\n const inner = innerRef.current;\n if (!wrapper || !inner) {\n return;\n }\n\n // First-render shortcut: skip the animation when an item starts\n // already open (avoids the \"all items open then animate closed\"\n // flash on mount).\n const isFirstPaint = wrapper.dataset.noriPainted !== '1';\n wrapper.dataset.noriPainted = '1';\n\n wrapper.style.overflow = 'hidden';\n wrapper.style.transitionProperty = 'max-height, opacity';\n wrapper.style.transitionDuration = `${ACCORDION_ANIM_DURATION_MS}ms`;\n wrapper.style.transitionTimingFunction = 'cubic-bezier(0.16, 1, 0.3, 1)';\n\n if (item.open) {\n const target = inner.scrollHeight;\n if (isFirstPaint) {\n wrapper.style.maxHeight = `${target}px`;\n wrapper.style.opacity = '1';\n return;\n }\n // Animate from current measured 0px to the target height.\n wrapper.style.maxHeight = '0px';\n wrapper.style.opacity = '0';\n // Force a reflow so the start state actually applies before\n // we set the end state — otherwise the browser collapses\n // both into a single repaint and skips the animation.\n void wrapper.offsetHeight;\n requestAnimationFrame(() => {\n wrapper.style.maxHeight = `${target}px`;\n wrapper.style.opacity = '1';\n });\n } else {\n // Going from open → closed. Set the explicit current height\n // first so we have something to transition FROM (auto/none\n // doesn't transition).\n const current = inner.scrollHeight;\n wrapper.style.maxHeight = `${current}px`;\n wrapper.style.opacity = '1';\n void wrapper.offsetHeight;\n requestAnimationFrame(() => {\n wrapper.style.maxHeight = '0px';\n wrapper.style.opacity = '0';\n });\n }\n }, [item.open]);\n\n // Native height + opacity animation. Driven by `useAnimatedNumber`,\n // which dispatches per-property to a static-key reanimated worklet\n // (the plugin can't serialize closures over computed keys, so each\n // property gets its own static-key useAnimatedStyle inside the hook).\n //\n // Target values are derived from open + measured size. Before\n // measurement we still call the hooks (hook order must stay\n // stable); they animate to/from 0 which becomes a no-op until the\n // first onLayout fires.\n const targetHeight = item.open ? (measuredHeight ?? 0) : 0;\n const targetOpacity = item.open ? 1 : 0;\n const heightAnim = useAnimatedNumber('height', targetHeight, {\n duration: ACCORDION_ANIM_DURATION_MS,\n });\n const opacityAnim = useAnimatedNumber('opacity', targetOpacity, {\n duration: ACCORDION_ANIM_DURATION_MS,\n });\n\n const onInnerLayout = useCallback(\n (e: LayoutChangeEvent) => {\n if (Platform.OS === 'web') {\n return;\n }\n const next = e.nativeEvent.layout.height;\n if (next > 0 && next !== measuredHeight) {\n setMeasuredHeight(next);\n }\n },\n [measuredHeight]\n );\n\n // Native path: always mount the inner so we can measure its natural\n // height once. Before measurement, we render with `position:\n // absolute, opacity: 0` so the layout pass runs off-screen and\n // doesn't affect the surrounding flow (avoids the \"flash of fully-\n // open content\" on first paint of an initially-closed item).\n // After measurement, the outer Animated.View drives height +\n // opacity together.\n if (Platform.OS !== 'web') {\n const animatedWrapperStyle: ViewStyle = {\n overflow: 'hidden',\n };\n // Pre-measurement: render the inner off-screen for one layout\n // pass. The wrapper claims 0 height in the flow so the next\n // sibling is positioned correctly until we know the real size.\n if (measuredHeight === null) {\n return (\n <AnimatedView\n {...(testID !== undefined ? { testID } : {})}\n accessibilityRole=\"none\"\n aria-labelledby={item.triggerId}\n aria-hidden={!item.open}\n style={[animatedWrapperStyle, { height: 0 }]}\n className={cn('overflow-hidden', className)}\n >\n <View\n onLayout={onInnerLayout}\n className={cn('px-4 pt-1 pb-3')}\n // Absolute + left/right:0 stretches the measurement\n // pass to the parent's full width, so wrapping text\n // measures at its REAL natural height. Without\n // left/right, Yoga gives an absolute child width 0\n // and the measurement collapses to a few pixels.\n style={[innerStyle, { position: 'absolute', left: 0, right: 0, opacity: 0 }]}\n >\n {typeof children === 'string' ? (\n <RNText\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 children\n )}\n </View>\n </AnimatedView>\n );\n }\n return (\n <AnimatedView\n {...(testID !== undefined ? { testID } : {})}\n accessibilityRole=\"none\"\n aria-labelledby={item.triggerId}\n aria-hidden={!item.open}\n style={[animatedWrapperStyle, heightAnim as object]}\n className={cn('overflow-hidden', className)}\n >\n <AnimatedView style={opacityAnim as object}>\n {/* No `onLayout` on this inner — once we've captured\n the natural height in the measurement pass above,\n re-measuring here during the animation would see\n the CLIPPED height (the parent is mid-transition\n between 0 and the target) and clobber\n `measuredHeight` with that smaller value, freezing\n the open state at one line. Single-shot measurement\n is fine for static content; remeasuring on content\n change is a follow-up. */}\n <View className={cn('px-4 pt-1 pb-3')} style={innerStyle}>\n {typeof children === 'string' ? (\n <RNText\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 children\n )}\n </View>\n </AnimatedView>\n </AnimatedView>\n );\n }\n\n return (\n <View\n ref={(node: unknown) => {\n wrapperRef.current = node as HTMLElement | null;\n }}\n {...(testID !== undefined ? { testID } : {})}\n role=\"region\"\n accessibilityRole=\"none\"\n id={item.contentId}\n aria-labelledby={item.triggerId}\n aria-hidden={!item.open}\n className={cn('overflow-hidden', className)}\n >\n <View\n ref={(node: unknown) => {\n innerRef.current = node as HTMLElement | null;\n }}\n className={cn('px-4 pt-1 pb-3')}\n style={innerStyle}\n >\n {typeof children === 'string' ? (\n <RNText\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 children\n )}\n </View>\n </View>\n );\n};\n\n/**\n * Public `Accordion` value — the root function plus its `.Item`, `.Trigger`,\n * and `.Content` static members. `Object.assign` produces a value whose\n * inferred type carries the static properties, so `.d.ts` consumers can\n * write `<Accordion.Item>` without a separate import.\n */\nexport const Accordion = Object.assign(AccordionRoot, {\n Item: AccordionItem,\n Trigger: AccordionTrigger,\n Content: AccordionContent,\n});\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { px } from './chunk-5A2QOOVN.js';
|
|
2
|
-
import { useThemeColors } from './chunk-
|
|
2
|
+
import { useThemeColors } from './chunk-3W2O4OBL.js';
|
|
3
3
|
import { cn } from './chunk-CHXHRJNZ.js';
|
|
4
4
|
import { __name } from './chunk-WCQVDF3K.js';
|
|
5
5
|
import { useRef, useEffect } from 'react';
|
|
@@ -165,5 +165,5 @@ var Progress = /* @__PURE__ */ __name(({
|
|
|
165
165
|
}, "Progress");
|
|
166
166
|
|
|
167
167
|
export { Progress };
|
|
168
|
-
//# sourceMappingURL=chunk-
|
|
169
|
-
//# sourceMappingURL=chunk-
|
|
168
|
+
//# sourceMappingURL=chunk-3RNRVMNS.js.map
|
|
169
|
+
//# sourceMappingURL=chunk-3RNRVMNS.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Progress/Progress.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-OELY6K44.js","sourcesContent":["'use client';\n\nimport { useEffect, useRef } from 'react';\nimport { Animated, Easing, Text as RNText, View, type ViewStyle } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type ProgressTone = 'primary' | 'info' | 'success' | 'warning' | 'danger';\nexport type ProgressSize = 'sm' | 'md' | 'lg';\n\nexport type ProgressProps = {\n /**\n * Current progress value (`0..max`). Omit to render the indeterminate\n * marquee variant (use this when you don't know how long the work\n * will take, e.g. an initial load before headers come back).\n */\n value?: number;\n /** Upper bound for `value`. @defaultValue 100 */\n max?: number;\n /**\n * Color of the fill / shuttle. `primary` follows the theme's interactive\n * color (matches buttons + sliders); the rest map to semantic status colors.\n * @defaultValue 'primary'\n */\n tone?: ProgressTone;\n /**\n * Bar height — `sm` 4px, `md` 8px (default), `lg` 12px. The track is\n * always pill-shaped (border-radius = height/2).\n * @defaultValue 'md'\n */\n size?: ProgressSize;\n /**\n * Optional label rendered above the bar. When set, also enables a\n * percentage readout on the right side for determinate progress.\n */\n label?: string;\n /**\n * Hide the auto-rendered percentage when a `label` is provided. Useful\n * when the label itself already conveys the number (e.g. \"Step 3 of 5\").\n * @defaultValue false\n */\n hidePercentage?: boolean;\n /** Accessibility label when no visible `label` is provided. */\n 'aria-label'?: string;\n /** Reference to a labeling element by id. */\n 'aria-labelledby'?: string;\n className?: string;\n testID?: string;\n};\n\nconst SIZE_PX: Record<ProgressSize, number> = {\n sm: 4,\n md: 8,\n lg: 12,\n};\n\nconst INDETERMINATE_DURATION_MS = 1500;\nconst SHUTTLE_WIDTH_PCT = 30;\n\n/**\n * Linear progress indicator. Use the determinate form (`value` set) to\n * communicate \"we're 42% done\"; use the indeterminate form (`value`\n * omitted) for \"we're working, no ETA\". The track is always pill-shaped\n * and the fill animates smoothly between renders for the determinate\n * variant — keep updates throttled to ~10/s in the parent to avoid\n * jitter.\n *\n * Cross-platform: built on `View` + `Animated.View` so it renders\n * identically on web (rn-web) and native. Uses `useThemeColors()` to\n * pick up dark-mode flips automatically.\n *\n * Accessibility: maps to `role=\"progressbar\"` with `aria-valuemin`,\n * `aria-valuemax`, and (for determinate) `aria-valuenow`. Provide an\n * `aria-label`, `aria-labelledby`, or visible `label` so the bar is\n * named.\n */\nexport const Progress = ({\n value,\n max = 100,\n tone = 'primary',\n size = 'md',\n label,\n hidePercentage = false,\n className,\n testID,\n ...rest\n}: ProgressProps) => {\n const colors = useThemeColors();\n const ariaLabel = rest['aria-label'];\n const ariaLabelledBy = rest['aria-labelledby'];\n\n const isIndeterminate = value === undefined;\n const safeMax = max <= 0 ? 100 : max;\n const clamped = isIndeterminate ? 0 : Math.min(safeMax, Math.max(0, value));\n const pct = isIndeterminate ? 0 : (clamped / safeMax) * 100;\n\n const height = SIZE_PX[size];\n\n const fillColor =\n tone === 'primary'\n ? colors.semantic.interactive.primary\n : tone === 'success'\n ? colors.color.success\n : tone === 'warning'\n ? colors.color.warning\n : tone === 'danger'\n ? colors.color.danger\n : colors.color.info;\n\n // Indeterminate marquee — a 30%-wide shuttle that slides from -30% to\n // 100% on a continuous loop. Driven by `Animated.Value` (0..1) which we\n // interpolate to a percent string for `left`. ease-in-out keeps the\n // motion subtle so the bar never feels frantic.\n const shuttle = useRef(new Animated.Value(0)).current;\n useEffect(() => {\n if (!isIndeterminate) {\n return;\n }\n const loop = Animated.loop(\n Animated.timing(shuttle, {\n toValue: 1,\n duration: INDETERMINATE_DURATION_MS,\n easing: Easing.inOut(Easing.ease),\n // We animate `left` (a layout property), so the native driver\n // can't be used. Web (rn-web) ignores `useNativeDriver`.\n useNativeDriver: false,\n })\n );\n loop.start();\n return () => {\n loop.stop();\n };\n }, [isIndeterminate, shuttle]);\n\n const trackStyle: ViewStyle = {\n width: '100%',\n height,\n backgroundColor: colors.semantic.background.subtle,\n borderRadius: height / 2,\n overflow: 'hidden',\n position: 'relative',\n };\n\n const determinateFillStyle: ViewStyle = {\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n // Cast at the boundary — RN's typed DimensionValue is narrower than\n // the percentage strings rn-web actually accepts.\n width: `${pct}%` as unknown as number,\n backgroundColor: fillColor,\n borderRadius: height / 2,\n };\n\n // Build the indeterminate style only when needed — `Animated.Value.interpolate`\n // returns an animated node that RN reads at render; we keep the call inside\n // the branch so determinate renders never hit it (and so test envs that\n // stub `Animated.Value` don't choke on a missing `interpolate`).\n const buildIndeterminateStyle = () => {\n const left =\n typeof shuttle.interpolate === 'function'\n ? shuttle.interpolate({\n inputRange: [0, 1],\n outputRange: [`-${SHUTTLE_WIDTH_PCT}%`, '100%'],\n })\n : (`-${SHUTTLE_WIDTH_PCT}%` as unknown as number);\n return {\n position: 'absolute' as const,\n top: 0,\n bottom: 0,\n left: left as unknown as number,\n width: `${SHUTTLE_WIDTH_PCT}%` as unknown as number,\n backgroundColor: fillColor,\n borderRadius: height / 2,\n };\n };\n\n // ARIA: only emit aria-valuenow when determinate so AT announces\n // \"in progress\" rather than \"0%\" while indeterminate.\n const ariaProps: Record<string, unknown> = {\n role: 'progressbar',\n accessibilityRole: 'progressbar',\n 'aria-valuemin': 0,\n 'aria-valuemax': safeMax,\n };\n if (!isIndeterminate) {\n ariaProps['aria-valuenow'] = clamped;\n ariaProps.accessibilityValue = { min: 0, max: safeMax, now: clamped };\n }\n if (ariaLabel !== undefined) {\n ariaProps['aria-label'] = ariaLabel;\n ariaProps.accessibilityLabel = ariaLabel;\n } else if (label !== undefined) {\n ariaProps['aria-label'] = label;\n ariaProps.accessibilityLabel = label;\n }\n if (ariaLabelledBy !== undefined) {\n ariaProps['aria-labelledby'] = ariaLabelledBy;\n }\n\n const showHeader = label !== undefined;\n const showPercentage = showHeader && !hidePercentage && !isIndeterminate;\n\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn('w-full', className)}\n style={{ width: '100%' }}\n >\n {showHeader ? (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: px(colors.spacing['2']) - 2, // closest to legacy 6\n }}\n >\n <RNText\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: colors.semantic.text.muted,\n }}\n >\n {label}\n </RNText>\n {showPercentage ? (\n <RNText\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: colors.semantic.text.muted,\n // Tabular numerals keep the percentage from\n // jittering as digits change width.\n fontVariant: ['tabular-nums'],\n }}\n >\n {Math.round(pct)}%\n </RNText>\n ) : null}\n </View>\n ) : null}\n <View {...ariaProps} style={trackStyle}>\n {isIndeterminate ? (\n <Animated.View style={buildIndeterminateStyle()} />\n ) : (\n <View style={determinateFillStyle} />\n )}\n </View>\n </View>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Progress/Progress.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-3RNRVMNS.js","sourcesContent":["'use client';\n\nimport { useEffect, useRef } from 'react';\nimport { Animated, Easing, Text as RNText, View, type ViewStyle } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type ProgressTone = 'primary' | 'info' | 'success' | 'warning' | 'danger';\nexport type ProgressSize = 'sm' | 'md' | 'lg';\n\nexport type ProgressProps = {\n /**\n * Current progress value (`0..max`). Omit to render the indeterminate\n * marquee variant (use this when you don't know how long the work\n * will take, e.g. an initial load before headers come back).\n */\n value?: number;\n /** Upper bound for `value`. @defaultValue 100 */\n max?: number;\n /**\n * Color of the fill / shuttle. `primary` follows the theme's interactive\n * color (matches buttons + sliders); the rest map to semantic status colors.\n * @defaultValue 'primary'\n */\n tone?: ProgressTone;\n /**\n * Bar height — `sm` 4px, `md` 8px (default), `lg` 12px. The track is\n * always pill-shaped (border-radius = height/2).\n * @defaultValue 'md'\n */\n size?: ProgressSize;\n /**\n * Optional label rendered above the bar. When set, also enables a\n * percentage readout on the right side for determinate progress.\n */\n label?: string;\n /**\n * Hide the auto-rendered percentage when a `label` is provided. Useful\n * when the label itself already conveys the number (e.g. \"Step 3 of 5\").\n * @defaultValue false\n */\n hidePercentage?: boolean;\n /** Accessibility label when no visible `label` is provided. */\n 'aria-label'?: string;\n /** Reference to a labeling element by id. */\n 'aria-labelledby'?: string;\n className?: string;\n testID?: string;\n};\n\nconst SIZE_PX: Record<ProgressSize, number> = {\n sm: 4,\n md: 8,\n lg: 12,\n};\n\nconst INDETERMINATE_DURATION_MS = 1500;\nconst SHUTTLE_WIDTH_PCT = 30;\n\n/**\n * Linear progress indicator. Use the determinate form (`value` set) to\n * communicate \"we're 42% done\"; use the indeterminate form (`value`\n * omitted) for \"we're working, no ETA\". The track is always pill-shaped\n * and the fill animates smoothly between renders for the determinate\n * variant — keep updates throttled to ~10/s in the parent to avoid\n * jitter.\n *\n * Cross-platform: built on `View` + `Animated.View` so it renders\n * identically on web (rn-web) and native. Uses `useThemeColors()` to\n * pick up dark-mode flips automatically.\n *\n * Accessibility: maps to `role=\"progressbar\"` with `aria-valuemin`,\n * `aria-valuemax`, and (for determinate) `aria-valuenow`. Provide an\n * `aria-label`, `aria-labelledby`, or visible `label` so the bar is\n * named.\n */\nexport const Progress = ({\n value,\n max = 100,\n tone = 'primary',\n size = 'md',\n label,\n hidePercentage = false,\n className,\n testID,\n ...rest\n}: ProgressProps) => {\n const colors = useThemeColors();\n const ariaLabel = rest['aria-label'];\n const ariaLabelledBy = rest['aria-labelledby'];\n\n const isIndeterminate = value === undefined;\n const safeMax = max <= 0 ? 100 : max;\n const clamped = isIndeterminate ? 0 : Math.min(safeMax, Math.max(0, value));\n const pct = isIndeterminate ? 0 : (clamped / safeMax) * 100;\n\n const height = SIZE_PX[size];\n\n const fillColor =\n tone === 'primary'\n ? colors.semantic.interactive.primary\n : tone === 'success'\n ? colors.color.success\n : tone === 'warning'\n ? colors.color.warning\n : tone === 'danger'\n ? colors.color.danger\n : colors.color.info;\n\n // Indeterminate marquee — a 30%-wide shuttle that slides from -30% to\n // 100% on a continuous loop. Driven by `Animated.Value` (0..1) which we\n // interpolate to a percent string for `left`. ease-in-out keeps the\n // motion subtle so the bar never feels frantic.\n const shuttle = useRef(new Animated.Value(0)).current;\n useEffect(() => {\n if (!isIndeterminate) {\n return;\n }\n const loop = Animated.loop(\n Animated.timing(shuttle, {\n toValue: 1,\n duration: INDETERMINATE_DURATION_MS,\n easing: Easing.inOut(Easing.ease),\n // We animate `left` (a layout property), so the native driver\n // can't be used. Web (rn-web) ignores `useNativeDriver`.\n useNativeDriver: false,\n })\n );\n loop.start();\n return () => {\n loop.stop();\n };\n }, [isIndeterminate, shuttle]);\n\n const trackStyle: ViewStyle = {\n width: '100%',\n height,\n backgroundColor: colors.semantic.background.subtle,\n borderRadius: height / 2,\n overflow: 'hidden',\n position: 'relative',\n };\n\n const determinateFillStyle: ViewStyle = {\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n // Cast at the boundary — RN's typed DimensionValue is narrower than\n // the percentage strings rn-web actually accepts.\n width: `${pct}%` as unknown as number,\n backgroundColor: fillColor,\n borderRadius: height / 2,\n };\n\n // Build the indeterminate style only when needed — `Animated.Value.interpolate`\n // returns an animated node that RN reads at render; we keep the call inside\n // the branch so determinate renders never hit it (and so test envs that\n // stub `Animated.Value` don't choke on a missing `interpolate`).\n const buildIndeterminateStyle = () => {\n const left =\n typeof shuttle.interpolate === 'function'\n ? shuttle.interpolate({\n inputRange: [0, 1],\n outputRange: [`-${SHUTTLE_WIDTH_PCT}%`, '100%'],\n })\n : (`-${SHUTTLE_WIDTH_PCT}%` as unknown as number);\n return {\n position: 'absolute' as const,\n top: 0,\n bottom: 0,\n left: left as unknown as number,\n width: `${SHUTTLE_WIDTH_PCT}%` as unknown as number,\n backgroundColor: fillColor,\n borderRadius: height / 2,\n };\n };\n\n // ARIA: only emit aria-valuenow when determinate so AT announces\n // \"in progress\" rather than \"0%\" while indeterminate.\n const ariaProps: Record<string, unknown> = {\n role: 'progressbar',\n accessibilityRole: 'progressbar',\n 'aria-valuemin': 0,\n 'aria-valuemax': safeMax,\n };\n if (!isIndeterminate) {\n ariaProps['aria-valuenow'] = clamped;\n ariaProps.accessibilityValue = { min: 0, max: safeMax, now: clamped };\n }\n if (ariaLabel !== undefined) {\n ariaProps['aria-label'] = ariaLabel;\n ariaProps.accessibilityLabel = ariaLabel;\n } else if (label !== undefined) {\n ariaProps['aria-label'] = label;\n ariaProps.accessibilityLabel = label;\n }\n if (ariaLabelledBy !== undefined) {\n ariaProps['aria-labelledby'] = ariaLabelledBy;\n }\n\n const showHeader = label !== undefined;\n const showPercentage = showHeader && !hidePercentage && !isIndeterminate;\n\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn('w-full', className)}\n style={{ width: '100%' }}\n >\n {showHeader ? (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginBottom: px(colors.spacing['2']) - 2, // closest to legacy 6\n }}\n >\n <RNText\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: colors.semantic.text.muted,\n }}\n >\n {label}\n </RNText>\n {showPercentage ? (\n <RNText\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: colors.semantic.text.muted,\n // Tabular numerals keep the percentage from\n // jittering as digits change width.\n fontVariant: ['tabular-nums'],\n }}\n >\n {Math.round(pct)}%\n </RNText>\n ) : null}\n </View>\n ) : null}\n <View {...ariaProps} style={trackStyle}>\n {isIndeterminate ? (\n <Animated.View style={buildIndeterminateStyle()} />\n ) : (\n <View style={determinateFillStyle} />\n )}\n </View>\n </View>\n );\n};\n"]}
|
|
@@ -7,6 +7,7 @@ import { Platform, Appearance } from 'react-native';
|
|
|
7
7
|
var theme = {
|
|
8
8
|
color: {
|
|
9
9
|
danger: "#ef4444",
|
|
10
|
+
dangerText: "#b91c1c",
|
|
10
11
|
info: "#3b82f6",
|
|
11
12
|
neutral: {
|
|
12
13
|
"100": "#f4f4f5",
|
|
@@ -116,6 +117,7 @@ var theme = {
|
|
|
116
117
|
var themeDark = {
|
|
117
118
|
color: {
|
|
118
119
|
danger: "#ef4444",
|
|
120
|
+
dangerText: "#b91c1c",
|
|
119
121
|
info: "#3b82f6",
|
|
120
122
|
neutral: {
|
|
121
123
|
"100": "#f4f4f5",
|
|
@@ -288,5 +290,5 @@ function useThemeColors() {
|
|
|
288
290
|
__name(useThemeColors, "useThemeColors");
|
|
289
291
|
|
|
290
292
|
export { ColorSchemeProvider, ThemeProvider, defaultTheme, theme, themeDark, useColorScheme, useThemeColors };
|
|
291
|
-
//# sourceMappingURL=chunk-
|
|
292
|
-
//# sourceMappingURL=chunk-
|
|
293
|
+
//# sourceMappingURL=chunk-3W2O4OBL.js.map
|
|
294
|
+
//# sourceMappingURL=chunk-3W2O4OBL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../tokens/build/theme.ts","../src/theme/context.tsx","../src/theme/use-color-scheme.tsx","../src/theme/use-theme-colors.ts"],"names":["theme","createContext","jsx","useContext"],"mappings":"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","file":"chunk-3W2O4OBL.js","sourcesContent":["// GENERATED by @nori-ui/tokens — DO NOT EDIT.\n// Run `yarn build:tokens` to regenerate.\n\n// Generated for light mode.\n// Do not edit — run `yarn build:tokens`.\n\nexport const theme = {\n color: {\n danger: \"#ef4444\",\n dangerText: \"#b91c1c\",\n info: \"#3b82f6\",\n neutral: {\n \"100\": \"#f4f4f5\",\n \"200\": \"#e4e4e7\",\n \"300\": \"#d4d4d8\",\n \"400\": \"#a1a1aa\",\n \"50\": \"#fafafa\",\n \"500\": \"#71717a\",\n \"600\": \"#52525b\",\n \"700\": \"#3f3f46\",\n \"800\": \"#27272a\",\n \"900\": \"#18181b\",\n },\n primary: {\n \"100\": \"#ccfbf1\",\n \"200\": \"#99f6e4\",\n \"300\": \"#5eead4\",\n \"400\": \"#2dd4bf\",\n \"50\": \"#f0fdfa\",\n \"500\": \"#14b8a6\",\n \"600\": \"#0d9488\",\n \"700\": \"#0f766e\",\n \"800\": \"#115e59\",\n \"900\": \"#134e4a\",\n },\n success: \"#22c55e\",\n warning: \"#f59e0b\",\n },\n fontFamily: {\n body: \"system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif\",\n display: \"ui-serif, Georgia, 'Times New Roman', serif\",\n mono: \"ui-monospace, 'SF Mono', Menlo, Consolas, 'DejaVu Sans Mono', monospace\",\n },\n fontSize: {\n \"2xl\": \"24px\",\n \"3xl\": \"30px\",\n \"4xl\": \"36px\",\n lg: \"18px\",\n md: \"16px\",\n sm: \"14px\",\n xl: \"20px\",\n xs: \"12px\",\n },\n fontWeight: {\n bold: \"700\",\n medium: \"500\",\n regular: \"400\",\n semibold: \"600\",\n },\n lineHeight: {\n normal: \"1.4\",\n relaxed: \"1.6\",\n tight: \"1.2\",\n },\n radius: {\n \"2xl\": \"16px\",\n full: \"9999px\",\n lg: \"8px\",\n md: \"6px\",\n none: \"0px\",\n sm: \"4px\",\n xl: \"12px\",\n },\n semantic: {\n background: {\n default: \"#fafafa\",\n elevated: \"#ffffff\",\n subtle: \"#f4f4f5\",\n },\n border: {\n default: \"#e4e4e7\",\n strong: \"#d4d4d8\",\n },\n interactive: {\n destructive: \"#ef4444\",\n primary: \"#0d9488\",\n primaryHover: \"#0f766e\",\n primaryPressed: \"#115e59\",\n },\n text: {\n default: \"#18181b\",\n inverted: \"#fafafa\",\n muted: \"#52525b\",\n },\n },\n shadow: {\n lg: \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)\",\n md: \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)\",\n sm: \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n },\n spacing: {\n \"0\": \"0px\",\n \"1\": \"4px\",\n \"10\": \"40px\",\n \"12\": \"48px\",\n \"16\": \"64px\",\n \"2\": \"8px\",\n \"20\": \"80px\",\n \"24\": \"96px\",\n \"3\": \"12px\",\n \"4\": \"16px\",\n \"5\": \"20px\",\n \"6\": \"24px\",\n \"8\": \"32px\",\n },\n} as const;\n\nexport type Theme = typeof theme;\n\n\n// Dark mode overrides\n// Generated for dark mode.\n// Do not edit — run `yarn build:tokens`.\n\nexport const themeDark = {\n color: {\n danger: \"#ef4444\",\n dangerText: \"#b91c1c\",\n info: \"#3b82f6\",\n neutral: {\n \"100\": \"#f4f4f5\",\n \"200\": \"#e4e4e7\",\n \"300\": \"#d4d4d8\",\n \"400\": \"#a1a1aa\",\n \"50\": \"#fafafa\",\n \"500\": \"#71717a\",\n \"600\": \"#52525b\",\n \"700\": \"#3f3f46\",\n \"800\": \"#27272a\",\n \"900\": \"#18181b\",\n },\n primary: {\n \"100\": \"#ccfbf1\",\n \"200\": \"#99f6e4\",\n \"300\": \"#5eead4\",\n \"400\": \"#2dd4bf\",\n \"50\": \"#f0fdfa\",\n \"500\": \"#14b8a6\",\n \"600\": \"#0d9488\",\n \"700\": \"#0f766e\",\n \"800\": \"#115e59\",\n \"900\": \"#134e4a\",\n },\n success: \"#22c55e\",\n warning: \"#f59e0b\",\n },\n fontFamily: {\n body: \"system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif\",\n display: \"ui-serif, Georgia, 'Times New Roman', serif\",\n mono: \"ui-monospace, 'SF Mono', Menlo, Consolas, 'DejaVu Sans Mono', monospace\",\n },\n fontSize: {\n \"2xl\": \"24px\",\n \"3xl\": \"30px\",\n \"4xl\": \"36px\",\n lg: \"18px\",\n md: \"16px\",\n sm: \"14px\",\n xl: \"20px\",\n xs: \"12px\",\n },\n fontWeight: {\n bold: \"700\",\n medium: \"500\",\n regular: \"400\",\n semibold: \"600\",\n },\n lineHeight: {\n normal: \"1.4\",\n relaxed: \"1.6\",\n tight: \"1.2\",\n },\n radius: {\n \"2xl\": \"16px\",\n full: \"9999px\",\n lg: \"8px\",\n md: \"6px\",\n none: \"0px\",\n sm: \"4px\",\n xl: \"12px\",\n },\n semantic: {\n background: {\n default: \"#18181b\",\n elevated: \"#3f3f46\",\n subtle: \"#27272a\",\n },\n border: {\n default: \"#3f3f46\",\n strong: \"#52525b\",\n },\n interactive: {\n destructive: \"#ef4444\",\n primary: \"#2dd4bf\",\n primaryHover: \"#5eead4\",\n primaryPressed: \"#99f6e4\",\n },\n text: {\n default: \"#fafafa\",\n inverted: \"#18181b\",\n muted: \"#a1a1aa\",\n },\n },\n shadow: {\n lg: \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)\",\n md: \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)\",\n sm: \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n },\n spacing: {\n \"0\": \"0px\",\n \"1\": \"4px\",\n \"10\": \"40px\",\n \"12\": \"48px\",\n \"16\": \"64px\",\n \"2\": \"8px\",\n \"20\": \"80px\",\n \"24\": \"96px\",\n \"3\": \"12px\",\n \"4\": \"16px\",\n \"5\": \"20px\",\n \"6\": \"24px\",\n \"8\": \"32px\",\n },\n} as const;\n\n","'use client';\n\nimport { themeDark as defaultDark, theme as defaultLight, type Theme } from '@nori-ui/tokens';\nimport type { ReactNode } from 'react';\nimport { createContext } from 'react';\n\n/**\n * A `NoriTheme` is a paired light/dark palette. The active half is picked\n * by `useColorScheme()` so the same theme object covers both schemes.\n *\n * Build one yourself by spreading the defaults and overriding the colors\n * you care about, or pick a preset from `@nori-ui/core/themes` (see the\n * Theming docs for examples).\n */\nexport type NoriTheme = {\n light: Theme;\n dark: Theme;\n};\n\n/**\n * Default Nori palette — teal primary on a warm-paper light surface, and\n * teal-400 primary on a deep-zinc dark surface. Mirrors the `theme` /\n * `themeDark` exports from @nori-ui/tokens.\n */\nexport const defaultTheme: NoriTheme = {\n light: defaultLight,\n dark: defaultDark as unknown as Theme,\n};\n\n// Context value is the FULL pair, not the active half. `useThemeColors`\n// (the hook components reach for) resolves it to the right one based on\n// the current color scheme. Storing the pair means a parent only has to\n// declare the theme once — switching scheme is a separate concern.\nexport const ThemeContext = createContext<NoriTheme>(defaultTheme);\nThemeContext.displayName = 'ThemeContext';\n\nexport type ThemeProviderProps = {\n /**\n * The theme to apply to descendants. Pass either:\n * - a full `NoriTheme` (`{ light, dark }`) — both schemes covered\n * - a single `Theme` — used for both light and dark (rare; mostly\n * useful when you ONLY ever render in one scheme)\n * - omit — falls back to the Nori default (teal palette)\n */\n theme?: NoriTheme | Theme;\n children?: ReactNode;\n};\n\nconst isFullTheme = (t: NoriTheme | Theme): t is NoriTheme => 'light' in t && 'dark' in t;\n\nexport function ThemeProvider({ theme, children }: ThemeProviderProps) {\n const value: NoriTheme =\n theme === undefined ? defaultTheme : isFullTheme(theme) ? theme : { light: theme, dark: theme };\n return <ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>;\n}\n","'use client';\n\nimport { createContext, type ReactNode, useContext, useEffect, useState } from 'react';\nimport { Appearance, Platform } from 'react-native';\n\nexport type ColorScheme = 'light' | 'dark';\n\n// Override channel so a parent can force a scheme (e.g. an app shell with\n// hard-coded dark chrome that wants nested components to render against\n// the dark token half regardless of the OS Appearance). `null` means\n// \"no override — use the system signal\".\nconst ColorSchemeOverrideContext = createContext<ColorScheme | null>(null);\nColorSchemeOverrideContext.displayName = 'ColorSchemeOverrideContext';\n\nexport type ColorSchemeProviderProps = {\n /** Force a specific scheme for descendants. */\n value: ColorScheme;\n children?: ReactNode;\n};\n\n/**\n * Forces a color scheme for all descendants. Useful when a screen's chrome\n * is hard-coded to one scheme (e.g. a forced-dark editorial surface) and\n * you want library components inside it to follow that, not the OS.\n */\nexport function ColorSchemeProvider({ value, children }: ColorSchemeProviderProps) {\n return <ColorSchemeOverrideContext.Provider value={value}>{children}</ColorSchemeOverrideContext.Provider>;\n}\n\nconst isWeb = Platform.OS === 'web';\n\n// Web: a document is \"in dark mode\" when the root <html> element carries\n// the `dark` class (Tailwind / Fumadocs convention) OR a `data-theme=\"dark\"`\n// attribute (matches the `darkMode` selectors in our Tailwind preset).\n// We deliberately don't fall back to `prefers-color-scheme` — the app\n// usually owns that decision and writes it onto <html>; tracking the system\n// preference too would fight the app's chosen value.\nfunction readWebScheme(): ColorScheme {\n if (typeof document === 'undefined') {\n return 'light';\n }\n const root = document.documentElement;\n if (root.classList.contains('dark')) {\n return 'dark';\n }\n if (root.getAttribute('data-theme') === 'dark') {\n return 'dark';\n }\n return 'light';\n}\n\n/**\n * Returns the current color scheme — `'light'` or `'dark'`.\n *\n * On web: observes the root `<html>` element's `class=\"dark\"` and\n * `data-theme=\"dark\"` attribute (the same signals our Tailwind preset\n * keys on). Updates live as those flip.\n *\n * On native: delegates to `react-native`'s `Appearance` API so the hook\n * tracks the OS preference without extra wiring.\n *\n * Components consume this indirectly via `useThemeColors()`; reach for\n * this directly when you need the raw scheme (e.g. to swap an icon).\n */\nexport function useColorScheme(): ColorScheme {\n // A `<ColorSchemeProvider value=\"dark\">` ancestor (or NoriProvider's\n // `colorScheme` prop, which mounts one) wins over the OS signal — the\n // app shell knows which scheme its chrome is locked to.\n const override = useContext(ColorSchemeOverrideContext);\n\n const [scheme, setScheme] = useState<ColorScheme>(() => {\n if (isWeb) {\n return readWebScheme();\n }\n return (Appearance.getColorScheme() ?? 'light') as ColorScheme;\n });\n\n useEffect(() => {\n if (isWeb) {\n const root = document.documentElement;\n const update = () => setScheme(readWebScheme());\n const observer = new MutationObserver(update);\n observer.observe(root, { attributes: true, attributeFilter: ['class', 'data-theme'] });\n // Sync once after mount in case SSR shipped a different value.\n update();\n return () => observer.disconnect();\n }\n\n const sub = Appearance.addChangeListener(({ colorScheme }) => {\n setScheme((colorScheme ?? 'light') as ColorScheme);\n });\n return () => sub.remove();\n }, []);\n\n return override ?? scheme;\n}\n","'use client';\n\nimport type { Theme } from '@nori-ui/tokens';\nimport { useContext } from 'react';\nimport { ThemeContext } from './context';\nimport { useColorScheme } from './use-color-scheme';\n\n/**\n * Returns the active token palette — `theme.light` in light mode,\n * `theme.dark` in dark mode. Resolves the theme via `ThemeContext` so\n * any ancestor `<ThemeProvider theme={...}>` flows through. With no\n * provider in the tree, the default Nori palette (teal) is used.\n *\n * Use this **inside a component** when you need a hex value for a React\n * Native `style` prop (`backgroundColor`, `borderColor`, etc.).\n *\n * Note: className-based styles (e.g. `bg-semantic-interactive-primary`)\n * compile against the @nori-ui/tokens palette at build time and don't\n * follow `<ThemeProvider>` overrides today. Inline styles via this hook\n * always do — and inline beats class on CSS specificity, so the visible\n * color you see is whatever the hook resolves to. CSS-variable theming\n * for the className path is a planned follow-up.\n */\nexport function useThemeColors(): Theme {\n const scheme = useColorScheme();\n const themePair = useContext(ThemeContext);\n return scheme === 'dark' ? themePair.dark : themePair.light;\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { themeDark, theme, useThemeColors } from './chunk-
|
|
1
|
+
import { themeDark, theme, useThemeColors } from './chunk-3W2O4OBL.js';
|
|
2
2
|
import { __name } from './chunk-WCQVDF3K.js';
|
|
3
3
|
|
|
4
4
|
// src/theme/themes.ts
|
|
@@ -130,5 +130,5 @@ var presetThemes = {
|
|
|
130
130
|
var useTheme = useThemeColors;
|
|
131
131
|
|
|
132
132
|
export { blueTheme, orangeTheme, presetThemes, roseTheme, slateTheme, tealTheme, useTheme, violetTheme };
|
|
133
|
-
//# sourceMappingURL=chunk-
|
|
134
|
-
//# sourceMappingURL=chunk-
|
|
133
|
+
//# sourceMappingURL=chunk-4NBJW2JZ.js.map
|
|
134
|
+
//# sourceMappingURL=chunk-4NBJW2JZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/theme/themes.ts","../src/theme/use-theme.ts"],"names":[],"mappings":";;;;AA0CA,IAAM,KAAA,GAAQ;AAAA,EACV,IAAA,EAAM;AAAA,IACF,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACF,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACF,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACX;AAAA,EACA,MAAA,EAAQ;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACX;AAAA,EACA,MAAA,EAAQ;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACX;AAAA,EACA,KAAA,EAAO;AAAA,IACH,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO;AAAA;AAEf,CAAA;AAUA,SAAS,YAAY,IAAA,EAA8B;AAC/C,EAAA,MAAM,IAAA,GAAO,SAAA;AACb,EAAA,OAAO;AAAA,IACH,KAAA,EAAO;AAAA,MACH,GAAG,KAAA;AAAA,MACH,OAAO,EAAE,GAAG,KAAA,CAAa,KAAA,EAAO,SAAS,IAAA,EAAK;AAAA,MAC9C,QAAA,EAAU;AAAA,QACN,GAAG,KAAA,CAAa,QAAA;AAAA,QAChB,WAAA,EAAa;AAAA,UACT,GAAG,MAAa,QAAA,CAAS,WAAA;AAAA,UACzB,OAAA,EAAS,KAAK,KAAK,CAAA;AAAA,UACnB,YAAA,EAAc,KAAK,KAAK,CAAA;AAAA,UACxB,cAAA,EAAgB,KAAK,KAAK;AAAA;AAC9B;AACJ,KACJ;AAAA,IACA,IAAA,EAAM;AAAA,MACF,GAAG,IAAA;AAAA,MACH,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAO,SAAS,IAAA,EAAK;AAAA,MACtC,QAAA,EAAU;AAAA,QACN,GAAG,IAAA,CAAK,QAAA;AAAA,QACR,WAAA,EAAa;AAAA,UACT,GAAG,KAAK,QAAA,CAAS,WAAA;AAAA;AAAA;AAAA;AAAA,UAIjB,OAAA,EAAS,KAAK,KAAK,CAAA;AAAA,UACnB,YAAA,EAAc,KAAK,KAAK,CAAA;AAAA,UACxB,cAAA,EAAgB,KAAK,KAAK;AAAA;AAC9B;AACJ;AACJ,GACJ;AACJ;AAjCS,MAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAoCF,IAAM,SAAA,GAAuB,WAAA,CAAY,KAAA,CAAM,IAAI;AAEnD,IAAM,SAAA,GAAuB,WAAA,CAAY,KAAA,CAAM,IAAI;AAEnD,IAAM,SAAA,GAAuB,WAAA,CAAY,KAAA,CAAM,IAAI;AAEnD,IAAM,WAAA,GAAyB,WAAA,CAAY,KAAA,CAAM,MAAM;AAEvD,IAAM,WAAA,GAAyB,WAAA,CAAY,KAAA,CAAM,MAAM;AAEvD,IAAM,UAAA,GAAwB,WAAA,CAAY,KAAA,CAAM,KAAK;AAGrD,IAAM,YAAA,GAAe;AAAA,EACxB,IAAA,EAAM,SAAA;AAAA,EACN,IAAA,EAAM,SAAA;AAAA,EACN,IAAA,EAAM,SAAA;AAAA,EACN,MAAA,EAAQ,WAAA;AAAA,EACR,MAAA,EAAQ,WAAA;AAAA,EACR,KAAA,EAAO;AACX;;;AC3KO,IAAM,QAAA,GAAW","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/theme/themes.ts","../src/theme/use-theme.ts"],"names":[],"mappings":"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","file":"chunk-4NBJW2JZ.js","sourcesContent":["import { themeDark as defaultDark, theme as defaultLight, type Theme } from '@nori-ui/tokens';\nimport type { NoriTheme } from './context';\n\n/**\n * Built-in theme presets. Pass any of these to `<NoriProvider theme={...}>`\n * (or `<ThemeProvider theme={...}>` directly) to swap the brand color\n * across the whole component library.\n *\n * Each preset overrides the `primary` color ramp AND the semantic\n * `interactive.primary` / `primaryHover` / `primaryPressed` derivations.\n * Backgrounds, borders, neutrals, and the destructive/warning/success\n * tones stay identical to the default — themes are about brand identity,\n * not full re-skins. (For a full re-skin, build your own NoriTheme by\n * spreading `defaultTheme` and overriding whatever you need.)\n *\n * Custom theme example:\n *\n * import { defaultTheme } from '@nori-ui/core/theme';\n * const myTheme: NoriTheme = {\n * light: { ...defaultTheme.light, color: { ...defaultTheme.light.color, primary: { ... } } },\n * dark: { ...defaultTheme.dark, color: { ...defaultTheme.dark.color, primary: { ... } } },\n * };\n */\n\n// Each ramp follows the same 50-900 step pattern as the default teal —\n// values picked from the Tailwind palette so they sit in a familiar\n// brightness scale. The \"primary 600\" step is the canonical resting\n// brand color for buttons; \"primary 700\" is the hover; \"primary 400\"\n// is the dark-mode brand color (brighter to read against #18181b).\ntype PrimaryRamp = {\n '50': string;\n '100': string;\n '200': string;\n '300': string;\n '400': string;\n '500': string;\n '600': string;\n '700': string;\n '800': string;\n '900': string;\n};\n\nconst RAMPS = {\n teal: {\n '50': '#f0fdfa',\n '100': '#ccfbf1',\n '200': '#99f6e4',\n '300': '#5eead4',\n '400': '#2dd4bf',\n '500': '#14b8a6',\n '600': '#0d9488',\n '700': '#0f766e',\n '800': '#115e59',\n '900': '#134e4a',\n },\n blue: {\n '50': '#eff6ff',\n '100': '#dbeafe',\n '200': '#bfdbfe',\n '300': '#93c5fd',\n '400': '#60a5fa',\n '500': '#3b82f6',\n '600': '#2563eb',\n '700': '#1d4ed8',\n '800': '#1e40af',\n '900': '#1e3a8a',\n },\n rose: {\n '50': '#fff1f2',\n '100': '#ffe4e6',\n '200': '#fecdd3',\n '300': '#fda4af',\n '400': '#fb7185',\n '500': '#f43f5e',\n '600': '#e11d48',\n '700': '#be123c',\n '800': '#9f1239',\n '900': '#881337',\n },\n violet: {\n '50': '#f5f3ff',\n '100': '#ede9fe',\n '200': '#ddd6fe',\n '300': '#c4b5fd',\n '400': '#a78bfa',\n '500': '#8b5cf6',\n '600': '#7c3aed',\n '700': '#6d28d9',\n '800': '#5b21b6',\n '900': '#4c1d95',\n },\n orange: {\n '50': '#fff7ed',\n '100': '#ffedd5',\n '200': '#fed7aa',\n '300': '#fdba74',\n '400': '#fb923c',\n '500': '#f97316',\n '600': '#ea580c',\n '700': '#c2410c',\n '800': '#9a3412',\n '900': '#7c2d12',\n },\n slate: {\n '50': '#f8fafc',\n '100': '#f1f5f9',\n '200': '#e2e8f0',\n '300': '#cbd5e1',\n '400': '#94a3b8',\n '500': '#64748b',\n '600': '#475569',\n '700': '#334155',\n '800': '#1e293b',\n '900': '#0f172a',\n },\n} as const satisfies Record<string, PrimaryRamp>;\n\n/**\n * Build a NoriTheme by swapping the primary ramp into the default.\n *\n * The unknown-cast is unavoidable: the generated `Theme` type narrows\n * each color hex to its specific string literal (e.g. `'#0d9488'` for\n * `primary.600`), so a generic `PrimaryRamp` ramp can't be assigned\n * structurally. The runtime shape is identical — we just convince TS.\n */\nfunction buildPreset(ramp: PrimaryRamp): NoriTheme {\n const dark = defaultDark as unknown as Theme;\n return {\n light: {\n ...defaultLight,\n color: { ...defaultLight.color, primary: ramp },\n semantic: {\n ...defaultLight.semantic,\n interactive: {\n ...defaultLight.semantic.interactive,\n primary: ramp['600'],\n primaryHover: ramp['700'],\n primaryPressed: ramp['800'],\n },\n },\n } as unknown as Theme,\n dark: {\n ...dark,\n color: { ...dark.color, primary: ramp },\n semantic: {\n ...dark.semantic,\n interactive: {\n ...dark.semantic.interactive,\n // Brighter step on dark so the brand reads against the\n // deep-zinc background — matches the default teal recipe\n // (teal-400 on dark vs teal-600 on light).\n primary: ramp['400'],\n primaryHover: ramp['300'],\n primaryPressed: ramp['200'],\n },\n },\n } as unknown as Theme,\n };\n}\n\n/** The default Nori palette — teal primary. */\nexport const tealTheme: NoriTheme = buildPreset(RAMPS.teal);\n/** Tailwind blue primary. Calm, technical. */\nexport const blueTheme: NoriTheme = buildPreset(RAMPS.blue);\n/** Tailwind rose primary. Warm, energetic. */\nexport const roseTheme: NoriTheme = buildPreset(RAMPS.rose);\n/** Tailwind violet primary. Modern, software. */\nexport const violetTheme: NoriTheme = buildPreset(RAMPS.violet);\n/** Tailwind orange primary. Lively, social. */\nexport const orangeTheme: NoriTheme = buildPreset(RAMPS.orange);\n/** Tailwind slate primary. Neutral, low-saturation — for tools that should fade into the work. */\nexport const slateTheme: NoriTheme = buildPreset(RAMPS.slate);\n\n/** All bundled presets, keyed by name. Useful for theme pickers and tests. */\nexport const presetThemes = {\n teal: tealTheme,\n blue: blueTheme,\n rose: roseTheme,\n violet: violetTheme,\n orange: orangeTheme,\n slate: slateTheme,\n} as const;\n\nexport type PresetThemeName = keyof typeof presetThemes;\n","'use client';\n\nimport { useThemeColors } from './use-theme-colors';\n\n/**\n * Returns the active token palette — equivalent to `useThemeColors()`.\n * Kept as a separate name for clarity in user code; both hooks return\n * the same `Theme` object resolved from the current `<ThemeProvider>`\n * and color scheme.\n */\nexport const useTheme = useThemeColors;\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { px } from './chunk-5A2QOOVN.js';
|
|
2
|
-
import { useThemeColors } from './chunk-
|
|
2
|
+
import { useThemeColors } from './chunk-3W2O4OBL.js';
|
|
3
3
|
import { cn } from './chunk-CHXHRJNZ.js';
|
|
4
4
|
import { __name } from './chunk-WCQVDF3K.js';
|
|
5
5
|
import { Text as Text$1 } from 'react-native';
|
|
@@ -72,5 +72,5 @@ var Text = /* @__PURE__ */ __name(({ variant = "body-md", className, testID, chi
|
|
|
72
72
|
}, "Text");
|
|
73
73
|
|
|
74
74
|
export { Text };
|
|
75
|
-
//# sourceMappingURL=chunk-
|
|
76
|
-
//# sourceMappingURL=chunk-
|
|
75
|
+
//# sourceMappingURL=chunk-57AVXG7D.js.map
|
|
76
|
+
//# sourceMappingURL=chunk-57AVXG7D.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Text/Text.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/components/Text/Text.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-57AVXG7D.js","sourcesContent":["'use client';\n\nimport type { TextProps as RNTextProps, TextStyle } from 'react-native';\nimport { Text as RNText } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type TextVariant = 'body-xs' | 'body-sm' | 'body-md' | 'body-lg' | 'heading-1' | 'heading-2' | 'heading-3';\n\nexport type TextProps = RNTextProps & {\n variant?: TextVariant;\n className?: string;\n testID?: string;\n};\n\nconst VARIANT_CLASSES: Record<TextVariant, string> = {\n 'body-xs': 'text-xs leading-normal',\n 'body-sm': 'text-sm leading-normal',\n 'body-md': 'text-md leading-normal',\n 'body-lg': 'text-lg leading-relaxed',\n 'heading-1': 'text-4xl leading-tight font-bold',\n 'heading-2': 'text-3xl leading-tight font-semibold',\n 'heading-3': 'text-2xl leading-tight font-semibold',\n};\n\nconst HEADING_VARIANTS: Readonly<Set<TextVariant>> = new Set(['heading-1', 'heading-2', 'heading-3']);\n\n// Per-variant resolution from the active theme. Keys here name the\n// fontSize / fontWeight / lineHeight tokens the variant pulls from. The\n// fontFamily is picked separately (display for headings, body otherwise).\ntype VariantKeys = {\n fontSize: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl';\n fontWeight: 'regular' | 'medium' | 'semibold' | 'bold';\n lineHeight: 'tight' | 'normal' | 'relaxed';\n};\nconst VARIANT_KEYS: Record<TextVariant, VariantKeys> = {\n 'body-xs': { fontSize: 'xs', fontWeight: 'regular', lineHeight: 'normal' },\n 'body-sm': { fontSize: 'sm', fontWeight: 'regular', lineHeight: 'normal' },\n 'body-md': { fontSize: 'md', fontWeight: 'regular', lineHeight: 'normal' },\n 'body-lg': { fontSize: 'lg', fontWeight: 'regular', lineHeight: 'relaxed' },\n 'heading-1': { fontSize: '4xl', fontWeight: 'bold', lineHeight: 'tight' },\n 'heading-2': {\n fontSize: '3xl',\n fontWeight: 'semibold',\n lineHeight: 'tight',\n },\n 'heading-3': {\n fontSize: '2xl',\n fontWeight: 'semibold',\n lineHeight: 'tight',\n },\n};\n\n/**\n * Typography primitive. Renders a react-native <Text>; on web via RN-Web\n * it becomes a <div role=\"...\"> with the appropriate className.\n *\n * Inline style is sourced from the active `<NoriProvider theme={...}>`:\n * font family (display for headings, body for body variants), fontSize,\n * fontWeight, lineHeight all flow through. Override the whole variant by\n * passing a custom theme; override a single instance by passing `style`.\n *\n * The `className` path keeps the Tailwind dark-mode color flip — inline\n * style provides the typographic substance, className provides the color.\n */\nexport const Text = ({ variant = 'body-md', className, testID, children, ...rest }: TextProps) => {\n const colors = useThemeColors();\n const isHeading = HEADING_VARIANTS.has(variant);\n const role = isHeading ? 'header' : rest.accessibilityRole;\n\n const keys = VARIANT_KEYS[variant];\n const sizePx = px(colors.fontSize[keys.fontSize]);\n const lhMultiplier = Number(colors.lineHeight[keys.lineHeight]);\n const themedStyle: TextStyle = {\n // Inline color is the ONLY color source. The Tailwind preset uses\n // `darkMode: ['class', '[data-theme=\"dark\"]']` — that requires a\n // DOM, so on native the `dark:` variant never fires and a\n // className-only color path would always emit the LIGHT variant\n // (near-black), invisible on a dark surface. Sourcing color from\n // `useThemeColors()` means it follows the OS scheme AND honors a\n // forced `colorScheme` override on the provider.\n color: colors.semantic.text.default,\n fontFamily: isHeading ? colors.fontFamily.display : colors.fontFamily.body,\n fontSize: sizePx,\n // RN expects lineHeight in px, not unitless. Tokens carry it as a\n // ratio (1.2 / 1.4 / 1.6) — multiply against the variant fontSize.\n lineHeight: sizePx * lhMultiplier,\n // The fontWeight token returns string literals like \"500\" / \"700\"\n // which match RN's TextStyle.fontWeight enum.\n fontWeight: colors.fontWeight[keys.fontWeight] as TextStyle['fontWeight'],\n };\n\n // Caller-provided style wins (last in the array). The themed style is\n // the source of truth, the user's `style` prop the override.\n const styleProp = (rest as { style?: TextStyle | TextStyle[] }).style;\n\n return (\n <RNText\n testID={testID}\n {...rest}\n {...(role !== undefined ? { accessibilityRole: role } : {})}\n className={cn(VARIANT_CLASSES[variant], className)}\n style={[themedStyle, styleProp]}\n >\n {children}\n </RNText>\n );\n};\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Slot } from './chunk-ZIBNLXIV.js';
|
|
2
2
|
import { px } from './chunk-5A2QOOVN.js';
|
|
3
|
-
import { useThemeColors } from './chunk-
|
|
3
|
+
import { useThemeColors } from './chunk-3W2O4OBL.js';
|
|
4
4
|
import { cn } from './chunk-CHXHRJNZ.js';
|
|
5
5
|
import { __name } from './chunk-WCQVDF3K.js';
|
|
6
6
|
import { createContext, useState, useCallback, useId, useRef, useEffect, isValidElement, useContext } from 'react';
|
|
@@ -332,5 +332,5 @@ var Popover = Object.assign(PopoverRoot, {
|
|
|
332
332
|
});
|
|
333
333
|
|
|
334
334
|
export { Popover, usePopoverContext };
|
|
335
|
-
//# sourceMappingURL=chunk-
|
|
336
|
-
//# sourceMappingURL=chunk-
|
|
335
|
+
//# sourceMappingURL=chunk-7TESZOYQ.js.map
|
|
336
|
+
//# sourceMappingURL=chunk-7TESZOYQ.js.map
|