panelui-native 0.22.6 → 0.28.1
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/README.md +1 -0
- package/lib/module/components/accordion/index.js +8 -8
- package/lib/module/components/accordion/index.js.map +1 -1
- package/lib/module/components/alert/index.js +2 -2
- package/lib/module/components/alert/index.js.map +1 -1
- package/lib/module/components/area-chart/index.js +958 -0
- package/lib/module/components/area-chart/index.js.map +1 -0
- package/lib/module/components/attachment/index.js +2 -1
- package/lib/module/components/attachment/index.js.map +1 -1
- package/lib/module/components/avatar/index.js +4 -4
- package/lib/module/components/avatar/index.js.map +1 -1
- package/lib/module/components/badge/index.js +4 -4
- package/lib/module/components/badge/index.js.map +1 -1
- package/lib/module/components/bar-chart/index.js +994 -0
- package/lib/module/components/bar-chart/index.js.map +1 -0
- package/lib/module/components/bottom-sheet/index.js +213 -24
- package/lib/module/components/bottom-sheet/index.js.map +1 -1
- package/lib/module/components/breadcrumb/index.js +275 -0
- package/lib/module/components/breadcrumb/index.js.map +1 -0
- package/lib/module/components/button/index.js +11 -6
- package/lib/module/components/button/index.js.map +1 -1
- package/lib/module/components/calendar/index.js +557 -0
- package/lib/module/components/calendar/index.js.map +1 -0
- package/lib/module/components/carousel/index.js +680 -0
- package/lib/module/components/carousel/index.js.map +1 -0
- package/lib/module/components/chip/index.js +6 -6
- package/lib/module/components/chip/index.js.map +1 -1
- package/lib/module/components/date-picker/index.js +158 -0
- package/lib/module/components/date-picker/index.js.map +1 -0
- package/lib/module/components/dialog/index.js +7 -2
- package/lib/module/components/dialog/index.js.map +1 -1
- package/lib/module/components/direction/index.js +15 -20
- package/lib/module/components/direction/index.js.map +1 -1
- package/lib/module/components/empty-state/index.js +2 -2
- package/lib/module/components/empty-state/index.js.map +1 -1
- package/lib/module/components/field/index.js +5 -5
- package/lib/module/components/field/index.js.map +1 -1
- package/lib/module/components/flow/index.js +3 -3
- package/lib/module/components/flow/index.js.map +1 -1
- package/lib/module/components/frame/index.js +22 -5
- package/lib/module/components/frame/index.js.map +1 -1
- package/lib/module/components/heatmap-chart/index.js +28 -8
- package/lib/module/components/heatmap-chart/index.js.map +1 -1
- package/lib/module/components/input-group/index.js +5 -4
- package/lib/module/components/input-group/index.js.map +1 -1
- package/lib/module/components/item/index.js +9 -9
- package/lib/module/components/item/index.js.map +1 -1
- package/lib/module/components/label/index.js +4 -4
- package/lib/module/components/label/index.js.map +1 -1
- package/lib/module/components/line-chart/index.js +165 -184
- package/lib/module/components/line-chart/index.js.map +1 -1
- package/lib/module/components/loader/index.js +758 -0
- package/lib/module/components/loader/index.js.map +1 -0
- package/lib/module/components/map/basemap.js +265 -0
- package/lib/module/components/map/basemap.js.map +1 -0
- package/lib/module/components/map/index.js +850 -0
- package/lib/module/components/map/index.js.map +1 -0
- package/lib/module/components/map/maplibre.js +87 -0
- package/lib/module/components/map/maplibre.js.map +1 -0
- package/lib/module/components/marker/index.js +3 -3
- package/lib/module/components/marker/index.js.map +1 -1
- package/lib/module/components/message/index.js +15 -14
- package/lib/module/components/message/index.js.map +1 -1
- package/lib/module/components/message-scroller/index.js +5 -4
- package/lib/module/components/message-scroller/index.js.map +1 -1
- package/lib/module/components/otp-input/index.js +2 -2
- package/lib/module/components/popover/index.js +39 -7
- package/lib/module/components/popover/index.js.map +1 -1
- package/lib/module/components/progress/index.js +8 -2
- package/lib/module/components/progress/index.js.map +1 -1
- package/lib/module/components/radio-group/index.js +2 -2
- package/lib/module/components/radio-group/index.js.map +1 -1
- package/lib/module/components/ring-chart/index.js +423 -0
- package/lib/module/components/ring-chart/index.js.map +1 -0
- package/lib/module/components/section-rail/index.js +6 -6
- package/lib/module/components/section-rail/index.js.map +1 -1
- package/lib/module/components/select/index.js +10 -4
- package/lib/module/components/select/index.js.map +1 -1
- package/lib/module/components/separator/index.js +76 -22
- package/lib/module/components/separator/index.js.map +1 -1
- package/lib/module/components/shimmer/index.js +10 -1
- package/lib/module/components/shimmer/index.js.map +1 -1
- package/lib/module/components/slider/index.js +19 -5
- package/lib/module/components/slider/index.js.map +1 -1
- package/lib/module/components/steps/index.js +5 -5
- package/lib/module/components/steps/index.js.map +1 -1
- package/lib/module/components/switch/index.js +6 -1
- package/lib/module/components/switch/index.js.map +1 -1
- package/lib/module/components/tabs/index.js +7 -7
- package/lib/module/components/tabs/index.js.map +1 -1
- package/lib/module/components/timeline/index.js +4 -4
- package/lib/module/components/timeline/index.js.map +1 -1
- package/lib/module/components/toast/index.js +2 -2
- package/lib/module/components/toast/index.js.map +1 -1
- package/lib/module/components/toggle-button/index.js +5 -5
- package/lib/module/components/toggle-button/index.js.map +1 -1
- package/lib/module/components/tooltip/index.js +492 -0
- package/lib/module/components/tooltip/index.js.map +1 -0
- package/lib/module/components/typography/index.js +7 -2
- package/lib/module/components/typography/index.js.map +1 -1
- package/lib/module/hooks/index.js +1 -0
- package/lib/module/hooks/index.js.map +1 -1
- package/lib/module/hooks/use-back-handler.js +37 -0
- package/lib/module/hooks/use-back-handler.js.map +1 -0
- package/lib/module/hooks/use-direction.js +43 -0
- package/lib/module/hooks/use-direction.js.map +1 -0
- package/lib/module/icons/index.js +180 -2
- package/lib/module/icons/index.js.map +1 -1
- package/lib/module/index.js +12 -2
- package/lib/module/index.js.map +1 -1
- package/lib/module/primitives/keyboard-avoider.js +2 -1
- package/lib/module/primitives/keyboard-avoider.js.map +1 -1
- package/lib/module/primitives/text.js +55 -11
- package/lib/module/primitives/text.js.map +1 -1
- package/lib/module/utils/chart.js +279 -0
- package/lib/module/utils/chart.js.map +1 -0
- package/lib/module/utils/date.js +386 -0
- package/lib/module/utils/date.js.map +1 -0
- package/lib/typescript/src/components/accordion/index.d.ts.map +1 -1
- package/lib/typescript/src/components/alert/index.d.ts.map +1 -1
- package/lib/typescript/src/components/area-chart/index.d.ts +237 -0
- package/lib/typescript/src/components/area-chart/index.d.ts.map +1 -0
- package/lib/typescript/src/components/attachment/index.d.ts.map +1 -1
- package/lib/typescript/src/components/bar-chart/index.d.ts +270 -0
- package/lib/typescript/src/components/bar-chart/index.d.ts.map +1 -0
- package/lib/typescript/src/components/bottom-sheet/index.d.ts +75 -4
- package/lib/typescript/src/components/bottom-sheet/index.d.ts.map +1 -1
- package/lib/typescript/src/components/breadcrumb/index.d.ts +100 -0
- package/lib/typescript/src/components/breadcrumb/index.d.ts.map +1 -0
- package/lib/typescript/src/components/button/index.d.ts.map +1 -1
- package/lib/typescript/src/components/calendar/index.d.ts +108 -0
- package/lib/typescript/src/components/calendar/index.d.ts.map +1 -0
- package/lib/typescript/src/components/carousel/index.d.ts +179 -0
- package/lib/typescript/src/components/carousel/index.d.ts.map +1 -0
- package/lib/typescript/src/components/chip/index.d.ts.map +1 -1
- package/lib/typescript/src/components/date-picker/index.d.ts +91 -0
- package/lib/typescript/src/components/date-picker/index.d.ts.map +1 -0
- package/lib/typescript/src/components/dialog/index.d.ts.map +1 -1
- package/lib/typescript/src/components/direction/index.d.ts +11 -10
- package/lib/typescript/src/components/direction/index.d.ts.map +1 -1
- package/lib/typescript/src/components/empty-state/index.d.ts.map +1 -1
- package/lib/typescript/src/components/field/index.d.ts.map +1 -1
- package/lib/typescript/src/components/frame/index.d.ts +17 -0
- package/lib/typescript/src/components/frame/index.d.ts.map +1 -1
- package/lib/typescript/src/components/heatmap-chart/index.d.ts +22 -3
- package/lib/typescript/src/components/heatmap-chart/index.d.ts.map +1 -1
- package/lib/typescript/src/components/input-group/index.d.ts.map +1 -1
- package/lib/typescript/src/components/item/index.d.ts.map +1 -1
- package/lib/typescript/src/components/label/index.d.ts.map +1 -1
- package/lib/typescript/src/components/line-chart/index.d.ts +42 -2
- package/lib/typescript/src/components/line-chart/index.d.ts.map +1 -1
- package/lib/typescript/src/components/loader/index.d.ts +38 -0
- package/lib/typescript/src/components/loader/index.d.ts.map +1 -0
- package/lib/typescript/src/components/map/basemap.d.ts +76 -0
- package/lib/typescript/src/components/map/basemap.d.ts.map +1 -0
- package/lib/typescript/src/components/map/index.d.ts +367 -0
- package/lib/typescript/src/components/map/index.d.ts.map +1 -0
- package/lib/typescript/src/components/map/maplibre.d.ts +193 -0
- package/lib/typescript/src/components/map/maplibre.d.ts.map +1 -0
- package/lib/typescript/src/components/marker/index.d.ts.map +1 -1
- package/lib/typescript/src/components/message/index.d.ts.map +1 -1
- package/lib/typescript/src/components/message-scroller/index.d.ts.map +1 -1
- package/lib/typescript/src/components/popover/index.d.ts.map +1 -1
- package/lib/typescript/src/components/progress/index.d.ts.map +1 -1
- package/lib/typescript/src/components/ring-chart/index.d.ts +156 -0
- package/lib/typescript/src/components/ring-chart/index.d.ts.map +1 -0
- package/lib/typescript/src/components/select/index.d.ts.map +1 -1
- package/lib/typescript/src/components/separator/index.d.ts +36 -1
- package/lib/typescript/src/components/separator/index.d.ts.map +1 -1
- package/lib/typescript/src/components/shimmer/index.d.ts.map +1 -1
- package/lib/typescript/src/components/slider/index.d.ts.map +1 -1
- package/lib/typescript/src/components/steps/index.d.ts.map +1 -1
- package/lib/typescript/src/components/switch/index.d.ts.map +1 -1
- package/lib/typescript/src/components/tabs/index.d.ts.map +1 -1
- package/lib/typescript/src/components/timeline/index.d.ts.map +1 -1
- package/lib/typescript/src/components/toast/index.d.ts.map +1 -1
- package/lib/typescript/src/components/toggle-button/index.d.ts.map +1 -1
- package/lib/typescript/src/components/tooltip/index.d.ts +125 -0
- package/lib/typescript/src/components/tooltip/index.d.ts.map +1 -0
- package/lib/typescript/src/components/typography/index.d.ts +6 -0
- package/lib/typescript/src/components/typography/index.d.ts.map +1 -1
- package/lib/typescript/src/hooks/index.d.ts +1 -0
- package/lib/typescript/src/hooks/index.d.ts.map +1 -1
- package/lib/typescript/src/hooks/use-back-handler.d.ts +19 -0
- package/lib/typescript/src/hooks/use-back-handler.d.ts.map +1 -0
- package/lib/typescript/src/hooks/use-direction.d.ts +20 -0
- package/lib/typescript/src/hooks/use-direction.d.ts.map +1 -0
- package/lib/typescript/src/icons/index.d.ts +8 -0
- package/lib/typescript/src/icons/index.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +14 -4
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/primitives/keyboard-avoider.d.ts.map +1 -1
- package/lib/typescript/src/primitives/text.d.ts +20 -0
- package/lib/typescript/src/primitives/text.d.ts.map +1 -1
- package/lib/typescript/src/utils/chart.d.ts +96 -0
- package/lib/typescript/src/utils/chart.d.ts.map +1 -0
- package/lib/typescript/src/utils/date.d.ts +116 -0
- package/lib/typescript/src/utils/date.d.ts.map +1 -0
- package/package.json +9 -1
- package/src/components/accordion/index.tsx +8 -12
- package/src/components/alert/index.tsx +2 -2
- package/src/components/area-chart/index.tsx +1147 -0
- package/src/components/attachment/index.tsx +2 -2
- package/src/components/avatar/index.tsx +4 -4
- package/src/components/badge/index.tsx +6 -6
- package/src/components/bar-chart/index.tsx +1208 -0
- package/src/components/bottom-sheet/index.tsx +282 -21
- package/src/components/breadcrumb/index.tsx +363 -0
- package/src/components/button/index.tsx +12 -8
- package/src/components/calendar/index.tsx +703 -0
- package/src/components/carousel/index.tsx +788 -0
- package/src/components/chip/index.tsx +6 -8
- package/src/components/date-picker/index.tsx +237 -0
- package/src/components/dialog/index.tsx +7 -2
- package/src/components/direction/index.tsx +22 -22
- package/src/components/empty-state/index.tsx +2 -2
- package/src/components/field/index.tsx +3 -5
- package/src/components/flow/index.tsx +3 -3
- package/src/components/frame/index.tsx +22 -7
- package/src/components/heatmap-chart/index.tsx +58 -11
- package/src/components/input-group/index.tsx +5 -4
- package/src/components/item/index.tsx +9 -9
- package/src/components/label/index.tsx +2 -2
- package/src/components/line-chart/index.tsx +194 -223
- package/src/components/loader/index.tsx +812 -0
- package/src/components/map/basemap.ts +304 -0
- package/src/components/map/index.tsx +1116 -0
- package/src/components/map/maplibre.ts +201 -0
- package/src/components/marker/index.tsx +3 -3
- package/src/components/message/index.tsx +15 -14
- package/src/components/message-scroller/index.tsx +5 -4
- package/src/components/otp-input/index.tsx +2 -2
- package/src/components/popover/index.tsx +43 -7
- package/src/components/progress/index.tsx +10 -2
- package/src/components/radio-group/index.tsx +2 -2
- package/src/components/ring-chart/index.tsx +543 -0
- package/src/components/section-rail/index.tsx +6 -6
- package/src/components/select/index.tsx +10 -4
- package/src/components/separator/index.tsx +77 -19
- package/src/components/shimmer/index.tsx +10 -1
- package/src/components/slider/index.tsx +20 -5
- package/src/components/steps/index.tsx +5 -5
- package/src/components/switch/index.tsx +6 -1
- package/src/components/tabs/index.tsx +7 -9
- package/src/components/timeline/index.tsx +4 -4
- package/src/components/toast/index.tsx +2 -2
- package/src/components/toggle-button/index.tsx +5 -7
- package/src/components/tooltip/index.tsx +610 -0
- package/src/components/typography/index.tsx +7 -2
- package/src/hooks/index.ts +1 -0
- package/src/hooks/use-back-handler.ts +37 -0
- package/src/hooks/use-direction.ts +45 -0
- package/src/icons/index.tsx +111 -0
- package/src/index.ts +129 -0
- package/src/primitives/keyboard-avoider.tsx +2 -1
- package/src/primitives/text.tsx +53 -8
- package/src/utils/chart.ts +355 -0
- package/src/utils/date.ts +446 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Breadcrumb — the trail of where you are in a hierarchy.
|
|
3
|
+
*
|
|
4
|
+
* A row of links back up the tree, ending in the page you are on. The last
|
|
5
|
+
* crumb is not a link: you cannot navigate to where you already are, so it is
|
|
6
|
+
* a plain, current-marked label rather than a dead tappable target.
|
|
7
|
+
*
|
|
8
|
+
* The separators are the component's job, not yours. `Breadcrumb.List` drops a
|
|
9
|
+
* chevron between each crumb it holds, so a trail is just its items — there is
|
|
10
|
+
* no separator to forget, mis-order, or leave dangling at the end. Change the
|
|
11
|
+
* glyph once with `separator` on the root and every gap follows.
|
|
12
|
+
*
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <Breadcrumb>
|
|
15
|
+
* <Breadcrumb.List>
|
|
16
|
+
* <Breadcrumb.Item>
|
|
17
|
+
* <Breadcrumb.Link onPress={goHome}>Home</Breadcrumb.Link>
|
|
18
|
+
* </Breadcrumb.Item>
|
|
19
|
+
* <Breadcrumb.Item>
|
|
20
|
+
* <Breadcrumb.Link onPress={goProjects}>Projects</Breadcrumb.Link>
|
|
21
|
+
* </Breadcrumb.Item>
|
|
22
|
+
* <Breadcrumb.Item>
|
|
23
|
+
* <Breadcrumb.Page>PanelUI</Breadcrumb.Page>
|
|
24
|
+
* </Breadcrumb.Item>
|
|
25
|
+
* </Breadcrumb.List>
|
|
26
|
+
* </Breadcrumb>
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* A deep trail on a narrow phone does not wrap into a paragraph: give the list
|
|
30
|
+
* a `maxItems` and it keeps the first and last crumbs, folding the middle into
|
|
31
|
+
* a single ellipsis. Hand the ellipsis an `onEllipsisPress` and it becomes the
|
|
32
|
+
* handle for a menu of the hidden steps.
|
|
33
|
+
*/
|
|
34
|
+
import {
|
|
35
|
+
Children,
|
|
36
|
+
createContext,
|
|
37
|
+
forwardRef,
|
|
38
|
+
isValidElement,
|
|
39
|
+
useContext,
|
|
40
|
+
type ReactNode,
|
|
41
|
+
} from 'react';
|
|
42
|
+
import { View, type ViewProps } from 'react-native';
|
|
43
|
+
import { tv, type VariantProps } from 'tailwind-variants';
|
|
44
|
+
import { useCSSVariable } from 'uniwind';
|
|
45
|
+
import { ChevronRightIcon, EllipsisIcon } from '../../icons';
|
|
46
|
+
import {
|
|
47
|
+
AnimatedPressable,
|
|
48
|
+
type AnimatedPressableProps,
|
|
49
|
+
} from '../../primitives/animated-pressable';
|
|
50
|
+
import { Text, type TextProps, textChildren } from '../../primitives/text';
|
|
51
|
+
import { cn } from '../../utils/cn';
|
|
52
|
+
|
|
53
|
+
type BreadcrumbSize = 'sm' | 'default';
|
|
54
|
+
|
|
55
|
+
const crumbText = tv({
|
|
56
|
+
base: '',
|
|
57
|
+
variants: {
|
|
58
|
+
size: {
|
|
59
|
+
sm: 'text-xs',
|
|
60
|
+
default: 'text-sm',
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
defaultVariants: { size: 'default' },
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Sub-parts read the density and the shared separator glyph from here, so the
|
|
68
|
+
* trail is configured once on the root rather than repeated per crumb.
|
|
69
|
+
*/
|
|
70
|
+
const BreadcrumbContext = createContext<{
|
|
71
|
+
size: BreadcrumbSize;
|
|
72
|
+
separator: ReactNode;
|
|
73
|
+
}>({
|
|
74
|
+
size: 'default',
|
|
75
|
+
separator: null,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
const useBreadcrumb = () => useContext(BreadcrumbContext);
|
|
79
|
+
|
|
80
|
+
export interface BreadcrumbProps extends ViewProps {
|
|
81
|
+
className?: string;
|
|
82
|
+
/** Text density for every crumb. `sm` for a dense header bar. */
|
|
83
|
+
size?: BreadcrumbSize;
|
|
84
|
+
/**
|
|
85
|
+
* The glyph `Breadcrumb.List` places between crumbs. Defaults to a chevron;
|
|
86
|
+
* pass a `<Text>/</Text>`, a slash, or any node to change every gap at once.
|
|
87
|
+
*/
|
|
88
|
+
separator?: ReactNode;
|
|
89
|
+
children?: ReactNode;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* The trail's landmark. Labelled for assistive tech so the row is announced as
|
|
94
|
+
* "Breadcrumb" rather than an anonymous run of links.
|
|
95
|
+
*/
|
|
96
|
+
const BreadcrumbRoot = forwardRef<View, BreadcrumbProps>(
|
|
97
|
+
({ className, size = 'default', separator, children, ...props }, ref) => (
|
|
98
|
+
<BreadcrumbContext.Provider value={{ size, separator: separator ?? null }}>
|
|
99
|
+
<View
|
|
100
|
+
ref={ref}
|
|
101
|
+
accessibilityLabel="Breadcrumb"
|
|
102
|
+
className={cn('w-full', className)}
|
|
103
|
+
{...props}
|
|
104
|
+
>
|
|
105
|
+
{textChildren(children)}
|
|
106
|
+
</View>
|
|
107
|
+
</BreadcrumbContext.Provider>
|
|
108
|
+
)
|
|
109
|
+
);
|
|
110
|
+
BreadcrumbRoot.displayName = 'Breadcrumb';
|
|
111
|
+
|
|
112
|
+
export interface BreadcrumbListProps extends ViewProps {
|
|
113
|
+
className?: string;
|
|
114
|
+
/**
|
|
115
|
+
* Collapse the trail once it holds more than this many crumbs, so a deep
|
|
116
|
+
* path never wraps into a block of text on a narrow screen. The first
|
|
117
|
+
* `itemsBeforeCollapse` and last `itemsAfterCollapse` survive; the middle
|
|
118
|
+
* folds into a single ellipsis.
|
|
119
|
+
*/
|
|
120
|
+
maxItems?: number;
|
|
121
|
+
/** How many leading crumbs to keep when collapsing. Default 1. */
|
|
122
|
+
itemsBeforeCollapse?: number;
|
|
123
|
+
/** How many trailing crumbs to keep when collapsing. Default 1. */
|
|
124
|
+
itemsAfterCollapse?: number;
|
|
125
|
+
/**
|
|
126
|
+
* Makes the collapsed ellipsis pressable — the handle for a menu listing the
|
|
127
|
+
* hidden steps. Without it the ellipsis is a static marker.
|
|
128
|
+
*/
|
|
129
|
+
onEllipsisPress?: () => void;
|
|
130
|
+
children?: ReactNode;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** A private marker: the slot the collapsed middle crumbs fold into. */
|
|
134
|
+
const COLLAPSE = Symbol('breadcrumb-collapse');
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* The crumb row. It owns the separators — one between every pair of crumbs and
|
|
138
|
+
* none at the ends — and the collapsing, so a caller only ever lists items.
|
|
139
|
+
*/
|
|
140
|
+
const BreadcrumbList = forwardRef<View, BreadcrumbListProps>(
|
|
141
|
+
(
|
|
142
|
+
{
|
|
143
|
+
className,
|
|
144
|
+
maxItems,
|
|
145
|
+
itemsBeforeCollapse = 1,
|
|
146
|
+
itemsAfterCollapse = 1,
|
|
147
|
+
onEllipsisPress,
|
|
148
|
+
children,
|
|
149
|
+
...props
|
|
150
|
+
},
|
|
151
|
+
ref
|
|
152
|
+
) => {
|
|
153
|
+
const crumbs = Children.toArray(children).filter(isValidElement);
|
|
154
|
+
|
|
155
|
+
// Fold the middle only when hiding something actually shortens the row:
|
|
156
|
+
// keeping N-1 of N crumbs plus an ellipsis saves nothing.
|
|
157
|
+
let sequence: Array<ReactNode | typeof COLLAPSE> = crumbs;
|
|
158
|
+
if (
|
|
159
|
+
maxItems !== undefined &&
|
|
160
|
+
crumbs.length > maxItems &&
|
|
161
|
+
itemsBeforeCollapse + itemsAfterCollapse < crumbs.length
|
|
162
|
+
) {
|
|
163
|
+
const head = crumbs.slice(0, Math.max(0, itemsBeforeCollapse));
|
|
164
|
+
const tail =
|
|
165
|
+
itemsAfterCollapse > 0 ? crumbs.slice(crumbs.length - itemsAfterCollapse) : [];
|
|
166
|
+
sequence = [...head, COLLAPSE, ...tail];
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return (
|
|
170
|
+
<View
|
|
171
|
+
ref={ref}
|
|
172
|
+
accessibilityRole="list"
|
|
173
|
+
className={cn('flex-row flex-wrap items-center gap-1.5', className)}
|
|
174
|
+
{...props}
|
|
175
|
+
>
|
|
176
|
+
{sequence.map((node, i) => (
|
|
177
|
+
<View key={i} className="flex-row items-center gap-1.5">
|
|
178
|
+
{i > 0 ? <BreadcrumbSeparator /> : null}
|
|
179
|
+
{node === COLLAPSE ? (
|
|
180
|
+
<BreadcrumbEllipsis onPress={onEllipsisPress} />
|
|
181
|
+
) : (
|
|
182
|
+
node
|
|
183
|
+
)}
|
|
184
|
+
</View>
|
|
185
|
+
))}
|
|
186
|
+
</View>
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
);
|
|
190
|
+
BreadcrumbList.displayName = 'Breadcrumb.List';
|
|
191
|
+
|
|
192
|
+
export interface BreadcrumbItemProps extends ViewProps {
|
|
193
|
+
className?: string;
|
|
194
|
+
children?: ReactNode;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/** One crumb: wraps a link or the current page. */
|
|
198
|
+
const BreadcrumbItem = forwardRef<View, BreadcrumbItemProps>(
|
|
199
|
+
({ className, children, ...props }, ref) => (
|
|
200
|
+
<View
|
|
201
|
+
ref={ref}
|
|
202
|
+
className={cn('flex-row items-center', className)}
|
|
203
|
+
{...props}
|
|
204
|
+
>
|
|
205
|
+
{textChildren(children)}
|
|
206
|
+
</View>
|
|
207
|
+
)
|
|
208
|
+
);
|
|
209
|
+
BreadcrumbItem.displayName = 'Breadcrumb.Item';
|
|
210
|
+
|
|
211
|
+
export interface BreadcrumbLinkProps
|
|
212
|
+
extends Omit<AnimatedPressableProps, 'children'> {
|
|
213
|
+
className?: string;
|
|
214
|
+
/** Text style for the crumb's label. */
|
|
215
|
+
textClassName?: string;
|
|
216
|
+
children?: ReactNode;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* A navigable crumb — an ancestor you can jump back to. Muted until pressed,
|
|
221
|
+
* so the current page (which is not a link) reads as the emphasised end of the
|
|
222
|
+
* trail. A string child is wrapped in the crumb text style; anything else
|
|
223
|
+
* renders as given.
|
|
224
|
+
*/
|
|
225
|
+
const BreadcrumbLink = forwardRef<View, BreadcrumbLinkProps>(
|
|
226
|
+
({ className, textClassName, children, ...props }, ref) => {
|
|
227
|
+
const { size } = useBreadcrumb();
|
|
228
|
+
|
|
229
|
+
return (
|
|
230
|
+
<AnimatedPressable
|
|
231
|
+
ref={ref}
|
|
232
|
+
accessibilityRole="link"
|
|
233
|
+
pressScale={1}
|
|
234
|
+
pressOpacity={0.6}
|
|
235
|
+
className={cn('flex-row items-center', className)}
|
|
236
|
+
{...props}
|
|
237
|
+
>
|
|
238
|
+
{textChildren(children, (text) => (
|
|
239
|
+
<Text className={crumbText({ size, className: cn('text-muted-foreground', textClassName) })}>
|
|
240
|
+
{text}
|
|
241
|
+
</Text>
|
|
242
|
+
))}
|
|
243
|
+
</AnimatedPressable>
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
);
|
|
247
|
+
BreadcrumbLink.displayName = 'Breadcrumb.Link';
|
|
248
|
+
|
|
249
|
+
export interface BreadcrumbPageProps extends TextProps {
|
|
250
|
+
className?: string;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* The trailing crumb: where you are now. Not a link — `aria-current="page"`
|
|
255
|
+
* marks it as the destination, and it is painted in the full foreground so the
|
|
256
|
+
* trail resolves to it.
|
|
257
|
+
*/
|
|
258
|
+
const BreadcrumbPage = forwardRef<React.ElementRef<typeof Text>, BreadcrumbPageProps>(
|
|
259
|
+
({ className, ...props }, ref) => {
|
|
260
|
+
const { size } = useBreadcrumb();
|
|
261
|
+
|
|
262
|
+
return (
|
|
263
|
+
<Text
|
|
264
|
+
ref={ref}
|
|
265
|
+
aria-current="page"
|
|
266
|
+
accessibilityRole="text"
|
|
267
|
+
weight="medium"
|
|
268
|
+
className={crumbText({ size, className: cn('text-foreground', className) })}
|
|
269
|
+
{...props}
|
|
270
|
+
/>
|
|
271
|
+
);
|
|
272
|
+
}
|
|
273
|
+
);
|
|
274
|
+
BreadcrumbPage.displayName = 'Breadcrumb.Page';
|
|
275
|
+
|
|
276
|
+
export interface BreadcrumbSeparatorProps extends ViewProps {
|
|
277
|
+
className?: string;
|
|
278
|
+
/** Override the glyph for this one gap. Falls back to the root's separator. */
|
|
279
|
+
children?: ReactNode;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* The glyph between crumbs. `Breadcrumb.List` inserts it for you; it is public
|
|
284
|
+
* only for the rare hand-assembled trail. Hidden from screen readers — the
|
|
285
|
+
* order of the crumbs already conveys the hierarchy.
|
|
286
|
+
*/
|
|
287
|
+
const BreadcrumbSeparator = forwardRef<View, BreadcrumbSeparatorProps>(
|
|
288
|
+
({ className, children, ...props }, ref) => {
|
|
289
|
+
const { separator } = useBreadcrumb();
|
|
290
|
+
const rawTint = useCSSVariable('--color-muted-foreground');
|
|
291
|
+
const tint = typeof rawTint === 'string' ? rawTint : undefined;
|
|
292
|
+
const glyph = children ?? separator;
|
|
293
|
+
|
|
294
|
+
return (
|
|
295
|
+
<View
|
|
296
|
+
ref={ref}
|
|
297
|
+
aria-hidden
|
|
298
|
+
accessibilityElementsHidden
|
|
299
|
+
importantForAccessibility="no-hide-descendants"
|
|
300
|
+
className={cn('items-center justify-center', className)}
|
|
301
|
+
{...props}
|
|
302
|
+
>
|
|
303
|
+
{glyph ?? <ChevronRightIcon size={14} color={tint} />}
|
|
304
|
+
</View>
|
|
305
|
+
);
|
|
306
|
+
}
|
|
307
|
+
);
|
|
308
|
+
BreadcrumbSeparator.displayName = 'Breadcrumb.Separator';
|
|
309
|
+
|
|
310
|
+
export interface BreadcrumbEllipsisProps
|
|
311
|
+
extends Omit<AnimatedPressableProps, 'children'> {
|
|
312
|
+
className?: string;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Stands in for the crumbs a collapsed trail hides. Static by default; give it
|
|
317
|
+
* an `onPress` (via the list's `onEllipsisPress`) and it becomes the trigger
|
|
318
|
+
* for a menu of the hidden steps. Labelled "Show more" so the collapse is not
|
|
319
|
+
* silent to assistive tech.
|
|
320
|
+
*/
|
|
321
|
+
const BreadcrumbEllipsis = forwardRef<View, BreadcrumbEllipsisProps>(
|
|
322
|
+
({ className, onPress, ...props }, ref) => {
|
|
323
|
+
const rawTint = useCSSVariable('--color-muted-foreground');
|
|
324
|
+
const tint = typeof rawTint === 'string' ? rawTint : undefined;
|
|
325
|
+
const glyph = <EllipsisIcon size={16} color={tint} />;
|
|
326
|
+
|
|
327
|
+
if (!onPress) {
|
|
328
|
+
return (
|
|
329
|
+
<View
|
|
330
|
+
ref={ref}
|
|
331
|
+
accessibilityLabel="More"
|
|
332
|
+
className={cn('h-5 items-center justify-center px-0.5', className)}
|
|
333
|
+
>
|
|
334
|
+
{glyph}
|
|
335
|
+
</View>
|
|
336
|
+
);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return (
|
|
340
|
+
<AnimatedPressable
|
|
341
|
+
ref={ref}
|
|
342
|
+
accessibilityRole="button"
|
|
343
|
+
accessibilityLabel="Show more"
|
|
344
|
+
pressScale={0.92}
|
|
345
|
+
onPress={onPress}
|
|
346
|
+
className={cn('h-5 items-center justify-center px-0.5', className)}
|
|
347
|
+
{...props}
|
|
348
|
+
>
|
|
349
|
+
{glyph}
|
|
350
|
+
</AnimatedPressable>
|
|
351
|
+
);
|
|
352
|
+
}
|
|
353
|
+
);
|
|
354
|
+
BreadcrumbEllipsis.displayName = 'Breadcrumb.Ellipsis';
|
|
355
|
+
|
|
356
|
+
export const Breadcrumb = Object.assign(BreadcrumbRoot, {
|
|
357
|
+
List: BreadcrumbList,
|
|
358
|
+
Item: BreadcrumbItem,
|
|
359
|
+
Link: BreadcrumbLink,
|
|
360
|
+
Page: BreadcrumbPage,
|
|
361
|
+
Separator: BreadcrumbSeparator,
|
|
362
|
+
Ellipsis: BreadcrumbEllipsis,
|
|
363
|
+
});
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
AnimatedPressable,
|
|
7
7
|
type AnimatedPressableProps,
|
|
8
8
|
} from '../../primitives/animated-pressable';
|
|
9
|
-
import { Text } from '../../primitives/text';
|
|
9
|
+
import { Text, textChildren } from '../../primitives/text';
|
|
10
10
|
import { IconColorProvider } from '../../icons';
|
|
11
11
|
import { getNativeUI } from '../../native';
|
|
12
12
|
import { Spinner } from '../spinner';
|
|
@@ -210,10 +210,16 @@ export const Button = forwardRef<View, ButtonProps>(
|
|
|
210
210
|
>
|
|
211
211
|
{/* Non-string children are React Native views, and the native
|
|
212
212
|
button cannot measure those directly — they have to be hosted
|
|
213
|
-
or they render outside the button's bounds.
|
|
213
|
+
or they render outside the button's bounds. An icon beside a
|
|
214
|
+
label is the common case, and the label half of it is still
|
|
215
|
+
bare text once it is in there. */}
|
|
214
216
|
{isStringLabel ? undefined : (
|
|
215
217
|
<RNHostView matchContents>
|
|
216
|
-
<>
|
|
218
|
+
<>
|
|
219
|
+
{textChildren(children, (text) => (
|
|
220
|
+
<Text className={label({ className: labelClassName })}>{text}</Text>
|
|
221
|
+
))}
|
|
222
|
+
</>
|
|
217
223
|
</RNHostView>
|
|
218
224
|
)}
|
|
219
225
|
</NativeButton>
|
|
@@ -236,11 +242,9 @@ export const Button = forwardRef<View, ButtonProps>(
|
|
|
236
242
|
) : (
|
|
237
243
|
startContent
|
|
238
244
|
)}
|
|
239
|
-
{
|
|
240
|
-
<Text className={label({ className: labelClassName })}>{
|
|
241
|
-
)
|
|
242
|
-
children
|
|
243
|
-
)}
|
|
245
|
+
{textChildren(children, (text) => (
|
|
246
|
+
<Text className={label({ className: labelClassName })}>{text}</Text>
|
|
247
|
+
))}
|
|
244
248
|
{endContent}
|
|
245
249
|
</AnimatedPressable>
|
|
246
250
|
</IconColorProvider>
|