@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.
Files changed (129) hide show
  1. package/package.json +3 -3
  2. package/plugin/web.js +280 -532
  3. package/src/Accordion/Accordion.native.tsx +8 -6
  4. package/src/Accordion/Accordion.styles.old.tsx +298 -0
  5. package/src/Accordion/Accordion.styles.tsx +102 -236
  6. package/src/Accordion/Accordion.web.tsx +1 -3
  7. package/src/ActivityIndicator/ActivityIndicator.styles.old.tsx +94 -0
  8. package/src/ActivityIndicator/ActivityIndicator.styles.tsx +44 -74
  9. package/src/Alert/Alert.native.tsx +16 -6
  10. package/src/Alert/Alert.styles.old.tsx +209 -0
  11. package/src/Alert/Alert.styles.tsx +67 -149
  12. package/src/Alert/Alert.web.tsx +3 -4
  13. package/src/Avatar/Avatar.styles.old.tsx +99 -0
  14. package/src/Avatar/Avatar.styles.tsx +35 -80
  15. package/src/Badge/Badge.styles.old.tsx +157 -0
  16. package/src/Badge/Badge.styles.tsx +61 -121
  17. package/src/Badge/Badge.web.tsx +8 -15
  18. package/src/Breadcrumb/Breadcrumb.styles.old.tsx +231 -0
  19. package/src/Breadcrumb/Breadcrumb.styles.tsx +83 -200
  20. package/src/Breadcrumb/Breadcrumb.web.tsx +31 -30
  21. package/src/Button/Button.native.tsx +14 -21
  22. package/src/Button/Button.styles.tsx +103 -140
  23. package/src/Button/Button.web.tsx +9 -19
  24. package/src/Card/Card.native.tsx +7 -11
  25. package/src/Card/Card.styles.old.tsx +160 -0
  26. package/src/Card/Card.styles.tsx +105 -142
  27. package/src/Card/Card.web.tsx +5 -4
  28. package/src/Checkbox/Checkbox.native.tsx +9 -5
  29. package/src/Checkbox/Checkbox.styles.old.tsx +271 -0
  30. package/src/Checkbox/Checkbox.styles.tsx +104 -216
  31. package/src/Checkbox/Checkbox.web.tsx +7 -8
  32. package/src/Chip/Chip.styles.old.tsx +184 -0
  33. package/src/Chip/Chip.styles.tsx +34 -72
  34. package/src/Chip/Chip.web.tsx +3 -5
  35. package/src/Dialog/Dialog.native.tsx +7 -4
  36. package/src/Dialog/Dialog.styles.old.tsx +202 -0
  37. package/src/Dialog/Dialog.styles.tsx +69 -133
  38. package/src/Dialog/Dialog.web.tsx +3 -3
  39. package/src/Dialog/types.ts +1 -1
  40. package/src/Divider/Divider.styles.old.tsx +172 -0
  41. package/src/Divider/Divider.styles.tsx +62 -84
  42. package/src/Icon/Icon.native.tsx +8 -8
  43. package/src/Icon/Icon.styles.old.tsx +81 -0
  44. package/src/Icon/Icon.styles.tsx +52 -66
  45. package/src/Icon/Icon.web.tsx +62 -21
  46. package/src/Icon/IconRegistry.native.ts +41 -0
  47. package/src/Icon/IconRegistry.ts +107 -0
  48. package/src/Icon/IconSvg/IconSvg.web.tsx +28 -5
  49. package/src/Icon/icon-resolver.ts +12 -43
  50. package/src/Icon/index.native.ts +2 -1
  51. package/src/Icon/index.ts +1 -0
  52. package/src/Icon/index.web.ts +1 -0
  53. package/src/Image/Image.styles.old.tsx +69 -0
  54. package/src/Image/Image.styles.tsx +46 -60
  55. package/src/Input/Input.native.tsx +138 -53
  56. package/src/Input/Input.styles.old.tsx +289 -0
  57. package/src/Input/Input.styles.tsx +134 -232
  58. package/src/Input/Input.web.tsx +5 -8
  59. package/src/List/List.native.tsx +5 -2
  60. package/src/List/List.styles.old.tsx +242 -0
  61. package/src/List/List.styles.tsx +179 -215
  62. package/src/List/ListItem.native.tsx +16 -11
  63. package/src/List/ListItem.web.tsx +26 -16
  64. package/src/Menu/Menu.styles.old.tsx +197 -0
  65. package/src/Menu/Menu.styles.tsx +68 -150
  66. package/src/Menu/MenuItem.native.tsx +5 -3
  67. package/src/Menu/MenuItem.styles.old.tsx +114 -0
  68. package/src/Menu/MenuItem.styles.tsx +57 -89
  69. package/src/Menu/MenuItem.web.tsx +10 -7
  70. package/src/Popover/Popover.native.tsx +10 -4
  71. package/src/Popover/Popover.styles.old.tsx +135 -0
  72. package/src/Popover/Popover.styles.tsx +51 -112
  73. package/src/Pressable/Pressable.styles.old.tsx +27 -0
  74. package/src/Pressable/Pressable.styles.tsx +35 -27
  75. package/src/Progress/Progress.styles.old.tsx +200 -0
  76. package/src/Progress/Progress.styles.tsx +75 -164
  77. package/src/RadioButton/RadioButton.native.tsx +4 -3
  78. package/src/RadioButton/RadioButton.styles.old.tsx +175 -0
  79. package/src/RadioButton/RadioButton.styles.tsx +83 -154
  80. package/src/RadioButton/RadioButton.web.tsx +2 -2
  81. package/src/SVGImage/SVGImage.styles.old.tsx +86 -0
  82. package/src/SVGImage/SVGImage.styles.tsx +35 -78
  83. package/src/Screen/Screen.native.tsx +19 -26
  84. package/src/Screen/Screen.styles.old.tsx +87 -0
  85. package/src/Screen/Screen.styles.tsx +103 -68
  86. package/src/Screen/Screen.web.tsx +2 -2
  87. package/src/Select/Select.native.tsx +42 -33
  88. package/src/Select/Select.styles.old.tsx +353 -0
  89. package/src/Select/Select.styles.tsx +214 -300
  90. package/src/Select/Select.web.tsx +45 -33
  91. package/src/Skeleton/Skeleton.styles.old.tsx +67 -0
  92. package/src/Skeleton/Skeleton.styles.tsx +29 -53
  93. package/src/Slider/Slider.styles.old.tsx +259 -0
  94. package/src/Slider/Slider.styles.tsx +153 -234
  95. package/src/Slider/Slider.web.tsx +2 -4
  96. package/src/Switch/Switch.native.tsx +9 -7
  97. package/src/Switch/Switch.styles.old.tsx +203 -0
  98. package/src/Switch/Switch.styles.tsx +101 -174
  99. package/src/Switch/Switch.web.tsx +7 -8
  100. package/src/TabBar/TabBar.native.tsx +3 -2
  101. package/src/TabBar/TabBar.styles.old.tsx +343 -0
  102. package/src/TabBar/TabBar.styles.tsx +145 -279
  103. package/src/Table/Table.native.tsx +180 -68
  104. package/src/Table/Table.styles.old.tsx +311 -0
  105. package/src/Table/Table.styles.tsx +140 -281
  106. package/src/Table/Table.web.tsx +169 -70
  107. package/src/Text/Text.native.tsx +1 -3
  108. package/src/Text/Text.style.demo.tsx +16 -0
  109. package/src/Text/Text.styles.old.tsx +219 -0
  110. package/src/Text/Text.styles.tsx +94 -84
  111. package/src/Text/Text.web.tsx +3 -2
  112. package/src/Text/index.ts +1 -0
  113. package/src/TextArea/TextArea.native.tsx +21 -8
  114. package/src/TextArea/TextArea.styles.old.tsx +213 -0
  115. package/src/TextArea/TextArea.styles.tsx +87 -187
  116. package/src/TextArea/TextArea.web.tsx +17 -6
  117. package/src/Tooltip/Tooltip.styles.old.tsx +82 -0
  118. package/src/Tooltip/Tooltip.styles.tsx +32 -56
  119. package/src/Video/Video.styles.old.tsx +51 -0
  120. package/src/Video/Video.styles.tsx +32 -44
  121. package/src/View/View.native.tsx +41 -13
  122. package/src/View/View.styles.old.tsx +125 -0
  123. package/src/View/View.styles.tsx +76 -106
  124. package/src/View/View.web.tsx +5 -21
  125. package/src/View/types.ts +31 -3
  126. package/src/examples/ButtonExamples.tsx +20 -0
  127. package/src/examples/CardExamples.tsx +0 -6
  128. package/src/extensions/extendComponent.ts +61 -0
  129. 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 { 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,15 +1,9 @@
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
- import { resolveIconPath, isIconName } from '../Icon/icon-resolver';
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
- 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) {
@@ -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
- path={iconPath}
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
- breadcrumbSeparatorStyles.useVariants({ size });
124
- const separatorProps = getWebProps([breadcrumbSeparatorStyles.separator, separatorStyle]);
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
- breadcrumbEllipsisStyles.useVariants({ size });
140
- const ellipsisProps = getWebProps([breadcrumbEllipsisStyles.ellipsis]);
141
- const iconProps = getWebProps([breadcrumbEllipsisStyles.icon({ intent })]);
142
- const ellipsisIconPath = resolveIconPath('dots-horizontal');
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
- path={ellipsisIconPath}
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
- const containerProps = getWebProps([breadcrumbContainerStyles.container, style as any]);
171
- const menuIconPath = resolveIconPath('dots-horizontal');
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
- breadcrumbMenuButtonStyles.useVariants({ size });
175
- const menuButtonProps = getWebProps([breadcrumbMenuButtonStyles.button]);
176
- const menuIconProps = getWebProps([breadcrumbMenuButtonStyles.icon({ intent })]);
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
- path={menuIconPath}
249
+ name="dots-horizontal"
249
250
  {...menuIconProps}
250
251
  aria-label="dots-horizontal"
251
252
  />