zero-to-app 3.2.1 → 3.2.2

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 (213) hide show
  1. package/dist/brand/brand-config.d.ts +65 -0
  2. package/dist/brand/brand-config.d.ts.map +1 -0
  3. package/dist/brand/brand-config.js +68 -0
  4. package/dist/brand/brand-config.js.map +1 -0
  5. package/dist/brand/brand-context.d.ts +55 -0
  6. package/dist/brand/brand-context.d.ts.map +1 -0
  7. package/dist/brand/brand-context.js +76 -0
  8. package/dist/brand/brand-context.js.map +1 -0
  9. package/dist/brand/brand-types.d.ts +92 -0
  10. package/dist/brand/brand-types.d.ts.map +1 -0
  11. package/dist/brand/brand-types.js +2 -0
  12. package/dist/brand/brand-types.js.map +1 -0
  13. package/dist/brand/default-brand.d.ts +11 -0
  14. package/dist/brand/default-brand.d.ts.map +1 -0
  15. package/dist/brand/default-brand.js +32 -0
  16. package/dist/brand/default-brand.js.map +1 -0
  17. package/dist/brand/index.d.ts +6 -0
  18. package/dist/brand/index.d.ts.map +1 -0
  19. package/dist/brand/index.js +8 -0
  20. package/dist/brand/index.js.map +1 -0
  21. package/dist/brand/palette-generator.d.ts +64 -0
  22. package/dist/brand/palette-generator.d.ts.map +1 -0
  23. package/dist/brand/palette-generator.js +292 -0
  24. package/dist/brand/palette-generator.js.map +1 -0
  25. package/dist/components/index.d.ts +3 -0
  26. package/dist/components/index.d.ts.map +1 -0
  27. package/dist/components/index.js +3 -0
  28. package/dist/components/index.js.map +1 -0
  29. package/dist/components/navigation/app-tabs/app-tabs.d.ts +63 -0
  30. package/dist/components/navigation/app-tabs/app-tabs.d.ts.map +1 -0
  31. package/dist/components/navigation/app-tabs/app-tabs.js +13 -0
  32. package/dist/components/navigation/app-tabs/app-tabs.js.map +1 -0
  33. package/dist/components/navigation/app-tabs/app-tabs.web.d.ts +47 -0
  34. package/dist/components/navigation/app-tabs/app-tabs.web.d.ts.map +1 -0
  35. package/dist/components/navigation/app-tabs/app-tabs.web.js +104 -0
  36. package/dist/components/navigation/app-tabs/app-tabs.web.js.map +1 -0
  37. package/dist/components/navigation/app-tabs/index.d.ts +3 -0
  38. package/dist/components/navigation/app-tabs/index.d.ts.map +1 -0
  39. package/dist/components/navigation/app-tabs/index.js +3 -0
  40. package/dist/components/navigation/app-tabs/index.js.map +1 -0
  41. package/dist/components/navigation/drawer/drawer.d.ts +24 -0
  42. package/dist/components/navigation/drawer/drawer.d.ts.map +1 -0
  43. package/dist/components/navigation/drawer/drawer.js +82 -0
  44. package/dist/components/navigation/drawer/drawer.js.map +1 -0
  45. package/dist/components/navigation/index.d.ts +10 -0
  46. package/dist/components/navigation/index.d.ts.map +1 -0
  47. package/dist/components/navigation/index.js +11 -0
  48. package/dist/components/navigation/index.js.map +1 -0
  49. package/dist/components/navigation/native-header.d.ts +25 -0
  50. package/dist/components/navigation/native-header.d.ts.map +1 -0
  51. package/dist/components/navigation/native-header.js +32 -0
  52. package/dist/components/navigation/native-header.js.map +1 -0
  53. package/dist/components/navigation/shared/sidebar-styles.d.ts +34 -0
  54. package/dist/components/navigation/shared/sidebar-styles.d.ts.map +1 -0
  55. package/dist/components/navigation/shared/sidebar-styles.js +34 -0
  56. package/dist/components/navigation/shared/sidebar-styles.js.map +1 -0
  57. package/dist/components/navigation/sidebar/index.d.ts +10 -0
  58. package/dist/components/navigation/sidebar/index.d.ts.map +1 -0
  59. package/dist/components/navigation/sidebar/index.js +7 -0
  60. package/dist/components/navigation/sidebar/index.js.map +1 -0
  61. package/dist/components/navigation/sidebar/sidebar-footer.d.ts +18 -0
  62. package/dist/components/navigation/sidebar/sidebar-footer.d.ts.map +1 -0
  63. package/dist/components/navigation/sidebar/sidebar-footer.js +27 -0
  64. package/dist/components/navigation/sidebar/sidebar-footer.js.map +1 -0
  65. package/dist/components/navigation/sidebar/sidebar-header.d.ts +26 -0
  66. package/dist/components/navigation/sidebar/sidebar-header.d.ts.map +1 -0
  67. package/dist/components/navigation/sidebar/sidebar-header.js +38 -0
  68. package/dist/components/navigation/sidebar/sidebar-header.js.map +1 -0
  69. package/dist/components/navigation/sidebar/sidebar-item.d.ts +36 -0
  70. package/dist/components/navigation/sidebar/sidebar-item.d.ts.map +1 -0
  71. package/dist/components/navigation/sidebar/sidebar-item.js +63 -0
  72. package/dist/components/navigation/sidebar/sidebar-item.js.map +1 -0
  73. package/dist/components/navigation/sidebar/sidebar-section.d.ts +34 -0
  74. package/dist/components/navigation/sidebar/sidebar-section.d.ts.map +1 -0
  75. package/dist/components/navigation/sidebar/sidebar-section.js +56 -0
  76. package/dist/components/navigation/sidebar/sidebar-section.js.map +1 -0
  77. package/dist/components/navigation/sidebar/sidebar.d.ts +2 -0
  78. package/dist/components/navigation/sidebar/sidebar.d.ts.map +1 -0
  79. package/dist/components/navigation/sidebar/sidebar.js +4 -0
  80. package/dist/components/navigation/sidebar/sidebar.js.map +1 -0
  81. package/dist/components/navigation/sidebar/sidebar.native.d.ts +23 -0
  82. package/dist/components/navigation/sidebar/sidebar.native.d.ts.map +1 -0
  83. package/dist/components/navigation/sidebar/sidebar.native.js +80 -0
  84. package/dist/components/navigation/sidebar/sidebar.native.js.map +1 -0
  85. package/dist/components/navigation/sidebar/sidebar.web.d.ts +26 -0
  86. package/dist/components/navigation/sidebar/sidebar.web.d.ts.map +1 -0
  87. package/dist/components/navigation/sidebar/sidebar.web.js +90 -0
  88. package/dist/components/navigation/sidebar/sidebar.web.js.map +1 -0
  89. package/dist/components/navigation/themed-stack.d.ts +25 -0
  90. package/dist/components/navigation/themed-stack.d.ts.map +1 -0
  91. package/dist/components/navigation/themed-stack.js +37 -0
  92. package/dist/components/navigation/themed-stack.js.map +1 -0
  93. package/dist/components/shared/index.d.ts +3 -0
  94. package/dist/components/shared/index.d.ts.map +1 -0
  95. package/dist/components/shared/index.js +2 -0
  96. package/dist/components/shared/index.js.map +1 -0
  97. package/dist/components/shared/types.d.ts +82 -0
  98. package/dist/components/shared/types.d.ts.map +1 -0
  99. package/dist/components/shared/types.js +2 -0
  100. package/dist/components/shared/types.js.map +1 -0
  101. package/dist/components/shared/utils.d.ts +19 -0
  102. package/dist/components/shared/utils.d.ts.map +1 -0
  103. package/dist/components/shared/utils.js +23 -0
  104. package/dist/components/shared/utils.js.map +1 -0
  105. package/dist/components/ui/button.d.ts +132 -0
  106. package/dist/components/ui/button.d.ts.map +1 -0
  107. package/dist/components/ui/button.js +252 -0
  108. package/dist/components/ui/button.js.map +1 -0
  109. package/dist/components/ui/chip.d.ts +88 -0
  110. package/dist/components/ui/chip.d.ts.map +1 -0
  111. package/dist/components/ui/chip.js +129 -0
  112. package/dist/components/ui/chip.js.map +1 -0
  113. package/dist/components/ui/collapsible.d.ts +88 -0
  114. package/dist/components/ui/collapsible.d.ts.map +1 -0
  115. package/dist/components/ui/collapsible.js +66 -0
  116. package/dist/components/ui/collapsible.js.map +1 -0
  117. package/dist/components/ui/container.d.ts +31 -0
  118. package/dist/components/ui/container.d.ts.map +1 -0
  119. package/dist/components/ui/container.js +46 -0
  120. package/dist/components/ui/container.js.map +1 -0
  121. package/dist/components/ui/fab.d.ts +51 -0
  122. package/dist/components/ui/fab.d.ts.map +1 -0
  123. package/dist/components/ui/fab.js +142 -0
  124. package/dist/components/ui/fab.js.map +1 -0
  125. package/dist/components/ui/index.d.ts +23 -0
  126. package/dist/components/ui/index.d.ts.map +1 -0
  127. package/dist/components/ui/index.js +22 -0
  128. package/dist/components/ui/index.js.map +1 -0
  129. package/dist/components/ui/screen.d.ts +40 -0
  130. package/dist/components/ui/screen.d.ts.map +1 -0
  131. package/dist/components/ui/screen.js +57 -0
  132. package/dist/components/ui/screen.js.map +1 -0
  133. package/dist/components/ui/slider.d.ts +47 -0
  134. package/dist/components/ui/slider.d.ts.map +1 -0
  135. package/dist/components/ui/slider.js +41 -0
  136. package/dist/components/ui/slider.js.map +1 -0
  137. package/dist/components/ui/themed-image.d.ts +7 -0
  138. package/dist/components/ui/themed-image.d.ts.map +1 -0
  139. package/dist/components/ui/themed-image.js +9 -0
  140. package/dist/components/ui/themed-image.js.map +1 -0
  141. package/dist/components/ui/themed-view.d.ts +20 -0
  142. package/dist/components/ui/themed-view.d.ts.map +1 -0
  143. package/dist/components/ui/themed-view.js +75 -0
  144. package/dist/components/ui/themed-view.js.map +1 -0
  145. package/dist/components/ui/typography.d.ts +110 -0
  146. package/dist/components/ui/typography.d.ts.map +1 -0
  147. package/dist/components/ui/typography.js +69 -0
  148. package/dist/components/ui/typography.js.map +1 -0
  149. package/dist/context/layout-context.d.ts +66 -0
  150. package/dist/context/layout-context.d.ts.map +1 -0
  151. package/dist/context/layout-context.js +83 -0
  152. package/dist/context/layout-context.js.map +1 -0
  153. package/dist/context/scroll-context.d.ts +8 -0
  154. package/dist/context/scroll-context.d.ts.map +1 -0
  155. package/dist/context/scroll-context.js +16 -0
  156. package/dist/context/scroll-context.js.map +1 -0
  157. package/dist/context/sidebar-context.d.ts +74 -0
  158. package/dist/context/sidebar-context.d.ts.map +1 -0
  159. package/dist/context/sidebar-context.js +95 -0
  160. package/dist/context/sidebar-context.js.map +1 -0
  161. package/dist/hooks/index.d.ts +4 -0
  162. package/dist/hooks/index.d.ts.map +1 -0
  163. package/dist/hooks/index.js +5 -0
  164. package/dist/hooks/index.js.map +1 -0
  165. package/dist/hooks/use-breakpoint.d.ts +8 -0
  166. package/dist/hooks/use-breakpoint.d.ts.map +1 -0
  167. package/dist/hooks/use-breakpoint.js +10 -0
  168. package/dist/hooks/use-breakpoint.js.map +1 -0
  169. package/dist/hooks/use-dimensions.d.ts +31 -0
  170. package/dist/hooks/use-dimensions.d.ts.map +1 -0
  171. package/dist/hooks/use-dimensions.js +44 -0
  172. package/dist/hooks/use-dimensions.js.map +1 -0
  173. package/dist/hooks/use-route-navigation.d.ts +19 -0
  174. package/dist/hooks/use-route-navigation.d.ts.map +1 -0
  175. package/dist/hooks/use-route-navigation.js +25 -0
  176. package/dist/hooks/use-route-navigation.js.map +1 -0
  177. package/dist/icons/icon-utils.d.ts +24 -0
  178. package/dist/icons/icon-utils.d.ts.map +1 -0
  179. package/dist/icons/icon-utils.js +57 -0
  180. package/dist/icons/icon-utils.js.map +1 -0
  181. package/dist/icons/index.d.ts +13 -0
  182. package/dist/icons/index.d.ts.map +1 -0
  183. package/dist/icons/index.js +12 -0
  184. package/dist/icons/index.js.map +1 -0
  185. package/dist/index.d.ts +9 -0
  186. package/dist/index.d.ts.map +1 -0
  187. package/dist/index.js +12 -0
  188. package/dist/index.js.map +1 -0
  189. package/dist/theme/high-contrast-theme.d.ts +19 -0
  190. package/dist/theme/high-contrast-theme.d.ts.map +1 -0
  191. package/dist/theme/high-contrast-theme.js +257 -0
  192. package/dist/theme/high-contrast-theme.js.map +1 -0
  193. package/dist/theme/index.d.ts +5 -0
  194. package/dist/theme/index.d.ts.map +1 -0
  195. package/dist/theme/index.js +6 -0
  196. package/dist/theme/index.js.map +1 -0
  197. package/dist/theme/theme-config.d.ts +150 -0
  198. package/dist/theme/theme-config.d.ts.map +1 -0
  199. package/dist/theme/theme-config.js +318 -0
  200. package/dist/theme/theme-config.js.map +1 -0
  201. package/dist/theme/theme.d.ts +106 -0
  202. package/dist/theme/theme.d.ts.map +1 -0
  203. package/dist/theme/theme.js +135 -0
  204. package/dist/theme/theme.js.map +1 -0
  205. package/dist/utils/contrast-checker.d.ts +51 -0
  206. package/dist/utils/contrast-checker.d.ts.map +1 -0
  207. package/dist/utils/contrast-checker.js +97 -0
  208. package/dist/utils/contrast-checker.js.map +1 -0
  209. package/dist/utils/index.d.ts +2 -0
  210. package/dist/utils/index.d.ts.map +1 -0
  211. package/dist/utils/index.js +3 -0
  212. package/dist/utils/index.js.map +1 -0
  213. package/package.json +1 -1
