@idealyst/components 1.1.7 → 1.1.8

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.
Files changed (105) hide show
  1. package/package.json +3 -3
  2. package/src/Accordion/Accordion.native.tsx +8 -6
  3. package/src/Accordion/Accordion.styles.old.tsx +298 -0
  4. package/src/Accordion/Accordion.styles.tsx +102 -236
  5. package/src/ActivityIndicator/ActivityIndicator.styles.old.tsx +94 -0
  6. package/src/ActivityIndicator/ActivityIndicator.styles.tsx +44 -74
  7. package/src/Alert/Alert.native.tsx +16 -6
  8. package/src/Alert/Alert.styles.old.tsx +209 -0
  9. package/src/Alert/Alert.styles.tsx +67 -149
  10. package/src/Avatar/Avatar.styles.old.tsx +99 -0
  11. package/src/Avatar/Avatar.styles.tsx +35 -80
  12. package/src/Badge/Badge.styles.old.tsx +157 -0
  13. package/src/Badge/Badge.styles.tsx +61 -121
  14. package/src/Breadcrumb/Breadcrumb.styles.old.tsx +231 -0
  15. package/src/Breadcrumb/Breadcrumb.styles.tsx +83 -200
  16. package/src/Breadcrumb/Breadcrumb.web.tsx +28 -23
  17. package/src/Button/Button.styles.tsx +89 -141
  18. package/src/Card/Card.native.tsx +7 -11
  19. package/src/Card/Card.styles.old.tsx +160 -0
  20. package/src/Card/Card.styles.tsx +105 -142
  21. package/src/Card/Card.web.tsx +5 -4
  22. package/src/Checkbox/Checkbox.native.tsx +9 -5
  23. package/src/Checkbox/Checkbox.styles.old.tsx +271 -0
  24. package/src/Checkbox/Checkbox.styles.tsx +104 -216
  25. package/src/Checkbox/Checkbox.web.tsx +6 -6
  26. package/src/Chip/Chip.styles.old.tsx +184 -0
  27. package/src/Chip/Chip.styles.tsx +34 -72
  28. package/src/Dialog/Dialog.native.tsx +7 -4
  29. package/src/Dialog/Dialog.styles.old.tsx +202 -0
  30. package/src/Dialog/Dialog.styles.tsx +69 -133
  31. package/src/Divider/Divider.styles.old.tsx +172 -0
  32. package/src/Divider/Divider.styles.tsx +62 -84
  33. package/src/Icon/Icon.native.tsx +8 -8
  34. package/src/Icon/Icon.styles.old.tsx +81 -0
  35. package/src/Icon/Icon.styles.tsx +52 -66
  36. package/src/Icon/Icon.web.tsx +43 -7
  37. package/src/Icon/IconSvg/IconSvg.web.tsx +2 -0
  38. package/src/Image/Image.styles.old.tsx +69 -0
  39. package/src/Image/Image.styles.tsx +46 -60
  40. package/src/Input/Input.native.tsx +138 -53
  41. package/src/Input/Input.styles.old.tsx +289 -0
  42. package/src/Input/Input.styles.tsx +127 -198
  43. package/src/List/List.native.tsx +5 -2
  44. package/src/List/List.styles.old.tsx +242 -0
  45. package/src/List/List.styles.tsx +179 -215
  46. package/src/List/ListItem.native.tsx +12 -6
  47. package/src/List/ListItem.web.tsx +23 -13
  48. package/src/Menu/Menu.styles.old.tsx +197 -0
  49. package/src/Menu/Menu.styles.tsx +68 -150
  50. package/src/Menu/MenuItem.native.tsx +5 -3
  51. package/src/Menu/MenuItem.styles.old.tsx +114 -0
  52. package/src/Menu/MenuItem.styles.tsx +57 -89
  53. package/src/Menu/MenuItem.web.tsx +8 -3
  54. package/src/Popover/Popover.native.tsx +10 -4
  55. package/src/Popover/Popover.styles.old.tsx +135 -0
  56. package/src/Popover/Popover.styles.tsx +51 -112
  57. package/src/Pressable/Pressable.styles.old.tsx +27 -0
  58. package/src/Pressable/Pressable.styles.tsx +35 -27
  59. package/src/Progress/Progress.styles.old.tsx +200 -0
  60. package/src/Progress/Progress.styles.tsx +75 -164
  61. package/src/RadioButton/RadioButton.native.tsx +4 -3
  62. package/src/RadioButton/RadioButton.styles.old.tsx +175 -0
  63. package/src/RadioButton/RadioButton.styles.tsx +83 -154
  64. package/src/RadioButton/RadioButton.web.tsx +2 -2
  65. package/src/SVGImage/SVGImage.styles.old.tsx +86 -0
  66. package/src/SVGImage/SVGImage.styles.tsx +35 -78
  67. package/src/Screen/Screen.native.tsx +18 -25
  68. package/src/Screen/Screen.styles.old.tsx +87 -0
  69. package/src/Screen/Screen.styles.tsx +105 -67
  70. package/src/Screen/Screen.web.tsx +1 -1
  71. package/src/Select/Select.native.tsx +42 -33
  72. package/src/Select/Select.styles.old.tsx +353 -0
  73. package/src/Select/Select.styles.tsx +223 -292
  74. package/src/Skeleton/Skeleton.styles.old.tsx +67 -0
  75. package/src/Skeleton/Skeleton.styles.tsx +29 -53
  76. package/src/Slider/Slider.styles.old.tsx +259 -0
  77. package/src/Slider/Slider.styles.tsx +153 -234
  78. package/src/Switch/Switch.native.tsx +7 -5
  79. package/src/Switch/Switch.styles.old.tsx +203 -0
  80. package/src/Switch/Switch.styles.tsx +101 -174
  81. package/src/Switch/Switch.web.tsx +5 -5
  82. package/src/TabBar/TabBar.native.tsx +3 -2
  83. package/src/TabBar/TabBar.styles.old.tsx +343 -0
  84. package/src/TabBar/TabBar.styles.tsx +145 -279
  85. package/src/Table/Table.native.tsx +18 -9
  86. package/src/Table/Table.styles.old.tsx +311 -0
  87. package/src/Table/Table.styles.tsx +152 -286
  88. package/src/Text/Text.native.tsx +1 -3
  89. package/src/Text/Text.style.demo.tsx +16 -0
  90. package/src/Text/Text.styles.old.tsx +219 -0
  91. package/src/Text/Text.styles.tsx +94 -84
  92. package/src/Text/Text.web.tsx +2 -2
  93. package/src/Text/index.ts +1 -0
  94. package/src/TextArea/TextArea.styles.old.tsx +213 -0
  95. package/src/TextArea/TextArea.styles.tsx +93 -181
  96. package/src/Tooltip/Tooltip.styles.old.tsx +82 -0
  97. package/src/Tooltip/Tooltip.styles.tsx +32 -56
  98. package/src/Video/Video.styles.old.tsx +51 -0
  99. package/src/Video/Video.styles.tsx +32 -44
  100. package/src/View/View.native.tsx +12 -14
  101. package/src/View/View.styles.old.tsx +125 -0
  102. package/src/View/View.styles.tsx +76 -106
  103. package/src/View/View.web.tsx +1 -0
  104. package/src/examples/CardExamples.tsx +0 -6
  105. package/src/extensions/extendComponent.ts +61 -0
