@retray-dev/ui-kit 13.2.0 → 13.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +680 -0
- package/CONSUMER.md +2 -0
- package/README.md +4 -4
- package/SKILL.md +276 -12
- package/dist/Accordion.d.mts +6 -6
- package/dist/Accordion.d.ts +6 -6
- package/dist/Accordion.js +39 -40
- package/dist/Accordion.mjs +4 -4
- package/dist/AlertBanner.d.mts +3 -3
- package/dist/AlertBanner.d.ts +3 -3
- package/dist/AlertBanner.js +7 -13
- package/dist/AlertBanner.mjs +4 -4
- package/dist/AppHeader.d.mts +4 -4
- package/dist/AppHeader.d.ts +4 -4
- package/dist/AppHeader.js +37 -28
- package/dist/AppHeader.mjs +6 -6
- package/dist/Avatar.d.mts +4 -4
- package/dist/Avatar.d.ts +4 -4
- package/dist/Avatar.mjs +2 -2
- package/dist/Badge.d.mts +5 -5
- package/dist/Badge.d.ts +5 -5
- package/dist/Badge.js +7 -13
- package/dist/Badge.mjs +3 -3
- package/dist/Button.d.mts +5 -5
- package/dist/Button.d.ts +5 -5
- package/dist/Button.js +31 -29
- package/dist/Button.mjs +5 -5
- package/dist/ButtonGroup.d.mts +3 -3
- package/dist/ButtonGroup.d.ts +3 -3
- package/dist/Card.d.mts +13 -13
- package/dist/Card.d.ts +13 -13
- package/dist/Card.js +23 -14
- package/dist/Card.mjs +4 -4
- package/dist/CategoryStrip.d.mts +3 -3
- package/dist/CategoryStrip.d.ts +3 -3
- package/dist/CategoryStrip.js +30 -27
- package/dist/CategoryStrip.mjs +5 -5
- package/dist/Checkbox.d.mts +2 -2
- package/dist/Checkbox.d.ts +2 -2
- package/dist/Checkbox.js +23 -14
- package/dist/Checkbox.mjs +3 -3
- package/dist/Chip.d.mts +5 -5
- package/dist/Chip.d.ts +5 -5
- package/dist/Chip.js +30 -27
- package/dist/Chip.mjs +5 -5
- package/dist/ConfirmDialog.d.mts +2 -2
- package/dist/ConfirmDialog.d.ts +2 -2
- package/dist/ConfirmDialog.js +64 -58
- package/dist/ConfirmDialog.mjs +7 -6
- package/dist/CurrencyDisplay.d.mts +3 -3
- package/dist/CurrencyDisplay.d.ts +3 -3
- package/dist/CurrencyDisplay.mjs +2 -2
- package/dist/CurrencyInput.d.mts +2 -2
- package/dist/CurrencyInput.d.ts +2 -2
- package/dist/CurrencyInput.js +7 -13
- package/dist/CurrencyInput.mjs +4 -4
- package/dist/DetailRow.d.mts +6 -6
- package/dist/DetailRow.d.ts +6 -6
- package/dist/DetailRow.js +7 -13
- package/dist/DetailRow.mjs +3 -3
- package/dist/EmptyState.d.mts +4 -4
- package/dist/EmptyState.d.ts +4 -4
- package/dist/EmptyState.js +31 -29
- package/dist/EmptyState.mjs +6 -6
- package/dist/ErrorBoundary.d.mts +9 -7
- package/dist/ErrorBoundary.d.ts +9 -7
- package/dist/ErrorBoundary.js +33 -29
- package/dist/ErrorBoundary.mjs +5 -5
- package/dist/Form.d.mts +9 -9
- package/dist/Form.d.ts +9 -9
- package/dist/Form.mjs +2 -2
- package/dist/HolographicCard.d.mts +2 -2
- package/dist/HolographicCard.d.ts +2 -2
- package/dist/HolographicCard.js +23 -14
- package/dist/HolographicCard.mjs +2 -2
- package/dist/IconButton.d.mts +4 -4
- package/dist/IconButton.d.ts +4 -4
- package/dist/IconButton.js +30 -27
- package/dist/IconButton.mjs +4 -4
- package/dist/IconPicker.d.mts +2 -2
- package/dist/IconPicker.d.ts +2 -2
- package/dist/IconPicker.js +40 -45
- package/dist/IconPicker.mjs +6 -6
- package/dist/Image.d.mts +18 -0
- package/dist/Image.d.ts +18 -0
- package/dist/Image.js +53 -0
- package/dist/Image.mjs +2 -0
- package/dist/ImageUpload.d.mts +2 -2
- package/dist/ImageUpload.d.ts +2 -2
- package/dist/ImageUpload.js +24 -15
- package/dist/ImageUpload.mjs +5 -5
- package/dist/ImageViewer.d.mts +2 -2
- package/dist/ImageViewer.d.ts +2 -2
- package/dist/ImageViewer.js +31 -28
- package/dist/ImageViewer.mjs +6 -6
- package/dist/Input.d.mts +4 -4
- package/dist/Input.d.ts +4 -4
- package/dist/Input.js +7 -13
- package/dist/Input.mjs +3 -3
- package/dist/ItemGroup.d.mts +23 -0
- package/dist/ItemGroup.d.ts +23 -0
- package/dist/{ListGroup.js → ItemGroup.js} +11 -13
- package/dist/ItemGroup.mjs +4 -0
- package/dist/LabelValue.d.mts +4 -4
- package/dist/LabelValue.d.ts +4 -4
- package/dist/LabelValue.js +7 -13
- package/dist/LabelValue.mjs +3 -3
- package/dist/ListItem.d.mts +6 -6
- package/dist/ListItem.d.ts +6 -6
- package/dist/ListItem.js +30 -27
- package/dist/ListItem.mjs +5 -5
- package/dist/MediaCard.d.mts +6 -6
- package/dist/MediaCard.d.ts +6 -6
- package/dist/MediaCard.js +30 -27
- package/dist/MediaCard.mjs +5 -5
- package/dist/MenuItem.d.mts +5 -5
- package/dist/MenuItem.d.ts +5 -5
- package/dist/MenuItem.js +30 -27
- package/dist/MenuItem.mjs +5 -5
- package/dist/MonthPicker.d.mts +2 -2
- package/dist/MonthPicker.d.ts +2 -2
- package/dist/MonthPicker.js +23 -14
- package/dist/MonthPicker.mjs +3 -3
- package/dist/NumberStepper.d.mts +3 -3
- package/dist/NumberStepper.d.ts +3 -3
- package/dist/NumberStepper.js +30 -27
- package/dist/NumberStepper.mjs +5 -5
- package/dist/PagerDots.d.mts +2 -2
- package/dist/PagerDots.d.ts +2 -2
- package/dist/PagerDots.js +30 -27
- package/dist/PagerDots.mjs +4 -4
- package/dist/Pressable.d.mts +3 -27
- package/dist/Pressable.d.ts +3 -27
- package/dist/Pressable.js +23 -14
- package/dist/Pressable.mjs +2 -2
- package/dist/PricingCard.d.mts +2 -2
- package/dist/PricingCard.d.ts +2 -2
- package/dist/PricingCard.js +31 -29
- package/dist/PricingCard.mjs +7 -7
- package/dist/Progress.d.mts +2 -2
- package/dist/Progress.d.ts +2 -2
- package/dist/Progress.mjs +2 -2
- package/dist/RadioGroup.d.mts +2 -2
- package/dist/RadioGroup.d.ts +2 -2
- package/dist/RadioGroup.js +23 -14
- package/dist/RadioGroup.mjs +3 -3
- package/dist/RetrayProvider.d.mts +1 -1
- package/dist/RetrayProvider.d.ts +1 -1
- package/dist/RetrayProvider.js +14 -34
- package/dist/RetrayProvider.mjs +3 -3
- package/dist/ScreenContainer.d.mts +24 -0
- package/dist/ScreenContainer.d.ts +24 -0
- package/dist/ScreenContainer.js +85 -0
- package/dist/ScreenContainer.mjs +3 -0
- package/dist/Select.d.mts +2 -2
- package/dist/Select.d.ts +2 -2
- package/dist/Select.js +38 -45
- package/dist/Select.mjs +3 -3
- package/dist/SelectableCard.d.mts +5 -5
- package/dist/SelectableCard.d.ts +5 -5
- package/dist/SelectableCard.js +30 -27
- package/dist/SelectableCard.mjs +5 -5
- package/dist/SelectableGrid.d.mts +5 -4
- package/dist/SelectableGrid.d.ts +5 -4
- package/dist/SelectableGrid.js +80 -44
- package/dist/SelectableGrid.mjs +5 -5
- package/dist/Separator.d.mts +4 -2
- package/dist/Separator.d.ts +4 -2
- package/dist/Separator.js +29 -1
- package/dist/Separator.mjs +3 -2
- package/dist/Sheet.d.mts +10 -10
- package/dist/Sheet.d.ts +10 -10
- package/dist/Sheet.js +59 -44
- package/dist/Sheet.mjs +4 -3
- package/dist/SheetSelect.d.mts +2 -2
- package/dist/SheetSelect.d.ts +2 -2
- package/dist/SheetSelect.js +30 -27
- package/dist/SheetSelect.mjs +5 -5
- package/dist/Skeleton.d.mts +5 -5
- package/dist/Skeleton.d.ts +5 -5
- package/dist/Skeleton.mjs +3 -3
- package/dist/Slider.d.mts +2 -2
- package/dist/Slider.d.ts +2 -2
- package/dist/Slider.js +23 -14
- package/dist/Slider.mjs +3 -3
- package/dist/Spinner.d.mts +2 -2
- package/dist/Spinner.d.ts +2 -2
- package/dist/Spinner.mjs +2 -2
- package/dist/Stats.d.mts +6 -6
- package/dist/Stats.d.ts +6 -6
- package/dist/Stats.js +30 -27
- package/dist/Stats.mjs +5 -5
- package/dist/Switch.d.mts +2 -2
- package/dist/Switch.d.ts +2 -2
- package/dist/Switch.js +23 -14
- package/dist/Switch.mjs +3 -3
- package/dist/TabBar.d.mts +3 -3
- package/dist/TabBar.d.ts +3 -3
- package/dist/TabBar.js +30 -27
- package/dist/TabBar.mjs +4 -4
- package/dist/Tabs.d.mts +13 -13
- package/dist/Tabs.d.ts +13 -13
- package/dist/Tabs.js +23 -14
- package/dist/Tabs.mjs +3 -3
- package/dist/Text.d.mts +4 -4
- package/dist/Text.d.ts +4 -4
- package/dist/Text.js +20 -2
- package/dist/Text.mjs +3 -3
- package/dist/Textarea.d.mts +3 -3
- package/dist/Textarea.d.ts +3 -3
- package/dist/Textarea.js +7 -13
- package/dist/Textarea.mjs +3 -3
- package/dist/Toast.d.mts +4 -4
- package/dist/Toast.d.ts +4 -4
- package/dist/Toast.mjs +2 -2
- package/dist/Toggle.d.mts +4 -4
- package/dist/Toggle.d.ts +4 -4
- package/dist/Toggle.js +30 -27
- package/dist/Toggle.mjs +4 -4
- package/dist/VirtualizedList.d.mts +28 -0
- package/dist/VirtualizedList.d.ts +28 -0
- package/dist/VirtualizedList.js +130 -0
- package/dist/VirtualizedList.mjs +3 -0
- package/dist/{chunk-MZ6WRTD2.mjs → chunk-24JTXQ2M.mjs} +7 -13
- package/dist/{chunk-OBV72JD4.mjs → chunk-2DDJ53DK.mjs} +9 -11
- package/dist/{chunk-H6MQL7PS.mjs → chunk-2J5OZOMX.mjs} +12 -6
- package/dist/{chunk-4NQFTHN3.mjs → chunk-3GE4UFV5.mjs} +2 -2
- package/dist/{chunk-KAGADD2O.mjs → chunk-3RIZCKRM.mjs} +2 -2
- package/dist/{chunk-DE25XTVQ.mjs → chunk-3VHFOSZR.mjs} +2 -2
- package/dist/{chunk-C5ZRMR2E.mjs → chunk-4PF4LKNT.mjs} +2 -2
- package/dist/{chunk-5MYNAAFE.mjs → chunk-5J7VKFSZ.mjs} +4 -4
- package/dist/{chunk-E2PONRJG.mjs → chunk-5TNQ573V.mjs} +2 -2
- package/dist/{chunk-CZN6L2QU.mjs → chunk-6T2DVIQT.mjs} +4 -4
- package/dist/{chunk-L3YKPTJQ.mjs → chunk-7CE6PDCQ.mjs} +2 -2
- package/dist/{chunk-Y6YS33GM.mjs → chunk-AHFEAY6M.mjs} +4 -4
- package/dist/{chunk-77UOVFIS.mjs → chunk-AZRATPNP.mjs} +2 -2
- package/dist/{chunk-UMZTPUB3.mjs → chunk-BGXOEFDM.mjs} +6 -31
- package/dist/{chunk-KC5QDYGZ.mjs → chunk-BMAAAJWN.mjs} +2 -2
- package/dist/{chunk-IJCMPVW5.mjs → chunk-BQMJQMWY.mjs} +2 -2
- package/dist/{chunk-COA2YZOX.mjs → chunk-BTPCY4C7.mjs} +4 -4
- package/dist/chunk-BVJAYPAD.mjs +55 -0
- package/dist/{chunk-RA6SAAFE.mjs → chunk-BWLVX2SQ.mjs} +4 -4
- package/dist/{chunk-HHOOFDBA.mjs → chunk-CCEM3HIJ.mjs} +5 -5
- package/dist/chunk-CTUFFKGS.mjs +30 -0
- package/dist/{chunk-EHGBHFMH.mjs → chunk-CYGYC7XT.mjs} +8 -4
- package/dist/{chunk-ESQDPO5E.mjs → chunk-DLAOTHHS.mjs} +7 -6
- package/dist/{chunk-QY3X2UYR.mjs → chunk-DYYPDQA2.mjs} +21 -7
- package/dist/{chunk-S44XWTTC.mjs → chunk-E4BJ5WXG.mjs} +3 -3
- package/dist/{chunk-HUSSF6TF.mjs → chunk-EQNCMDZC.mjs} +1 -1
- package/dist/{chunk-PI6RULJX.mjs → chunk-EQYTDFDD.mjs} +1 -1
- package/dist/{chunk-BULKGOIZ.mjs → chunk-FE26TPCI.mjs} +4 -4
- package/dist/{chunk-DBHSUUKU.mjs → chunk-FOUSI6JD.mjs} +1 -1
- package/dist/{chunk-KPTY7UYQ.mjs → chunk-GR7PKEKD.mjs} +1 -1
- package/dist/{chunk-RRKM4MKB.mjs → chunk-HLWGFBIF.mjs} +3 -3
- package/dist/chunk-HMKJGVXA.mjs +35 -0
- package/dist/{chunk-U6DEBYU5.mjs → chunk-IFGZUJFH.mjs} +3 -3
- package/dist/{chunk-2VIDP72N.mjs → chunk-K3V6OTVB.mjs} +1 -1
- package/dist/{chunk-K7TKID3V.mjs → chunk-K4YFTUMC.mjs} +3 -3
- package/dist/{chunk-NGEN2EES.mjs → chunk-MQAK2W6L.mjs} +14 -22
- package/dist/{chunk-CM2DG4MR.mjs → chunk-MSS3CD6F.mjs} +4 -4
- package/dist/{chunk-2QXJDRVU.mjs → chunk-NQYS6RPX.mjs} +4 -4
- package/dist/{chunk-62BBSSUF.mjs → chunk-P5KC3RTG.mjs} +1 -1
- package/dist/{chunk-K3QX2M26.mjs → chunk-PPKCGCZ3.mjs} +5 -5
- package/dist/{chunk-ITG4JQM3.mjs → chunk-QEE3EQ3N.mjs} +2 -2
- package/dist/{chunk-IDVUZIVY.mjs → chunk-RLPPRIJ7.mjs} +17 -33
- package/dist/{chunk-XCIG6HT2.mjs → chunk-S433IOQE.mjs} +2 -2
- package/dist/{chunk-IGU223UM.mjs → chunk-SWUZKVYO.mjs} +1 -1
- package/dist/{chunk-NPCBNGNE.mjs → chunk-T4KMKHTI.mjs} +55 -22
- package/dist/{chunk-7BZJRB77.mjs → chunk-UBTP4NPP.mjs} +4 -30
- package/dist/{chunk-TMH263OK.mjs → chunk-UEA2VYGW.mjs} +3 -3
- package/dist/chunk-VISIOH33.mjs +37 -0
- package/dist/{chunk-SZEKQAOY.mjs → chunk-VSKBODEY.mjs} +1 -1
- package/dist/{chunk-FTTI6T5Q.mjs → chunk-W422TEH2.mjs} +3 -3
- package/dist/{chunk-WIPEDNSD.mjs → chunk-WD5LBXPR.mjs} +4 -4
- package/dist/chunk-WFNGSYS4.mjs +111 -0
- package/dist/chunk-WR6DCNAE.mjs +65 -0
- package/dist/{chunk-ERWJPVX7.mjs → chunk-XKBB2UZU.mjs} +2 -2
- package/dist/{chunk-422IVD3H.mjs → chunk-Y5TPAKOS.mjs} +13 -17
- package/dist/{chunk-AZV7KNJI.mjs → chunk-YKWIMVGU.mjs} +2 -2
- package/dist/{chunk-ZKDKKQCE.mjs → chunk-YOXSXHDE.mjs} +4 -4
- package/dist/{chunk-PGQ6FMXS.mjs → chunk-ZO5BRTCW.mjs} +2 -2
- package/dist/{chunk-KSSVIFYR.mjs → chunk-ZQGCQ7SA.mjs} +14 -34
- package/dist/{chunk-ZTPYUU5C.mjs → chunk-ZRUUUVOO.mjs} +3 -3
- package/dist/{index-CY34hxPN.d.mts → index-CinAt5Uo.d.mts} +3 -3
- package/dist/{index-CY34hxPN.d.ts → index-CinAt5Uo.d.ts} +3 -3
- package/dist/index.d.mts +68 -18
- package/dist/index.d.ts +68 -18
- package/dist/index.js +965 -825
- package/dist/index.mjs +76 -69
- package/package.json +3 -2
- package/src/components/Accordion/Accordion.tsx +9 -18
- package/src/components/AppHeader/AppHeader.tsx +9 -1
- package/src/components/ConfirmDialog/ConfirmDialog.tsx +4 -34
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +5 -2
- package/src/components/Image/Image.tsx +50 -0
- package/src/components/Image/index.ts +2 -0
- package/src/components/ImageUpload/ImageUpload.tsx +1 -1
- package/src/components/{ListGroup/ListGroup.tsx → ItemGroup/ItemGroup.tsx} +15 -29
- package/src/components/ItemGroup/index.ts +2 -0
- package/src/components/ListGroup/index.tsx +20 -0
- package/src/components/MenuGroup/index.tsx +20 -0
- package/src/components/Pressable/Pressable.tsx +0 -24
- package/src/components/ScreenContainer/ScreenContainer.tsx +94 -0
- package/src/components/ScreenContainer/index.ts +2 -0
- package/src/components/Select/Select.tsx +22 -30
- package/src/components/SelectableGrid/SelectableGrid.tsx +51 -19
- package/src/components/Separator/Separator.tsx +35 -2
- package/src/components/Sheet/Sheet.tsx +3 -34
- package/src/components/Tabs/Tabs.tsx +9 -9
- package/src/components/Tabs/index.ts +1 -1
- package/src/components/Text/Text.tsx +6 -0
- package/src/components/VirtualizedList/VirtualizedList.tsx +154 -0
- package/src/components/VirtualizedList/index.ts +2 -0
- package/src/hooks/useConfirmDialog.ts +2 -11
- package/src/hooks/useSheetModal.ts +40 -0
- package/src/index.ts +5 -1
- package/src/theme/colors.ts +19 -57
- package/src/tokens.ts +21 -7
- package/src/utils/curatedIcons.ts +9 -18
- package/src/utils/haptics.ts +10 -21
- package/src/utils/icons.ts +7 -14
- package/dist/ListGroup.d.mts +0 -34
- package/dist/ListGroup.d.ts +0 -34
- package/dist/ListGroup.mjs +0 -4
- package/dist/MenuGroup.d.mts +0 -34
- package/dist/MenuGroup.d.ts +0 -34
- package/dist/MenuGroup.js +0 -106
- package/dist/MenuGroup.mjs +0 -4
- package/dist/chunk-ARONDO7M.mjs +0 -40
- package/dist/chunk-EW2FIDSM.mjs +0 -29
- package/dist/chunk-S2VGME7X.mjs +0 -82
- package/src/components/ListGroup/index.ts +0 -1
- package/src/components/MenuGroup/MenuGroup.tsx +0 -145
- package/src/components/MenuGroup/index.ts +0 -1
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef, useState } from 'react'
|
|
2
|
+
import { BottomSheetModal } from '@gorhom/bottom-sheet'
|
|
3
|
+
import { impactMedium } from '../utils/haptics'
|
|
4
|
+
|
|
5
|
+
type SheetState = 'idle' | 'presenting' | 'presented' | 'dismissing'
|
|
6
|
+
|
|
7
|
+
export function useSheetModal(visible: boolean, onDismiss?: () => void) {
|
|
8
|
+
const ref = useRef<BottomSheetModal>(null)
|
|
9
|
+
const state = useRef<SheetState>('idle')
|
|
10
|
+
const onDismissRef = useRef(onDismiss)
|
|
11
|
+
const [tick, setTick] = useState(0)
|
|
12
|
+
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
onDismissRef.current = onDismiss
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
if (visible) {
|
|
19
|
+
if (state.current === 'idle') {
|
|
20
|
+
state.current = 'presenting'
|
|
21
|
+
impactMedium()
|
|
22
|
+
ref.current?.present()
|
|
23
|
+
state.current = 'presented'
|
|
24
|
+
}
|
|
25
|
+
} else {
|
|
26
|
+
if (state.current === 'presented' || state.current === 'presenting') {
|
|
27
|
+
state.current = 'dismissing'
|
|
28
|
+
ref.current?.dismiss()
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}, [visible, tick])
|
|
32
|
+
|
|
33
|
+
const handleDismiss = useCallback(() => {
|
|
34
|
+
state.current = 'idle'
|
|
35
|
+
onDismissRef.current?.()
|
|
36
|
+
setTick((t) => t + 1)
|
|
37
|
+
}, [])
|
|
38
|
+
|
|
39
|
+
return { ref, handleDismiss }
|
|
40
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -39,9 +39,9 @@ export * from './components/Chip'
|
|
|
39
39
|
export * from './components/ConfirmDialog'
|
|
40
40
|
export * from './components/LabelValue'
|
|
41
41
|
export * from './components/MonthPicker'
|
|
42
|
+
export * from './components/Pressable'
|
|
42
43
|
export * from './components/MediaCard'
|
|
43
44
|
export * from './components/CategoryStrip'
|
|
44
|
-
export * from './components/Pressable'
|
|
45
45
|
export * from './components/DetailRow'
|
|
46
46
|
export * from './components/Form'
|
|
47
47
|
export * from './components/RetrayProvider'
|
|
@@ -58,6 +58,9 @@ export * from './components/ImageUpload'
|
|
|
58
58
|
export * from './components/IconPicker'
|
|
59
59
|
export * from './components/NumberStepper'
|
|
60
60
|
export * from './components/Stats'
|
|
61
|
+
export * from './components/Image'
|
|
62
|
+
export * from './components/ScreenContainer'
|
|
63
|
+
export * from './components/VirtualizedList'
|
|
61
64
|
// HolographicCard is intentionally NOT re-exported here — it depends on the
|
|
62
65
|
// optional peer @shopify/react-native-skia, so it must stay out of the main
|
|
63
66
|
// barrel's module graph. Deep-import it: '@retray-dev/ui-kit/HolographicCard'.
|
|
@@ -86,6 +89,7 @@ export {
|
|
|
86
89
|
// Hooks
|
|
87
90
|
export { useConfirmDialog } from './hooks/useConfirmDialog'
|
|
88
91
|
export type { UseConfirmDialogOptions, UseConfirmDialogResult } from './hooks/useConfirmDialog'
|
|
92
|
+
export { useSheetModal } from './hooks/useSheetModal'
|
|
89
93
|
|
|
90
94
|
|
|
91
95
|
// Design tokens
|
package/src/theme/colors.ts
CHANGED
|
@@ -9,20 +9,6 @@ function rgbToHex(r: number, g: number, b: number): string {
|
|
|
9
9
|
return `#${componentToHex(r)}${componentToHex(g)}${componentToHex(b)}`
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
function withAlphaOnWhite(hex: string, alpha: number): string {
|
|
13
|
-
const rgb = hexToRgb(hex)
|
|
14
|
-
if (!rgb) return hex
|
|
15
|
-
const r = rgb.r * alpha + 255 * (1 - alpha); const g = rgb.g * alpha + 255 * (1 - alpha); const b = rgb.b * alpha + 255 * (1 - alpha)
|
|
16
|
-
return rgbToHex(r, g, b)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function withAlphaOnDark(hex: string, alpha: number, bgHex = '#0f0f0f'): string {
|
|
20
|
-
const rgb = hexToRgb(hex); const bg = hexToRgb(bgHex)
|
|
21
|
-
if (!rgb || !bg) return hex
|
|
22
|
-
const r = rgb.r * alpha + bg.r * (1 - alpha); const g = rgb.g * alpha + bg.g * (1 - alpha); const b = rgb.b * alpha + bg.b * (1 - alpha)
|
|
23
|
-
return rgbToHex(r, g, b)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
12
|
function mixWithBackground(fgHex: string, bgHex: string, opacity: number): string {
|
|
27
13
|
const fg = hexToRgb(fgHex); const bg = hexToRgb(bgHex)
|
|
28
14
|
if (!fg || !bg) return fgHex
|
|
@@ -30,14 +16,11 @@ function mixWithBackground(fgHex: string, bgHex: string, opacity: number): strin
|
|
|
30
16
|
return rgbToHex(r, g, b)
|
|
31
17
|
}
|
|
32
18
|
|
|
33
|
-
function
|
|
34
|
-
return
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const rgb = hexToRgb(hex)
|
|
39
|
-
if (!rgb) return hex
|
|
40
|
-
return rgbToHex(rgb.r * (1 - amount), rgb.g * (1 - amount), rgb.b * (1 - amount))
|
|
19
|
+
function createColorPair(fg: string, bg: string, dark: boolean): { tint: string; border: string } {
|
|
20
|
+
return {
|
|
21
|
+
tint: mixWithBackground(fg, dark ? bg : '#ffffff', dark ? 0.15 : 0.08),
|
|
22
|
+
border: mixWithBackground(fg, dark ? bg : '#ffffff', dark ? 0.45 : 0.30),
|
|
23
|
+
}
|
|
41
24
|
}
|
|
42
25
|
|
|
43
26
|
// ─── Default palettes ─────────────────────────────────────────────────────────
|
|
@@ -91,49 +74,26 @@ export const defaultDark: ThemeColors = {
|
|
|
91
74
|
export function deriveColors(t: ThemeColors, scheme: 'light' | 'dark'): ResolvedColors {
|
|
92
75
|
const dark = scheme === 'dark'
|
|
93
76
|
const bg = t.background
|
|
77
|
+
const WHITE = '#ffffff'
|
|
78
|
+
const BLACK = '#000000'
|
|
94
79
|
|
|
95
|
-
// AUDIT FIX: Text hierarchy opacities raised to pass WCAG AA.
|
|
96
|
-
// foregroundSubtle was 0.55 → ~#858585 (3.5:1 fail on white)
|
|
97
|
-
// foregroundMuted was 0.38 → ~#ababab (2.2:1 critical fail on white)
|
|
98
|
-
// New values on light (#1a1a1a on #ffffff):
|
|
99
|
-
// foregroundSubtle 0.70 → ~#646464 (5.9:1 ✓ AA)
|
|
100
|
-
// foregroundMuted 0.62 → ~#767676 (4.5:1 ✓ AA minimum)
|
|
101
80
|
const foregroundSubtle = mixWithBackground(t.foreground, bg, 0.70)
|
|
102
81
|
const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62)
|
|
103
82
|
|
|
104
83
|
const surface = dark
|
|
105
|
-
?
|
|
106
|
-
:
|
|
84
|
+
? mixWithBackground(bg, BLACK, 0.94)
|
|
85
|
+
: mixWithBackground(bg, BLACK, 0.96)
|
|
107
86
|
const surfaceStrong = dark
|
|
108
|
-
?
|
|
109
|
-
:
|
|
87
|
+
? mixWithBackground(bg, BLACK, 0.88)
|
|
88
|
+
: mixWithBackground(bg, BLACK, 0.92)
|
|
110
89
|
|
|
111
|
-
// Skeleton needs higher contrast than surface to be visible.
|
|
112
|
-
// Light: 10% darken (was 4% via surface — invisible). Dark: 10% lighten.
|
|
113
90
|
const skeleton = dark
|
|
114
|
-
?
|
|
115
|
-
:
|
|
116
|
-
|
|
117
|
-
const destructiveTint = dark
|
|
118
|
-
? withAlphaOnDark(t.destructive, 0.15, bg)
|
|
119
|
-
: withAlphaOnWhite(t.destructive, 0.08)
|
|
120
|
-
const destructiveBorder = dark
|
|
121
|
-
? withAlphaOnDark(t.destructive, 0.45, bg)
|
|
122
|
-
: withAlphaOnWhite(t.destructive, 0.30)
|
|
123
|
-
|
|
124
|
-
const successTint = dark
|
|
125
|
-
? withAlphaOnDark(t.success, 0.15, bg)
|
|
126
|
-
: withAlphaOnWhite(t.success, 0.08)
|
|
127
|
-
const successBorder = dark
|
|
128
|
-
? withAlphaOnDark(t.success, 0.45, bg)
|
|
129
|
-
: withAlphaOnWhite(t.success, 0.30)
|
|
91
|
+
? mixWithBackground(bg, BLACK, 0.90)
|
|
92
|
+
: mixWithBackground(bg, BLACK, 0.90)
|
|
130
93
|
|
|
131
|
-
const
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
const warningBorder = dark
|
|
135
|
-
? withAlphaOnDark(t.warning, 0.45, bg)
|
|
136
|
-
: withAlphaOnWhite(t.warning, 0.30)
|
|
94
|
+
const { tint: destructiveTint, border: destructiveBorder } = createColorPair(t.destructive, bg, dark)
|
|
95
|
+
const { tint: successTint, border: successBorder } = createColorPair(t.success, bg, dark)
|
|
96
|
+
const { tint: warningTint, border: warningBorder } = createColorPair(t.warning, bg, dark)
|
|
137
97
|
|
|
138
98
|
return {
|
|
139
99
|
...t,
|
|
@@ -153,6 +113,8 @@ export function deriveColors(t: ThemeColors, scheme: 'light' | 'dark'): Resolved
|
|
|
153
113
|
accentForegroundResolved: t.accentForeground ?? t.primaryForeground,
|
|
154
114
|
ring: t.accent ?? t.primary,
|
|
155
115
|
input: t.border,
|
|
156
|
-
separator: dark
|
|
116
|
+
separator: dark
|
|
117
|
+
? mixWithBackground(t.border, WHITE, 0.78)
|
|
118
|
+
: mixWithBackground(t.border, BLACK, 0.84),
|
|
157
119
|
}
|
|
158
120
|
}
|
package/src/tokens.ts
CHANGED
|
@@ -49,17 +49,17 @@ export const SHADOWS = {
|
|
|
49
49
|
},
|
|
50
50
|
lg: {
|
|
51
51
|
shadowColor: '#000',
|
|
52
|
-
shadowOffset: { width: 0, height:
|
|
53
|
-
shadowOpacity: 0.
|
|
54
|
-
shadowRadius:
|
|
55
|
-
elevation:
|
|
52
|
+
shadowOffset: { width: 0, height: 4 },
|
|
53
|
+
shadowOpacity: 0.12,
|
|
54
|
+
shadowRadius: 12,
|
|
55
|
+
elevation: 8,
|
|
56
56
|
},
|
|
57
57
|
xl: {
|
|
58
58
|
shadowColor: '#000',
|
|
59
|
-
shadowOffset: { width: 0, height:
|
|
60
|
-
shadowOpacity: 0.
|
|
59
|
+
shadowOffset: { width: 0, height: 8 },
|
|
60
|
+
shadowOpacity: 0.18,
|
|
61
61
|
shadowRadius: 24,
|
|
62
|
-
elevation:
|
|
62
|
+
elevation: 16,
|
|
63
63
|
},
|
|
64
64
|
} as const
|
|
65
65
|
|
|
@@ -200,6 +200,20 @@ export const TYPOGRAPHY = {
|
|
|
200
200
|
lineHeight: 18,
|
|
201
201
|
letterSpacing: 0,
|
|
202
202
|
},
|
|
203
|
+
'code-sm': {
|
|
204
|
+
fontFamily: 'SohneMono-Regular',
|
|
205
|
+
fontSize: 13,
|
|
206
|
+
fontWeight: '400' as const,
|
|
207
|
+
lineHeight: 18,
|
|
208
|
+
letterSpacing: 0,
|
|
209
|
+
},
|
|
210
|
+
'code-md': {
|
|
211
|
+
fontFamily: 'SohneMono-Regular',
|
|
212
|
+
fontSize: 15,
|
|
213
|
+
fontWeight: '400' as const,
|
|
214
|
+
lineHeight: 22,
|
|
215
|
+
letterSpacing: 0,
|
|
216
|
+
},
|
|
203
217
|
} as const
|
|
204
218
|
|
|
205
219
|
// ─── Types ────────────────────────────────────────────────────────────────────
|
|
@@ -106,31 +106,22 @@ const CATEGORIES: CuratedCategoryDef[] = [
|
|
|
106
106
|
},
|
|
107
107
|
]
|
|
108
108
|
|
|
109
|
-
let _allIcons: string[] | null = null
|
|
110
|
-
let _categorized: CuratedCategoryDef[] | null = null
|
|
111
|
-
|
|
112
109
|
export function getAllCuratedIcons(): string[] {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
for (const
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
result.push(name)
|
|
121
|
-
}
|
|
110
|
+
const seen = new Set<string>()
|
|
111
|
+
const result: string[] = []
|
|
112
|
+
for (const cat of CATEGORIES) {
|
|
113
|
+
for (const name of cat.icons) {
|
|
114
|
+
if (!seen.has(name)) {
|
|
115
|
+
seen.add(name)
|
|
116
|
+
result.push(name)
|
|
122
117
|
}
|
|
123
118
|
}
|
|
124
|
-
_allIcons = result
|
|
125
119
|
}
|
|
126
|
-
return
|
|
120
|
+
return result
|
|
127
121
|
}
|
|
128
122
|
|
|
129
123
|
export function getCuratedCategories(): CuratedCategoryDef[] {
|
|
130
|
-
|
|
131
|
-
_categorized = CATEGORIES.map((cat) => ({ ...cat, icons: [...cat.icons] }))
|
|
132
|
-
}
|
|
133
|
-
return _categorized!
|
|
124
|
+
return CATEGORIES.map((cat) => ({ ...cat, icons: [...cat.icons] }))
|
|
134
125
|
}
|
|
135
126
|
|
|
136
127
|
export function getIconCategory(name: string): string | undefined {
|
package/src/utils/haptics.ts
CHANGED
|
@@ -1,45 +1,34 @@
|
|
|
1
1
|
import { Platform } from 'react-native'
|
|
2
|
+
import * as Haptics from 'expo-haptics'
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
async function getHaptics(): Promise<typeof import('expo-haptics') | null> {
|
|
7
|
-
if (Platform.OS === 'web') return null
|
|
8
|
-
if (!_loaded) {
|
|
9
|
-
_loaded = true
|
|
10
|
-
try {
|
|
11
|
-
_haptics = await import('expo-haptics')
|
|
12
|
-
} catch {
|
|
13
|
-
_haptics = null
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
return _haptics
|
|
4
|
+
function maybeHaptics() {
|
|
5
|
+
return Platform.OS === 'web' ? null : Haptics
|
|
17
6
|
}
|
|
18
7
|
|
|
19
8
|
export function selectionAsync(): void {
|
|
20
|
-
|
|
9
|
+
maybeHaptics()?.selectionAsync()
|
|
21
10
|
}
|
|
22
11
|
|
|
23
12
|
export function impactLight(): void {
|
|
24
|
-
|
|
13
|
+
maybeHaptics()?.impactAsync(Haptics.ImpactFeedbackStyle.Light)
|
|
25
14
|
}
|
|
26
15
|
|
|
27
16
|
export function impactMedium(): void {
|
|
28
|
-
|
|
17
|
+
maybeHaptics()?.impactAsync(Haptics.ImpactFeedbackStyle.Medium)
|
|
29
18
|
}
|
|
30
19
|
|
|
31
20
|
export function impactHeavy(): void {
|
|
32
|
-
|
|
21
|
+
maybeHaptics()?.impactAsync(Haptics.ImpactFeedbackStyle.Heavy)
|
|
33
22
|
}
|
|
34
23
|
|
|
35
24
|
export function notificationSuccess(): void {
|
|
36
|
-
|
|
25
|
+
maybeHaptics()?.notificationAsync(Haptics.NotificationFeedbackType.Success)
|
|
37
26
|
}
|
|
38
27
|
|
|
39
28
|
export function notificationError(): void {
|
|
40
|
-
|
|
29
|
+
maybeHaptics()?.notificationAsync(Haptics.NotificationFeedbackType.Error)
|
|
41
30
|
}
|
|
42
31
|
|
|
43
32
|
export function notificationWarning(): void {
|
|
44
|
-
|
|
33
|
+
maybeHaptics()?.notificationAsync(Haptics.NotificationFeedbackType.Warning)
|
|
45
34
|
}
|
package/src/utils/icons.ts
CHANGED
|
@@ -26,27 +26,20 @@ const ALL_FAMILIES: { name: IconFamily; component: IconComponentType; glyphMap?:
|
|
|
26
26
|
{ name: 'Ionicons', component: Ionicons as unknown as IconComponentType },
|
|
27
27
|
]
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
for (const entry of ALL_FAMILIES) {
|
|
35
|
-
try {
|
|
36
|
-
entry.glyphMap = (entry.component as unknown as { glyphMap?: Record<string, number> }).glyphMap
|
|
37
|
-
} catch {
|
|
38
|
-
entry.glyphMap = {}
|
|
39
|
-
}
|
|
29
|
+
function getGlyphMap(component: IconComponentType): Record<string, number> {
|
|
30
|
+
try {
|
|
31
|
+
return (component as unknown as { glyphMap?: Record<string, number> }).glyphMap ?? {}
|
|
32
|
+
} catch {
|
|
33
|
+
return {}
|
|
40
34
|
}
|
|
41
35
|
}
|
|
42
36
|
|
|
43
37
|
export function Icon({ name, size, color, family }: IconProps): React.ReactElement | null {
|
|
44
|
-
ensureGlyphCache()
|
|
45
38
|
const entry = family
|
|
46
39
|
? ALL_FAMILIES.find((f) => f.name === family)
|
|
47
40
|
: ALL_FAMILIES.find((f) => {
|
|
48
|
-
const glyphMap = f.
|
|
49
|
-
return
|
|
41
|
+
const glyphMap = getGlyphMap(f.component)
|
|
42
|
+
return name in glyphMap
|
|
50
43
|
})
|
|
51
44
|
|
|
52
45
|
if (!entry) return null
|
package/dist/ListGroup.d.mts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { ViewStyle } from 'react-native';
|
|
3
|
-
|
|
4
|
-
type ListGroupVariant = 'plain' | 'card';
|
|
5
|
-
interface ListGroupProps {
|
|
6
|
-
children: React.ReactNode;
|
|
7
|
-
/**
|
|
8
|
-
* - `plain` (default): no background, plain ListItems inside.
|
|
9
|
-
* - `card`: card surface with background + border wrapping plain ListItems.
|
|
10
|
-
*/
|
|
11
|
-
variant?: ListGroupVariant;
|
|
12
|
-
style?: ViewStyle;
|
|
13
|
-
}
|
|
14
|
-
interface ListGroupHeaderProps {
|
|
15
|
-
children: React.ReactNode;
|
|
16
|
-
style?: ViewStyle;
|
|
17
|
-
}
|
|
18
|
-
interface ListGroupFooterProps {
|
|
19
|
-
children: React.ReactNode;
|
|
20
|
-
style?: ViewStyle;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* ListGroup wraps multiple ListItems and auto-adds separators between them.
|
|
24
|
-
* Use variant="card" for a standalone surface or "plain" for items inside another container.
|
|
25
|
-
*/
|
|
26
|
-
declare function ListGroup({ children, variant, style }: ListGroupProps): React.JSX.Element;
|
|
27
|
-
declare namespace ListGroup {
|
|
28
|
-
var Header: typeof ListGroupHeader;
|
|
29
|
-
var Footer: typeof ListGroupFooter;
|
|
30
|
-
}
|
|
31
|
-
declare function ListGroupHeader({ children, style }: ListGroupHeaderProps): React.JSX.Element;
|
|
32
|
-
declare function ListGroupFooter({ children, style }: ListGroupFooterProps): React.JSX.Element;
|
|
33
|
-
|
|
34
|
-
export { ListGroup, ListGroupFooter, type ListGroupFooterProps, ListGroupHeader, type ListGroupHeaderProps, type ListGroupProps, type ListGroupVariant };
|
package/dist/ListGroup.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { ViewStyle } from 'react-native';
|
|
3
|
-
|
|
4
|
-
type ListGroupVariant = 'plain' | 'card';
|
|
5
|
-
interface ListGroupProps {
|
|
6
|
-
children: React.ReactNode;
|
|
7
|
-
/**
|
|
8
|
-
* - `plain` (default): no background, plain ListItems inside.
|
|
9
|
-
* - `card`: card surface with background + border wrapping plain ListItems.
|
|
10
|
-
*/
|
|
11
|
-
variant?: ListGroupVariant;
|
|
12
|
-
style?: ViewStyle;
|
|
13
|
-
}
|
|
14
|
-
interface ListGroupHeaderProps {
|
|
15
|
-
children: React.ReactNode;
|
|
16
|
-
style?: ViewStyle;
|
|
17
|
-
}
|
|
18
|
-
interface ListGroupFooterProps {
|
|
19
|
-
children: React.ReactNode;
|
|
20
|
-
style?: ViewStyle;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* ListGroup wraps multiple ListItems and auto-adds separators between them.
|
|
24
|
-
* Use variant="card" for a standalone surface or "plain" for items inside another container.
|
|
25
|
-
*/
|
|
26
|
-
declare function ListGroup({ children, variant, style }: ListGroupProps): React.JSX.Element;
|
|
27
|
-
declare namespace ListGroup {
|
|
28
|
-
var Header: typeof ListGroupHeader;
|
|
29
|
-
var Footer: typeof ListGroupFooter;
|
|
30
|
-
}
|
|
31
|
-
declare function ListGroupHeader({ children, style }: ListGroupHeaderProps): React.JSX.Element;
|
|
32
|
-
declare function ListGroupFooter({ children, style }: ListGroupFooterProps): React.JSX.Element;
|
|
33
|
-
|
|
34
|
-
export { ListGroup, ListGroupFooter, type ListGroupFooterProps, ListGroupHeader, type ListGroupHeaderProps, type ListGroupProps, type ListGroupVariant };
|
package/dist/ListGroup.mjs
DELETED
package/dist/MenuGroup.d.mts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { ViewStyle } from 'react-native';
|
|
3
|
-
|
|
4
|
-
type MenuGroupVariant = 'plain' | 'card';
|
|
5
|
-
interface MenuGroupProps {
|
|
6
|
-
children: React.ReactNode;
|
|
7
|
-
/**
|
|
8
|
-
* - `plain` (default): no background, plain MenuItems inside.
|
|
9
|
-
* - `card`: card surface with background + border wrapping plain MenuItems.
|
|
10
|
-
*/
|
|
11
|
-
variant?: MenuGroupVariant;
|
|
12
|
-
style?: ViewStyle;
|
|
13
|
-
}
|
|
14
|
-
interface MenuGroupHeaderProps {
|
|
15
|
-
children: React.ReactNode;
|
|
16
|
-
style?: ViewStyle;
|
|
17
|
-
}
|
|
18
|
-
interface MenuGroupFooterProps {
|
|
19
|
-
children: React.ReactNode;
|
|
20
|
-
style?: ViewStyle;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* MenuGroup wraps multiple MenuItems and auto-adds separators between them.
|
|
24
|
-
* Use variant="card" for a standalone surface or "plain" for items inside another container.
|
|
25
|
-
*/
|
|
26
|
-
declare function MenuGroup({ children, variant, style }: MenuGroupProps): React.JSX.Element;
|
|
27
|
-
declare namespace MenuGroup {
|
|
28
|
-
var Header: typeof MenuGroupHeader;
|
|
29
|
-
var Footer: typeof MenuGroupFooter;
|
|
30
|
-
}
|
|
31
|
-
declare function MenuGroupHeader({ children, style }: MenuGroupHeaderProps): React.JSX.Element;
|
|
32
|
-
declare function MenuGroupFooter({ children, style }: MenuGroupFooterProps): React.JSX.Element;
|
|
33
|
-
|
|
34
|
-
export { MenuGroup, MenuGroupFooter, type MenuGroupFooterProps, MenuGroupHeader, type MenuGroupHeaderProps, type MenuGroupProps, type MenuGroupVariant };
|
package/dist/MenuGroup.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { ViewStyle } from 'react-native';
|
|
3
|
-
|
|
4
|
-
type MenuGroupVariant = 'plain' | 'card';
|
|
5
|
-
interface MenuGroupProps {
|
|
6
|
-
children: React.ReactNode;
|
|
7
|
-
/**
|
|
8
|
-
* - `plain` (default): no background, plain MenuItems inside.
|
|
9
|
-
* - `card`: card surface with background + border wrapping plain MenuItems.
|
|
10
|
-
*/
|
|
11
|
-
variant?: MenuGroupVariant;
|
|
12
|
-
style?: ViewStyle;
|
|
13
|
-
}
|
|
14
|
-
interface MenuGroupHeaderProps {
|
|
15
|
-
children: React.ReactNode;
|
|
16
|
-
style?: ViewStyle;
|
|
17
|
-
}
|
|
18
|
-
interface MenuGroupFooterProps {
|
|
19
|
-
children: React.ReactNode;
|
|
20
|
-
style?: ViewStyle;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* MenuGroup wraps multiple MenuItems and auto-adds separators between them.
|
|
24
|
-
* Use variant="card" for a standalone surface or "plain" for items inside another container.
|
|
25
|
-
*/
|
|
26
|
-
declare function MenuGroup({ children, variant, style }: MenuGroupProps): React.JSX.Element;
|
|
27
|
-
declare namespace MenuGroup {
|
|
28
|
-
var Header: typeof MenuGroupHeader;
|
|
29
|
-
var Footer: typeof MenuGroupFooter;
|
|
30
|
-
}
|
|
31
|
-
declare function MenuGroupHeader({ children, style }: MenuGroupHeaderProps): React.JSX.Element;
|
|
32
|
-
declare function MenuGroupFooter({ children, style }: MenuGroupFooterProps): React.JSX.Element;
|
|
33
|
-
|
|
34
|
-
export { MenuGroup, MenuGroupFooter, type MenuGroupFooterProps, MenuGroupHeader, type MenuGroupHeaderProps, type MenuGroupProps, type MenuGroupVariant };
|
package/dist/MenuGroup.js
DELETED
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var React2 = require('react');
|
|
4
|
-
var reactNative = require('react-native');
|
|
5
|
-
var reactNativeSizeMatters = require('react-native-size-matters');
|
|
6
|
-
|
|
7
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
-
|
|
9
|
-
var React2__default = /*#__PURE__*/_interopDefault(React2);
|
|
10
|
-
|
|
11
|
-
// src/components/MenuGroup/MenuGroup.tsx
|
|
12
|
-
var ThemeContext = React2.createContext(void 0);
|
|
13
|
-
function useTheme() {
|
|
14
|
-
const context = React2.useContext(ThemeContext);
|
|
15
|
-
if (!context) {
|
|
16
|
-
throw new Error("useTheme must be used within a ThemeProvider");
|
|
17
|
-
}
|
|
18
|
-
return context;
|
|
19
|
-
}
|
|
20
|
-
var isWeb = reactNative.Platform.OS === "web";
|
|
21
|
-
var s = isWeb ? (n) => n : reactNativeSizeMatters.scale;
|
|
22
|
-
var vs = isWeb ? (n) => n : reactNativeSizeMatters.verticalScale;
|
|
23
|
-
|
|
24
|
-
// src/tokens.ts
|
|
25
|
-
var RADIUS = {
|
|
26
|
-
md: 14};
|
|
27
|
-
|
|
28
|
-
// src/components/MenuGroup/MenuGroup.tsx
|
|
29
|
-
function MenuGroup({ children, variant = "plain", style }) {
|
|
30
|
-
const { colors } = useTheme();
|
|
31
|
-
const processedChildren = React2__default.default.Children.map(children, (child, index) => {
|
|
32
|
-
if (!React2__default.default.isValidElement(child)) return child;
|
|
33
|
-
if (child.type === MenuGroupHeader || child.type === MenuGroupFooter) {
|
|
34
|
-
return child;
|
|
35
|
-
}
|
|
36
|
-
const childProps = child.props;
|
|
37
|
-
const isMenuItem = "onPress" in childProps;
|
|
38
|
-
if (!isMenuItem) return child;
|
|
39
|
-
const isLast = index === React2__default.default.Children.count(children) - 1;
|
|
40
|
-
if (childProps["showSeparator"] === void 0 && !isLast) {
|
|
41
|
-
return React2__default.default.cloneElement(child, {
|
|
42
|
-
showSeparator: true
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
return child;
|
|
46
|
-
});
|
|
47
|
-
const cardStyle = variant === "card" ? {
|
|
48
|
-
backgroundColor: colors.card,
|
|
49
|
-
borderRadius: RADIUS.md,
|
|
50
|
-
borderWidth: 1,
|
|
51
|
-
borderColor: colors.border,
|
|
52
|
-
shadowColor: "#000",
|
|
53
|
-
shadowOffset: { width: 0, height: 2 },
|
|
54
|
-
shadowOpacity: 0.06,
|
|
55
|
-
shadowRadius: 6,
|
|
56
|
-
elevation: 2,
|
|
57
|
-
paddingVertical: vs(4)
|
|
58
|
-
} : {};
|
|
59
|
-
return /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.container, cardStyle, style] }, processedChildren);
|
|
60
|
-
}
|
|
61
|
-
function MenuGroupHeader({ children, style }) {
|
|
62
|
-
const { colors } = useTheme();
|
|
63
|
-
if (typeof children === "string") {
|
|
64
|
-
return /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.header, { borderBottomColor: colors.separator }, style] }, /* @__PURE__ */ React2__default.default.createElement(reactNative.Text, { style: [styles.headerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
|
|
65
|
-
}
|
|
66
|
-
return /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.header, { borderBottomColor: colors.separator }, style] }, children);
|
|
67
|
-
}
|
|
68
|
-
function MenuGroupFooter({ children, style }) {
|
|
69
|
-
const { colors } = useTheme();
|
|
70
|
-
if (typeof children === "string") {
|
|
71
|
-
return /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.footer, style] }, /* @__PURE__ */ React2__default.default.createElement(reactNative.Text, { style: [styles.footerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
|
|
72
|
-
}
|
|
73
|
-
return /* @__PURE__ */ React2__default.default.createElement(reactNative.View, { style: [styles.footer, style] }, children);
|
|
74
|
-
}
|
|
75
|
-
MenuGroup.Header = MenuGroupHeader;
|
|
76
|
-
MenuGroup.Footer = MenuGroupFooter;
|
|
77
|
-
var styles = reactNative.StyleSheet.create({
|
|
78
|
-
container: {
|
|
79
|
-
overflow: "hidden"
|
|
80
|
-
},
|
|
81
|
-
header: {
|
|
82
|
-
paddingHorizontal: s(16),
|
|
83
|
-
paddingTop: vs(12),
|
|
84
|
-
paddingBottom: vs(8),
|
|
85
|
-
borderBottomWidth: reactNative.StyleSheet.hairlineWidth
|
|
86
|
-
},
|
|
87
|
-
headerText: {
|
|
88
|
-
fontFamily: "Sohne-SemiBold",
|
|
89
|
-
fontSize: 13,
|
|
90
|
-
letterSpacing: 0.32,
|
|
91
|
-
textTransform: "uppercase"
|
|
92
|
-
},
|
|
93
|
-
footer: {
|
|
94
|
-
paddingHorizontal: s(16),
|
|
95
|
-
paddingTop: vs(8),
|
|
96
|
-
paddingBottom: vs(12)
|
|
97
|
-
},
|
|
98
|
-
footerText: {
|
|
99
|
-
fontFamily: "Sohne-Regular",
|
|
100
|
-
fontSize: 12
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
|
|
104
|
-
exports.MenuGroup = MenuGroup;
|
|
105
|
-
exports.MenuGroupFooter = MenuGroupFooter;
|
|
106
|
-
exports.MenuGroupHeader = MenuGroupHeader;
|
package/dist/MenuGroup.mjs
DELETED
package/dist/chunk-ARONDO7M.mjs
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { Platform } from 'react-native';
|
|
2
|
-
|
|
3
|
-
// src/utils/haptics.ts
|
|
4
|
-
var _haptics = null;
|
|
5
|
-
var _loaded = false;
|
|
6
|
-
async function getHaptics() {
|
|
7
|
-
if (Platform.OS === "web") return null;
|
|
8
|
-
if (!_loaded) {
|
|
9
|
-
_loaded = true;
|
|
10
|
-
try {
|
|
11
|
-
_haptics = await import('expo-haptics');
|
|
12
|
-
} catch {
|
|
13
|
-
_haptics = null;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
return _haptics;
|
|
17
|
-
}
|
|
18
|
-
function selectionAsync() {
|
|
19
|
-
getHaptics().then((h) => h?.selectionAsync());
|
|
20
|
-
}
|
|
21
|
-
function impactLight() {
|
|
22
|
-
getHaptics().then((h) => h?.impactAsync(h.ImpactFeedbackStyle.Light));
|
|
23
|
-
}
|
|
24
|
-
function impactMedium() {
|
|
25
|
-
getHaptics().then((h) => h?.impactAsync(h.ImpactFeedbackStyle.Medium));
|
|
26
|
-
}
|
|
27
|
-
function impactHeavy() {
|
|
28
|
-
getHaptics().then((h) => h?.impactAsync(h.ImpactFeedbackStyle.Heavy));
|
|
29
|
-
}
|
|
30
|
-
function notificationSuccess() {
|
|
31
|
-
getHaptics().then((h) => h?.notificationAsync(h.NotificationFeedbackType.Success));
|
|
32
|
-
}
|
|
33
|
-
function notificationError() {
|
|
34
|
-
getHaptics().then((h) => h?.notificationAsync(h.NotificationFeedbackType.Error));
|
|
35
|
-
}
|
|
36
|
-
function notificationWarning() {
|
|
37
|
-
getHaptics().then((h) => h?.notificationAsync(h.NotificationFeedbackType.Warning));
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export { impactHeavy, impactLight, impactMedium, notificationError, notificationSuccess, notificationWarning, selectionAsync };
|