@hzblj/kara-components 0.9.0 → 0.11.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 +72 -28
- package/README.md +8 -8
- package/lib/module/atoms/activity-indicator/activity-indicator.android.js +6 -1
- package/lib/module/atoms/activity-indicator/activity-indicator.android.js.map +1 -1
- package/lib/module/atoms/activity-indicator/activity-indicator.ios.js +2 -0
- package/lib/module/atoms/activity-indicator/activity-indicator.ios.js.map +1 -1
- package/lib/module/atoms/avatar/avatar.js +5 -0
- package/lib/module/atoms/avatar/avatar.js.map +1 -1
- package/lib/module/atoms/button/button-tokens.js +2 -2
- package/lib/module/atoms/button/button-tokens.js.map +1 -1
- package/lib/module/atoms/button/button.android.js +6 -2
- package/lib/module/atoms/button/button.android.js.map +1 -1
- package/lib/module/atoms/button/button.ios.js +7 -2
- package/lib/module/atoms/button/button.ios.js.map +1 -1
- package/lib/module/atoms/card/card.android.js +5 -3
- package/lib/module/atoms/card/card.android.js.map +1 -1
- package/lib/module/atoms/card/card.ios.js +7 -3
- package/lib/module/atoms/card/card.ios.js.map +1 -1
- package/lib/module/atoms/checkbox/checkbox.android.js +1 -1
- package/lib/module/atoms/checkbox/checkbox.android.js.map +1 -1
- package/lib/module/atoms/color-picker/color-picker.android.js +32 -5
- package/lib/module/atoms/color-picker/color-picker.android.js.map +1 -1
- package/lib/module/atoms/fab/fab.android.js +9 -1
- package/lib/module/atoms/fab/fab.android.js.map +1 -1
- package/lib/module/atoms/fab/fab.ios.js +9 -3
- package/lib/module/atoms/fab/fab.ios.js.map +1 -1
- package/lib/module/atoms/glass-view/glass-view.android.js +1 -1
- package/lib/module/atoms/glass-view/glass-view.android.js.map +1 -1
- package/lib/module/atoms/h-stack/h-stack.ios.js +5 -3
- package/lib/module/atoms/h-stack/h-stack.ios.js.map +1 -1
- package/lib/module/atoms/icon-button/icon-button.android.js +9 -0
- package/lib/module/atoms/icon-button/icon-button.android.js.map +1 -1
- package/lib/module/atoms/icon-button/icon-button.ios.js +26 -6
- package/lib/module/atoms/icon-button/icon-button.ios.js.map +1 -1
- package/lib/module/atoms/image/image.js +4 -4
- package/lib/module/atoms/image/image.js.map +1 -1
- package/lib/module/atoms/pressable/pressable.js +52 -28
- package/lib/module/atoms/pressable/pressable.js.map +1 -1
- package/lib/module/atoms/progress/progress.android.js +7 -0
- package/lib/module/atoms/progress/progress.android.js.map +1 -1
- package/lib/module/atoms/progress/progress.ios.js +6 -1
- package/lib/module/atoms/progress/progress.ios.js.map +1 -1
- package/lib/module/atoms/segmented-control/segmented-control.android.js +1 -1
- package/lib/module/atoms/segmented-control/segmented-control.android.js.map +1 -1
- package/lib/module/atoms/segmented-control/segmented-control.ios.js +1 -1
- package/lib/module/atoms/segmented-control/segmented-control.ios.js.map +1 -1
- package/lib/module/atoms/skeleton/skeleton.js +20 -6
- package/lib/module/atoms/skeleton/skeleton.js.map +1 -1
- package/lib/module/atoms/surface/surface.android.js +5 -3
- package/lib/module/atoms/surface/surface.android.js.map +1 -1
- package/lib/module/atoms/surface/surface.ios.js +7 -3
- package/lib/module/atoms/surface/surface.ios.js.map +1 -1
- package/lib/module/atoms/switch/switch.android.js +1 -1
- package/lib/module/atoms/switch/switch.android.js.map +1 -1
- package/lib/module/atoms/text/text.android.js +5 -3
- package/lib/module/atoms/text/text.android.js.map +1 -1
- package/lib/module/atoms/text/text.ios.js +6 -4
- package/lib/module/atoms/text/text.ios.js.map +1 -1
- package/lib/module/atoms/v-stack/v-stack.ios.js +5 -3
- package/lib/module/atoms/v-stack/v-stack.ios.js.map +1 -1
- package/lib/module/atoms/z-stack/z-stack.ios.js +5 -3
- package/lib/module/atoms/z-stack/z-stack.ios.js.map +1 -1
- package/lib/module/glyph/glyph.android.js +2 -0
- package/lib/module/glyph/glyph.android.js.map +1 -1
- package/lib/module/glyph/glyph.ios.js +5 -2
- package/lib/module/glyph/glyph.ios.js.map +1 -1
- package/lib/module/molecules/collapsible/collapsible.android.js +18 -8
- package/lib/module/molecules/collapsible/collapsible.android.js.map +1 -1
- package/lib/module/molecules/labeled-content/labeled-content.js +4 -1
- package/lib/module/molecules/labeled-content/labeled-content.js.map +1 -1
- package/lib/module/molecules/link/link.js +4 -1
- package/lib/module/molecules/link/link.js.map +1 -1
- package/lib/module/molecules/list-item/list-item.js +4 -1
- package/lib/module/molecules/list-item/list-item.js.map +1 -1
- package/lib/module/molecules/navigation-bar/navigation-bar.android.js +1 -1
- package/lib/module/molecules/navigation-bar/navigation-bar.android.js.map +1 -1
- package/lib/module/molecules/navigation-bar/navigation-bar.ios.js +1 -1
- package/lib/module/molecules/navigation-bar/navigation-bar.ios.js.map +1 -1
- package/lib/module/molecules/rn-list-item/rn-list-item.js +10 -2
- package/lib/module/molecules/rn-list-item/rn-list-item.js.map +1 -1
- package/lib/module/molecules/scroll-edge-container/scroll-edge-container.android.js +3 -4
- package/lib/module/molecules/scroll-edge-container/scroll-edge-container.android.js.map +1 -1
- package/lib/module/molecules/stepper/stepper.ios.js +6 -2
- package/lib/module/molecules/stepper/stepper.ios.js.map +1 -1
- package/lib/module/motion.js +19 -0
- package/lib/module/motion.js.map +1 -0
- package/lib/module/organisms/fab-menu/fab-menu.android.js +8 -5
- package/lib/module/organisms/fab-menu/fab-menu.android.js.map +1 -1
- package/lib/module/organisms/fab-menu/fab-menu.ios.js +5 -2
- package/lib/module/organisms/fab-menu/fab-menu.ios.js.map +1 -1
- package/lib/module/organisms/snackbar/snackbar.js +142 -17
- package/lib/module/organisms/snackbar/snackbar.js.map +1 -1
- package/lib/module/organisms/swipe-actions/swipe-actions.android.js +1 -1
- package/lib/module/organisms/swipe-actions/swipe-actions.android.js.map +1 -1
- package/lib/module/use-stack-modifiers.js +10 -8
- package/lib/module/use-stack-modifiers.js.map +1 -1
- package/lib/typescript/atoms/activity-indicator/activity-indicator.types.d.ts +3 -1
- package/lib/typescript/atoms/avatar/avatar.types.d.ts +7 -2
- package/lib/typescript/atoms/badge/badge.types.d.ts +1 -1
- package/lib/typescript/atoms/blur-view/blur-view.types.d.ts +6 -6
- package/lib/typescript/atoms/button/button-tokens.d.ts +1 -1
- package/lib/typescript/atoms/button/button.types.d.ts +9 -7
- package/lib/typescript/atoms/card/card.types.d.ts +3 -3
- package/lib/typescript/atoms/checkbox/checkbox.types.d.ts +2 -2
- package/lib/typescript/atoms/chip/chip.types.d.ts +1 -1
- package/lib/typescript/atoms/color-picker/color-picker.types.d.ts +4 -3
- package/lib/typescript/atoms/date-picker/date-picker.types.d.ts +4 -4
- package/lib/typescript/atoms/divider/divider.types.d.ts +2 -2
- package/lib/typescript/atoms/fab/fab.types.d.ts +10 -3
- package/lib/typescript/atoms/glass-view/glass-view.types.d.ts +5 -5
- package/lib/typescript/atoms/h-stack/h-stack.types.d.ts +8 -5
- package/lib/typescript/atoms/icon/icon.types.d.ts +4 -4
- package/lib/typescript/atoms/icon-button/icon-button.types.d.ts +14 -3
- package/lib/typescript/atoms/image/image.d.ts +2 -2
- package/lib/typescript/atoms/island/island.types.d.ts +4 -4
- package/lib/typescript/atoms/list/list.types.d.ts +5 -5
- package/lib/typescript/atoms/picker/picker.types.d.ts +1 -1
- package/lib/typescript/atoms/pressable/pressable.types.d.ts +23 -7
- package/lib/typescript/atoms/progress/progress.types.d.ts +3 -1
- package/lib/typescript/atoms/rn-flat-list/rn-flat-list.types.d.ts +2 -2
- package/lib/typescript/atoms/rn-icon/rn-icon.types.d.ts +1 -1
- package/lib/typescript/atoms/rn-scroll-view/rn-scroll-view.types.d.ts +2 -2
- package/lib/typescript/atoms/rn-section-list/rn-section-list.types.d.ts +2 -2
- package/lib/typescript/atoms/rn-text/rn-text.types.d.ts +2 -2
- package/lib/typescript/atoms/rn-view/rn-view.types.d.ts +3 -3
- package/lib/typescript/atoms/scroll-view/scroll-view.types.d.ts +3 -3
- package/lib/typescript/atoms/segmented-control/segmented-control.types.d.ts +3 -3
- package/lib/typescript/atoms/skeleton/skeleton.types.d.ts +2 -1
- package/lib/typescript/atoms/spacer/spacer.types.d.ts +1 -1
- package/lib/typescript/atoms/surface/surface.types.d.ts +3 -3
- package/lib/typescript/atoms/switch/switch.types.d.ts +1 -1
- package/lib/typescript/atoms/text/text.types.d.ts +3 -3
- package/lib/typescript/atoms/text-field/text-field.types.d.ts +4 -4
- package/lib/typescript/atoms/v-stack/v-stack.types.d.ts +4 -4
- package/lib/typescript/atoms/z-stack/z-stack.types.d.ts +4 -4
- package/lib/typescript/glyph/glyph-button.types.d.ts +1 -1
- package/lib/typescript/glyph/glyph.types.d.ts +3 -1
- package/lib/typescript/molecules/collapsible/collapsible.types.d.ts +1 -1
- package/lib/typescript/molecules/empty-state/empty-state.types.d.ts +1 -1
- package/lib/typescript/molecules/label/label.types.d.ts +1 -1
- package/lib/typescript/molecules/labeled-content/labeled-content.types.d.ts +6 -4
- package/lib/typescript/molecules/link/link.types.d.ts +2 -1
- package/lib/typescript/molecules/list-item/list-item.types.d.ts +6 -4
- package/lib/typescript/molecules/navigation-bar/navigation-bar.types.d.ts +8 -8
- package/lib/typescript/molecules/pager/pager.types.d.ts +2 -2
- package/lib/typescript/molecules/radio-group/radio-group.types.d.ts +2 -2
- package/lib/typescript/molecules/rn-list-item/rn-list-item.types.d.ts +1 -1
- package/lib/typescript/molecules/rn-tooltip/rn-tooltip.types.d.ts +7 -7
- package/lib/typescript/molecules/scroll-edge-container/scroll-edge-container.types.d.ts +3 -3
- package/lib/typescript/molecules/search-bar/search-bar.types.d.ts +2 -2
- package/lib/typescript/molecules/stepper/stepper.ios.d.ts +1 -1
- package/lib/typescript/molecules/stepper/stepper.types.d.ts +2 -2
- package/lib/typescript/molecules/tooltip/tooltip.types.d.ts +6 -6
- package/lib/typescript/motion.d.ts +8 -0
- package/lib/typescript/organisms/action-sheet/action-sheet.types.d.ts +3 -3
- package/lib/typescript/organisms/alert/alert.types.d.ts +3 -3
- package/lib/typescript/organisms/context-menu/context-menu.types.d.ts +9 -9
- package/lib/typescript/organisms/fab-menu/fab-menu.types.d.ts +10 -5
- package/lib/typescript/organisms/form/form.types.d.ts +1 -1
- package/lib/typescript/organisms/menu/menu.types.d.ts +2 -2
- package/lib/typescript/organisms/sheet/sheet.types.d.ts +12 -12
- package/lib/typescript/organisms/snackbar/snackbar.types.d.ts +39 -6
- package/lib/typescript/organisms/swipe-actions/swipe-actions.types.d.ts +5 -5
- package/lib/typescript/templates/screen/screen.types.d.ts +2 -2
- package/lib/typescript/use-stack-modifiers.d.ts +6 -5
- package/package.json +4 -4
- package/src/atoms/activity-indicator/activity-indicator.android.tsx +7 -1
- package/src/atoms/activity-indicator/activity-indicator.ios.tsx +9 -1
- package/src/atoms/activity-indicator/activity-indicator.types.ts +3 -1
- package/src/atoms/avatar/avatar.tsx +5 -1
- package/src/atoms/avatar/avatar.types.ts +7 -2
- package/src/atoms/badge/badge.types.ts +1 -1
- package/src/atoms/blur-view/blur-view.types.ts +6 -6
- package/src/atoms/button/button-tokens.ts +2 -2
- package/src/atoms/button/button.android.tsx +5 -3
- package/src/atoms/button/button.ios.tsx +10 -2
- package/src/atoms/button/button.types.ts +9 -7
- package/src/atoms/card/card.android.tsx +6 -4
- package/src/atoms/card/card.ios.tsx +7 -3
- package/src/atoms/card/card.types.ts +9 -8
- package/src/atoms/checkbox/checkbox.android.tsx +1 -1
- package/src/atoms/checkbox/checkbox.types.ts +2 -2
- package/src/atoms/chip/chip.types.ts +1 -1
- package/src/atoms/color-picker/color-picker.android.tsx +26 -6
- package/src/atoms/color-picker/color-picker.types.ts +4 -3
- package/src/atoms/date-picker/date-picker.types.ts +4 -4
- package/src/atoms/divider/divider.types.ts +2 -2
- package/src/atoms/fab/fab.android.tsx +5 -3
- package/src/atoms/fab/fab.ios.tsx +8 -4
- package/src/atoms/fab/fab.types.ts +10 -3
- package/src/atoms/glass-view/glass-view.android.tsx +1 -1
- package/src/atoms/glass-view/glass-view.types.ts +5 -5
- package/src/atoms/h-stack/h-stack.ios.tsx +6 -4
- package/src/atoms/h-stack/h-stack.types.ts +18 -14
- package/src/atoms/icon/icon.types.ts +4 -4
- package/src/atoms/icon-button/icon-button.android.tsx +16 -3
- package/src/atoms/icon-button/icon-button.ios.tsx +24 -5
- package/src/atoms/icon-button/icon-button.types.ts +14 -3
- package/src/atoms/image/image.tsx +3 -3
- package/src/atoms/island/island.types.ts +4 -4
- package/src/atoms/list/list.types.ts +5 -5
- package/src/atoms/picker/picker.types.ts +1 -1
- package/src/atoms/pressable/pressable.tsx +50 -21
- package/src/atoms/pressable/pressable.types.ts +35 -17
- package/src/atoms/progress/progress.android.tsx +5 -3
- package/src/atoms/progress/progress.ios.tsx +5 -2
- package/src/atoms/progress/progress.types.ts +3 -1
- package/src/atoms/rn-flat-list/rn-flat-list.types.ts +2 -2
- package/src/atoms/rn-icon/rn-icon.types.ts +1 -1
- package/src/atoms/rn-scroll-view/rn-scroll-view.types.ts +2 -2
- package/src/atoms/rn-section-list/rn-section-list.types.ts +2 -2
- package/src/atoms/rn-text/rn-text.types.ts +2 -2
- package/src/atoms/rn-view/rn-view.types.ts +3 -3
- package/src/atoms/scroll-view/scroll-view.types.ts +3 -3
- package/src/atoms/segmented-control/segmented-control.android.tsx +1 -1
- package/src/atoms/segmented-control/segmented-control.ios.tsx +1 -1
- package/src/atoms/segmented-control/segmented-control.types.ts +3 -3
- package/src/atoms/skeleton/skeleton.tsx +18 -4
- package/src/atoms/skeleton/skeleton.types.ts +2 -1
- package/src/atoms/spacer/spacer.types.ts +1 -1
- package/src/atoms/surface/surface.android.tsx +6 -4
- package/src/atoms/surface/surface.ios.tsx +7 -3
- package/src/atoms/surface/surface.types.ts +11 -10
- package/src/atoms/switch/switch.android.tsx +1 -1
- package/src/atoms/switch/switch.types.ts +1 -1
- package/src/atoms/text/text.android.tsx +6 -4
- package/src/atoms/text/text.ios.tsx +6 -4
- package/src/atoms/text/text.types.ts +24 -23
- package/src/atoms/text-field/text-field.types.ts +4 -4
- package/src/atoms/v-stack/v-stack.ios.tsx +6 -4
- package/src/atoms/v-stack/v-stack.types.ts +18 -17
- package/src/atoms/z-stack/z-stack.ios.tsx +6 -4
- package/src/atoms/z-stack/z-stack.types.ts +16 -15
- package/src/glyph/glyph-button.types.ts +1 -1
- package/src/glyph/glyph.android.tsx +14 -2
- package/src/glyph/glyph.ios.tsx +13 -3
- package/src/glyph/glyph.types.ts +3 -1
- package/src/molecules/collapsible/collapsible.android.tsx +27 -7
- package/src/molecules/collapsible/collapsible.types.ts +1 -1
- package/src/molecules/empty-state/empty-state.types.ts +1 -1
- package/src/molecules/label/label.types.ts +1 -1
- package/src/molecules/labeled-content/labeled-content.tsx +12 -1
- package/src/molecules/labeled-content/labeled-content.types.ts +6 -4
- package/src/molecules/link/link.tsx +2 -1
- package/src/molecules/link/link.types.ts +2 -1
- package/src/molecules/list-item/list-item.tsx +20 -2
- package/src/molecules/list-item/list-item.types.ts +6 -4
- package/src/molecules/navigation-bar/navigation-bar.android.tsx +1 -1
- package/src/molecules/navigation-bar/navigation-bar.ios.tsx +1 -1
- package/src/molecules/navigation-bar/navigation-bar.types.ts +8 -8
- package/src/molecules/pager/pager.types.ts +2 -2
- package/src/molecules/radio-group/radio-group.types.ts +2 -2
- package/src/molecules/rn-list-item/rn-list-item.tsx +18 -3
- package/src/molecules/rn-list-item/rn-list-item.types.ts +1 -1
- package/src/molecules/rn-tooltip/rn-tooltip.types.ts +7 -7
- package/src/molecules/scroll-edge-container/scroll-edge-container.android.tsx +3 -2
- package/src/molecules/scroll-edge-container/scroll-edge-container.types.ts +3 -3
- package/src/molecules/search-bar/search-bar.types.ts +2 -2
- package/src/molecules/stepper/stepper.ios.tsx +8 -2
- package/src/molecules/stepper/stepper.types.ts +2 -2
- package/src/molecules/tooltip/tooltip.types.ts +6 -6
- package/src/motion.ts +13 -0
- package/src/organisms/action-sheet/action-sheet.types.ts +3 -3
- package/src/organisms/alert/alert.types.ts +3 -3
- package/src/organisms/context-menu/context-menu.types.ts +9 -9
- package/src/organisms/fab-menu/fab-menu.android.tsx +9 -5
- package/src/organisms/fab-menu/fab-menu.ios.tsx +6 -2
- package/src/organisms/fab-menu/fab-menu.types.ts +10 -5
- package/src/organisms/form/form.types.ts +1 -1
- package/src/organisms/menu/menu.types.ts +2 -2
- package/src/organisms/sheet/sheet.types.ts +12 -12
- package/src/organisms/snackbar/snackbar.tsx +143 -19
- package/src/organisms/snackbar/snackbar.types.ts +42 -6
- package/src/organisms/swipe-actions/swipe-actions.android.tsx +1 -1
- package/src/organisms/swipe-actions/swipe-actions.types.ts +5 -5
- package/src/templates/screen/screen.types.ts +2 -2
- package/src/use-stack-modifiers.ts +20 -7
- package/lib/module/platform-support.js +0 -19
- package/lib/module/platform-support.js.map +0 -1
- package/lib/typescript/platform-support.d.ts +0 -8
- package/src/platform-support.ts +0 -20
|
@@ -9,13 +9,13 @@ export type SheetDetent = 'auto' | number
|
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* `center` is iOS's own, `leading` Material's. `large` puts the title above the content in a large face, and once
|
|
12
|
-
* that scrolls under the bar the bar's own title fades in
|
|
12
|
+
* that scrolls under the bar the bar's own title fades in (centred on iOS, leading on Android).
|
|
13
13
|
*/
|
|
14
14
|
export type SheetTitleStyle = 'center' | 'large' | 'leading'
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* The sheet's header: a `NavigationBar` with the title and items, and anything else that should stay put above the
|
|
18
|
-
* content (`children
|
|
18
|
+
* content (`children`: a segmented control, a search hint). On iOS 26 a scrollable sheet's content scrolls under it
|
|
19
19
|
* with the system's scroll edge effect; elsewhere it sits above the content.
|
|
20
20
|
*/
|
|
21
21
|
export type SheetHeaderProps = {
|
|
@@ -27,11 +27,11 @@ export type SheetHeaderProps = {
|
|
|
27
27
|
leadingItems?: NavigationBarItem[]
|
|
28
28
|
/** A search field in place of the title (iOS). */
|
|
29
29
|
search?: NavigationBarSearch
|
|
30
|
-
/** The title
|
|
30
|
+
/** The title: in the bar, or above the content with a `large` `titleStyle`. */
|
|
31
31
|
title?: string
|
|
32
32
|
/** `center` by default. */
|
|
33
33
|
titleStyle?: SheetTitleStyle
|
|
34
|
-
/** In screen order, toward the trailing edge
|
|
34
|
+
/** In screen order, toward the trailing edge: the close item, by convention. */
|
|
35
35
|
trailingItems?: NavigationBarItem[]
|
|
36
36
|
}
|
|
37
37
|
|
|
@@ -39,14 +39,14 @@ export type SheetHeaderProps = {
|
|
|
39
39
|
export type SheetRef = {
|
|
40
40
|
/** Dismisses it without calling `onDismiss`, which reports the user's dismissals only. */
|
|
41
41
|
dismiss: () => Promise<void>
|
|
42
|
-
/** Presents at a detent
|
|
42
|
+
/** Presents at a detent, the first by default. */
|
|
43
43
|
present: (detentIndex?: number) => Promise<void>
|
|
44
44
|
/** Moves to another detent. */
|
|
45
45
|
resize: (detentIndex: number) => Promise<void>
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
/**
|
|
49
|
-
* A native sheet
|
|
49
|
+
* A native sheet (`UISheetPresentationController` on iOS, Material's bottom sheet on Android) with an optional
|
|
50
50
|
* native header (`<Sheet.Header>` as a direct child). The React Native tier: it needs no host, and must not sit inside
|
|
51
51
|
* one; native atoms in its content go in an `Island`.
|
|
52
52
|
*/
|
|
@@ -55,7 +55,7 @@ export type SheetProps = {
|
|
|
55
55
|
bg?: ColorToken
|
|
56
56
|
/** The content. A `<Sheet.Header>` among the direct children becomes the native header instead. */
|
|
57
57
|
children: ReactNode
|
|
58
|
-
/** Where the sheet can rest, smallest first. `['auto']`
|
|
58
|
+
/** Where the sheet can rest, smallest first. `['auto']` (fit the content) by default. */
|
|
59
59
|
detents?: SheetDetent[]
|
|
60
60
|
/** Dims what is behind. On by default. */
|
|
61
61
|
dimmed?: boolean
|
|
@@ -67,9 +67,9 @@ export type SheetProps = {
|
|
|
67
67
|
footer?: ReactElement
|
|
68
68
|
/** The drag handle. On by default. */
|
|
69
69
|
grabber?: boolean
|
|
70
|
-
/** The user dismissed it
|
|
70
|
+
/** The user dismissed it; `visible` going false does not call this. */
|
|
71
71
|
onDismiss: () => void
|
|
72
|
-
/** The sheet moved to another detent
|
|
72
|
+
/** The sheet moved to another detent: its index in `detents`. */
|
|
73
73
|
onDetentChange?: (detentIndex: number) => void
|
|
74
74
|
/** The sheet finished presenting. */
|
|
75
75
|
onPresent?: () => void
|
|
@@ -77,7 +77,7 @@ export type SheetProps = {
|
|
|
77
77
|
ref?: Ref<SheetRef>
|
|
78
78
|
/**
|
|
79
79
|
* The content is a scroll view (`<Sheet.ScrollView>`) the sheet drives: dragging past its top resizes the sheet,
|
|
80
|
-
* and a header scrolls with the iOS 26 edge effect. Off by default
|
|
80
|
+
* and a header scrolls with the iOS 26 edge effect. Off by default; set it with a scrolling body.
|
|
81
81
|
*/
|
|
82
82
|
scrollable?: boolean
|
|
83
83
|
/** Test identifier, forwarded to the native sheet. */
|
|
@@ -92,7 +92,7 @@ export type SheetScrollHandler = (event: NativeSyntheticEvent<NativeScrollEvent>
|
|
|
92
92
|
export type SheetScrollContextValue = {
|
|
93
93
|
/** Render it first in the content. `null` unless the header's `titleStyle` is `large`. */
|
|
94
94
|
largeTitle: ReactNode
|
|
95
|
-
/** Forward the scroll view's scroll events to it
|
|
95
|
+
/** Forward the scroll view's scroll events to it; it tracks the large title. Unset when there is none. */
|
|
96
96
|
onScroll?: SheetScrollHandler
|
|
97
97
|
/** The room an overlaid header takes, to add to the content's top padding. `0` where the header sits above it. */
|
|
98
98
|
topInset: number
|
|
@@ -105,7 +105,7 @@ export type SheetScrollContextValue = {
|
|
|
105
105
|
export type SheetScrollViewProps = Pick<ScrollViewProps, 'keyboardShouldPersistTaps'> & {
|
|
106
106
|
/** The scrolling content, after the large title if there is one. */
|
|
107
107
|
children: ReactNode
|
|
108
|
-
/** Styles the scrolling content
|
|
108
|
+
/** Styles the scrolling content: padding and gap belong here, as with `RnScrollView`. */
|
|
109
109
|
content?: ResponsiveViewSx
|
|
110
110
|
/** Called on every scroll event, after the sheet's own listener. */
|
|
111
111
|
onScroll?: SheetScrollHandler
|
|
@@ -1,41 +1,165 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {duration as durations, easing, spacing, useReducedMotion} from '@hzblj/kara-theme'
|
|
2
|
+
import {useEffect, useRef} from 'react'
|
|
3
|
+
import {AccessibilityInfo, Platform} from 'react-native'
|
|
4
|
+
import {
|
|
5
|
+
Easing,
|
|
6
|
+
type EntryExitAnimationFunction,
|
|
7
|
+
FadeIn,
|
|
8
|
+
FadeInDown,
|
|
9
|
+
FadeInUp,
|
|
10
|
+
FadeOut,
|
|
11
|
+
FadeOutDown,
|
|
12
|
+
FadeOutUp,
|
|
13
|
+
ReduceMotion,
|
|
14
|
+
withTiming,
|
|
15
|
+
} from 'react-native-reanimated'
|
|
2
16
|
|
|
3
|
-
import {ABox} from '../../atoms/box'
|
|
17
|
+
import {ABox, Box} from '../../atoms/box'
|
|
4
18
|
import {Pressable} from '../../atoms/pressable'
|
|
5
19
|
import {RnText} from '../../atoms/rn-text'
|
|
6
|
-
import
|
|
20
|
+
import {RnGlyph} from '../../glyph'
|
|
21
|
+
import {timing} from '../../motion'
|
|
22
|
+
import type {SnackbarAnimation, SnackbarComponent, SnackbarDuration, SnackbarProps} from './snackbar.types'
|
|
23
|
+
|
|
24
|
+
/** Material's `SnackbarDuration.Short` and `Long`. */
|
|
25
|
+
const DURATIONS = {long: 10_000, short: 4_000} as const
|
|
26
|
+
|
|
27
|
+
const PLATFORM_ANIMATION: SnackbarAnimation = Platform.OS === 'android' ? 'scale' : 'slide'
|
|
28
|
+
|
|
29
|
+
/** The close glyph at the label's height: an SF Symbol fills its box, Material's icon sits inside a padded one. */
|
|
30
|
+
const CLOSE_SIZE = Platform.OS === 'ios' ? 's12' : 's16'
|
|
31
|
+
|
|
32
|
+
const SMOOTH_OUT = Easing.bezier(...easing.smoothOut)
|
|
33
|
+
const GROW = timing('quick')
|
|
34
|
+
|
|
35
|
+
/** Material's snackbar enter: it fades in while it grows from 80 %, in 150 ms. */
|
|
36
|
+
const scaleIn: EntryExitAnimationFunction = () => {
|
|
37
|
+
'worklet'
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
animations: {opacity: withTiming(1, GROW), transform: [{scale: withTiming(1, GROW)}]},
|
|
41
|
+
initialValues: {opacity: 0, transform: [{scale: 0.8}]},
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The presets in and out: arriving in `fast`, leaving in `quick`, both on `smoothOut`. `ReduceMotion.Never`, because
|
|
47
|
+
* `useReducedMotion` has already picked the fade by then, and a fade is what should still run.
|
|
48
|
+
*/
|
|
49
|
+
const TRANSITIONS = {
|
|
50
|
+
fade: {
|
|
51
|
+
entering: FadeIn.duration(durations.fast).easing(SMOOTH_OUT).reduceMotion(ReduceMotion.Never),
|
|
52
|
+
exiting: FadeOut.duration(durations.quick).easing(SMOOTH_OUT).reduceMotion(ReduceMotion.Never),
|
|
53
|
+
},
|
|
54
|
+
// Material's exit is a 75 ms fade: `micro`.
|
|
55
|
+
scale: {entering: scaleIn, exiting: FadeOut.duration(durations.micro).reduceMotion(ReduceMotion.Never)},
|
|
56
|
+
// Slide: in from the edge it sits on, and back out toward it.
|
|
57
|
+
slideBottom: {
|
|
58
|
+
entering: FadeInDown.duration(durations.fast).easing(SMOOTH_OUT).reduceMotion(ReduceMotion.Never),
|
|
59
|
+
exiting: FadeOutDown.duration(durations.quick).easing(SMOOTH_OUT).reduceMotion(ReduceMotion.Never),
|
|
60
|
+
},
|
|
61
|
+
slideTop: {
|
|
62
|
+
entering: FadeInUp.duration(durations.fast).easing(SMOOTH_OUT).reduceMotion(ReduceMotion.Never),
|
|
63
|
+
exiting: FadeOutUp.duration(durations.quick).easing(SMOOTH_OUT).reduceMotion(ReduceMotion.Never),
|
|
64
|
+
},
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const transitionsFor = (animation: SnackbarAnimation, position: 'bottom' | 'top') => {
|
|
68
|
+
if (animation === 'slide') {
|
|
69
|
+
return position === 'top' ? TRANSITIONS.slideTop : TRANSITIONS.slideBottom
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return TRANSITIONS[animation]
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const millisecondsOf = (duration: SnackbarDuration) =>
|
|
76
|
+
typeof duration === 'number' ? duration : duration === 'indefinite' ? undefined : DURATIONS[duration]
|
|
77
|
+
|
|
78
|
+
export const Snackbar: SnackbarComponent = ({
|
|
79
|
+
actionLabel,
|
|
80
|
+
actionOnNewLine = false,
|
|
81
|
+
animation = PLATFORM_ANIMATION,
|
|
82
|
+
dismissible = false,
|
|
83
|
+
duration = 'indefinite',
|
|
84
|
+
entering,
|
|
85
|
+
exiting,
|
|
86
|
+
message,
|
|
87
|
+
offset = 's24',
|
|
88
|
+
onAction,
|
|
89
|
+
onDismiss,
|
|
90
|
+
position = 'bottom',
|
|
91
|
+
visible,
|
|
92
|
+
}: SnackbarProps) => {
|
|
93
|
+
const reduced = useReducedMotion()
|
|
94
|
+
// A caller's inline `onDismiss` is a new function every render; the timer must not restart for it.
|
|
95
|
+
const dismiss = useRef(onDismiss)
|
|
96
|
+
dismiss.current = onDismiss
|
|
97
|
+
|
|
98
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: a new `message` restarts the timer, as a new snackbar
|
|
99
|
+
useEffect(() => {
|
|
100
|
+
const milliseconds = millisecondsOf(duration)
|
|
101
|
+
|
|
102
|
+
if (!visible || milliseconds === undefined) {
|
|
103
|
+
return
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const timer = setTimeout(() => dismiss.current?.(), milliseconds)
|
|
107
|
+
|
|
108
|
+
return () => clearTimeout(timer)
|
|
109
|
+
}, [duration, message, visible])
|
|
110
|
+
|
|
111
|
+
// Material's snackbar is announced; a React Native view is not unless asked.
|
|
112
|
+
useEffect(() => {
|
|
113
|
+
if (visible) {
|
|
114
|
+
AccessibilityInfo.announceForAccessibility(message)
|
|
115
|
+
}
|
|
116
|
+
}, [message, visible])
|
|
7
117
|
|
|
8
|
-
export const Snackbar: SnackbarComponent = ({actionLabel, message, onAction, visible}: SnackbarProps) => {
|
|
9
118
|
if (!visible) {
|
|
10
119
|
return null
|
|
11
120
|
}
|
|
12
121
|
|
|
122
|
+
const edge = position === 'top' ? {top: spacing[offset]} : {bottom: spacing[offset]}
|
|
123
|
+
const hasTrailing = Boolean(actionLabel) || dismissible
|
|
124
|
+
// With motion reduced it only fades: nothing slides or grows.
|
|
125
|
+
const preset = transitionsFor(reduced ? 'fade' : animation, position)
|
|
126
|
+
|
|
13
127
|
return (
|
|
14
128
|
<ABox
|
|
15
|
-
align=
|
|
129
|
+
align={actionOnNewLine ? 'stretch' : 'center'}
|
|
16
130
|
bg="surface.high.contrast"
|
|
17
131
|
borderRadius="medium"
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
flexDirection="row"
|
|
22
|
-
gap="s12"
|
|
23
|
-
left={16}
|
|
132
|
+
flexDirection={actionOnNewLine ? 'column' : 'row'}
|
|
133
|
+
gap={actionOnNewLine ? 's8' : 's12'}
|
|
134
|
+
left={spacing.s16}
|
|
24
135
|
position="absolute"
|
|
25
136
|
px="s16"
|
|
26
137
|
py="s12"
|
|
27
|
-
right={
|
|
138
|
+
right={spacing.s16}
|
|
28
139
|
shadow="snackbar"
|
|
140
|
+
{...edge}
|
|
141
|
+
entering={entering ?? preset.entering}
|
|
142
|
+
exiting={exiting ?? preset.exiting}
|
|
29
143
|
>
|
|
30
|
-
|
|
144
|
+
{/* It takes the room, so the action sits at the trailing end, as far in from it as the message is from the start. */}
|
|
145
|
+
<RnText color="content.on.high.contrast" flex={actionOnNewLine ? undefined : 1} variant="footnote">
|
|
31
146
|
{message}
|
|
32
147
|
</RnText>
|
|
33
|
-
{
|
|
34
|
-
<
|
|
35
|
-
|
|
36
|
-
{
|
|
37
|
-
|
|
38
|
-
|
|
148
|
+
{hasTrailing ? (
|
|
149
|
+
<Box align="center" alignSelf={actionOnNewLine ? 'flex-end' : undefined} flexDirection="row" gap="s16">
|
|
150
|
+
{actionLabel ? (
|
|
151
|
+
<Pressable onPress={onAction} pressEffect="opacity" ripple={false}>
|
|
152
|
+
<RnText color="content.accent" variant="footnoteMedium">
|
|
153
|
+
{actionLabel}
|
|
154
|
+
</RnText>
|
|
155
|
+
</Pressable>
|
|
156
|
+
) : null}
|
|
157
|
+
{dismissible ? (
|
|
158
|
+
<Pressable accessibilityLabel="Dismiss" onPress={onDismiss} pressEffect="opacity" ripple={false}>
|
|
159
|
+
<RnGlyph color="content.on.high.contrast" name="close" size={CLOSE_SIZE} />
|
|
160
|
+
</Pressable>
|
|
161
|
+
) : null}
|
|
162
|
+
</Box>
|
|
39
163
|
) : null}
|
|
40
164
|
</ABox>
|
|
41
165
|
)
|
|
@@ -1,17 +1,53 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type {SpaceSize} from '@hzblj/kara-theme'
|
|
2
|
+
import type {ComponentProps, ReactNode} from 'react'
|
|
3
|
+
import type Animated from 'react-native-reanimated'
|
|
4
|
+
|
|
5
|
+
type LayoutAnimation = ComponentProps<typeof Animated.View>['entering']
|
|
6
|
+
|
|
7
|
+
/** How it comes and goes. */
|
|
8
|
+
export type SnackbarAnimation = 'fade' | 'scale' | 'slide'
|
|
9
|
+
|
|
10
|
+
/** How long it stays: Material's short (4 s) and long (10 s), never, or a number of milliseconds. */
|
|
11
|
+
export type SnackbarDuration = 'indefinite' | 'long' | 'short' | number
|
|
12
|
+
|
|
13
|
+
/** The edge of its parent it sits on. */
|
|
14
|
+
export type SnackbarPosition = 'bottom' | 'top'
|
|
2
15
|
|
|
3
16
|
/**
|
|
4
|
-
* A short message laid over
|
|
5
|
-
* both platforms
|
|
17
|
+
* A short message laid over an edge of its parent, with an optional action at its trailing end. The React Native tier,
|
|
18
|
+
* drawn the same on both platforms (iOS has no snackbar of its own), so it needs no host. Material's options are all
|
|
19
|
+
* here: a duration, a dismiss button, the action on a line of its own. It is announced to VoiceOver and TalkBack when
|
|
20
|
+
* it appears.
|
|
6
21
|
*/
|
|
7
22
|
export type SnackbarProps = {
|
|
8
|
-
/** The action button's text,
|
|
23
|
+
/** The action button's text, at the trailing end. No button without it. */
|
|
9
24
|
actionLabel?: string
|
|
25
|
+
/** Puts the action under the message, at its trailing end: Material's layout for a long message or action. */
|
|
26
|
+
actionOnNewLine?: boolean
|
|
27
|
+
/**
|
|
28
|
+
* How it comes and goes. `scale` is Material's own (a fade and a scale from 80 %), `slide` rises from its edge as it
|
|
29
|
+
* fades in, `fade` only fades. `scale` on Android and `slide` on iOS by default. With motion reduced, it fades.
|
|
30
|
+
*/
|
|
31
|
+
animation?: SnackbarAnimation
|
|
32
|
+
/** A close button at the trailing end, Material's dismiss action; it calls `onDismiss`. */
|
|
33
|
+
dismissible?: boolean
|
|
34
|
+
/** How long it stays up before `onDismiss` is called. `indefinite` by default: it never hides itself. */
|
|
35
|
+
duration?: SnackbarDuration
|
|
36
|
+
/** A Reanimated entering animation of your own, e.g. `FadeInDown.springify()`. It wins over `animation`. */
|
|
37
|
+
entering?: LayoutAnimation
|
|
38
|
+
/** A Reanimated exiting animation of your own. It wins over `animation`. */
|
|
39
|
+
exiting?: LayoutAnimation
|
|
10
40
|
/** The message. */
|
|
11
41
|
message: string
|
|
12
|
-
/**
|
|
42
|
+
/** Between the snackbar and its edge, a space token. `s24` by default; raise it above a tab bar. */
|
|
43
|
+
offset?: SpaceSize
|
|
44
|
+
/** The action was pressed. The snackbar stays up; turn `visible` off to hide it. */
|
|
13
45
|
onAction?: () => void
|
|
14
|
-
/**
|
|
46
|
+
/** It asks to go: its `duration` ran out, or its dismiss button was pressed. Turn `visible` off to hide it. */
|
|
47
|
+
onDismiss?: () => void
|
|
48
|
+
/** The edge of its parent it sits on. `bottom` by default, Material's place for it. */
|
|
49
|
+
position?: SnackbarPosition
|
|
50
|
+
/** Shows the snackbar while true, animating it in and out. */
|
|
15
51
|
visible: boolean
|
|
16
52
|
}
|
|
17
53
|
|
|
@@ -49,7 +49,7 @@ type ActionButtonProps = {action: SwipeAction; onDone: () => void}
|
|
|
49
49
|
const ActionButton = ({action, onDone}: ActionButtonProps) => {
|
|
50
50
|
const theme = useAppTheme()
|
|
51
51
|
const fill = action.tint ?? (action.destructive ? 'fill.destructive.primary' : 'fill.accent.primary')
|
|
52
|
-
const content = !action.tint && action.destructive ? 'content.on.destructive' : 'content.on.
|
|
52
|
+
const content = !action.tint && action.destructive ? 'content.on.destructive' : 'content.on.accent'
|
|
53
53
|
|
|
54
54
|
const onClick = useCallback(() => {
|
|
55
55
|
onDone()
|
|
@@ -7,26 +7,26 @@ import type {IconName} from '../../atoms/icon'
|
|
|
7
7
|
export type SwipeAction = {
|
|
8
8
|
/** Fills the button with `fill.destructive.primary` unless `tint` says otherwise. */
|
|
9
9
|
destructive?: boolean
|
|
10
|
-
/** One of the app's icons, on the button
|
|
10
|
+
/** One of the app's icons, on the button: a round one on iOS 26, as in Mail, a filled stadium on Android. */
|
|
11
11
|
icon: IconName
|
|
12
12
|
/**
|
|
13
|
-
* The action's name, written under the button
|
|
13
|
+
* The action's name, written under the button; before iOS 26 a row of the usual height shows the icon alone and
|
|
14
14
|
* keeps the label for VoiceOver. Actions are keyed by it, so keep labels unique within one row.
|
|
15
15
|
*/
|
|
16
16
|
label: string
|
|
17
17
|
/** Called when the button is pressed. The row closes by itself. */
|
|
18
18
|
onPress: () => void
|
|
19
19
|
/**
|
|
20
|
-
* The button's fill
|
|
20
|
+
* The button's fill: `fill.destructive.primary` for a destructive action, `fill.accent.primary` otherwise. The icon
|
|
21
21
|
* on it is white, so pick a fill that holds white in both appearances.
|
|
22
22
|
*/
|
|
23
23
|
tint?: ColorToken
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
|
-
* A list row with buttons behind it, uncovered by a swipe
|
|
27
|
+
* A list row with buttons behind it, uncovered by a swipe. SwiftUI's `swipeActions` on iOS, and on Android, where
|
|
28
28
|
* Compose has none, kara's own: the row slides on an anchored drag and the buttons show in the strip it leaves. One
|
|
29
|
-
* row is open at a time on both; a tap on an open row closes it. A native organism
|
|
29
|
+
* row is open at a time on both; a tap on an open row closes it. A native organism: it belongs inside a `List`.
|
|
30
30
|
*/
|
|
31
31
|
export type SwipeActionsProps = {
|
|
32
32
|
/**
|
|
@@ -2,7 +2,7 @@ import type {Sx} from '@hzblj/kara-sx'
|
|
|
2
2
|
import type {ReactNode} from 'react'
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* The full-bleed native host a screen starts with
|
|
5
|
+
* The full-bleed native host a screen starts with: a SwiftUI or Compose `Host` filling its parent, so native atoms
|
|
6
6
|
* render anywhere inside it. The background runs to the edges; the content keeps clear of the status bar where the
|
|
7
7
|
* screen covers it (no navigation bar above), on Android as SwiftUI's safe area does on iOS.
|
|
8
8
|
*/
|
|
@@ -13,7 +13,7 @@ export type ScreenProps = {
|
|
|
13
13
|
children?: ReactNode
|
|
14
14
|
/** Keeps the content where it is when the keyboard opens, instead of avoiding it. Android reads it once, on mount. */
|
|
15
15
|
ignoreKeyboardInset?: boolean
|
|
16
|
-
/** Test identifier
|
|
16
|
+
/** Test identifier, on the host view on iOS and on the view around it on Android. */
|
|
17
17
|
testID?: string
|
|
18
18
|
}
|
|
19
19
|
|
|
@@ -1,24 +1,37 @@
|
|
|
1
1
|
import {clickable, type ModifierConfig, testID as testIdModifier} from '@expo/ui/jetpack-compose/modifiers'
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
type AccessibilityProps,
|
|
4
|
+
type ResponsiveSx,
|
|
5
|
+
splitAccessibility,
|
|
6
|
+
useAccessibilityModifiers,
|
|
7
|
+
useSxModifiers,
|
|
8
|
+
} from '@hzblj/kara-sx'
|
|
3
9
|
import {useMemo} from 'react'
|
|
4
10
|
|
|
5
11
|
/**
|
|
6
|
-
* A Compose stack's modifiers in the order a pressable one needs: its frame, shape and background, then the press,
|
|
7
|
-
* then its padding. Compose clips a `clickable` to what comes after it, so with the padding first the ripple
|
|
8
|
-
* at the padding and a row pressed by its edge would light up only in the middle.
|
|
12
|
+
* A Compose stack's modifiers in the order a pressable one needs: its frame, shape and background, then the press, its
|
|
13
|
+
* semantics, then its padding. Compose clips a `clickable` to what comes after it, so with the padding first the ripple
|
|
14
|
+
* would stop at the padding and a row pressed by its edge would light up only in the middle. The semantics come after
|
|
15
|
+
* the click, because a label that replaces the children's clears whatever semantics are inside it.
|
|
9
16
|
*/
|
|
10
|
-
export const useStackModifiers = (
|
|
11
|
-
|
|
17
|
+
export const useStackModifiers = (
|
|
18
|
+
props: ResponsiveSx & AccessibilityProps,
|
|
19
|
+
onPress?: () => void,
|
|
20
|
+
testID?: string
|
|
21
|
+
): ModifierConfig[] => {
|
|
22
|
+
const [accessibility, {p, pb, pl, pr, pt, px, py, ...frame}] = splitAccessibility(props)
|
|
12
23
|
const frameModifiers = useSxModifiers(frame)
|
|
13
24
|
const paddingModifiers = useSxModifiers({p, pb, pl, pr, pt, px, py})
|
|
25
|
+
const accessibilityModifiers = useAccessibilityModifiers(accessibility, onPress !== undefined)
|
|
14
26
|
|
|
15
27
|
return useMemo(
|
|
16
28
|
() => [
|
|
17
29
|
...frameModifiers,
|
|
18
30
|
...(testID ? [testIdModifier(testID)] : []),
|
|
19
31
|
...(onPress ? [clickable(onPress)] : []),
|
|
32
|
+
...accessibilityModifiers,
|
|
20
33
|
...paddingModifiers,
|
|
21
34
|
],
|
|
22
|
-
[frameModifiers, onPress, paddingModifiers, testID]
|
|
35
|
+
[accessibilityModifiers, frameModifiers, onPress, paddingModifiers, testID]
|
|
23
36
|
)
|
|
24
37
|
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const warned = new Set();
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Announces an atom that only one platform can implement. The stub still satisfies the shared
|
|
7
|
-
* component type, so `contract.check.ts` keeps both files honest — this just makes the gap loud
|
|
8
|
-
* in dev instead of leaving a control that mysteriously never appears.
|
|
9
|
-
*
|
|
10
|
-
* Warns once per atom: the gap is permanent, so repeating it every render would be noise.
|
|
11
|
-
*/
|
|
12
|
-
export const warnUnsupported = (atom, platform) => {
|
|
13
|
-
if (!__DEV__ || warned.has(atom)) {
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
warned.add(atom);
|
|
17
|
-
console.error(`[kara-ui] <${atom}> has no ${platform} implementation and renders nothing there. Branch on Platform.OS at the call site.`);
|
|
18
|
-
};
|
|
19
|
-
//# sourceMappingURL=platform-support.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["warned","Set","warnUnsupported","atom","platform","__DEV__","has","add","console","error"],"sourceRoot":"../../src","sources":["platform-support.ts"],"mappings":";;AAAA,MAAMA,MAAM,GAAG,IAAIC,GAAG,CAAS,CAAC;;AAEhC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,eAAe,GAAGA,CAACC,IAAY,EAAEC,QAA2B,KAAK;EAC5E,IAAI,CAACC,OAAO,IAAIL,MAAM,CAACM,GAAG,CAACH,IAAI,CAAC,EAAE;IAChC;EACF;EAEAH,MAAM,CAACO,GAAG,CAACJ,IAAI,CAAC;EAEhBK,OAAO,CAACC,KAAK,CACX,cAAcN,IAAI,YAAYC,QAAQ,oFACxC,CAAC;AACH,CAAC","ignoreList":[]}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Announces an atom that only one platform can implement. The stub still satisfies the shared
|
|
3
|
-
* component type, so `contract.check.ts` keeps both files honest — this just makes the gap loud
|
|
4
|
-
* in dev instead of leaving a control that mysteriously never appears.
|
|
5
|
-
*
|
|
6
|
-
* Warns once per atom: the gap is permanent, so repeating it every render would be noise.
|
|
7
|
-
*/
|
|
8
|
-
export declare const warnUnsupported: (atom: string, platform: 'Android' | 'iOS') => void;
|
package/src/platform-support.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
const warned = new Set<string>()
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Announces an atom that only one platform can implement. The stub still satisfies the shared
|
|
5
|
-
* component type, so `contract.check.ts` keeps both files honest — this just makes the gap loud
|
|
6
|
-
* in dev instead of leaving a control that mysteriously never appears.
|
|
7
|
-
*
|
|
8
|
-
* Warns once per atom: the gap is permanent, so repeating it every render would be noise.
|
|
9
|
-
*/
|
|
10
|
-
export const warnUnsupported = (atom: string, platform: 'Android' | 'iOS') => {
|
|
11
|
-
if (!__DEV__ || warned.has(atom)) {
|
|
12
|
-
return
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
warned.add(atom)
|
|
16
|
-
|
|
17
|
-
console.error(
|
|
18
|
-
`[kara-ui] <${atom}> has no ${platform} implementation and renders nothing there. Branch on Platform.OS at the call site.`
|
|
19
|
-
)
|
|
20
|
-
}
|