@@ -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 { 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';
5
+ import { defineStyle, ThemeStyleWrapper } from '@idealyst/theme';
6
+ import type { Theme as BaseTheme, Size } from '@idealyst/theme';
8
7
 
9
- type BreadcrumbVariants = {
10
- size: BreadcrumbSize;
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
- export type ExpandedBreadcrumbStyles = StylesheetStyles<keyof BreadcrumbVariants>;
11
+ // Wrap theme for $iterator support
12
+ type Theme = ThemeStyleWrapper<BaseTheme>;
18
13
 
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
- }
14
+ type BreadcrumbIntent = 'primary' | 'neutral';
30
15
 
31
- type ItemTextDynamicProps = {
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
- * Create size variants for item text
25
+ * Breadcrumb styles with intent and state handling.
40
26
  */
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
- }
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
- * 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
- }
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: createItemTextSizeVariants(theme),
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
- const createIconStyles = (theme: Theme) => {
98
- return {
66
+ icon: (_props: BreadcrumbDynamicProps) => ({
99
67
  variants: {
100
- size: createIconSizeVariants(theme),
68
+ size: {
69
+ width: theme.sizes.$breadcrumb.iconSize,
70
+ height: theme.sizes.$breadcrumb.iconSize,
71
+ fontSize: theme.sizes.$breadcrumb.iconSize,
72
+ },
101
73
  },
102
- } as const;
103
- }
74
+ }),
104
75
 
