@idealyst/components 1.1.7 → 1.1.9
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/package.json +3 -3
- package/plugin/web.js +280 -532
- package/src/Accordion/Accordion.native.tsx +8 -6
- package/src/Accordion/Accordion.styles.old.tsx +298 -0
- package/src/Accordion/Accordion.styles.tsx +102 -236
- package/src/Accordion/Accordion.web.tsx +1 -3
- package/src/ActivityIndicator/ActivityIndicator.styles.old.tsx +94 -0
- package/src/ActivityIndicator/ActivityIndicator.styles.tsx +44 -74
- package/src/Alert/Alert.native.tsx +16 -6
- package/src/Alert/Alert.styles.old.tsx +209 -0
- package/src/Alert/Alert.styles.tsx +67 -149
- package/src/Alert/Alert.web.tsx +3 -4
- package/src/Avatar/Avatar.styles.old.tsx +99 -0
- package/src/Avatar/Avatar.styles.tsx +35 -80
- package/src/Badge/Badge.styles.old.tsx +157 -0
- package/src/Badge/Badge.styles.tsx +61 -121
- package/src/Badge/Badge.web.tsx +8 -15
- package/src/Breadcrumb/Breadcrumb.styles.old.tsx +231 -0
- package/src/Breadcrumb/Breadcrumb.styles.tsx +83 -200
- package/src/Breadcrumb/Breadcrumb.web.tsx +31 -30
- package/src/Button/Button.native.tsx +14 -21
- package/src/Button/Button.styles.tsx +103 -140
- package/src/Button/Button.web.tsx +9 -19
- package/src/Card/Card.native.tsx +7 -11
- package/src/Card/Card.styles.old.tsx +160 -0
- package/src/Card/Card.styles.tsx +105 -142
- package/src/Card/Card.web.tsx +5 -4
- package/src/Checkbox/Checkbox.native.tsx +9 -5
- package/src/Checkbox/Checkbox.styles.old.tsx +271 -0
- package/src/Checkbox/Checkbox.styles.tsx +104 -216
- package/src/Checkbox/Checkbox.web.tsx +7 -8
- package/src/Chip/Chip.styles.old.tsx +184 -0
- package/src/Chip/Chip.styles.tsx +34 -72
- package/src/Chip/Chip.web.tsx +3 -5
- package/src/Dialog/Dialog.native.tsx +7 -4
- package/src/Dialog/Dialog.styles.old.tsx +202 -0
- package/src/Dialog/Dialog.styles.tsx +69 -133
- package/src/Dialog/Dialog.web.tsx +3 -3
- package/src/Dialog/types.ts +1 -1
- package/src/Divider/Divider.styles.old.tsx +172 -0
- package/src/Divider/Divider.styles.tsx +62 -84
- package/src/Icon/Icon.native.tsx +8 -8
- package/src/Icon/Icon.styles.old.tsx +81 -0
- package/src/Icon/Icon.styles.tsx +52 -66
- package/src/Icon/Icon.web.tsx +62 -21
- package/src/Icon/IconRegistry.native.ts +41 -0
- package/src/Icon/IconRegistry.ts +107 -0
- package/src/Icon/IconSvg/IconSvg.web.tsx +28 -5
- package/src/Icon/icon-resolver.ts +12 -43
- package/src/Icon/index.native.ts +2 -1
- package/src/Icon/index.ts +1 -0
- package/src/Icon/index.web.ts +1 -0
- package/src/Image/Image.styles.old.tsx +69 -0
- package/src/Image/Image.styles.tsx +46 -60
- package/src/Input/Input.native.tsx +138 -53
- package/src/Input/Input.styles.old.tsx +289 -0
- package/src/Input/Input.styles.tsx +134 -232
- package/src/Input/Input.web.tsx +5 -8
- package/src/List/List.native.tsx +5 -2
- package/src/List/List.styles.old.tsx +242 -0
- package/src/List/List.styles.tsx +179 -215
- package/src/List/ListItem.native.tsx +16 -11
- package/src/List/ListItem.web.tsx +26 -16
- package/src/Menu/Menu.styles.old.tsx +197 -0
- package/src/Menu/Menu.styles.tsx +68 -150
- package/src/Menu/MenuItem.native.tsx +5 -3
- package/src/Menu/MenuItem.styles.old.tsx +114 -0
- package/src/Menu/MenuItem.styles.tsx +57 -89
- package/src/Menu/MenuItem.web.tsx +10 -7
- package/src/Popover/Popover.native.tsx +10 -4
- package/src/Popover/Popover.styles.old.tsx +135 -0
- package/src/Popover/Popover.styles.tsx +51 -112
- package/src/Pressable/Pressable.styles.old.tsx +27 -0
- package/src/Pressable/Pressable.styles.tsx +35 -27
- package/src/Progress/Progress.styles.old.tsx +200 -0
- package/src/Progress/Progress.styles.tsx +75 -164
- package/src/RadioButton/RadioButton.native.tsx +4 -3
- package/src/RadioButton/RadioButton.styles.old.tsx +175 -0
- package/src/RadioButton/RadioButton.styles.tsx +83 -154
- package/src/RadioButton/RadioButton.web.tsx +2 -2
- package/src/SVGImage/SVGImage.styles.old.tsx +86 -0
- package/src/SVGImage/SVGImage.styles.tsx +35 -78
- package/src/Screen/Screen.native.tsx +19 -26
- package/src/Screen/Screen.styles.old.tsx +87 -0
- package/src/Screen/Screen.styles.tsx +103 -68
- package/src/Screen/Screen.web.tsx +2 -2
- package/src/Select/Select.native.tsx +42 -33
- package/src/Select/Select.styles.old.tsx +353 -0
- package/src/Select/Select.styles.tsx +214 -300
- package/src/Select/Select.web.tsx +45 -33
- package/src/Skeleton/Skeleton.styles.old.tsx +67 -0
- package/src/Skeleton/Skeleton.styles.tsx +29 -53
- package/src/Slider/Slider.styles.old.tsx +259 -0
- package/src/Slider/Slider.styles.tsx +153 -234
- package/src/Slider/Slider.web.tsx +2 -4
- package/src/Switch/Switch.native.tsx +9 -7
- package/src/Switch/Switch.styles.old.tsx +203 -0
- package/src/Switch/Switch.styles.tsx +101 -174
- package/src/Switch/Switch.web.tsx +7 -8
- package/src/TabBar/TabBar.native.tsx +3 -2
- package/src/TabBar/TabBar.styles.old.tsx +343 -0
- package/src/TabBar/TabBar.styles.tsx +145 -279
- package/src/Table/Table.native.tsx +180 -68
- package/src/Table/Table.styles.old.tsx +311 -0
- package/src/Table/Table.styles.tsx +140 -281
- package/src/Table/Table.web.tsx +169 -70
- package/src/Text/Text.native.tsx +1 -3
- package/src/Text/Text.style.demo.tsx +16 -0
- package/src/Text/Text.styles.old.tsx +219 -0
- package/src/Text/Text.styles.tsx +94 -84
- package/src/Text/Text.web.tsx +3 -2
- package/src/Text/index.ts +1 -0
- package/src/TextArea/TextArea.native.tsx +21 -8
- package/src/TextArea/TextArea.styles.old.tsx +213 -0
- package/src/TextArea/TextArea.styles.tsx +87 -187
- package/src/TextArea/TextArea.web.tsx +17 -6
- package/src/Tooltip/Tooltip.styles.old.tsx +82 -0
- package/src/Tooltip/Tooltip.styles.tsx +32 -56
- package/src/Video/Video.styles.old.tsx +51 -0
- package/src/Video/Video.styles.tsx +32 -44
- package/src/View/View.native.tsx +41 -13
- package/src/View/View.styles.old.tsx +125 -0
- package/src/View/View.styles.tsx +76 -106
- package/src/View/View.web.tsx +5 -21
- package/src/View/types.ts +31 -3
- package/src/examples/ButtonExamples.tsx +20 -0
- package/src/examples/CardExamples.tsx +0 -6
- package/src/extensions/extendComponent.ts +61 -0
- package/src/index.ts +1 -1
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { StyleSheet } from 'react-native-unistyles';
|
|
2
|
+
import { Theme, StylesheetStyles, Size } from '@idealyst/theme';
|
|
3
|
+
import { buildSizeVariants } from '../utils/buildSizeVariants';
|
|
4
|
+
import { applyExtensions } from '../extensions/applyExtension';
|
|
5
|
+
|
|
6
|
+
type BreadcrumbSize = Size;
|
|
7
|
+
type BreadcrumbIntent = 'primary' | 'neutral';
|
|
8
|
+
|
|
9
|
+
type BreadcrumbVariants = {
|
|
10
|
+
size: BreadcrumbSize;
|
|
11
|
+
intent: BreadcrumbIntent;
|
|
12
|
+
disabled: boolean;
|
|
13
|
+
isLast: boolean;
|
|
14
|
+
clickable: boolean;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type ExpandedBreadcrumbStyles = StylesheetStyles<keyof BreadcrumbVariants>;
|
|
18
|
+
|
|
19
|
+
export type BreadcrumbStylesheet = {
|
|
20
|
+
container: ExpandedBreadcrumbStyles;
|
|
21
|
+
item: ExpandedBreadcrumbStyles;
|
|
22
|
+
itemText: ExpandedBreadcrumbStyles;
|
|
23
|
+
icon: ExpandedBreadcrumbStyles;
|
|
24
|
+
separator: ExpandedBreadcrumbStyles;
|
|
25
|
+
ellipsis: ExpandedBreadcrumbStyles;
|
|
26
|
+
ellipsisIcon: ExpandedBreadcrumbStyles;
|
|
27
|
+
menuButton: ExpandedBreadcrumbStyles;
|
|
28
|
+
menuButtonIcon: ExpandedBreadcrumbStyles;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
type ItemTextDynamicProps = {
|
|
32
|
+
intent?: BreadcrumbIntent;
|
|
33
|
+
isLast?: boolean;
|
|
34
|
+
disabled?: boolean;
|
|
35
|
+
clickable?: boolean;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Create size variants for item text
|
|
40
|
+
*/
|
|
41
|
+
function createItemTextSizeVariants(theme: Theme) {
|
|
42
|
+
return buildSizeVariants(theme, 'breadcrumb', (size) => ({
|
|
43
|
+
fontSize: size.fontSize,
|
|
44
|
+
lineHeight: size.lineHeight,
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Get item text color based on state
|
|
50
|
+
*/
|
|
51
|
+
function getItemTextColor(theme: Theme, intent: BreadcrumbIntent, isLast: boolean, disabled: boolean, clickable: boolean): string {
|
|
52
|
+
if (disabled) {
|
|
53
|
+
return theme.colors.text.secondary;
|
|
54
|
+
}
|
|
55
|
+
if (isLast) {
|
|
56
|
+
return theme.colors.text.primary;
|
|
57
|
+
}
|
|
58
|
+
if (clickable) {
|
|
59
|
+
return intent === 'primary' ? theme.intents.primary.primary : theme.colors.text.secondary;
|
|
60
|
+
}
|
|
61
|
+
return theme.colors.text.secondary;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Create size variants for icons
|
|
66
|
+
*/
|
|
67
|
+
function createIconSizeVariants(theme: Theme) {
|
|
68
|
+
return buildSizeVariants(theme, 'breadcrumb', (size) => ({
|
|
69
|
+
width: size.iconSize,
|
|
70
|
+
height: size.iconSize,
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Get icon color based on intent
|
|
76
|
+
*/
|
|
77
|
+
function getIconColor(theme: Theme, intent: BreadcrumbIntent) {
|
|
78
|
+
if (intent === 'primary') {
|
|
79
|
+
return theme.intents.primary.primary;
|
|
80
|
+
}
|
|
81
|
+
return theme.colors.text.secondary;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const createItemTextStyles = (theme: Theme) => {
|
|
85
|
+
return ({ intent = 'primary', isLast = false, disabled = false, clickable = true }: ItemTextDynamicProps) => {
|
|
86
|
+
const color = getItemTextColor(theme, intent, isLast, disabled, clickable);
|
|
87
|
+
return {
|
|
88
|
+
color,
|
|
89
|
+
opacity: disabled ? 0.5 : 1,
|
|
90
|
+
variants: {
|
|
91
|
+
size: createItemTextSizeVariants(theme),
|
|
92
|
+
},
|
|
93
|
+
} as const;
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const createIconStyles = (theme: Theme) => {
|
|
98
|
+
return {
|
|
99
|
+
variants: {
|
|
100
|
+
size: createIconSizeVariants(theme),
|
|
101
|
+
},
|
|
102
|
+
} as const;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const createSeparatorStyles = (theme: Theme) => {
|
|
106
|
+
return {
|
|
107
|
+
color: theme.colors.text.tertiary,
|
|
108
|
+
variants: {
|
|
109
|
+
size: createItemTextSizeVariants(theme),
|
|
110
|
+
},
|
|
111
|
+
} as const;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const createEllipsisIconStyles = (theme: Theme) => {
|
|
115
|
+
return ({ intent }: Partial<BreadcrumbVariants>) => {
|
|
116
|
+
return {
|
|
117
|
+
color: getIconColor(theme, intent),
|
|
118
|
+
variants: {
|
|
119
|
+
size: createIconSizeVariants(theme),
|
|
120
|
+
},
|
|
121
|
+
} as const;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const createMenuButtonIconStyles = (theme: Theme) => {
|
|
126
|
+
return ({ intent }: Partial<BreadcrumbVariants>) => {
|
|
127
|
+
return {
|
|
128
|
+
color: getIconColor(theme, intent),
|
|
129
|
+
variants: {
|
|
130
|
+
size: createIconSizeVariants(theme),
|
|
131
|
+
},
|
|
132
|
+
} as const;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Style creators for extension support
|
|
137
|
+
function createContainerStyles() {
|
|
138
|
+
return () => ({
|
|
139
|
+
display: 'flex' as const,
|
|
140
|
+
flexDirection: 'row' as const,
|
|
141
|
+
alignItems: 'center' as const,
|
|
142
|
+
flexWrap: 'wrap' as const,
|
|
143
|
+
gap: 8,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function createItemStyles() {
|
|
148
|
+
return () => ({
|
|
149
|
+
display: 'flex' as const,
|
|
150
|
+
flexDirection: 'row' as const,
|
|
151
|
+
alignItems: 'center' as const,
|
|
152
|
+
gap: 4,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Styles are inlined here instead of in @idealyst/theme because Unistyles' Babel transform on native cannot resolve function calls to extract variant structures.
|
|
157
|
+
export const breadcrumbStyles = StyleSheet.create((theme: Theme) => {
|
|
158
|
+
// Apply extensions to main visual elements
|
|
159
|
+
|
|
160
|
+
return applyExtensions('Breadcrumb', theme, {container: createContainerStyles(),
|
|
161
|
+
item: createItemStyles(),
|
|
162
|
+
itemText: createItemTextStyles(theme),
|
|
163
|
+
// Additional styles (merged from return)
|
|
164
|
+
// Minor utility styles (not extended)
|
|
165
|
+
icon: createIconStyles(theme),
|
|
166
|
+
separator: createSeparatorStyles(theme),
|
|
167
|
+
ellipsis: {
|
|
168
|
+
display: 'flex',
|
|
169
|
+
alignItems: 'center',
|
|
170
|
+
justifyContent: 'center',
|
|
171
|
+
},
|
|
172
|
+
ellipsisIcon: createEllipsisIconStyles(theme),
|
|
173
|
+
menuButton: {
|
|
174
|
+
paddingVertical: 4,
|
|
175
|
+
paddingHorizontal: 8,
|
|
176
|
+
},
|
|
177
|
+
menuButtonIcon: createMenuButtonIconStyles(theme)});
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
// Export individual style sheets for backwards compatibility
|
|
181
|
+
export const breadcrumbContainerStyles = StyleSheet.create((theme: Theme) => {
|
|
182
|
+
return {
|
|
183
|
+
container: {
|
|
184
|
+
display: 'flex',
|
|
185
|
+
flexDirection: 'row',
|
|
186
|
+
alignItems: 'center',
|
|
187
|
+
flexWrap: 'wrap',
|
|
188
|
+
gap: 8,
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
export const breadcrumbItemStyles = StyleSheet.create((theme: Theme) => {
|
|
194
|
+
return {
|
|
195
|
+
item: {
|
|
196
|
+
display: 'flex',
|
|
197
|
+
flexDirection: 'row',
|
|
198
|
+
alignItems: 'center',
|
|
199
|
+
gap: 4,
|
|
200
|
+
},
|
|
201
|
+
itemText: createItemTextStyles(theme),
|
|
202
|
+
icon: createIconStyles(theme),
|
|
203
|
+
} as const;
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
export const breadcrumbSeparatorStyles = StyleSheet.create((theme: Theme) => {
|
|
207
|
+
return {
|
|
208
|
+
separator: createSeparatorStyles(theme),
|
|
209
|
+
} as const;
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
export const breadcrumbEllipsisStyles = StyleSheet.create((theme: Theme) => {
|
|
213
|
+
return {
|
|
214
|
+
ellipsis: {
|
|
215
|
+
display: 'flex',
|
|
216
|
+
alignItems: 'center',
|
|
217
|
+
justifyContent: 'center',
|
|
218
|
+
},
|
|
219
|
+
icon: createEllipsisIconStyles(theme),
|
|
220
|
+
} as const;
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
export const breadcrumbMenuButtonStyles = StyleSheet.create((theme: Theme) => {
|
|
224
|
+
return {
|
|
225
|
+
button: {
|
|
226
|
+
paddingVertical: 4,
|
|
227
|
+
paddingHorizontal: 8,
|
|
228
|
+
},
|
|
229
|
+
icon: createMenuButtonIconStyles(theme),
|
|
230
|
+
} as const;
|
|
231
|
+
});
|
|
@@ -1,235 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Breadcrumb styles using defineStyle with $iterator expansion.
|
|
3
|
+
*/
|
|
1
4
|
import { StyleSheet } from 'react-native-unistyles';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { applyExtensions } from '../extensions/applyExtension';
|
|
5
|
-
|
|
6
|
-
type BreadcrumbSize = Size;
|
|
7
|
-
type BreadcrumbIntent = 'primary' | 'neutral';
|
|
5
|
+
import { defineStyle, ThemeStyleWrapper } from '@idealyst/theme';
|
|
6
|
+
import type { Theme as BaseTheme, Size } from '@idealyst/theme';
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
intent: BreadcrumbIntent;
|
|
12
|
-
disabled: boolean;
|
|
13
|
-
isLast: boolean;
|
|
14
|
-
clickable: boolean;
|
|
15
|
-
}
|
|
8
|
+
// Required: Unistyles must see StyleSheet usage in original source to process this file
|
|
9
|
+
void StyleSheet;
|
|
16
10
|
|
|
17
|
-
|
|
11
|
+
// Wrap theme for $iterator support
|
|
12
|
+
type Theme = ThemeStyleWrapper<BaseTheme>;
|
|
18
13
|
|
|
19
|
-
|
|
20
|
-
container: ExpandedBreadcrumbStyles;
|
|
21
|
-
item: ExpandedBreadcrumbStyles;
|
|
22
|
-
itemText: ExpandedBreadcrumbStyles;
|
|
23
|
-
icon: ExpandedBreadcrumbStyles;
|
|
24
|
-
separator: ExpandedBreadcrumbStyles;
|
|
25
|
-
ellipsis: ExpandedBreadcrumbStyles;
|
|
26
|
-
ellipsisIcon: ExpandedBreadcrumbStyles;
|
|
27
|
-
menuButton: ExpandedBreadcrumbStyles;
|
|
28
|
-
menuButtonIcon: ExpandedBreadcrumbStyles;
|
|
29
|
-
}
|
|
14
|
+
type BreadcrumbIntent = 'primary' | 'neutral';
|
|
30
15
|
|
|
31
|
-
type
|
|
16
|
+
export type BreadcrumbDynamicProps = {
|
|
17
|
+
size?: Size;
|
|
32
18
|
intent?: BreadcrumbIntent;
|
|
33
|
-
isLast?: boolean;
|
|
34
19
|
disabled?: boolean;
|
|
20
|
+
isLast?: boolean;
|
|
35
21
|
clickable?: boolean;
|
|
36
22
|
};
|
|
37
23
|
|
|
38
24
|
/**
|
|
39
|
-
*
|
|
25
|
+
* Breadcrumb styles with intent and state handling.
|
|
40
26
|
*/
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
* Get item text color based on state
|
|
50
|
-
*/
|
|
51
|
-
function getItemTextColor(theme: Theme, intent: BreadcrumbIntent, isLast: boolean, disabled: boolean, clickable: boolean): string {
|
|
52
|
-
if (disabled) {
|
|
53
|
-
return theme.colors.text.secondary;
|
|
54
|
-
}
|
|
55
|
-
if (isLast) {
|
|
56
|
-
return theme.colors.text.primary;
|
|
57
|
-
}
|
|
58
|
-
if (clickable) {
|
|
59
|
-
return intent === 'primary' ? theme.intents.primary.primary : theme.colors.text.secondary;
|
|
60
|
-
}
|
|
61
|
-
return theme.colors.text.secondary;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Create size variants for icons
|
|
66
|
-
*/
|
|
67
|
-
function createIconSizeVariants(theme: Theme) {
|
|
68
|
-
return buildSizeVariants(theme, 'breadcrumb', (size) => ({
|
|
69
|
-
width: size.iconSize,
|
|
70
|
-
height: size.iconSize,
|
|
71
|
-
}));
|
|
72
|
-
}
|
|
27
|
+
export const breadcrumbStyles = defineStyle('Breadcrumb', (theme: Theme) => ({
|
|
28
|
+
container: (_props: BreadcrumbDynamicProps) => ({
|
|
29
|
+
display: 'flex' as const,
|
|
30
|
+
flexDirection: 'row' as const,
|
|
31
|
+
alignItems: 'center' as const,
|
|
32
|
+
flexWrap: 'wrap' as const,
|
|
33
|
+
gap: 8,
|
|
34
|
+
}),
|
|
73
35
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
36
|
+
item: (_props: BreadcrumbDynamicProps) => ({
|
|
37
|
+
display: 'flex' as const,
|
|
38
|
+
flexDirection: 'row' as const,
|
|
39
|
+
alignItems: 'center' as const,
|
|
40
|
+
gap: 4,
|
|
41
|
+
}),
|
|
42
|
+
|
|
43
|
+
itemText: ({ intent = 'primary', isLast = false, disabled = false, clickable = true }: BreadcrumbDynamicProps) => {
|
|
44
|
+
// Get color based on state - inline for Unistyles to trace
|
|
45
|
+
const color = disabled
|
|
46
|
+
? theme.colors.text.secondary
|
|
47
|
+
: isLast
|
|
48
|
+
? theme.colors.text.primary
|
|
49
|
+
: clickable
|
|
50
|
+
? (intent === 'primary' ? theme.intents.primary.primary : theme.colors.text.secondary)
|
|
51
|
+
: theme.colors.text.secondary;
|
|
83
52
|
|
|
84
|
-
const createItemTextStyles = (theme: Theme) => {
|
|
85
|
-
return ({ intent = 'primary', isLast = false, disabled = false, clickable = true }: ItemTextDynamicProps) => {
|
|
86
|
-
const color = getItemTextColor(theme, intent, isLast, disabled, clickable);
|
|
87
53
|
return {
|
|
88
54
|
color,
|
|
89
55
|
opacity: disabled ? 0.5 : 1,
|
|
90
56
|
variants: {
|
|
91
|
-
size
|
|
57
|
+
// $iterator expands for each breadcrumb size
|
|
58
|
+
size: {
|
|
59
|
+
fontSize: theme.sizes.$breadcrumb.fontSize,
|
|
60
|
+
lineHeight: theme.sizes.$breadcrumb.lineHeight,
|
|
61
|
+
},
|
|
92
62
|
},
|
|
93
63
|
} as const;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
64
|
+
},
|
|
96
65
|
|
|
97
|
-
|
|
98
|
-
return {
|
|
66
|
+
icon: (_props: BreadcrumbDynamicProps) => ({
|
|
99
67
|
variants: {
|
|
100
|
-
size:
|
|
68
|
+
size: {
|
|
69
|
+
width: theme.sizes.$breadcrumb.iconSize,
|
|
70
|
+
height: theme.sizes.$breadcrumb.iconSize,
|
|
71
|
+
fontSize: theme.sizes.$breadcrumb.iconSize,
|
|
72
|
+
},
|
|
101
73
|
},
|
|
102
|
-
}
|
|
103
|
-
}
|
|
74
|
+
}),
|
|
104
75
|
|
|
105
|
-
|
|
106
|
-
return {
|
|
76
|
+
separator: (_props: BreadcrumbDynamicProps) => ({
|
|
107
77
|
color: theme.colors.text.tertiary,
|
|
108
78
|
variants: {
|
|
109
|
-
size:
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
const createEllipsisIconStyles = (theme: Theme) => {
|
|
115
|
-
return ({ intent }: Partial<BreadcrumbVariants>) => {
|
|
116
|
-
return {
|
|
117
|
-
color: getIconColor(theme, intent),
|
|
118
|
-
variants: {
|
|
119
|
-
size: createIconSizeVariants(theme),
|
|
79
|
+
size: {
|
|
80
|
+
fontSize: theme.sizes.$breadcrumb.fontSize,
|
|
81
|
+
lineHeight: theme.sizes.$breadcrumb.lineHeight,
|
|
120
82
|
},
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
const createMenuButtonIconStyles = (theme: Theme) => {
|
|
126
|
-
return ({ intent }: Partial<BreadcrumbVariants>) => {
|
|
127
|
-
return {
|
|
128
|
-
color: getIconColor(theme, intent),
|
|
129
|
-
variants: {
|
|
130
|
-
size: createIconSizeVariants(theme),
|
|
131
|
-
},
|
|
132
|
-
} as const;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// Style creators for extension support
|
|
137
|
-
function createContainerStyles() {
|
|
138
|
-
return () => ({
|
|
139
|
-
display: 'flex' as const,
|
|
140
|
-
flexDirection: 'row' as const,
|
|
141
|
-
alignItems: 'center' as const,
|
|
142
|
-
flexWrap: 'wrap' as const,
|
|
143
|
-
gap: 8,
|
|
144
|
-
});
|
|
145
|
-
}
|
|
83
|
+
},
|
|
84
|
+
}),
|
|
146
85
|
|
|
147
|
-
|
|
148
|
-
return () => ({
|
|
86
|
+
ellipsis: (_props: BreadcrumbDynamicProps) => ({
|
|
149
87
|
display: 'flex' as const,
|
|
150
|
-
flexDirection: 'row' as const,
|
|
151
88
|
alignItems: 'center' as const,
|
|
152
|
-
|
|
153
|
-
})
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// Styles are inlined here instead of in @idealyst/theme because Unistyles' Babel transform on native cannot resolve function calls to extract variant structures.
|
|
157
|
-
export const breadcrumbStyles = StyleSheet.create((theme: Theme) => {
|
|
158
|
-
// Apply extensions to main visual elements
|
|
159
|
-
const extended = applyExtensions('Breadcrumb', theme, {
|
|
160
|
-
container: createContainerStyles(),
|
|
161
|
-
item: createItemStyles(),
|
|
162
|
-
itemText: createItemTextStyles(theme),
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
return {
|
|
166
|
-
...extended,
|
|
167
|
-
// Minor utility styles (not extended)
|
|
168
|
-
icon: createIconStyles(theme),
|
|
169
|
-
separator: createSeparatorStyles(theme),
|
|
170
|
-
ellipsis: {
|
|
171
|
-
display: 'flex',
|
|
172
|
-
alignItems: 'center',
|
|
173
|
-
justifyContent: 'center',
|
|
174
|
-
},
|
|
175
|
-
ellipsisIcon: createEllipsisIconStyles(theme),
|
|
176
|
-
menuButton: {
|
|
177
|
-
paddingVertical: 4,
|
|
178
|
-
paddingHorizontal: 8,
|
|
179
|
-
},
|
|
180
|
-
menuButtonIcon: createMenuButtonIconStyles(theme),
|
|
181
|
-
};
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
// Export individual style sheets for backwards compatibility
|
|
185
|
-
export const breadcrumbContainerStyles = StyleSheet.create((theme: Theme) => {
|
|
186
|
-
return {
|
|
187
|
-
container: {
|
|
188
|
-
display: 'flex',
|
|
189
|
-
flexDirection: 'row',
|
|
190
|
-
alignItems: 'center',
|
|
191
|
-
flexWrap: 'wrap',
|
|
192
|
-
gap: 8,
|
|
193
|
-
},
|
|
194
|
-
};
|
|
195
|
-
});
|
|
89
|
+
justifyContent: 'center' as const,
|
|
90
|
+
}),
|
|
196
91
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
92
|
+
ellipsisIcon: ({ intent = 'primary' }: BreadcrumbDynamicProps) => ({
|
|
93
|
+
color: intent === 'primary' ? theme.intents.primary.primary : theme.colors.text.secondary,
|
|
94
|
+
variants: {
|
|
95
|
+
size: {
|
|
96
|
+
width: theme.sizes.$breadcrumb.iconSize,
|
|
97
|
+
height: theme.sizes.$breadcrumb.iconSize,
|
|
98
|
+
fontSize: theme.sizes.$breadcrumb.iconSize,
|
|
99
|
+
},
|
|
204
100
|
},
|
|
205
|
-
|
|
206
|
-
icon: createIconStyles(theme),
|
|
207
|
-
} as const;
|
|
208
|
-
});
|
|
101
|
+
}),
|
|
209
102
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}
|
|
214
|
-
});
|
|
103
|
+
menuButton: (_props: BreadcrumbDynamicProps) => ({
|
|
104
|
+
paddingVertical: 4,
|
|
105
|
+
paddingHorizontal: 8,
|
|
106
|
+
}),
|
|
215
107
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
} as const;
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
export const breadcrumbMenuButtonStyles = StyleSheet.create((theme: Theme) => {
|
|
228
|
-
return {
|
|
229
|
-
button: {
|
|
230
|
-
paddingVertical: 4,
|
|
231
|
-
paddingHorizontal: 8,
|
|
108
|
+
menuButtonIcon: ({ intent = 'primary' }: BreadcrumbDynamicProps) => ({
|
|
109
|
+
color: intent === 'primary' ? theme.intents.primary.primary : theme.colors.text.secondary,
|
|
110
|
+
variants: {
|
|
111
|
+
size: {
|
|
112
|
+
width: theme.sizes.$breadcrumb.iconSize,
|
|
113
|
+
height: theme.sizes.$breadcrumb.iconSize,
|
|
114
|
+
fontSize: theme.sizes.$breadcrumb.iconSize,
|
|
115
|
+
},
|
|
232
116
|
},
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
});
|
|
117
|
+
}),
|
|
118
|
+
}));
|
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
import React, { isValidElement, useState
|
|
1
|
+
import React, { isValidElement, useState } from 'react';
|
|
2
2
|
import { getWebProps } from 'react-native-unistyles/web';
|
|
3
|
-
import {
|
|
4
|
-
breadcrumbContainerStyles,
|
|
5
|
-
breadcrumbItemStyles,
|
|
6
|
-
breadcrumbSeparatorStyles,
|
|
7
|
-
breadcrumbEllipsisStyles,
|
|
8
|
-
breadcrumbMenuButtonStyles
|
|
9
|
-
} from './Breadcrumb.styles';
|
|
3
|
+
import { breadcrumbStyles } from './Breadcrumb.styles';
|
|
10
4
|
import type { BreadcrumbProps, BreadcrumbItem as BreadcrumbItemType } from './types';
|
|
11
5
|
import { IconSvg } from '../Icon/IconSvg/IconSvg.web';
|
|
12
|
-
import {
|
|
6
|
+
import { isIconName } from '../Icon/icon-resolver';
|
|
13
7
|
import Menu from '../Menu/Menu.web';
|
|
14
8
|
import type { MenuItem } from '../Menu/types';
|
|
15
9
|
|
|
@@ -26,21 +20,23 @@ const BreadcrumbItem: React.FC<BreadcrumbItemProps> = ({ item, isLast, size, int
|
|
|
26
20
|
const isDisabled = item.disabled || false;
|
|
27
21
|
|
|
28
22
|
// Apply size variant
|
|
29
|
-
|
|
23
|
+
breadcrumbStyles.useVariants({
|
|
30
24
|
size,
|
|
31
25
|
});
|
|
32
26
|
|
|
33
|
-
// Get dynamic
|
|
34
|
-
const
|
|
27
|
+
// Get dynamic styles - call as functions for theme reactivity
|
|
28
|
+
const itemStyle_ = (breadcrumbStyles.item as any)({});
|
|
29
|
+
const itemTextStyle = (breadcrumbStyles.itemText as any)({
|
|
35
30
|
intent,
|
|
36
31
|
isLast,
|
|
37
32
|
disabled: isDisabled,
|
|
38
33
|
clickable: isClickable,
|
|
39
34
|
});
|
|
35
|
+
const iconStyle = (breadcrumbStyles.icon as any)({});
|
|
40
36
|
|
|
41
|
-
const itemProps = getWebProps([
|
|
37
|
+
const itemProps = getWebProps([itemStyle_]);
|
|
42
38
|
const itemTextProps = getWebProps([itemTextStyle, itemStyle]);
|
|
43
|
-
const iconProps = getWebProps([
|
|
39
|
+
const iconProps = getWebProps([iconStyle]);
|
|
44
40
|
|
|
45
41
|
const handleClick = () => {
|
|
46
42
|
if (!item.disabled && item.onPress) {
|
|
@@ -52,11 +48,9 @@ const BreadcrumbItem: React.FC<BreadcrumbItemProps> = ({ item, isLast, size, int
|
|
|
52
48
|
if (!item.icon) return null;
|
|
53
49
|
|
|
54
50
|
if (isIconName(item.icon)) {
|
|
55
|
-
const iconPath = resolveIconPath(item.icon);
|
|
56
51
|
return (
|
|
57
52
|
<IconSvg
|
|
58
|
-
|
|
59
|
-
{...iconProps}
|
|
53
|
+
name={item.icon}
|
|
60
54
|
aria-label={item.icon}
|
|
61
55
|
/>
|
|
62
56
|
);
|
|
@@ -120,8 +114,9 @@ interface BreadcrumbSeparatorProps {
|
|
|
120
114
|
}
|
|
121
115
|
|
|
122
116
|
const BreadcrumbSeparator: React.FC<BreadcrumbSeparatorProps> = ({ separator, size, separatorStyle }) => {
|
|
123
|
-
|
|
124
|
-
const
|
|
117
|
+
breadcrumbStyles.useVariants({ size });
|
|
118
|
+
const separatorStyle_ = (breadcrumbStyles.separator as any)({});
|
|
119
|
+
const separatorProps = getWebProps([separatorStyle_, separatorStyle]);
|
|
125
120
|
|
|
126
121
|
return (
|
|
127
122
|
<span {...separatorProps} aria-hidden="true">
|
|
@@ -136,15 +131,16 @@ interface BreadcrumbEllipsisProps {
|
|
|
136
131
|
}
|
|
137
132
|
|
|
138
133
|
const BreadcrumbEllipsis: React.FC<BreadcrumbEllipsisProps> = ({ size, intent }) => {
|
|
139
|
-
|
|
140
|
-
const
|
|
141
|
-
const
|
|
142
|
-
const
|
|
134
|
+
breadcrumbStyles.useVariants({ size });
|
|
135
|
+
const ellipsisStyle = (breadcrumbStyles.ellipsis as any)({});
|
|
136
|
+
const ellipsisIconStyle = (breadcrumbStyles.ellipsisIcon as any)({ intent });
|
|
137
|
+
const ellipsisProps = getWebProps([ellipsisStyle]);
|
|
138
|
+
const iconProps = getWebProps([ellipsisIconStyle]);
|
|
143
139
|
|
|
144
140
|
return (
|
|
145
141
|
<span {...ellipsisProps}>
|
|
146
142
|
<IconSvg
|
|
147
|
-
|
|
143
|
+
name="dots-horizontal"
|
|
148
144
|
{...iconProps}
|
|
149
145
|
aria-label="more items"
|
|
150
146
|
/>
|
|
@@ -167,13 +163,18 @@ const Breadcrumb: React.FC<BreadcrumbProps> = ({
|
|
|
167
163
|
id,
|
|
168
164
|
}) => {
|
|
169
165
|
const [menuOpen, setMenuOpen] = useState(false);
|
|
170
|
-
|
|
171
|
-
|
|
166
|
+
|
|
167
|
+
// Get dynamic styles - call as functions for theme reactivity
|
|
168
|
+
const containerStyle = (breadcrumbStyles.container as any)({});
|
|
169
|
+
const menuButtonStyle = (breadcrumbStyles.menuButton as any)({});
|
|
170
|
+
const menuButtonIconStyle = (breadcrumbStyles.menuButtonIcon as any)({ intent });
|
|
171
|
+
|
|
172
|
+
const containerProps = getWebProps([containerStyle, style as any]);
|
|
172
173
|
|
|
173
174
|
// Apply variants for menu button
|
|
174
|
-
|
|
175
|
-
const menuButtonProps = getWebProps([
|
|
176
|
-
const menuIconProps = getWebProps([
|
|
175
|
+
breadcrumbStyles.useVariants({ size });
|
|
176
|
+
const menuButtonProps = getWebProps([menuButtonStyle]);
|
|
177
|
+
const menuIconProps = getWebProps([menuButtonIconStyle]);
|
|
177
178
|
|
|
178
179
|
// Handle responsive collapsing
|
|
179
180
|
let displayItems = items;
|
|
@@ -245,7 +246,7 @@ const Breadcrumb: React.FC<BreadcrumbProps> = ({
|
|
|
245
246
|
aria-label="Show more breadcrumb items"
|
|
246
247
|
>
|
|
247
248
|
<IconSvg
|
|
248
|
-
|
|
249
|
+
name="dots-horizontal"
|
|
249
250
|
{...menuIconProps}
|
|
250
251
|
aria-label="dots-horizontal"
|
|
251
252
|
/>
|