@@ -0,0 +1,292 @@
1
+ /**
2
+ * Material Design 3 Color Palette Generator
3
+ * Uses @material/material-color-utilities to generate tonal palettes from seed colors
4
+ * Reference: https://m3.material.io/styles/color/the-color-system/color-roles
5
+ */
6
+ import { argbFromHex, hexFromArgb, TonalPalette, Hct, } from '@material/material-color-utilities';
7
+ /**
8
+ * Generates a tonal palette from a seed color
9
+ * @param seedColor Hex color string (e.g., '#6750A4')
10
+ * @returns TonalPalette with tones 0-100
11
+ */
12
+ function generateTonalPalette(seedColor) {
13
+ const argb = argbFromHex(seedColor);
14
+ const hct = Hct.fromInt(argb);
15
+ return TonalPalette.fromHueAndChroma(hct.hue, hct.chroma);
16
+ }
17
+ /**
18
+ * Generates secondary palette from primary
19
+ * Uses same hue with reduced chroma for harmony
20
+ */
21
+ function generateSecondaryPalette(primaryColor) {
22
+ const argb = argbFromHex(primaryColor);
23
+ const hct = Hct.fromInt(argb);
24
+ // Secondary uses same hue but lower chroma (16 is M3 standard)
25
+ return TonalPalette.fromHueAndChroma(hct.hue, Math.min(16, hct.chroma));
26
+ }
27
+ /**
28
+ * Generates tertiary palette from primary
29
+ * Uses complementary hue for contrast
30
+ */
31
+ function generateTertiaryPalette(primaryColor) {
32
+ const argb = argbFromHex(primaryColor);
33
+ const hct = Hct.fromInt(argb);
34
+ // Tertiary uses complementary hue (+60 degrees)
35
+ const tertiaryHue = (hct.hue + 60) % 360;
36
+ return TonalPalette.fromHueAndChroma(tertiaryHue, Math.max(24, hct.chroma));
37
+ }
38
+ /**
39
+ * Generates neutral palette from primary
40
+ * Uses very low chroma for subtle tinting
41
+ */
42
+ function generateNeutralPalette(primaryColor) {
43
+ const argb = argbFromHex(primaryColor);
44
+ const hct = Hct.fromInt(argb);
45
+ // Neutral uses same hue with very low chroma (4 is M3 standard)
46
+ return TonalPalette.fromHueAndChroma(hct.hue, 4);
47
+ }
48
+ /**
49
+ * Generates neutral variant palette from primary
50
+ * Uses low chroma for subtle variation
51
+ */
52
+ function generateNeutralVariantPalette(primaryColor) {
53
+ const argb = argbFromHex(primaryColor);
54
+ const hct = Hct.fromInt(argb);
55
+ // Neutral variant uses same hue with low chroma (8 is M3 standard)
56
+ return TonalPalette.fromHueAndChroma(hct.hue, 8);
57
+ }
58
+ /**
59
+ * Generates M3 error palette
60
+ * Uses standard red hue with appropriate chroma
61
+ */
62
+ function generateErrorPalette() {
63
+ // M3 standard error color: red with hue ~25, chroma ~84
64
+ return TonalPalette.fromHueAndChroma(25, 84);
65
+ }
66
+ /**
67
+ * Generates a complete Material Design 3 light theme color scheme from seed colors
68
+ * @param options Seed colors for generating palettes
69
+ * @returns Complete Colors object for light theme
70
+ */
71
+ export function generateLightColors(options) {
72
+ // Generate tonal palettes
73
+ const primaryPalette = generateTonalPalette(options.primary);
74
+ const secondaryPalette = options.secondary
75
+ ? generateTonalPalette(options.secondary)
76
+ : generateSecondaryPalette(options.primary);
77
+ const tertiaryPalette = options.tertiary
78
+ ? generateTonalPalette(options.tertiary)
79
+ : generateTertiaryPalette(options.primary);
80
+ const errorPalette = options.error
81
+ ? generateTonalPalette(options.error)
82
+ : generateErrorPalette();
83
+ const neutralPalette = options.neutral
84
+ ? generateTonalPalette(options.neutral)
85
+ : generateNeutralPalette(options.primary);
86
+ const neutralVariantPalette = options.neutralVariant
87
+ ? generateTonalPalette(options.neutralVariant)
88
+ : generateNeutralVariantPalette(options.primary);
89
+ // Build light theme using M3 tone mappings
90
+ // Reference: https://m3.material.io/styles/color/the-color-system/tokens
91
+ return {
92
+ // Primary — use the exact seed color so the brand color is preserved exactly.
93
+ // onPrimary is computed from contrast (white or black) against that exact color.
94
+ primary: options.primary,
95
+ onPrimary: pickOnColor(options.primary),
96
+ primaryContainer: hexFromArgb(primaryPalette.tone(90)),
97
+ onPrimaryContainer: hexFromArgb(primaryPalette.tone(10)),
98
+ // Secondary
99
+ secondary: hexFromArgb(secondaryPalette.tone(40)),
100
+ onSecondary: hexFromArgb(secondaryPalette.tone(100)),
101
+ secondaryContainer: hexFromArgb(secondaryPalette.tone(90)),
102
+ onSecondaryContainer: hexFromArgb(secondaryPalette.tone(10)),
103
+ // Tertiary
104
+ tertiary: hexFromArgb(tertiaryPalette.tone(40)),
105
+ onTertiary: hexFromArgb(tertiaryPalette.tone(100)),
106
+ tertiaryContainer: hexFromArgb(tertiaryPalette.tone(90)),
107
+ onTertiaryContainer: hexFromArgb(tertiaryPalette.tone(10)),
108
+ // Error
109
+ error: hexFromArgb(errorPalette.tone(40)),
110
+ onError: hexFromArgb(errorPalette.tone(100)),
111
+ errorContainer: hexFromArgb(errorPalette.tone(90)),
112
+ onErrorContainer: hexFromArgb(errorPalette.tone(10)),
113
+ // Surface
114
+ surface: hexFromArgb(neutralPalette.tone(98)),
115
+ onSurface: hexFromArgb(neutralPalette.tone(10)),
116
+ onSurfaceVariant: hexFromArgb(neutralVariantPalette.tone(30)),
117
+ // Surface containers
118
+ surfaceContainerLowest: hexFromArgb(neutralPalette.tone(100)),
119
+ surfaceContainerLow: hexFromArgb(neutralPalette.tone(96)),
120
+ surfaceContainer: hexFromArgb(neutralPalette.tone(94)),
121
+ surfaceContainerHigh: hexFromArgb(neutralPalette.tone(92)),
122
+ surfaceContainerHighest: hexFromArgb(neutralPalette.tone(90)),
123
+ // Outline
124
+ outline: hexFromArgb(neutralVariantPalette.tone(50)),
125
+ outlineVariant: hexFromArgb(neutralVariantPalette.tone(80)),
126
+ // Inverse
127
+ inverseSurface: hexFromArgb(neutralPalette.tone(20)),
128
+ inverseOnSurface: hexFromArgb(neutralPalette.tone(95)),
129
+ inversePrimary: hexFromArgb(primaryPalette.tone(80)),
130
+ // Semantic
131
+ scrim: hexFromArgb(neutralPalette.tone(0)),
132
+ shadow: hexFromArgb(neutralPalette.tone(0)),
133
+ };
134
+ }
135
+ /**
136
+ * Generates a complete Material Design 3 dark theme color scheme from seed colors
137
+ * @param options Seed colors for generating palettes
138
+ * @returns Complete Colors object for dark theme
139
+ */
140
+ export function generateDarkColors(options) {
141
+ // Generate tonal palettes (same as light)
142
+ const primaryPalette = generateTonalPalette(options.primary);
143
+ const secondaryPalette = options.secondary
144
+ ? generateTonalPalette(options.secondary)
145
+ : generateSecondaryPalette(options.primary);
146
+ const tertiaryPalette = options.tertiary
147
+ ? generateTonalPalette(options.tertiary)
148
+ : generateTertiaryPalette(options.primary);
149
+ const errorPalette = options.error
150
+ ? generateTonalPalette(options.error)
151
+ : generateErrorPalette();
152
+ const neutralPalette = options.neutral
153
+ ? generateTonalPalette(options.neutral)
154
+ : generateNeutralPalette(options.primary);
155
+ const neutralVariantPalette = options.neutralVariant
156
+ ? generateTonalPalette(options.neutralVariant)
157
+ : generateNeutralVariantPalette(options.primary);
158
+ // Build dark theme using M3 tone mappings
159
+ // Dark theme uses inverted tone values
160
+ return {
161
+ // Primary — same exact brand color in dark mode; onPrimary adapts via contrast.
162
+ primary: options.primary,
163
+ onPrimary: pickOnColor(options.primary),
164
+ primaryContainer: hexFromArgb(primaryPalette.tone(30)),
165
+ onPrimaryContainer: hexFromArgb(primaryPalette.tone(90)),
166
+ // Secondary
167
+ secondary: hexFromArgb(secondaryPalette.tone(80)),
168
+ onSecondary: hexFromArgb(secondaryPalette.tone(20)),
169
+ secondaryContainer: hexFromArgb(secondaryPalette.tone(30)),
170
+ onSecondaryContainer: hexFromArgb(secondaryPalette.tone(90)),
171
+ // Tertiary
172
+ tertiary: hexFromArgb(tertiaryPalette.tone(80)),
173
+ onTertiary: hexFromArgb(tertiaryPalette.tone(20)),
174
+ tertiaryContainer: hexFromArgb(tertiaryPalette.tone(30)),
175
+ onTertiaryContainer: hexFromArgb(tertiaryPalette.tone(90)),
176
+ // Error
177
+ error: hexFromArgb(errorPalette.tone(80)),
178
+ onError: hexFromArgb(errorPalette.tone(20)),
179
+ errorContainer: hexFromArgb(errorPalette.tone(30)),
180
+ onErrorContainer: hexFromArgb(errorPalette.tone(90)),
181
+ // Surface
182
+ surface: hexFromArgb(neutralPalette.tone(6)),
183
+ onSurface: hexFromArgb(neutralPalette.tone(90)),
184
+ onSurfaceVariant: hexFromArgb(neutralVariantPalette.tone(80)),
185
+ // Surface containers
186
+ surfaceContainerLowest: hexFromArgb(neutralPalette.tone(4)),
187
+ surfaceContainerLow: hexFromArgb(neutralPalette.tone(10)),
188
+ surfaceContainer: hexFromArgb(neutralPalette.tone(12)),
189
+ surfaceContainerHigh: hexFromArgb(neutralPalette.tone(17)),
190
+ surfaceContainerHighest: hexFromArgb(neutralPalette.tone(22)),
191
+ // Outline
192
+ outline: hexFromArgb(neutralVariantPalette.tone(60)),
193
+ outlineVariant: hexFromArgb(neutralVariantPalette.tone(30)),
194
+ // Inverse
195
+ inverseSurface: hexFromArgb(neutralPalette.tone(90)),
196
+ inverseOnSurface: hexFromArgb(neutralPalette.tone(20)),
197
+ inversePrimary: hexFromArgb(primaryPalette.tone(40)),
198
+ // Semantic
199
+ scrim: hexFromArgb(neutralPalette.tone(0)),
200
+ shadow: hexFromArgb(neutralPalette.tone(0)),
201
+ };
202
+ }
203
+ /**
204
+ * Pick white or black as the on-color for a given background, based on contrast.
205
+ */
206
+ function pickOnColor(background) {
207
+ return contrastRatio('#FFFFFF', background) >= contrastRatio('#000000', background)
208
+ ? '#FFFFFF'
209
+ : '#000000';
210
+ }
211
+ /**
212
+ * Compute WCAG 2.1 relative luminance for an ARGB integer.
213
+ * https://www.w3.org/TR/WCAG21/#dfn-relative-luminance
214
+ */
215
+ function relativeLuminance(argb) {
216
+ const linearize = (val) => val <= 0.04045 ? val / 12.92 : Math.pow((val + 0.055) / 1.055, 2.4);
217
+ const r = linearize(((argb >> 16) & 0xFF) / 255);
218
+ const g = linearize(((argb >> 8) & 0xFF) / 255);
219
+ const b = linearize((argb & 0xFF) / 255);
220
+ return 0.2126 * r + 0.7152 * g + 0.0722 * b;
221
+ }
222
+ /**
223
+ * Compute the WCAG 2.1 contrast ratio between two hex colors.
224
+ * Returns a value between 1 (no contrast) and 21 (black on white).
225
+ * https://www.w3.org/TR/WCAG21/#dfn-contrast-ratio
226
+ */
227
+ export function contrastRatio(foreground, background) {
228
+ const fgL = relativeLuminance(argbFromHex(foreground));
229
+ const bgL = relativeLuminance(argbFromHex(background));
230
+ const lighter = Math.max(fgL, bgL);
231
+ const darker = Math.min(fgL, bgL);
232
+ return (lighter + 0.05) / (darker + 0.05);
233
+ }
234
+ /**
235
+ * Check if two colors meet a minimum WCAG contrast ratio.
236
+ * @param foreground Foreground color (hex)
237
+ * @param background Background color (hex)
238
+ * @param minRatio Minimum contrast ratio (default: 4.5 for AA compliance)
239
+ * @returns true if contrast meets minimum ratio
240
+ */
241
+ export function hasContrastRatio(foreground, background, minRatio = 4.5) {
242
+ return contrastRatio(foreground, background) >= minRatio;
243
+ }
244
+ /**
245
+ * Generate high-contrast color adjustments
246
+ * Increases contrast for accessibility compliance
247
+ */
248
+ export function generateHighContrastColors(baseColors) {
249
+ // In high-contrast mode, increase tone differences
250
+ // This is a simplified version - production would use full WCAG calculations
251
+ return {
252
+ ...baseColors,
253
+ // Increase contrast for all on-color pairs
254
+ onPrimary: '#FFFFFF',
255
+ onSecondary: '#FFFFFF',
256
+ onTertiary: '#FFFFFF',
257
+ onError: '#FFFFFF',
258
+ onSurface: '#000000',
259
+ onSurfaceVariant: '#000000',
260
+ onPrimaryContainer: '#000000',
261
+ onSecondaryContainer: '#000000',
262
+ onTertiaryContainer: '#000000',
263
+ onErrorContainer: '#000000',
264
+ };
265
+ }
266
+ /**
267
+ * Adapter: Convert a TonalPalette into a simple map of tones -> hex strings.
268
+ * This provides a stable, serializable shape consumers in the codebase expect
269
+ * (e.g. lookups by tone value) and isolates callers from potential upstream
270
+ * API changes in the material-color-utilities package.
271
+ */
272
+ export function tonalPaletteToHexMap(palette) {
273
+ const map = {};
274
+ for (let t = 0; t <= 100; t += 10) {
275
+ try {
276
+ map[t] = hexFromArgb(palette.tone(t));
277
+ }
278
+ catch (e) {
279
+ // if palette.tone is unavailable for some reason, fallback to white/black
280
+ map[t] = t >= 50 ? '#FFFFFF' : '#000000';
281
+ }
282
+ }
283
+ return map;
284
+ }
285
+ /**
286
+ * Helper: generate a hex-map directly from a seed color
287
+ */
288
+ export function generateTonalHexMapFromSeed(seedColor) {
289
+ const palette = generateTonalPalette(seedColor);
290
+ return tonalPaletteToHexMap(palette);
291
+ }
292
+ //# sourceMappingURL=palette-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"palette-generator.js","sourceRoot":"","sources":["../../brand/palette-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from './ui';
2
+ export * from './navigation';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../components/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC;AACrB,cAAc,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './ui';
2
+ export * from './navigation';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../components/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC;AACrB,cAAc,cAAc,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { ReactNode } from 'react';
2
+ /**
3
+ * SF Symbol icon configuration for iOS
4
+ */
5
+ export interface SFSymbolIcon {
6
+ /** Default state SF Symbol name */
7
+ default: string;
8
+ /** Selected state SF Symbol name */
9
+ selected: string;
10
+ }
11
+ /**
12
+ * Material Design icon name for Android
13
+ */
14
+ export type MaterialIconName = string;
15
+ /**
16
+ * Tab configuration for AppTabs
17
+ */
18
+ export interface AppTabConfig {
19
+ /** Unique tab name (used for routing) */
20
+ name: string;
21
+ /** Tab route href */
22
+ href: string;
23
+ /** Tab display label */
24
+ label: string;
25
+ /** Optional iOS SF Symbol icon configuration (must include both default and selected states) */
26
+ sfSymbol?: SFSymbolIcon;
27
+ /** Optional Android Material Design icon name */
28
+ materialIcon?: MaterialIconName;
29
+ /** Optional web icon (web only) */
30
+ webIcon?: any;
31
+ }
32
+ /**
33
+ * External link configuration (web only)
34
+ */
35
+ export interface AppTabsExternalLink {
36
+ label: string;
37
+ href: string;
38
+ icon?: any;
39
+ }
40
+ /**
41
+ * Props for AppTabs component
42
+ */
43
+ export interface AppTabsProps {
44
+ /** Brand or app name to display */
45
+ brandName?: string;
46
+ /** Optional logo image */
47
+ logoImage?: ReactNode;
48
+ /** Array of tab configurations */
49
+ tabs: AppTabConfig[];
50
+ /** External links shown in the app bar (web only) */
51
+ externalLinks?: AppTabsExternalLink[];
52
+ /** App bar height in pixels (web only) */
53
+ height?: number;
54
+ /** Called when hamburger is pressed (native only) */
55
+ onPrimaryMenuPress?: () => void;
56
+ }
57
+ /**
58
+ * Native platform tabs for mobile (iOS/Android).
59
+ * Uses true native tabs with liquid glass effect on iOS.
60
+ * For web, see app-tabs.web.tsx
61
+ */
62
+ export default function AppTabs({ tabs, }: AppTabsProps): import("react/jsx-runtime").JSX.Element;
63
+ //# sourceMappingURL=app-tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-tabs.d.ts","sourceRoot":"","sources":["../../../../components/navigation/app-tabs/app-tabs.tsx"],"names":[],"mappings":"AAAA,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIzC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,gGAAgG;IAChG,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,iDAAiD;IACjD,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,mCAAmC;IACnC,OAAO,CAAC,EAAE,GAAG,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,kCAAkC;IAClC,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,qDAAqD;IACrD,aAAa,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACtC,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,EAC9B,IAAI,GACL,EAAE,YAAY,2CAoBd"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { NativeTabs } from 'expo-router/unstable-native-tabs';
3
+ import { useThemeContext } from '../../../theme';
4
+ /**
5
+ * Native platform tabs for mobile (iOS/Android).
6
+ * Uses true native tabs with liquid glass effect on iOS.
7
+ * For web, see app-tabs.web.tsx
8
+ */
9
+ export default function AppTabs({ tabs, }) {
10
+ const { values: theme } = useThemeContext();
11
+ return (_jsx(NativeTabs, { tintColor: theme.primary, iconColor: theme.onSurfaceVariant, children: tabs.map((tab) => (_jsxs(NativeTabs.Trigger, { name: tab.name, children: [(tab.sfSymbol || tab.materialIcon) && (_jsx(NativeTabs.Trigger.Icon, { sf: tab.sfSymbol, md: tab.materialIcon })), _jsx(NativeTabs.Trigger.Label, { children: tab.label })] }, tab.name))) }));
12
+ }
13
+ //# sourceMappingURL=app-tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-tabs.js","sourceRoot":"","sources":["../../../../components/navigation/app-tabs/app-tabs.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AA8DjD;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,EAC9B,IAAI,GACS;IACb,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,eAAe,EAAE,CAAC;IAE5C,OAAO,CACL,KAAC,UAAU,IACT,SAAS,EAAE,KAAK,CAAC,OAAO,EACxB,SAAS,EAAE,KAAK,CAAC,gBAAgB,YAChC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACjB,MAAC,UAAU,CAAC,OAAO,IAAgB,IAAI,EAAE,GAAG,CAAC,IAAI,aAC9C,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,CACrC,KAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IACtB,EAAE,EAAE,GAAG,CAAC,QAAe,EACvB,EAAE,EAAE,GAAG,CAAC,YAAY,GACpB,CACH,EACD,KAAC,UAAU,CAAC,OAAO,CAAC,KAAK,cAAE,GAAG,CAAC,KAAK,GAA4B,KAPzC,GAAG,CAAC,IAAI,CAQZ,CACtB,CAAC,GACS,CACd,CAAC;AACJ,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { ReactNode } from 'react';
2
+ import { type PlatformIcon } from '../../../icons';
3
+ /**
4
+ * External link configuration for AppTabs
5
+ */
6
+ export interface AppTabsExternalLink {
7
+ label: string;
8
+ href: string;
9
+ icon?: PlatformIcon | string;
10
+ }
11
+ /**
12
+ * SF Symbol icon configuration for iOS
13
+ */
14
+ export interface SFSymbolIcon {
15
+ default: string;
16
+ selected: string;
17
+ }
18
+ export type MaterialIconName = string;
19
+ /**
20
+ * Tab configuration for AppTabs
21
+ */
22
+ export interface AppTabConfig {
23
+ name: string;
24
+ href: string;
25
+ label: string;
26
+ sfSymbol?: SFSymbolIcon;
27
+ materialIcon?: MaterialIconName;
28
+ webIcon?: PlatformIcon | string;
29
+ }
30
+ /**
31
+ * Props for AppTabs component
32
+ */
33
+ export interface AppTabsProps {
34
+ brandName: string;
35
+ logoImage?: ReactNode;
36
+ tabs: AppTabConfig[];
37
+ externalLinks?: AppTabsExternalLink[];
38
+ height?: number;
39
+ /** Native-only: called when hamburger is pressed on native platforms */
40
+ onPrimaryMenuPress?: () => void;
41
+ }
42
+ /**
43
+ * Material 3 themed tabs component for navigation.
44
+ * Responsive: right-side drawer on mobile, horizontal tabs on desktop.
45
+ */
46
+ export default function AppTabs({ brandName, logoImage, tabs, externalLinks, height, }: AppTabsProps): import("react/jsx-runtime").JSX.Element;
47
+ //# sourceMappingURL=app-tabs.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-tabs.web.d.ts","sourceRoot":"","sources":["../../../../components/navigation/app-tabs/app-tabs.web.tsx"],"names":[],"mappings":"AAQA,OAAc,EAAE,SAAS,EAAuB,MAAM,OAAO,CAAC;AAM9D,OAAO,EAAc,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAO/D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,OAAO,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,EAAE,YAAY,EAAE,CAAC;IACrB,aAAa,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,EAC9B,SAAS,EACT,SAAS,EACT,IAAI,EACJ,aAAkB,EAClB,MAAW,GACZ,EAAE,YAAY,2CAoFd"}
@@ -0,0 +1,104 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Tabs, TabList, TabTrigger, TabSlot, } from 'expo-router/ui';
3
+ import { useState, useEffect } from 'react';
4
+ import { Pressable, View, StyleSheet, Linking } from 'react-native';
5
+ import { useThemeContext } from '../../../theme';
6
+ import { Typography } from '../../ui/typography';
7
+ import { ThemedView } from '../../ui/themed-view';
8
+ import { Link, usePathname, useRouter } from 'expo-router';
9
+ import { renderIcon } from '../../../icons';
10
+ import { useLayout } from '../../../context/layout-context';
11
+ import { useDimensions, breakpoints } from '../../../hooks';
12
+ import { Drawer } from '../drawer/drawer';
13
+ import { SidebarItem } from '../sidebar/sidebar-item';
14
+ import { sidebarItemStyles } from '../shared/sidebar-styles';
15
+ /**
16
+ * Material 3 themed tabs component for navigation.
17
+ * Responsive: right-side drawer on mobile, horizontal tabs on desktop.
18
+ */
19
+ export default function AppTabs({ brandName, logoImage, tabs, externalLinks = [], height = 64, }) {
20
+ const { setAppBarHeight } = useLayout();
21
+ const { width } = useDimensions();
22
+ const isMobile = width < breakpoints.large;
23
+ const [menuOpen, setMenuOpen] = useState(false);
24
+ const pathname = usePathname();
25
+ const router = useRouter();
26
+ useEffect(() => {
27
+ setAppBarHeight(height);
28
+ }, [height, setAppBarHeight]);
29
+ // Close drawer on navigation
30
+ useEffect(() => {
31
+ setMenuOpen(false);
32
+ }, [pathname]);
33
+ return (_jsxs(Tabs, { children: [_jsx(TabList, { asChild: true, children: _jsx(CustomTabList, { brandName: brandName, logoImage: logoImage, externalLinks: externalLinks, height: height, isMobile: isMobile, onMenuPress: () => setMenuOpen(true), children: tabs.map((tab) => (_jsx(TabTrigger, { name: tab.name, href: tab.href, asChild: true, children: _jsx(TabButton, { height: height, webIcon: tab.webIcon, materialIcon: tab.materialIcon, children: tab.label }) }, tab.name))) }) }), _jsx(TabSlot, { style: { flex: 1, overflow: 'hidden' } }), isMobile && (_jsxs(Drawer, { isOpen: menuOpen, onClose: () => setMenuOpen(false), side: "right", header: _jsx(DrawerHeader, { brandName: brandName, logoImage: logoImage }), children: [tabs.map((tab) => {
34
+ const icon = tab.webIcon
35
+ ? (typeof tab.webIcon === 'string' ? { name: tab.webIcon } : tab.webIcon)
36
+ : tab.materialIcon
37
+ ? { library: 'MaterialIcons', name: tab.materialIcon }
38
+ : undefined;
39
+ const isActive = pathname === tab.href || pathname.startsWith(tab.href + '/');
40
+ return (_jsx(SidebarItem, { label: tab.label, icon: icon, active: isActive, onPress: () => router.push(tab.href) }, tab.name));
41
+ }), externalLinks.length > 0 && _jsx(DrawerDivider, {}), externalLinks.map((link, i) => {
42
+ const icon = link.icon
43
+ ? (typeof link.icon === 'string' ? { name: link.icon } : link.icon)
44
+ : undefined;
45
+ return (_jsx(SidebarItem, { label: link.label, icon: icon, onPress: () => Linking.openURL(link.href) }, i));
46
+ })] }))] }));
47
+ }
48
+ function TabButton({ children, isFocused, height, webIcon, materialIcon, ...props }) {
49
+ const { values: theme } = useThemeContext();
50
+ const spacing = theme.spacing;
51
+ const [hovered, setHovered] = useState(false);
52
+ const iconToRender = webIcon || (materialIcon ? { library: 'MaterialIcons', name: materialIcon } : undefined);
53
+ const iconColor = isFocused || hovered ? theme.primary : theme.onSurfaceVariant;
54
+ return (_jsxs(Pressable, { ...props, onHoverIn: () => setHovered(true), onHoverOut: () => setHovered(false), style: ({ pressed }) => [
55
+ styles.tabButton,
56
+ { paddingHorizontal: spacing.lg, height, justifyContent: 'center' },
57
+ pressed && { opacity: 0.7 },
58
+ ], children: [_jsxs(View, { style: [styles.tabButtonContent, { gap: spacing.sm }], children: [iconToRender && renderIcon(iconToRender, 'MaterialIcons', 20, iconColor), _jsx(Typography, { variant: "labelLarge", weight: "medium", color: iconColor, children: children })] }), isFocused && (_jsx(View, { style: [styles.activeIndicator, { backgroundColor: theme.primary }] }))] }));
59
+ }
60
+ function CustomTabList({ brandName, logoImage, externalLinks, height, isMobile, onMenuPress, children, ...props }) {
61
+ const { values: theme } = useThemeContext();
62
+ const spacing = theme.spacing;
63
+ return (_jsx(ThemedView, { variant: "appbar", rounded: false, style: [styles.appBar, { height, paddingHorizontal: spacing.xxl, borderBottomWidth: 1, borderBottomColor: theme.tokens.appbar.border }], children: _jsxs(View, { ...props, style: [styles.appBarContent, { height, gap: spacing.sm }], children: [_jsx(Link, { href: "/", style: styles.brand, children: _jsxs(View, { style: [styles.brandContent, { gap: spacing.sm }], children: [logoImage, _jsx(Typography, { variant: "titleLarge", weight: "medium", children: brandName })] }) }), !isMobile && (_jsxs(_Fragment, { children: [_jsx(View, { style: [styles.tabs, { gap: spacing.xs }], children: children }), externalLinks.length > 0 && (_jsx(View, { style: [styles.tabs, { gap: spacing.xs, marginLeft: spacing.lg }], children: externalLinks.map((link, i) => (_jsx(ExternalLinkButton, { ...link, height: height }, i))) }))] })), isMobile && (_jsx(Pressable, { onPress: onMenuPress, accessibilityLabel: "Open menu", accessibilityRole: "button", style: ({ pressed }) => [
64
+ styles.iconButton,
65
+ { padding: spacing.sm, borderRadius: theme.shape.buttonBorderRadius },
66
+ pressed && { opacity: 0.7 },
67
+ ], children: renderIcon({ library: 'Feather', name: 'menu' }, 'Feather', 24, theme.onSurface) }))] }) }));
68
+ }
69
+ // --- Desktop external link button ---
70
+ function ExternalLinkButton({ href, label, height, icon }) {
71
+ const { values: theme } = useThemeContext();
72
+ const spacing = theme.spacing;
73
+ const [hovered, setHovered] = useState(false);
74
+ const color = hovered ? theme.primary : theme.onSurfaceVariant;
75
+ return (_jsx(Link, { href: href, target: "_blank", asChild: true, children: _jsx(Pressable, { onHoverIn: () => setHovered(true), onHoverOut: () => setHovered(false), style: ({ pressed }) => [
76
+ styles.tabButton,
77
+ { paddingHorizontal: spacing.lg, height, justifyContent: 'center', borderRadius: theme.shape.buttonBorderRadius },
78
+ pressed && { opacity: 0.7 },
79
+ ], children: _jsxs(View, { style: [styles.tabButtonContent, { gap: spacing.sm }], children: [icon && renderIcon(icon, 'MaterialIcons', 20, color), _jsx(Typography, { variant: "labelLarge", weight: "medium", color: color, children: label })] }) }) }));
80
+ }
81
+ // --- Drawer header ---
82
+ function DrawerHeader({ brandName, logoImage }) {
83
+ const { values: theme } = useThemeContext();
84
+ const spacing = theme.spacing;
85
+ return (_jsx(View, { style: [styles.drawerHeader, { padding: spacing.lg, borderBottomColor: theme.tokens.sidebar.divider }], children: _jsxs(View, { style: [styles.brandContent, { gap: spacing.sm }], children: [logoImage, _jsx(Typography, { variant: "titleMedium", weight: "bold", children: brandName })] }) }));
86
+ }
87
+ function DrawerDivider() {
88
+ const { values: theme } = useThemeContext();
89
+ return _jsx(View, { style: [sidebarItemStyles.divider, { backgroundColor: theme.tokens.sidebar.divider }] });
90
+ }
91
+ // --- Styles ---
92
+ const styles = StyleSheet.create({
93
+ appBar: { width: '100%', flexDirection: 'row' },
94
+ appBarContent: { flexDirection: 'row', alignItems: 'center', width: '100%' },
95
+ brand: { marginRight: 'auto' },
96
+ brandContent: { flexDirection: 'row', alignItems: 'center' },
97
+ tabs: { flexDirection: 'row', alignItems: 'center' },
98
+ tabButton: { position: 'relative' },
99
+ tabButtonContent: { flexDirection: 'row', alignItems: 'center' },
100
+ activeIndicator: { position: 'absolute', bottom: 0, left: 0, right: 0, height: 3, borderTopLeftRadius: 2, borderTopRightRadius: 2 },
101
+ iconButton: { alignItems: 'center', justifyContent: 'center' },
102
+ drawerHeader: { borderBottomWidth: 1, width: '100%' },
103
+ });
104
+ //# sourceMappingURL=app-tabs.web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-tabs.web.js","sourceRoot":"","sources":["../../../../components/navigation/app-tabs/app-tabs.web.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { default as AppTabs } from './app-tabs';
2
+ export type { AppTabsProps, AppTabConfig, AppTabsExternalLink } from './app-tabs';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../components/navigation/app-tabs/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ // App tabs navigation component
2
+ export { default as AppTabs } from './app-tabs';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../components/navigation/app-tabs/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,24 @@
1
+ import React from 'react';
2
+ import { type StyleProp, type ViewStyle } from 'react-native';
3
+ export interface DrawerProps {
4
+ /** Whether the drawer is open */
5
+ isOpen: boolean;
6
+ /** Callback when drawer should close */
7
+ onClose: () => void;
8
+ /** Which side the drawer slides from */
9
+ side?: 'left' | 'right';
10
+ /** Optional header component */
11
+ header?: React.ReactNode;
12
+ /** Drawer content */
13
+ children: React.ReactNode;
14
+ /** Optional footer component */
15
+ footer?: React.ReactNode;
16
+ /** Custom styles for the drawer container */
17
+ style?: StyleProp<ViewStyle>;
18
+ }
19
+ /**
20
+ * Reusable animated drawer component.
21
+ * Slides in from the left or right with a backdrop.
22
+ */
23
+ export declare const Drawer: React.FC<DrawerProps>;
24
+ //# sourceMappingURL=drawer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawer.d.ts","sourceRoot":"","sources":["../../../../components/navigation/drawer/drawer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAA2C,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAIvG,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,wCAAwC;IACxC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,gCAAgC;IAChC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,qBAAqB;IACrB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,gCAAgC;IAChC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;CAC9B;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAuExC,CAAC"}