105
- const createSeparatorStyles = (theme: Theme) => {
106
- return {
76
+ separator: (_props: BreadcrumbDynamicProps) => ({
107
77
  color: theme.colors.text.tertiary,
108
78
  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),
79
+ size: {
80
+ fontSize: theme.sizes.$breadcrumb.fontSize,
81
+ lineHeight: theme.sizes.$breadcrumb.lineHeight,
120
82
  },
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
- }
83
+ },
84
+ }),
146
85
 
147
- function createItemStyles() {
148
- return () => ({
86
+ ellipsis: (_props: BreadcrumbDynamicProps) => ({
149
87
  display: 'flex' as const,
150
- flexDirection: 'row' as const,
151
88
  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
- 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
- export const breadcrumbItemStyles = StyleSheet.create((theme: Theme) => {
198
- return {
199
- item: {
200
- display: 'flex',
201
- flexDirection: 'row',
202
- alignItems: 'center',
203
- gap: 4,
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
- itemText: createItemTextStyles(theme),
206
- icon: createIconStyles(theme),
207
- } as const;
208
- });
101
+ }),
209
102
 
210
- export const breadcrumbSeparatorStyles = StyleSheet.create((theme: Theme) => {
211
- return {
212
- separator: createSeparatorStyles(theme),
213
- } as const;
214
- });
103
+ menuButton: (_props: BreadcrumbDynamicProps) => ({
104
+ paddingVertical: 4,
105
+ paddingHorizontal: 8,
106
+ }),
215
107
 
216
- export const breadcrumbEllipsisStyles = StyleSheet.create((theme: Theme) => {
217
- return {
218
- ellipsis: {
219
- display: 'flex',
220
- alignItems: 'center',
221
- justifyContent: 'center',
222
- },
223
- icon: createEllipsisIconStyles(theme),
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
- icon: createMenuButtonIconStyles(theme),
234
- } as const;
235
- });
117
+ }),
118
+ }));
@@ -1,12 +1,6 @@
1
- import React, { isValidElement, useState, useRef, useEffect } from 'react';
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
6
  import { resolveIconPath, isIconName } from '../Icon/icon-resolver';
@@ -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
- breadcrumbItemStyles.useVariants({
23
+ breadcrumbStyles.useVariants({
30
24
  size,
31
25
  });
32
26
 
33
- // Get dynamic item text style
34
- const itemTextStyle = (breadcrumbItemStyles.itemText as any)({
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([breadcrumbItemStyles.item]);
37
+ const itemProps = getWebProps([itemStyle_]);
42
38
  const itemTextProps = getWebProps([itemTextStyle, itemStyle]);
43
- const iconProps = getWebProps([breadcrumbItemStyles.icon]);
39
+ const iconProps = getWebProps([iconStyle]);
44
40
 
45
41
  const handleClick = () => {
46
42
  if (!item.disabled && item.onPress) {
@@ -53,10 +49,10 @@ const BreadcrumbItem: React.FC<BreadcrumbItemProps> = ({ item, isLast, size, int
53
49
 
54
50
  if (isIconName(item.icon)) {
55
51
  const iconPath = resolveIconPath(item.icon);
52
+ // IconSvg uses size="1em" by default, sized by container's fontSize from styles
56
53
  return (
57
54
  <IconSvg
58
55
  path={iconPath}
59
- {...iconProps}
60
56
  aria-label={item.icon}
61
57
  />
62
58
  );
@@ -120,8 +116,9 @@ interface BreadcrumbSeparatorProps {
120
116
  }
121
117
 
122
118
  const BreadcrumbSeparator: React.FC<BreadcrumbSeparatorProps> = ({ separator, size, separatorStyle }) => {
123
- breadcrumbSeparatorStyles.useVariants({ size });
124
- const separatorProps = getWebProps([breadcrumbSeparatorStyles.separator, separatorStyle]);
119
+ breadcrumbStyles.useVariants({ size });
120
+ const separatorStyle_ = (breadcrumbStyles.separator as any)({});
121
+ const separatorProps = getWebProps([separatorStyle_, separatorStyle]);
125
122
 
126
123
  return (
127
124
  <span {...separatorProps} aria-hidden="true">
@@ -136,9 +133,11 @@ interface BreadcrumbEllipsisProps {
136
133
  }
137
134
 
138
135
  const BreadcrumbEllipsis: React.FC<BreadcrumbEllipsisProps> = ({ size, intent }) => {
139
- breadcrumbEllipsisStyles.useVariants({ size });
140
- const ellipsisProps = getWebProps([breadcrumbEllipsisStyles.ellipsis]);
141
- const iconProps = getWebProps([breadcrumbEllipsisStyles.icon({ intent })]);
136
+ breadcrumbStyles.useVariants({ size });
137
+ const ellipsisStyle = (breadcrumbStyles.ellipsis as any)({});
138
+ const ellipsisIconStyle = (breadcrumbStyles.ellipsisIcon as any)({ intent });
139
+ const ellipsisProps = getWebProps([ellipsisStyle]);
140
+ const iconProps = getWebProps([ellipsisIconStyle]);
142
141
  const ellipsisIconPath = resolveIconPath('dots-horizontal');
143
142
 
144
143
  return (
@@ -167,13 +166,19 @@ const Breadcrumb: React.FC<BreadcrumbProps> = ({
167
166
  id,
168
167
  }) => {
169
168
  const [menuOpen, setMenuOpen] = useState(false);
170
- const containerProps = getWebProps([breadcrumbContainerStyles.container, style as any]);
169
+
170
+ // Get dynamic styles - call as functions for theme reactivity
171
+ const containerStyle = (breadcrumbStyles.container as any)({});
172
+ const menuButtonStyle = (breadcrumbStyles.menuButton as any)({});
173
+ const menuButtonIconStyle = (breadcrumbStyles.menuButtonIcon as any)({ intent });
174
+
175
+ const containerProps = getWebProps([containerStyle, style as any]);
171
176
  const menuIconPath = resolveIconPath('dots-horizontal');
172
177
 
173
178
  // Apply variants for menu button
174
- breadcrumbMenuButtonStyles.useVariants({ size });
175
- const menuButtonProps = getWebProps([breadcrumbMenuButtonStyles.button]);
176
- const menuIconProps = getWebProps([breadcrumbMenuButtonStyles.icon({ intent })]);
179
+ breadcrumbStyles.useVariants({ size });
180
+ const menuButtonProps = getWebProps([menuButtonStyle]);
181
+ const menuIconProps = getWebProps([menuButtonIconStyle]);
177
182
 
178
183
  // Handle responsive collapsing
179
184
  let displayItems = items;