@nwartz/design-system 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,2531 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ Autocomplete: () => Autocomplete,
24
+ Badge: () => Badge,
25
+ BottomNavBar: () => BottomNavBar,
26
+ Box: () => Box,
27
+ Button: () => Button,
28
+ Card: () => Card,
29
+ Checkbox: () => Checkbox,
30
+ DatePicker: () => DatePicker,
31
+ DropdownSelect: () => DropdownSelect,
32
+ Icon: () => Icon,
33
+ InputField: () => InputField,
34
+ LinkButton: () => LinkButton,
35
+ ProgressBar: () => ProgressBar,
36
+ SearchBar: () => SearchBar,
37
+ SegmentedTabs: () => SegmentedTabs,
38
+ Slider: () => Slider,
39
+ TabMenu: () => TabMenu,
40
+ TablePagination: () => TablePagination,
41
+ Tag: () => Tag,
42
+ Text: () => Text,
43
+ ThemeProvider: () => ThemeProvider,
44
+ Toggle: () => Toggle,
45
+ colorMap: () => colorMap,
46
+ darkColors: () => darkColors,
47
+ elevation: () => elevation,
48
+ lightColors: () => lightColors,
49
+ radius: () => radius,
50
+ radiusMap: () => radiusMap,
51
+ spacing: () => spacing,
52
+ spacingMap: () => spacingMap,
53
+ typography: () => typography,
54
+ useTheme: () => useTheme
55
+ });
56
+ module.exports = __toCommonJS(index_exports);
57
+
58
+ // tokens/colors.ts
59
+ var darkColors = {
60
+ /** App background — the deepest layer. */
61
+ backgroundScreen: "#131313",
62
+ /** Raised surfaces (cards, sheets, modals). */
63
+ shapePrimary: "#1A1A1A",
64
+ /** Inset surfaces, secondary containers, chips. */
65
+ shapeSecondary: "#2D2D2D",
66
+ /** Borders, dividers, disabled outlines. */
67
+ shapeTertiary: "#404040",
68
+ /** Primary text on dark backgrounds. */
69
+ textPrimary: "#FFFFFF",
70
+ /** Secondary / muted text. */
71
+ textSecondary: "#E1E1E1",
72
+ /** Tertiary / placeholder text. */
73
+ textTertiary: "#A0A0A0",
74
+ /** Brand primary — neon lime accent. */
75
+ primaryPure: "#CEFE00",
76
+ /** Brand primary — darker shade for hover/pressed. */
77
+ primaryMid: "#87AD00",
78
+ /** Destructive actions. */
79
+ dangerMid: "#BB4355"
80
+ };
81
+ var lightColors = {
82
+ backgroundScreen: "#F6F5F4",
83
+ shapePrimary: "#FAF9F7",
84
+ shapeSecondary: "#E9E8E7",
85
+ shapeTertiary: "#D9D8D7",
86
+ textPrimary: "#141414",
87
+ textSecondary: "#737271",
88
+ textTertiary: "#8E8D8B",
89
+ primaryPure: "#CEFE00",
90
+ primaryMid: "#87AD00",
91
+ dangerMid: "#BB4355"
92
+ };
93
+
94
+ // tokens/typography.ts
95
+ var import_react_native = require("react-native");
96
+ var fontFamilyBase = import_react_native.Platform.select({
97
+ ios: "Archivo",
98
+ android: "Archivo",
99
+ default: "Archivo, system-ui, sans-serif"
100
+ });
101
+ var typography = {
102
+ /** 56px / 900 / 1.15 — hero display, stat rings. */
103
+ display: {
104
+ fontFamily: fontFamilyBase,
105
+ fontSize: 56,
106
+ fontWeight: "900",
107
+ lineHeight: 64
108
+ },
109
+ /** 20px / 700 / 1.0 — section headings, card titles. */
110
+ heading: {
111
+ fontFamily: fontFamilyBase,
112
+ fontSize: 20,
113
+ fontWeight: "700",
114
+ lineHeight: 20
115
+ },
116
+ /** 16px / 400 / 1.5 — body copy, list items. */
117
+ body: {
118
+ fontFamily: fontFamilyBase,
119
+ fontSize: 16,
120
+ fontWeight: "400",
121
+ lineHeight: 24
122
+ },
123
+ /** 12px / 400 / 1.5 — captions, helper text, overlines. */
124
+ caption: {
125
+ fontFamily: fontFamilyBase,
126
+ fontSize: 12,
127
+ fontWeight: "400",
128
+ lineHeight: 18
129
+ }
130
+ };
131
+
132
+ // tokens/elevation.ts
133
+ var import_react_native2 = require("react-native");
134
+ function makeElevation(androidElevation, iOSShadow) {
135
+ if (import_react_native2.Platform.OS === "android") {
136
+ return { elevation: androidElevation };
137
+ }
138
+ return {
139
+ shadowColor: "#101828",
140
+ shadowOffset: { width: iOSShadow.offsetX, height: iOSShadow.offsetY },
141
+ shadowOpacity: iOSShadow.opacity,
142
+ shadowRadius: iOSShadow.radius
143
+ };
144
+ }
145
+ var elevation = {
146
+ /** $elevation-level-xs — subtle lift for inline elements. */
147
+ xs: makeElevation(1, { radius: 2, offsetX: 0, offsetY: 1, opacity: 0.05 }),
148
+ /** $elevation-level-sm — cards at rest. */
149
+ sm: makeElevation(2, { radius: 3, offsetX: 0, offsetY: 1, opacity: 0.1 }),
150
+ /** $elevation-level-md — raised panels, dropdowns. */
151
+ md: makeElevation(4, { radius: 8, offsetX: 0, offsetY: 4, opacity: 0.1 }),
152
+ /** $elevation-level-lg — modals, floating sheets. */
153
+ lg: makeElevation(8, { radius: 16, offsetX: 0, offsetY: 12, opacity: 0.08 }),
154
+ /** $elevation-level-xl — bottom sheets, popover menus. */
155
+ xl: makeElevation(12, { radius: 24, offsetX: 0, offsetY: 20, opacity: 0.08 }),
156
+ /** $elevation-level-xxl — full-screen overlays. */
157
+ xxl: makeElevation(16, { radius: 48, offsetX: 0, offsetY: 24, opacity: 0.08 }),
158
+ /** $elevation-level-xxxl — deepest layer. */
159
+ xxxl: makeElevation(24, { radius: 64, offsetX: 0, offsetY: 32, opacity: 0.08 })
160
+ };
161
+
162
+ // tokens/spacing.ts
163
+ var spacing = {
164
+ /** 0px */
165
+ none: 0,
166
+ /** 2px — hairline gaps. */
167
+ xxs: 2,
168
+ /** 4px — tight inset (icon-to-label). */
169
+ xs: 4,
170
+ /** 8px — compact gaps, small padding. */
171
+ sm: 8,
172
+ /** 12px — default inner padding for small controls. */
173
+ md: 12,
174
+ /** 16px — standard card padding, list row gaps. */
175
+ lg: 16,
176
+ /** 20px — generous spacing. */
177
+ xl: 20,
178
+ /** 24px — section gaps, card outer padding. */
179
+ "2xl": 24,
180
+ /** 32px — large section spacing. */
181
+ "3xl": 32,
182
+ /** 40px — page-level horizontal padding. */
183
+ "4xl": 40,
184
+ /** 48px — hero spacing. */
185
+ "5xl": 48,
186
+ /** 64px — page-level vertical spacing. */
187
+ "6xl": 64,
188
+ /** 80px — maximum spacing. */
189
+ "7xl": 80
190
+ };
191
+
192
+ // tokens/radius.ts
193
+ var radius = {
194
+ /** 4px — tiny elements: badges, tags. */
195
+ xs: 4,
196
+ /** 8px — small controls: inputs, chips. */
197
+ sm: 8,
198
+ /** 12px — medium elements: tiles, list rows. */
199
+ md: 12,
200
+ /** 16px — cards, panels. */
201
+ lg: 16,
202
+ /** 24px — large cards, modals. */
203
+ xl: 24,
204
+ /** Full circle / pill shape. */
205
+ full: 9999
206
+ };
207
+
208
+ // tokens/mapping.ts
209
+ var colorMap = {
210
+ background: "backgroundScreen",
211
+ backgroundElement: "shapeSecondary",
212
+ backgroundSelected: "shapeSecondary",
213
+ surfaceLowest: "shapePrimary",
214
+ surfaceHigh: "shapeSecondary",
215
+ outline: "shapeTertiary",
216
+ outlineVariant: "shapeTertiary",
217
+ text: "textPrimary",
218
+ textSecondary: "textSecondary",
219
+ secondary: "textSecondary",
220
+ secondaryContainer: "shapeSecondary",
221
+ onSecondaryContainer: "textSecondary",
222
+ success: "primaryPure",
223
+ danger: "dangerMid",
224
+ info: "textSecondary",
225
+ warning: "textSecondary"
226
+ };
227
+ var spacingMap = {
228
+ 2: "xxs",
229
+ 4: "xs",
230
+ 8: "sm",
231
+ 12: "md",
232
+ 16: "lg",
233
+ 20: "xl",
234
+ 24: "2xl",
235
+ 32: "3xl",
236
+ 40: "4xl",
237
+ 48: "5xl",
238
+ 64: "6xl",
239
+ 80: "7xl"
240
+ };
241
+ var radiusMap = {
242
+ 4: "xs",
243
+ 8: "sm",
244
+ 10: "sm",
245
+ 12: "md",
246
+ 14: "md",
247
+ 16: "lg",
248
+ 24: "xl",
249
+ 32: "xl",
250
+ 9999: "full"
251
+ };
252
+
253
+ // theme/theme.tsx
254
+ var import_react = require("react");
255
+ var import_react_native3 = require("react-native");
256
+ var import_jsx_runtime = require("react/jsx-runtime");
257
+ var ThemeContext = (0, import_react.createContext)(null);
258
+ function ThemeProvider({ children, mode: modeOverride, colors: colorOverrides }) {
259
+ const systemScheme = (0, import_react_native3.useColorScheme)();
260
+ const mode = modeOverride ?? (systemScheme === "light" ? "light" : "dark");
261
+ const value = (0, import_react.useMemo)(
262
+ () => ({
263
+ mode,
264
+ isDark: mode === "dark",
265
+ colors: { ...mode === "dark" ? darkColors : lightColors, ...colorOverrides }
266
+ }),
267
+ [mode, colorOverrides]
268
+ );
269
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ThemeContext.Provider, { value, children });
270
+ }
271
+ function useTheme() {
272
+ const ctx = (0, import_react.useContext)(ThemeContext);
273
+ if (!ctx) {
274
+ return { mode: "dark", isDark: true, colors: darkColors };
275
+ }
276
+ return ctx;
277
+ }
278
+
279
+ // components/Box.tsx
280
+ var import_react_native4 = require("react-native");
281
+ var import_jsx_runtime2 = require("react/jsx-runtime");
282
+ function Box({
283
+ bg,
284
+ p,
285
+ px,
286
+ py,
287
+ m,
288
+ mx,
289
+ my,
290
+ rounded,
291
+ elevation: elev,
292
+ direction,
293
+ align,
294
+ justify,
295
+ gap,
296
+ fullWidth,
297
+ fullHeight,
298
+ style,
299
+ children,
300
+ ...rest
301
+ }) {
302
+ const theme = useTheme();
303
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
304
+ import_react_native4.View,
305
+ {
306
+ style: [
307
+ bg && { backgroundColor: theme.colors[bg] },
308
+ p !== void 0 && { padding: spacing[p] },
309
+ px !== void 0 && { paddingHorizontal: spacing[px] },
310
+ py !== void 0 && { paddingVertical: spacing[py] },
311
+ m !== void 0 && { margin: spacing[m] },
312
+ mx !== void 0 && { marginHorizontal: spacing[mx] },
313
+ my !== void 0 && { marginVertical: spacing[my] },
314
+ rounded !== void 0 && { borderRadius: radius[rounded] },
315
+ elev !== void 0 && elevation[elev],
316
+ direction !== void 0 && { flexDirection: direction },
317
+ align !== void 0 && { alignItems: align },
318
+ justify !== void 0 && { justifyContent: justify },
319
+ gap !== void 0 && { gap },
320
+ fullWidth && { width: "100%" },
321
+ fullHeight && { height: "100%" },
322
+ style
323
+ ],
324
+ ...rest,
325
+ children
326
+ }
327
+ );
328
+ }
329
+
330
+ // components/Text.tsx
331
+ var import_react_native5 = require("react-native");
332
+ var import_jsx_runtime3 = require("react/jsx-runtime");
333
+ function Text({ variant = "body", color = "textPrimary", textStyle, style, children, ...rest }) {
334
+ const theme = useTheme();
335
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
336
+ import_react_native5.Text,
337
+ {
338
+ style: [typography[variant], { color: theme.colors[color] }, textStyle, style],
339
+ ...rest,
340
+ children
341
+ }
342
+ );
343
+ }
344
+
345
+ // components/Card.tsx
346
+ var import_react_native6 = require("react-native");
347
+ var import_jsx_runtime4 = require("react/jsx-runtime");
348
+ function Card({
349
+ level = "sm",
350
+ noPadding = false,
351
+ bordered = false,
352
+ radius: radiusToken,
353
+ style,
354
+ children,
355
+ ...rest
356
+ }) {
357
+ const theme = useTheme();
358
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
359
+ import_react_native6.View,
360
+ {
361
+ style: [
362
+ styles.card,
363
+ elevation[level],
364
+ { backgroundColor: theme.colors.shapePrimary },
365
+ radiusToken !== void 0 && { borderRadius: radius[radiusToken] },
366
+ bordered && { borderWidth: 1, borderColor: theme.colors.shapeTertiary },
367
+ !noPadding && { padding: spacing.lg },
368
+ style
369
+ ],
370
+ ...rest,
371
+ children
372
+ }
373
+ );
374
+ }
375
+ var styles = import_react_native6.StyleSheet.create({
376
+ card: {
377
+ borderRadius: radius.lg
378
+ }
379
+ });
380
+
381
+ // components/Button.tsx
382
+ var import_react_native7 = require("react-native");
383
+ var import_jsx_runtime5 = require("react/jsx-runtime");
384
+ function palette(variant, colors, pressed, brandPrimary, brandOnPrimary) {
385
+ const primary = brandPrimary ?? "#3D8BFF";
386
+ const onPrimary = brandOnPrimary ?? "#FFFFFF";
387
+ switch (variant) {
388
+ case "primary":
389
+ return {
390
+ background: pressed ? primary + "CC" : primary,
391
+ border: "transparent",
392
+ label: onPrimary
393
+ };
394
+ case "secondary":
395
+ return {
396
+ background: pressed ? colors.shapeSecondary + "CC" : colors.shapeSecondary,
397
+ border: "transparent",
398
+ label: colors.textPrimary
399
+ };
400
+ case "outline":
401
+ return {
402
+ background: pressed ? colors.shapeSecondary + "33" : "transparent",
403
+ border: colors.shapeSecondary,
404
+ label: colors.textPrimary
405
+ };
406
+ case "danger":
407
+ return {
408
+ background: pressed ? "#FF45451A" : "transparent",
409
+ border: "#FF454566",
410
+ label: "#FF4545"
411
+ };
412
+ case "ghost":
413
+ return {
414
+ background: pressed ? colors.shapeSecondary + "33" : "transparent",
415
+ border: "transparent",
416
+ label: colors.textSecondary
417
+ };
418
+ }
419
+ }
420
+ function Button({
421
+ label,
422
+ variant = "primary",
423
+ loading = false,
424
+ size = "md",
425
+ style,
426
+ disabled,
427
+ ...rest
428
+ }) {
429
+ const theme = useTheme();
430
+ const isDisabled = disabled || loading;
431
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
432
+ import_react_native7.Pressable,
433
+ {
434
+ accessibilityRole: "button",
435
+ disabled: isDisabled,
436
+ style: ({ pressed }) => {
437
+ const colors = palette(variant, theme.colors, pressed);
438
+ return [
439
+ styles2.base,
440
+ size === "sm" && styles2.small,
441
+ {
442
+ backgroundColor: colors.background,
443
+ borderColor: colors.border,
444
+ opacity: isDisabled ? 0.5 : 1
445
+ },
446
+ style
447
+ ];
448
+ },
449
+ ...rest,
450
+ children: ({ pressed }) => {
451
+ const colors = palette(variant, theme.colors, pressed);
452
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_react_native7.View, { style: styles2.row, children: [
453
+ loading ? /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_native7.ActivityIndicator, { size: "small", color: colors.label }) : null,
454
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
455
+ Text,
456
+ {
457
+ variant: "body",
458
+ color: "textPrimary",
459
+ textStyle: [styles2.label, size === "sm" && styles2.labelSmall, { color: colors.label }],
460
+ children: label
461
+ }
462
+ )
463
+ ] });
464
+ }
465
+ }
466
+ );
467
+ }
468
+ var styles2 = import_react_native7.StyleSheet.create({
469
+ base: {
470
+ borderRadius: radius.sm,
471
+ borderWidth: 1,
472
+ paddingVertical: spacing.lg,
473
+ paddingHorizontal: spacing["2xl"],
474
+ alignItems: "center",
475
+ justifyContent: "center"
476
+ },
477
+ small: {
478
+ paddingVertical: spacing.sm + spacing.xxs,
479
+ paddingHorizontal: spacing.lg
480
+ },
481
+ row: {
482
+ flexDirection: "row",
483
+ alignItems: "center",
484
+ justifyContent: "center",
485
+ gap: spacing.sm
486
+ },
487
+ label: {
488
+ fontSize: 16,
489
+ lineHeight: 24,
490
+ fontWeight: "600"
491
+ },
492
+ labelSmall: {
493
+ fontSize: 14,
494
+ lineHeight: 20
495
+ }
496
+ });
497
+
498
+ // components/Icon.tsx
499
+ var import_phosphor_react_native = require("phosphor-react-native");
500
+ var import_jsx_runtime6 = require("react/jsx-runtime");
501
+ var iconMap = {
502
+ "caret-down": import_phosphor_react_native.CaretDown,
503
+ "caret-up": import_phosphor_react_native.CaretUp,
504
+ "caret-right": import_phosphor_react_native.CaretRight,
505
+ check: import_phosphor_react_native.Check,
506
+ "x-circle": import_phosphor_react_native.XCircle,
507
+ x: import_phosphor_react_native.X,
508
+ "warning-circle": import_phosphor_react_native.WarningCircle,
509
+ "warning-octagon": import_phosphor_react_native.WarningOctagon,
510
+ house: import_phosphor_react_native.House,
511
+ bell: import_phosphor_react_native.Bell,
512
+ broadcast: import_phosphor_react_native.Broadcast,
513
+ "chat-circle": import_phosphor_react_native.ChatCircle,
514
+ "check-circle": import_phosphor_react_native.CheckCircle,
515
+ truck: import_phosphor_react_native.Truck,
516
+ "credit-card": import_phosphor_react_native.CreditCard,
517
+ crown: import_phosphor_react_native.Crown,
518
+ "crosshair-simple": import_phosphor_react_native.CrosshairSimple,
519
+ gauge: import_phosphor_react_native.Gauge,
520
+ lightning: import_phosphor_react_native.Lightning,
521
+ "thumbs-up": import_phosphor_react_native.ThumbsUp,
522
+ "map-trifold": import_phosphor_react_native.MapTrifold,
523
+ "map-pin": import_phosphor_react_native.MapPin,
524
+ medal: import_phosphor_react_native.Medal,
525
+ microphone: import_phosphor_react_native.Microphone,
526
+ "speaker-simple-x": import_phosphor_react_native.SpeakerSimpleX,
527
+ play: import_phosphor_react_native.Play,
528
+ plus: import_phosphor_react_native.Plus,
529
+ "radio-button": import_phosphor_react_native.RadioButton,
530
+ radio: import_phosphor_react_native.Radio,
531
+ "chart-bar": import_phosphor_react_native.ChartBar,
532
+ receipt: import_phosphor_react_native.Receipt,
533
+ path: import_phosphor_react_native.PathIcon,
534
+ "magnifying-glass": import_phosphor_react_native.MagnifyingGlass,
535
+ "gear-six": import_phosphor_react_native.GearSix,
536
+ "share-network": import_phosphor_react_native.ShareNetwork,
537
+ star: import_phosphor_react_native.Star,
538
+ "sign-out": import_phosphor_react_native.SignOut,
539
+ "steering-wheel": import_phosphor_react_native.SteeringWheel,
540
+ timer: import_phosphor_react_native.Timer,
541
+ pencil: import_phosphor_react_native.Pencil,
542
+ user: import_phosphor_react_native.User,
543
+ "user-minus": import_phosphor_react_native.UserMinus,
544
+ users: import_phosphor_react_native.Users,
545
+ globe: import_phosphor_react_native.Globe,
546
+ wallet: import_phosphor_react_native.Wallet,
547
+ lock: import_phosphor_react_native.Lock
548
+ };
549
+ function Icon({ name, size = 16, color, weight = "regular" }) {
550
+ const IconComponent = iconMap[name];
551
+ if (!IconComponent) {
552
+ return null;
553
+ }
554
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(IconComponent, { size, color, weight });
555
+ }
556
+
557
+ // components/DropdownSelect.tsx
558
+ var import_react2 = require("react");
559
+ var import_react_native8 = require("react-native");
560
+ var import_jsx_runtime7 = require("react/jsx-runtime");
561
+ function DropdownSelect({
562
+ items,
563
+ value,
564
+ onSelect,
565
+ open = true,
566
+ maxVisible = 5,
567
+ style,
568
+ ...rest
569
+ }) {
570
+ const theme = useTheme();
571
+ const [hoveredKey, setHoveredKey] = (0, import_react2.useState)(null);
572
+ if (!open) return null;
573
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
574
+ import_react_native8.View,
575
+ {
576
+ style: [
577
+ styles3.container,
578
+ {
579
+ backgroundColor: theme.colors.backgroundScreen,
580
+ borderColor: theme.colors.shapeSecondary
581
+ },
582
+ elevation.xl,
583
+ style
584
+ ],
585
+ ...rest,
586
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
587
+ import_react_native8.FlatList,
588
+ {
589
+ data: items,
590
+ keyExtractor: (item) => item.key,
591
+ bounces: false,
592
+ showsVerticalScrollIndicator: items.length > maxVisible,
593
+ nestedScrollEnabled: true,
594
+ renderItem: ({ item }) => {
595
+ const isSelected = item.key === value;
596
+ const isHovered = item.key === hoveredKey;
597
+ const isDisabled = item.disabled;
598
+ let itemBg;
599
+ if (isHovered) {
600
+ itemBg = theme.colors.shapeSecondary;
601
+ } else if (isSelected) {
602
+ itemBg = theme.colors.backgroundScreen;
603
+ } else {
604
+ itemBg = "transparent";
605
+ }
606
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_react_native8.View, { children: [
607
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(
608
+ import_react_native8.Pressable,
609
+ {
610
+ disabled: isDisabled,
611
+ onPress: () => onSelect?.(item),
612
+ onHoverIn: () => setHoveredKey(item.key),
613
+ onHoverOut: () => setHoveredKey(null),
614
+ style: () => [
615
+ styles3.item,
616
+ { backgroundColor: itemBg },
617
+ isDisabled && styles3.disabled
618
+ ],
619
+ children: [
620
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
621
+ Text,
622
+ {
623
+ variant: "body",
624
+ color: "textSecondary",
625
+ textStyle: [
626
+ styles3.itemLabel,
627
+ { color: isDisabled ? theme.colors.textTertiary : theme.colors.textSecondary }
628
+ ],
629
+ children: item.label
630
+ }
631
+ ),
632
+ isSelected && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Icon, { name: "check", size: 16, color: theme.colors.textSecondary })
633
+ ]
634
+ }
635
+ ),
636
+ item.key !== items[items.length - 1]?.key && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
637
+ import_react_native8.View,
638
+ {
639
+ style: [styles3.divider, { backgroundColor: theme.colors.shapePrimary }]
640
+ }
641
+ )
642
+ ] });
643
+ }
644
+ }
645
+ )
646
+ }
647
+ );
648
+ }
649
+ var styles3 = import_react_native8.StyleSheet.create({
650
+ container: {
651
+ borderRadius: radius.sm,
652
+ borderWidth: 1,
653
+ padding: spacing.xs,
654
+ gap: spacing.xxs
655
+ },
656
+ item: {
657
+ flexDirection: "row",
658
+ alignItems: "center",
659
+ justifyContent: "space-between",
660
+ paddingHorizontal: spacing.lg,
661
+ height: 40,
662
+ borderRadius: radius.sm
663
+ },
664
+ disabled: {
665
+ opacity: 0.32
666
+ },
667
+ itemLabel: {
668
+ fontSize: 14,
669
+ lineHeight: 21
670
+ },
671
+ divider: {
672
+ height: 1,
673
+ marginHorizontal: spacing.lg
674
+ }
675
+ });
676
+
677
+ // components/Autocomplete.tsx
678
+ var import_react3 = require("react");
679
+ var import_react_native9 = require("react-native");
680
+ var import_jsx_runtime8 = require("react/jsx-runtime");
681
+ function Autocomplete({
682
+ label,
683
+ value,
684
+ onChangeText,
685
+ size = "md",
686
+ disabled = false,
687
+ errorMessage,
688
+ items = [],
689
+ selectedItem,
690
+ onSelectItem,
691
+ open = false,
692
+ onToggle,
693
+ placeholder,
694
+ ...rest
695
+ }) {
696
+ const theme = useTheme();
697
+ const [isFocused, setIsFocused] = (0, import_react3.useState)(false);
698
+ const hasValue = !!value && value.length > 0;
699
+ const showError = !!errorMessage;
700
+ const isOpen = open;
701
+ const inputHeight = size === "sm" ? 40 : 44;
702
+ const paddingHorizontal = size === "sm" ? spacing.md : spacing.lg;
703
+ const getBorderColor = () => {
704
+ if (showError) {
705
+ return theme.colors.dangerMid;
706
+ }
707
+ if (isFocused) {
708
+ return theme.colors.primaryMid;
709
+ }
710
+ return theme.colors.shapeTertiary;
711
+ };
712
+ const getBoxShadow = () => {
713
+ if (isFocused || showError) {
714
+ const focusColor = showError ? theme.colors.dangerMid : "#FFF6D4";
715
+ return {
716
+ shadowColor: focusColor,
717
+ shadowOffset: { width: 0, height: 0 },
718
+ shadowOpacity: 1,
719
+ shadowRadius: 0,
720
+ elevation: 0
721
+ };
722
+ }
723
+ return elevation.xs;
724
+ };
725
+ const inputContainerStyle = [
726
+ styles4.inputContainer,
727
+ {
728
+ height: inputHeight,
729
+ paddingHorizontal,
730
+ backgroundColor: theme.colors.shapePrimary,
731
+ borderColor: getBorderColor(),
732
+ borderWidth: 1,
733
+ borderRadius: radius.sm
734
+ },
735
+ getBoxShadow()
736
+ ];
737
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native9.View, { style: [styles4.wrapper, disabled && styles4.disabledWrapper], children: [
738
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
739
+ Text,
740
+ {
741
+ variant: "body",
742
+ color: "textSecondary",
743
+ textStyle: styles4.label,
744
+ children: label
745
+ }
746
+ ),
747
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native9.View, { style: inputContainerStyle, children: [
748
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
749
+ import_react_native9.TextInput,
750
+ {
751
+ style: [
752
+ styles4.input,
753
+ {
754
+ color: theme.colors.textPrimary,
755
+ fontSize: 14
756
+ },
757
+ disabled && styles4.inputDisabled
758
+ ],
759
+ value,
760
+ onChangeText,
761
+ placeholder,
762
+ placeholderTextColor: theme.colors.textTertiary,
763
+ editable: !disabled,
764
+ onFocus: () => setIsFocused(true),
765
+ onBlur: () => setIsFocused(false),
766
+ ...rest
767
+ }
768
+ ),
769
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native9.View, { style: styles4.trailingIcons, children: [
770
+ hasValue && !disabled && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
771
+ import_react_native9.Pressable,
772
+ {
773
+ onPress: () => onChangeText?.(""),
774
+ hitSlop: 8,
775
+ style: styles4.iconButton,
776
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Icon, { name: "x-circle", size: 16, color: theme.colors.textSecondary })
777
+ }
778
+ ),
779
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
780
+ import_react_native9.Pressable,
781
+ {
782
+ onPress: onToggle,
783
+ disabled,
784
+ hitSlop: 8,
785
+ style: styles4.iconButton,
786
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
787
+ Icon,
788
+ {
789
+ name: isOpen ? "caret-up" : "caret-down",
790
+ size: 16,
791
+ color: theme.colors.textTertiary
792
+ }
793
+ )
794
+ }
795
+ )
796
+ ] })
797
+ ] }),
798
+ showError && /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native9.View, { style: styles4.errorRow, children: [
799
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(Icon, { name: "warning-circle", size: 16, color: theme.colors.dangerMid }),
800
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
801
+ Text,
802
+ {
803
+ variant: "body",
804
+ color: "textSecondary",
805
+ textStyle: [styles4.errorText, { color: theme.colors.textSecondary }],
806
+ children: errorMessage
807
+ }
808
+ )
809
+ ] }),
810
+ isOpen && items.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
811
+ DropdownSelect,
812
+ {
813
+ items,
814
+ value: selectedItem,
815
+ onSelect: (item) => {
816
+ onSelectItem?.(item);
817
+ onToggle?.();
818
+ },
819
+ open: isOpen,
820
+ style: styles4.dropdown
821
+ }
822
+ )
823
+ ] });
824
+ }
825
+ var styles4 = import_react_native9.StyleSheet.create({
826
+ wrapper: {
827
+ gap: spacing.xs
828
+ },
829
+ disabledWrapper: {
830
+ opacity: 0.32
831
+ },
832
+ label: {
833
+ fontSize: 14,
834
+ lineHeight: 21,
835
+ fontWeight: "500"
836
+ },
837
+ inputContainer: {
838
+ flexDirection: "row",
839
+ alignItems: "center",
840
+ gap: spacing.sm
841
+ },
842
+ input: {
843
+ flex: 1,
844
+ paddingVertical: 0,
845
+ includeFontPadding: false,
846
+ fontSize: 14,
847
+ lineHeight: 21
848
+ },
849
+ inputDisabled: {
850
+ opacity: 1
851
+ },
852
+ trailingIcons: {
853
+ flexDirection: "row",
854
+ alignItems: "center",
855
+ gap: spacing.xs
856
+ },
857
+ iconButton: {
858
+ padding: 2
859
+ },
860
+ errorRow: {
861
+ flexDirection: "row",
862
+ alignItems: "center",
863
+ gap: spacing.xs
864
+ },
865
+ errorText: {
866
+ fontSize: 14,
867
+ lineHeight: 21
868
+ },
869
+ dropdown: {
870
+ marginTop: spacing.xxs
871
+ }
872
+ });
873
+
874
+ // components/SegmentedTabs.tsx
875
+ var import_react_native10 = require("react-native");
876
+ var import_jsx_runtime9 = require("react/jsx-runtime");
877
+ function SegmentedTabs({ tabs, activeTabId, onTabChange }) {
878
+ const { colors } = useTheme();
879
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native10.View, { style: styles5.container, children: tabs.map((tab) => {
880
+ const isActive = tab.id === activeTabId;
881
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
882
+ import_react_native10.Pressable,
883
+ {
884
+ accessibilityRole: "tab",
885
+ accessibilityState: { selected: isActive },
886
+ onPress: () => onTabChange(tab.id),
887
+ style: ({ pressed }) => [
888
+ styles5.tab,
889
+ pressed && styles5.pressed,
890
+ { borderBottomColor: isActive ? colors.primaryPure : colors.shapeTertiary }
891
+ ],
892
+ children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
893
+ Text,
894
+ {
895
+ variant: "body",
896
+ color: "textPrimary",
897
+ textStyle: [
898
+ styles5.label,
899
+ {
900
+ color: isActive ? colors.primaryPure : colors.textSecondary,
901
+ fontWeight: isActive ? "700" : "400"
902
+ }
903
+ ],
904
+ children: tab.label
905
+ }
906
+ )
907
+ },
908
+ tab.id
909
+ );
910
+ }) });
911
+ }
912
+ var styles5 = import_react_native10.StyleSheet.create({
913
+ container: {
914
+ flexDirection: "row",
915
+ paddingHorizontal: spacing.xs,
916
+ paddingBottom: spacing.xxs
917
+ },
918
+ tab: {
919
+ flex: 1,
920
+ alignItems: "center",
921
+ justifyContent: "center",
922
+ paddingVertical: spacing.xs,
923
+ paddingBottom: spacing.sm,
924
+ borderBottomWidth: 2
925
+ },
926
+ label: {
927
+ fontSize: 16,
928
+ lineHeight: 24
929
+ },
930
+ pressed: {
931
+ opacity: 0.6
932
+ }
933
+ });
934
+
935
+ // components/Badge.tsx
936
+ var import_react_native11 = require("react-native");
937
+ var import_jsx_runtime10 = require("react/jsx-runtime");
938
+ var colorPalette = {
939
+ primary: { stroke: "#cefe00", solidBg: "#f8ffc5", solidText: "#536e00", outlineText: "#cefe00" },
940
+ secondary: { stroke: "#4fa971", solidBg: "#ddfad9", solidText: "#25584d", outlineText: "#25584d" },
941
+ info: { stroke: "#1048d6", solidBg: "#ebf4ff", solidText: "#1048d6", outlineText: "#1048d6" },
942
+ warning: { stroke: "#e3993a", solidBg: "#fef9ec", solidText: "#642000", outlineText: "#e3993a" },
943
+ success: { stroke: "#138135", solidBg: "#f1feeb", solidText: "#05482c", outlineText: "#138135" },
944
+ error: { stroke: "#bb4355", solidBg: "#fdefed", solidText: "#bb4355", outlineText: "#bb4355" },
945
+ gray: { stroke: "#d9d8d7", solidBg: "#e9e8e7", solidText: "#737271", outlineText: "#737271" }
946
+ };
947
+ var sizeStyles = {
948
+ sm: { height: 22, paddingHorizontal: 8, fontSize: 12, lineHeight: 18, iconSize: 12 },
949
+ md: { height: 24, paddingHorizontal: 8, fontSize: 14, lineHeight: 21, iconSize: 14 },
950
+ lg: { height: 28, paddingHorizontal: 12, fontSize: 14, lineHeight: 21, iconSize: 14 }
951
+ };
952
+ function Badge({
953
+ label,
954
+ size = "md",
955
+ color = "gray",
956
+ mode = "solid",
957
+ icon,
958
+ trailingIcon,
959
+ style,
960
+ ...rest
961
+ }) {
962
+ const palette2 = colorPalette[color];
963
+ const s = sizeStyles[size];
964
+ const bgColor = mode === "solid" ? palette2.solidBg : "transparent";
965
+ const textColor = mode === "solid" ? palette2.solidText : palette2.outlineText;
966
+ const borderColor = mode === "outline" ? palette2.stroke : "transparent";
967
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
968
+ import_react_native11.View,
969
+ {
970
+ style: [
971
+ styles6.badge,
972
+ {
973
+ height: s.height,
974
+ paddingHorizontal: s.paddingHorizontal,
975
+ backgroundColor: bgColor,
976
+ borderColor,
977
+ borderWidth: 1,
978
+ borderRadius: 16
979
+ },
980
+ style
981
+ ],
982
+ ...rest,
983
+ children: [
984
+ icon && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Icon, { name: icon, size: s.iconSize, color: textColor }),
985
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
986
+ Text,
987
+ {
988
+ variant: "caption",
989
+ textStyle: [
990
+ styles6.label,
991
+ { color: textColor, fontSize: s.fontSize, lineHeight: s.lineHeight }
992
+ ],
993
+ children: label
994
+ }
995
+ ),
996
+ trailingIcon && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Icon, { name: trailingIcon, size: s.iconSize, color: textColor })
997
+ ]
998
+ }
999
+ );
1000
+ }
1001
+ var styles6 = import_react_native11.StyleSheet.create({
1002
+ badge: {
1003
+ alignSelf: "flex-start",
1004
+ flexDirection: "row",
1005
+ alignItems: "center",
1006
+ gap: spacing.xs
1007
+ },
1008
+ label: {
1009
+ fontWeight: "500"
1010
+ }
1011
+ });
1012
+
1013
+ // components/InputField.tsx
1014
+ var import_react4 = require("react");
1015
+ var import_react_native12 = require("react-native");
1016
+ var import_jsx_runtime11 = require("react/jsx-runtime");
1017
+ function InputField({
1018
+ label,
1019
+ value,
1020
+ onChangeText,
1021
+ size = "md",
1022
+ disabled = false,
1023
+ errorMessage,
1024
+ leadingIcon,
1025
+ trailingIcon,
1026
+ onTrailingIconPress,
1027
+ placeholder,
1028
+ secureTextEntry,
1029
+ ...rest
1030
+ }) {
1031
+ const theme = useTheme();
1032
+ const [isFocused, setIsFocused] = (0, import_react4.useState)(false);
1033
+ const [isHovered, setIsHovered] = (0, import_react4.useState)(false);
1034
+ const hasValue = !!value && value.length > 0;
1035
+ const showError = !!errorMessage;
1036
+ const inputHeight = size === "sm" ? 40 : 44;
1037
+ const paddingHorizontal = size === "sm" ? 12 : 14;
1038
+ const getBorderColor = () => {
1039
+ if (showError) {
1040
+ return theme.colors.dangerMid;
1041
+ }
1042
+ if (isFocused) {
1043
+ return "#cefe00";
1044
+ }
1045
+ return "#d9d8d7";
1046
+ };
1047
+ const getBoxShadow = () => {
1048
+ if (isFocused) {
1049
+ return {
1050
+ shadowColor: "#fff6d4",
1051
+ shadowOffset: { width: 0, height: 0 },
1052
+ shadowOpacity: 1,
1053
+ shadowRadius: 0,
1054
+ elevation: 0
1055
+ };
1056
+ }
1057
+ return elevation.xs;
1058
+ };
1059
+ const containerStyle = [
1060
+ styles7.container,
1061
+ {
1062
+ height: inputHeight,
1063
+ paddingHorizontal,
1064
+ backgroundColor: isHovered && !isFocused && !showError ? "#e9e8e7" : "#faf9f7",
1065
+ borderColor: getBorderColor(),
1066
+ borderWidth: 1,
1067
+ borderRadius: 12
1068
+ },
1069
+ getBoxShadow()
1070
+ ];
1071
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: [styles7.wrapper, disabled && styles7.disabledWrapper], children: [
1072
+ label && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Text, { variant: "body", textStyle: [styles7.label, { color: "#737271" }], children: label }),
1073
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(
1074
+ import_react_native12.Pressable,
1075
+ {
1076
+ disabled,
1077
+ onHoverIn: () => setIsHovered(true),
1078
+ onHoverOut: () => setIsHovered(false),
1079
+ style: containerStyle,
1080
+ children: [
1081
+ leadingIcon && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Icon, { name: leadingIcon, size: 20, color: "#667085" }),
1082
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1083
+ import_react_native12.TextInput,
1084
+ {
1085
+ style: [
1086
+ styles7.input,
1087
+ {
1088
+ color: hasValue ? "#141414" : "#8e8d8b",
1089
+ fontSize: size === "sm" ? 13 : 14
1090
+ },
1091
+ disabled && styles7.inputDisabled
1092
+ ],
1093
+ value,
1094
+ onChangeText,
1095
+ placeholder,
1096
+ placeholderTextColor: "#8e8d8b",
1097
+ editable: !disabled,
1098
+ onFocus: () => setIsFocused(true),
1099
+ onBlur: () => setIsFocused(false),
1100
+ secureTextEntry,
1101
+ ...rest
1102
+ }
1103
+ ),
1104
+ trailingIcon && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1105
+ import_react_native12.Pressable,
1106
+ {
1107
+ onPress: onTrailingIconPress,
1108
+ disabled: !onTrailingIconPress,
1109
+ hitSlop: 8,
1110
+ style: styles7.iconButton,
1111
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Icon, { name: trailingIcon, size: 20, color: "#737271" })
1112
+ }
1113
+ )
1114
+ ]
1115
+ }
1116
+ ),
1117
+ showError && /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native12.View, { style: styles7.errorRow, children: [
1118
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Icon, { name: "warning-circle", size: 16, color: theme.colors.dangerMid }),
1119
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Text, { variant: "body", textStyle: [styles7.errorText, { color: "#737271" }], children: errorMessage })
1120
+ ] })
1121
+ ] });
1122
+ }
1123
+ var styles7 = import_react_native12.StyleSheet.create({
1124
+ wrapper: {
1125
+ gap: 4
1126
+ },
1127
+ disabledWrapper: {
1128
+ opacity: 0.32
1129
+ },
1130
+ label: {
1131
+ fontSize: 14,
1132
+ lineHeight: 21,
1133
+ fontWeight: "500"
1134
+ },
1135
+ container: {
1136
+ flexDirection: "row",
1137
+ alignItems: "center",
1138
+ gap: 8
1139
+ },
1140
+ input: {
1141
+ flex: 1,
1142
+ paddingVertical: 0,
1143
+ includeFontPadding: false,
1144
+ fontSize: 14,
1145
+ lineHeight: 21
1146
+ },
1147
+ inputDisabled: {
1148
+ opacity: 1
1149
+ },
1150
+ iconButton: {
1151
+ padding: 2
1152
+ },
1153
+ errorRow: {
1154
+ flexDirection: "row",
1155
+ alignItems: "center",
1156
+ gap: spacing.xs
1157
+ },
1158
+ errorText: {
1159
+ fontSize: 14,
1160
+ lineHeight: 21
1161
+ }
1162
+ });
1163
+
1164
+ // components/Tag.tsx
1165
+ var import_react_native13 = require("react-native");
1166
+ var import_jsx_runtime12 = require("react/jsx-runtime");
1167
+ var sizeStyles2 = {
1168
+ sm: { height: 24, paddingHorizontal: 8, fontSize: 12, lineHeight: 18, iconSize: 14, closeSize: 14, countFontSize: 12 },
1169
+ md: { height: 24, paddingHorizontal: 9, fontSize: 14, lineHeight: 21, iconSize: 16, closeSize: 16, countFontSize: 12 },
1170
+ lg: { height: 28, paddingHorizontal: 10, fontSize: 14, lineHeight: 21, iconSize: 16, closeSize: 20, countFontSize: 14 }
1171
+ };
1172
+ function Tag({
1173
+ label,
1174
+ size = "md",
1175
+ icon,
1176
+ trailingIcon,
1177
+ count,
1178
+ onPress,
1179
+ onTrailingPress,
1180
+ style,
1181
+ ...rest
1182
+ }) {
1183
+ const s = sizeStyles2[size];
1184
+ const content = /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native13.View, { style: [styles8.row, { gap: 3 }], children: [
1185
+ icon && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Icon, { name: icon, size: s.iconSize, color: "#737271" }),
1186
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1187
+ Text,
1188
+ {
1189
+ variant: "caption",
1190
+ textStyle: [styles8.label, { color: "#737271", fontSize: s.fontSize, lineHeight: s.lineHeight }],
1191
+ children: label
1192
+ }
1193
+ ),
1194
+ count !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.View, { style: [styles8.countBadge, { backgroundColor: "#e9e8e7" }], children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1195
+ Text,
1196
+ {
1197
+ variant: "caption",
1198
+ textStyle: [styles8.countText, { fontSize: s.countFontSize, color: "#737271" }],
1199
+ children: count
1200
+ }
1201
+ ) }),
1202
+ trailingIcon && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1203
+ import_react_native13.Pressable,
1204
+ {
1205
+ onPress: onTrailingPress,
1206
+ hitSlop: 4,
1207
+ style: styles8.trailingButton,
1208
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Icon, { name: trailingIcon, size: s.closeSize, color: "#737271" })
1209
+ }
1210
+ )
1211
+ ] });
1212
+ const containerStyle = [
1213
+ styles8.tag,
1214
+ {
1215
+ height: s.height,
1216
+ paddingHorizontal: s.paddingHorizontal,
1217
+ backgroundColor: "#faf9f7",
1218
+ borderColor: "#d9d8d7",
1219
+ borderWidth: 1,
1220
+ borderRadius: 6
1221
+ },
1222
+ style
1223
+ ];
1224
+ if (onPress) {
1225
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.Pressable, { accessibilityRole: "button", onPress, style: containerStyle, ...rest, children: content });
1226
+ }
1227
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native13.View, { style: containerStyle, ...rest, children: content });
1228
+ }
1229
+ var styles8 = import_react_native13.StyleSheet.create({
1230
+ tag: {
1231
+ alignSelf: "flex-start"
1232
+ },
1233
+ row: {
1234
+ flexDirection: "row",
1235
+ alignItems: "center"
1236
+ },
1237
+ label: {
1238
+ fontWeight: "500"
1239
+ },
1240
+ trailingButton: {
1241
+ padding: 2
1242
+ },
1243
+ countBadge: {
1244
+ borderRadius: 3,
1245
+ paddingHorizontal: 4,
1246
+ paddingVertical: 0,
1247
+ alignItems: "center",
1248
+ justifyContent: "center"
1249
+ },
1250
+ countText: {
1251
+ fontWeight: "500"
1252
+ }
1253
+ });
1254
+
1255
+ // components/Toggle.tsx
1256
+ var import_react_native14 = require("react-native");
1257
+ var import_jsx_runtime13 = require("react/jsx-runtime");
1258
+ var sizeConfig = {
1259
+ md: { trackWidth: 44, trackHeight: 24, thumbSize: 20, thumbOnX: 22, thumbOffX: 2, gap: 12 },
1260
+ sm: { trackWidth: 36, trackHeight: 20, thumbSize: 16, thumbOnX: 18, thumbOffX: 2, gap: 8 }
1261
+ };
1262
+ function Toggle({ value, onValueChange, label, disabled = false, size = "md" }) {
1263
+ const s = sizeConfig[size];
1264
+ const trackColor = value ? "#cefe00" : "#e9e8e7";
1265
+ const hoverTrackColor = value ? "#87ad00" : "#d9d8d7";
1266
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1267
+ import_react_native14.Pressable,
1268
+ {
1269
+ accessibilityRole: "switch",
1270
+ accessibilityState: { checked: value, disabled },
1271
+ disabled,
1272
+ onPress: () => onValueChange(!value),
1273
+ style: ({ pressed }) => [
1274
+ styles9.container,
1275
+ { gap: s.gap },
1276
+ pressed && styles9.pressed,
1277
+ disabled && styles9.disabled
1278
+ ],
1279
+ children: ({ pressed }) => /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_jsx_runtime13.Fragment, { children: [
1280
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1281
+ import_react_native14.View,
1282
+ {
1283
+ style: [
1284
+ styles9.track,
1285
+ {
1286
+ width: s.trackWidth,
1287
+ height: s.trackHeight,
1288
+ borderRadius: 12,
1289
+ backgroundColor: pressed ? hoverTrackColor : trackColor,
1290
+ justifyContent: value ? "flex-end" : "flex-start",
1291
+ paddingHorizontal: 2
1292
+ }
1293
+ ],
1294
+ children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1295
+ import_react_native14.View,
1296
+ {
1297
+ style: [
1298
+ styles9.thumb,
1299
+ {
1300
+ width: s.thumbSize,
1301
+ height: s.thumbSize,
1302
+ borderRadius: s.thumbSize / 2,
1303
+ backgroundColor: "#ffffff",
1304
+ shadowColor: "#101828",
1305
+ shadowOffset: { width: 0, height: 2 },
1306
+ shadowOpacity: 0.16,
1307
+ shadowRadius: 6,
1308
+ elevation: 3
1309
+ }
1310
+ ]
1311
+ }
1312
+ )
1313
+ }
1314
+ ),
1315
+ label && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1316
+ Text,
1317
+ {
1318
+ variant: "body",
1319
+ textStyle: [styles9.label, { color: "#141414" }],
1320
+ children: label
1321
+ }
1322
+ )
1323
+ ] })
1324
+ }
1325
+ );
1326
+ }
1327
+ var styles9 = import_react_native14.StyleSheet.create({
1328
+ container: {
1329
+ flexDirection: "row",
1330
+ alignItems: "center"
1331
+ },
1332
+ pressed: {
1333
+ opacity: 0.7
1334
+ },
1335
+ disabled: {
1336
+ opacity: 0.32
1337
+ },
1338
+ track: {
1339
+ alignItems: "center",
1340
+ justifyContent: "center"
1341
+ },
1342
+ thumb: {},
1343
+ label: {
1344
+ fontSize: 16,
1345
+ lineHeight: 24,
1346
+ fontWeight: "500"
1347
+ }
1348
+ });
1349
+
1350
+ // components/DatePicker.tsx
1351
+ var import_react5 = require("react");
1352
+ var import_react_native15 = require("react-native");
1353
+ var import_jsx_runtime14 = require("react/jsx-runtime");
1354
+ var WEEKDAYS = ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"];
1355
+ var MONTH_NAMES = [
1356
+ "Janeiro",
1357
+ "Fevereiro",
1358
+ "Mar\xE7o",
1359
+ "Abril",
1360
+ "Maio",
1361
+ "Junho",
1362
+ "Julho",
1363
+ "Agosto",
1364
+ "Setembro",
1365
+ "Outubro",
1366
+ "Novembro",
1367
+ "Dezembro"
1368
+ ];
1369
+ function getDaysInMonth(year, month) {
1370
+ return new Date(year, month + 1, 0).getDate();
1371
+ }
1372
+ function getFirstDayOfMonth(year, month) {
1373
+ const day = new Date(year, month, 1).getDay();
1374
+ return day === 0 ? 6 : day - 1;
1375
+ }
1376
+ function formatDate(date) {
1377
+ const day = date.getDate().toString().padStart(2, "0");
1378
+ const month = (date.getMonth() + 1).toString().padStart(2, "0");
1379
+ const year = date.getFullYear();
1380
+ return `${day}/${month}/${year}`;
1381
+ }
1382
+ function isSameDay(a, b) {
1383
+ return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
1384
+ }
1385
+ function isInRange(date, start, end) {
1386
+ if (!start || !end) {
1387
+ return false;
1388
+ }
1389
+ const time = date.getTime();
1390
+ return time > start.getTime() && time < end.getTime();
1391
+ }
1392
+ function DatePicker({
1393
+ startDate,
1394
+ endDate,
1395
+ onChange,
1396
+ disabled = false,
1397
+ errorMessage,
1398
+ placeholder = "Selecione as datas",
1399
+ open = false,
1400
+ onToggle
1401
+ }) {
1402
+ const [isHovered, setIsHovered] = (0, import_react5.useState)(false);
1403
+ const [viewYear, setViewYear] = (0, import_react5.useState)(startDate?.getFullYear() ?? (/* @__PURE__ */ new Date()).getFullYear());
1404
+ const [viewMonth, setViewMonth] = (0, import_react5.useState)(startDate?.getMonth() ?? (/* @__PURE__ */ new Date()).getMonth());
1405
+ const [selectingEnd, setSelectingEnd] = (0, import_react5.useState)(false);
1406
+ const showError = !!errorMessage;
1407
+ const today = /* @__PURE__ */ new Date();
1408
+ const navigateMonth = (delta) => {
1409
+ const newDate = new Date(viewYear, viewMonth + delta, 1);
1410
+ setViewYear(newDate.getFullYear());
1411
+ setViewMonth(newDate.getMonth());
1412
+ };
1413
+ const handleDayPress = (day) => {
1414
+ const date = new Date(viewYear, viewMonth, day);
1415
+ if (!selectingEnd) {
1416
+ onChange?.(date, null);
1417
+ setSelectingEnd(true);
1418
+ } else {
1419
+ if (startDate && date < startDate) {
1420
+ onChange?.(date, startDate);
1421
+ } else {
1422
+ onChange?.(startDate ?? date, date);
1423
+ }
1424
+ setSelectingEnd(false);
1425
+ }
1426
+ };
1427
+ const handleCancel = () => {
1428
+ onChange?.(null, null);
1429
+ setSelectingEnd(false);
1430
+ onToggle?.();
1431
+ };
1432
+ const handleApply = () => {
1433
+ onToggle?.();
1434
+ };
1435
+ const daysInMonth = getDaysInMonth(viewYear, viewMonth);
1436
+ const firstDay = getFirstDayOfMonth(viewYear, viewMonth);
1437
+ const triggerStyle = [
1438
+ styles10.trigger,
1439
+ {
1440
+ backgroundColor: "#faf9f7",
1441
+ borderColor: showError ? "#bb4355" : "#d9d8d7",
1442
+ borderWidth: 1,
1443
+ borderRadius: 8
1444
+ },
1445
+ elevation.xs
1446
+ ];
1447
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_react_native15.View, { style: styles10.wrapper, children: [
1448
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
1449
+ import_react_native15.Pressable,
1450
+ {
1451
+ disabled,
1452
+ onPress: onToggle,
1453
+ onHoverIn: () => setIsHovered(true),
1454
+ onHoverOut: () => setIsHovered(false),
1455
+ style: [
1456
+ triggerStyle,
1457
+ isHovered && !disabled && { backgroundColor: "#e9e8e7" }
1458
+ ],
1459
+ children: [
1460
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Icon, { name: "timer", size: 20, color: "#101828" }),
1461
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1462
+ Text,
1463
+ {
1464
+ variant: "body",
1465
+ textStyle: [
1466
+ styles10.triggerText,
1467
+ {
1468
+ color: startDate ? "#101828" : "#8e8d8b",
1469
+ fontWeight: startDate ? "600" : "400"
1470
+ }
1471
+ ],
1472
+ children: (() => {
1473
+ if (startDate && endDate) {
1474
+ return `${formatDate(startDate)} -- ${formatDate(endDate)}`;
1475
+ }
1476
+ if (startDate) {
1477
+ return `${formatDate(startDate)} --`;
1478
+ }
1479
+ return placeholder;
1480
+ })()
1481
+ }
1482
+ )
1483
+ ]
1484
+ }
1485
+ ),
1486
+ showError && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_react_native15.View, { style: styles10.errorRow, children: [
1487
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Icon, { name: "warning-circle", size: 16, color: "#bb4355" }),
1488
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Text, { variant: "body", textStyle: [styles10.errorText, { color: "#737271" }], children: errorMessage })
1489
+ ] }),
1490
+ open && /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(
1491
+ import_react_native15.View,
1492
+ {
1493
+ style: [
1494
+ styles10.calendar,
1495
+ {
1496
+ backgroundColor: "#f6f5f4",
1497
+ borderColor: "#e9e8e7"
1498
+ },
1499
+ elevation.lg
1500
+ ],
1501
+ children: [
1502
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_react_native15.View, { style: styles10.contentArea, children: [
1503
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_react_native15.View, { style: styles10.inputRow, children: [
1504
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_native15.View, { style: [styles10.dateInput, { borderColor: "#d9d8d7" }], children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Text, { variant: "body", textStyle: { color: startDate ? "#141414" : "#8e8d8b", fontSize: 14 }, children: startDate ? formatDate(startDate) : "Data inicial" }) }),
1505
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Text, { variant: "body", textStyle: { color: "#d9d8d7", fontSize: 16 }, children: "--" }),
1506
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_native15.View, { style: [styles10.dateInput, { borderColor: "#d0d5dd" }], children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Text, { variant: "body", textStyle: { color: endDate ? "#101828" : "#8e8d8b", fontSize: 14 }, children: endDate ? formatDate(endDate) : "Data final" }) })
1507
+ ] }),
1508
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_react_native15.View, { style: styles10.header, children: [
1509
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_native15.Pressable, { onPress: () => navigateMonth(-1), hitSlop: 8, style: styles10.navButton, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_native15.View, { style: { transform: [{ rotate: "180deg" }] }, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Icon, { name: "caret-right", size: 16, color: "#737271" }) }) }),
1510
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(Text, { variant: "body", textStyle: styles10.monthLabel, children: [
1511
+ MONTH_NAMES[viewMonth],
1512
+ " ",
1513
+ viewYear
1514
+ ] }),
1515
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_native15.Pressable, { onPress: () => navigateMonth(1), hitSlop: 8, style: styles10.navButton, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Icon, { name: "caret-right", size: 16, color: "#737271" }) })
1516
+ ] }),
1517
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_native15.View, { style: styles10.weekdayRow, children: WEEKDAYS.map((day) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Text, { variant: "caption", textStyle: styles10.weekdayText, children: day }, day)) }),
1518
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_react_native15.View, { style: styles10.daysGrid, children: [
1519
+ Array.from({ length: firstDay }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_native15.View, { style: styles10.dayCell }, `empty-${i}`)),
1520
+ Array.from({ length: daysInMonth }).map((_, i) => {
1521
+ const day = i + 1;
1522
+ const date = new Date(viewYear, viewMonth, day);
1523
+ const isStartDate = !!startDate && isSameDay(date, startDate);
1524
+ const isEndDate = !!endDate && isSameDay(date, endDate);
1525
+ const isSelected = isStartDate || isEndDate;
1526
+ const inRange = isInRange(date, startDate ?? null, endDate ?? null);
1527
+ const isTodayDate = isSameDay(date, today);
1528
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1529
+ import_react_native15.Pressable,
1530
+ {
1531
+ onPress: () => handleDayPress(day),
1532
+ style: [
1533
+ styles10.dayCell,
1534
+ inRange && { backgroundColor: "#d9d8d7" },
1535
+ (isStartDate || !endDate && selectingEnd && startDate && isSameDay(date, startDate)) && {
1536
+ borderRadius: 20,
1537
+ backgroundColor: "#cefe00"
1538
+ },
1539
+ isEndDate && {
1540
+ borderRadius: 20,
1541
+ backgroundColor: "#cefe00"
1542
+ }
1543
+ ],
1544
+ children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1545
+ Text,
1546
+ {
1547
+ variant: "caption",
1548
+ textStyle: [
1549
+ styles10.dayText,
1550
+ {
1551
+ color: isSelected ? "#000000" : "#141414",
1552
+ fontWeight: isTodayDate || isSelected ? "500" : "400"
1553
+ }
1554
+ ],
1555
+ children: day
1556
+ }
1557
+ )
1558
+ },
1559
+ day
1560
+ );
1561
+ })
1562
+ ] })
1563
+ ] }),
1564
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_react_native15.View, { style: styles10.bottomPanel, children: [
1565
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1566
+ import_react_native15.Pressable,
1567
+ {
1568
+ onPress: handleCancel,
1569
+ style: [styles10.actionButton, { borderColor: "#d9d8d7", backgroundColor: "#faf9f7" }],
1570
+ children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Text, { variant: "body", textStyle: { color: "#101828", fontSize: 14, fontWeight: "600" }, children: "Cancelar" })
1571
+ }
1572
+ ),
1573
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1574
+ import_react_native15.Pressable,
1575
+ {
1576
+ onPress: handleApply,
1577
+ style: [styles10.actionButton, { borderColor: "#cefe00", backgroundColor: "#cefe00" }],
1578
+ children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(Text, { variant: "body", textStyle: { color: "#000000", fontSize: 14, fontWeight: "600" }, children: "Aplicar" })
1579
+ }
1580
+ )
1581
+ ] })
1582
+ ]
1583
+ }
1584
+ )
1585
+ ] });
1586
+ }
1587
+ var styles10 = import_react_native15.StyleSheet.create({
1588
+ wrapper: {
1589
+ gap: spacing.xs
1590
+ },
1591
+ trigger: {
1592
+ flexDirection: "row",
1593
+ alignItems: "center",
1594
+ height: 40,
1595
+ paddingHorizontal: 16,
1596
+ gap: 8
1597
+ },
1598
+ triggerText: {
1599
+ fontSize: 14,
1600
+ lineHeight: 21
1601
+ },
1602
+ errorRow: {
1603
+ flexDirection: "row",
1604
+ alignItems: "center",
1605
+ gap: spacing.xs
1606
+ },
1607
+ errorText: {
1608
+ fontSize: 14,
1609
+ lineHeight: 21
1610
+ },
1611
+ calendar: {
1612
+ borderRadius: 12,
1613
+ borderWidth: 1,
1614
+ overflow: "hidden"
1615
+ },
1616
+ contentArea: {
1617
+ padding: 20,
1618
+ gap: 16
1619
+ },
1620
+ inputRow: {
1621
+ flexDirection: "row",
1622
+ alignItems: "center",
1623
+ gap: 8
1624
+ },
1625
+ dateInput: {
1626
+ flex: 1,
1627
+ height: 44,
1628
+ borderWidth: 1,
1629
+ borderRadius: 12,
1630
+ backgroundColor: "#faf9f7",
1631
+ paddingHorizontal: 14,
1632
+ alignItems: "flex-start",
1633
+ justifyContent: "center"
1634
+ },
1635
+ header: {
1636
+ flexDirection: "row",
1637
+ alignItems: "center",
1638
+ justifyContent: "space-between"
1639
+ },
1640
+ navButton: {
1641
+ width: 36,
1642
+ height: 36,
1643
+ borderRadius: 16,
1644
+ borderWidth: 1,
1645
+ borderColor: "#d9d8d7",
1646
+ alignItems: "center",
1647
+ justifyContent: "center"
1648
+ },
1649
+ monthLabel: {
1650
+ fontSize: 16,
1651
+ fontWeight: "600",
1652
+ lineHeight: 24,
1653
+ color: "#141414"
1654
+ },
1655
+ weekdayRow: {
1656
+ flexDirection: "row"
1657
+ },
1658
+ weekdayText: {
1659
+ flex: 1,
1660
+ textAlign: "center",
1661
+ fontSize: 14,
1662
+ lineHeight: 20,
1663
+ fontWeight: "500",
1664
+ color: "#101828"
1665
+ },
1666
+ daysGrid: {
1667
+ flexDirection: "row",
1668
+ flexWrap: "wrap"
1669
+ },
1670
+ dayCell: {
1671
+ width: "14.28%",
1672
+ aspectRatio: 1,
1673
+ alignItems: "center",
1674
+ justifyContent: "center",
1675
+ borderRadius: 20
1676
+ },
1677
+ dayText: {
1678
+ fontSize: 14,
1679
+ lineHeight: 20
1680
+ },
1681
+ bottomPanel: {
1682
+ flexDirection: "row",
1683
+ padding: 16,
1684
+ gap: 12,
1685
+ borderTopWidth: 1,
1686
+ borderTopColor: "#e9e8e7"
1687
+ },
1688
+ actionButton: {
1689
+ flex: 1,
1690
+ height: 40,
1691
+ borderRadius: 16,
1692
+ borderWidth: 1,
1693
+ alignItems: "center",
1694
+ justifyContent: "center"
1695
+ }
1696
+ });
1697
+
1698
+ // components/Checkbox.tsx
1699
+ var import_react6 = require("react");
1700
+ var import_react_native16 = require("react-native");
1701
+ var import_jsx_runtime15 = require("react/jsx-runtime");
1702
+ var sizeConfig2 = {
1703
+ sm: { boxSize: 16, iconSize: 12, gap: 8, fontSize: 14, lineHeight: 20, borderRadius: 4, radioRadius: 8 },
1704
+ md: { boxSize: 20, iconSize: 12, gap: 12, fontSize: 16, lineHeight: 24, borderRadius: 6, radioRadius: 10 }
1705
+ };
1706
+ function Checkbox({
1707
+ value,
1708
+ onValueChange,
1709
+ label,
1710
+ disabled = false,
1711
+ size = "md",
1712
+ type = "checkbox",
1713
+ indeterminate = false
1714
+ }) {
1715
+ const [isHovered, setIsHovered] = (0, import_react6.useState)(false);
1716
+ const s = sizeConfig2[size];
1717
+ const isChecked = value || indeterminate;
1718
+ const isRadio = type === "radio";
1719
+ const getBoxStyles = () => {
1720
+ if (isRadio) {
1721
+ const br = isChecked ? 500 : s.radioRadius;
1722
+ const borderColor2 = isChecked || isHovered ? "#cefe00" : "#d9d8d7";
1723
+ return {
1724
+ borderRadius: br,
1725
+ backgroundColor: isChecked ? "#cefe00" : "#faf9f7",
1726
+ borderColor: borderColor2
1727
+ };
1728
+ }
1729
+ let bgColor = "#faf9f7";
1730
+ if (isChecked) {
1731
+ bgColor = isHovered ? "#87ad00" : "#cefe00";
1732
+ }
1733
+ let borderColor = "#d9d8d7";
1734
+ if (isChecked) {
1735
+ borderColor = isHovered ? "#87ad00" : "#cefe00";
1736
+ } else if (isHovered) {
1737
+ borderColor = "#cefe00";
1738
+ }
1739
+ return {
1740
+ borderRadius: s.borderRadius,
1741
+ backgroundColor: bgColor,
1742
+ borderColor
1743
+ };
1744
+ };
1745
+ const boxStyles = getBoxStyles();
1746
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)(
1747
+ import_react_native16.Pressable,
1748
+ {
1749
+ accessibilityRole: isRadio ? "radio" : "checkbox",
1750
+ accessibilityState: { checked: value, disabled },
1751
+ disabled,
1752
+ onPress: () => onValueChange(!value),
1753
+ onHoverIn: () => setIsHovered(true),
1754
+ onHoverOut: () => setIsHovered(false),
1755
+ style: ({ pressed }) => [
1756
+ styles11.container,
1757
+ { gap: s.gap },
1758
+ pressed && styles11.pressed,
1759
+ disabled && styles11.disabled
1760
+ ],
1761
+ children: [
1762
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1763
+ import_react_native16.View,
1764
+ {
1765
+ style: [
1766
+ styles11.box,
1767
+ {
1768
+ width: s.boxSize,
1769
+ height: s.boxSize,
1770
+ borderWidth: isChecked ? 0 : 1.5,
1771
+ ...boxStyles
1772
+ }
1773
+ ],
1774
+ children: indeterminate ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_native16.View, { style: [styles11.indeterminateBar, { backgroundColor: "#ffffff" }] }) : isChecked && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(Icon, { name: "check", size: s.iconSize, color: "#ffffff", weight: "bold" })
1775
+ }
1776
+ ),
1777
+ label && /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1778
+ Text,
1779
+ {
1780
+ variant: "body",
1781
+ textStyle: [styles11.label, { color: "#141414", fontSize: s.fontSize, lineHeight: s.lineHeight }],
1782
+ children: label
1783
+ }
1784
+ )
1785
+ ]
1786
+ }
1787
+ );
1788
+ }
1789
+ var styles11 = import_react_native16.StyleSheet.create({
1790
+ container: {
1791
+ flexDirection: "row",
1792
+ alignItems: "center"
1793
+ },
1794
+ pressed: {
1795
+ opacity: 0.7
1796
+ },
1797
+ disabled: {
1798
+ opacity: 0.32
1799
+ },
1800
+ box: {
1801
+ alignItems: "center",
1802
+ justifyContent: "center"
1803
+ },
1804
+ indeterminateBar: {
1805
+ width: 10,
1806
+ height: 2,
1807
+ borderRadius: 1
1808
+ },
1809
+ label: {
1810
+ fontWeight: "500"
1811
+ }
1812
+ });
1813
+
1814
+ // components/TablePagination.tsx
1815
+ var import_react_native17 = require("react-native");
1816
+ var import_jsx_runtime16 = require("react/jsx-runtime");
1817
+ function getVisiblePages(current, total) {
1818
+ if (total <= 7) {
1819
+ return Array.from({ length: total }, (_, i) => i + 1);
1820
+ }
1821
+ const pages = [1];
1822
+ if (current > 3) {
1823
+ pages.push("ellipsis");
1824
+ }
1825
+ const start = Math.max(2, current - 1);
1826
+ const end = Math.min(total - 1, current + 1);
1827
+ for (let i = start; i <= end; i++) {
1828
+ pages.push(i);
1829
+ }
1830
+ if (current < total - 2) {
1831
+ pages.push("ellipsis");
1832
+ }
1833
+ if (total > 1) {
1834
+ pages.push(total);
1835
+ }
1836
+ return pages;
1837
+ }
1838
+ function TablePagination({
1839
+ currentPage,
1840
+ totalPages,
1841
+ onPageChange
1842
+ }) {
1843
+ const pages = getVisiblePages(currentPage, totalPages);
1844
+ const canGoBack = currentPage > 0;
1845
+ const canGoForward = currentPage < totalPages - 1;
1846
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(import_react_native17.View, { style: [styles12.container, { borderTopColor: "#e9e8e7" }], children: [
1847
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
1848
+ import_react_native17.Pressable,
1849
+ {
1850
+ disabled: !canGoBack,
1851
+ onPress: () => canGoBack && onPageChange(currentPage - 1),
1852
+ style: ({ pressed }) => [
1853
+ styles12.navButton,
1854
+ {
1855
+ opacity: !canGoBack ? 0.32 : 1,
1856
+ backgroundColor: "#faf9f7",
1857
+ borderColor: "#d9d8d7"
1858
+ },
1859
+ pressed && { opacity: 0.6 }
1860
+ ],
1861
+ children: [
1862
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_native17.View, { style: { transform: [{ rotate: "180deg" }] }, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Icon, { name: "caret-right", size: 20, color: "#101828" }) }),
1863
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Text, { variant: "body", textStyle: { color: "#101828", fontSize: 14, fontWeight: "600" }, children: "Anterior" })
1864
+ ]
1865
+ }
1866
+ ),
1867
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_native17.View, { style: styles12.pageNumbers, children: pages.map((page, index) => {
1868
+ if (page === "ellipsis") {
1869
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_native17.View, { style: styles12.pageCell, children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Text, { variant: "body", textStyle: { color: "#737271", fontSize: 14, fontWeight: "500" }, children: "..." }) }, `ellipsis-${index}`);
1870
+ }
1871
+ const isActive = page - 1 === currentPage;
1872
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1873
+ import_react_native17.Pressable,
1874
+ {
1875
+ onPress: () => onPageChange(page - 1),
1876
+ style: [
1877
+ styles12.pageCell,
1878
+ {
1879
+ backgroundColor: isActive ? "#e9e8e7" : "transparent",
1880
+ borderRadius: 8
1881
+ },
1882
+ isActive && {
1883
+ borderColor: "#cefe00",
1884
+ borderWidth: 1,
1885
+ ...elevation.xs
1886
+ }
1887
+ ],
1888
+ children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1889
+ Text,
1890
+ {
1891
+ variant: "body",
1892
+ textStyle: {
1893
+ color: isActive ? "#141414" : "#737271",
1894
+ fontSize: 14,
1895
+ fontWeight: "500"
1896
+ },
1897
+ children: page
1898
+ }
1899
+ )
1900
+ },
1901
+ page
1902
+ );
1903
+ }) }),
1904
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
1905
+ import_react_native17.Pressable,
1906
+ {
1907
+ disabled: !canGoForward,
1908
+ onPress: () => canGoForward && onPageChange(currentPage + 1),
1909
+ style: ({ pressed }) => [
1910
+ styles12.navButton,
1911
+ {
1912
+ opacity: !canGoForward ? 0.32 : 1,
1913
+ backgroundColor: "#faf9f7",
1914
+ borderColor: "#d9d8d7"
1915
+ },
1916
+ pressed && { opacity: 0.6 }
1917
+ ],
1918
+ children: [
1919
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Text, { variant: "body", textStyle: { color: "#101828", fontSize: 14, fontWeight: "600" }, children: "Pr\xF3ximo" }),
1920
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Icon, { name: "caret-right", size: 20, color: "#101828" })
1921
+ ]
1922
+ }
1923
+ )
1924
+ ] });
1925
+ }
1926
+ var styles12 = import_react_native17.StyleSheet.create({
1927
+ container: {
1928
+ flexDirection: "row",
1929
+ alignItems: "center",
1930
+ justifyContent: "space-between",
1931
+ paddingVertical: 12,
1932
+ paddingHorizontal: 24,
1933
+ borderTopWidth: 1
1934
+ },
1935
+ navButton: {
1936
+ flexDirection: "row",
1937
+ alignItems: "center",
1938
+ gap: 8,
1939
+ height: 36,
1940
+ paddingHorizontal: 14,
1941
+ borderRadius: 16,
1942
+ borderWidth: 1
1943
+ },
1944
+ pageNumbers: {
1945
+ flexDirection: "row",
1946
+ alignItems: "center",
1947
+ gap: 2
1948
+ },
1949
+ pageCell: {
1950
+ width: 40,
1951
+ height: 40,
1952
+ alignItems: "center",
1953
+ justifyContent: "center"
1954
+ }
1955
+ });
1956
+
1957
+ // components/LinkButton.tsx
1958
+ var import_react_native18 = require("react-native");
1959
+ var import_jsx_runtime17 = require("react/jsx-runtime");
1960
+ function LinkButton({
1961
+ label,
1962
+ icon,
1963
+ color = "primary",
1964
+ disabled,
1965
+ ...rest
1966
+ }) {
1967
+ const textColor = color === "primary" ? "#cefe00" : "#737271";
1968
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
1969
+ import_react_native18.Pressable,
1970
+ {
1971
+ accessibilityRole: "button",
1972
+ disabled,
1973
+ style: ({ pressed }) => [
1974
+ styles13.container,
1975
+ pressed && styles13.pressed,
1976
+ disabled && styles13.disabled
1977
+ ],
1978
+ ...rest,
1979
+ children: [
1980
+ icon && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Icon, { name: icon, size: 16, color: textColor }),
1981
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1982
+ Text,
1983
+ {
1984
+ variant: "body",
1985
+ textStyle: [styles13.label, { color: textColor }],
1986
+ children: label
1987
+ }
1988
+ )
1989
+ ]
1990
+ }
1991
+ );
1992
+ }
1993
+ var styles13 = import_react_native18.StyleSheet.create({
1994
+ container: {
1995
+ flexDirection: "row",
1996
+ alignItems: "center",
1997
+ gap: spacing.xs,
1998
+ alignSelf: "flex-start",
1999
+ paddingVertical: spacing.xs
2000
+ },
2001
+ pressed: {
2002
+ opacity: 0.6
2003
+ },
2004
+ disabled: {
2005
+ opacity: 0.32
2006
+ },
2007
+ label: {
2008
+ fontSize: 14,
2009
+ lineHeight: 21,
2010
+ fontWeight: "500"
2011
+ }
2012
+ });
2013
+
2014
+ // components/BottomNavBar.tsx
2015
+ var import_react_native19 = require("react-native");
2016
+ var import_jsx_runtime18 = require("react/jsx-runtime");
2017
+ function BottomNavBar({ items, activeItemId, onItemPress }) {
2018
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2019
+ import_react_native19.View,
2020
+ {
2021
+ style: [
2022
+ styles14.container,
2023
+ {
2024
+ backgroundColor: "#201f1fCC",
2025
+ borderColor: "#ffffff1A"
2026
+ }
2027
+ ],
2028
+ children: items.map((item) => {
2029
+ const isActive = item.id === activeItemId;
2030
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2031
+ import_react_native19.Pressable,
2032
+ {
2033
+ accessibilityRole: "button",
2034
+ accessibilityState: { selected: isActive },
2035
+ onPress: () => onItemPress(item.id),
2036
+ style: ({ pressed }) => [
2037
+ styles14.item,
2038
+ pressed && styles14.pressed
2039
+ ],
2040
+ children: isActive ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_native19.View, { style: styles14.activeItem, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2041
+ Icon,
2042
+ {
2043
+ name: item.icon,
2044
+ size: 25,
2045
+ color: "#141414",
2046
+ weight: "regular"
2047
+ }
2048
+ ) }) : /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_react_native19.View, { style: styles14.inactiveItem, children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
2049
+ Icon,
2050
+ {
2051
+ name: item.icon,
2052
+ size: 25,
2053
+ color: "#8e8d8b",
2054
+ weight: "regular"
2055
+ }
2056
+ ) })
2057
+ },
2058
+ item.id
2059
+ );
2060
+ })
2061
+ }
2062
+ );
2063
+ }
2064
+ var styles14 = import_react_native19.StyleSheet.create({
2065
+ container: {
2066
+ flexDirection: "row",
2067
+ alignItems: "center",
2068
+ justifyContent: "space-between",
2069
+ padding: 12,
2070
+ borderRadius: 9999,
2071
+ borderWidth: 1
2072
+ },
2073
+ item: {
2074
+ alignItems: "center",
2075
+ justifyContent: "center"
2076
+ },
2077
+ pressed: {
2078
+ opacity: 0.6
2079
+ },
2080
+ activeItem: {
2081
+ width: 55,
2082
+ height: 55,
2083
+ borderRadius: 9999,
2084
+ backgroundColor: "#cefe00",
2085
+ alignItems: "center",
2086
+ justifyContent: "center",
2087
+ shadowColor: "#caf300",
2088
+ shadowOffset: { width: 0, height: 0 },
2089
+ shadowOpacity: 0.4,
2090
+ shadowRadius: 15,
2091
+ elevation: 8
2092
+ },
2093
+ inactiveItem: {
2094
+ width: 60,
2095
+ height: 60,
2096
+ borderRadius: 9999,
2097
+ alignItems: "center",
2098
+ justifyContent: "center",
2099
+ padding: 8
2100
+ }
2101
+ });
2102
+
2103
+ // components/ProgressBar.tsx
2104
+ var import_react7 = require("react");
2105
+ var import_react_native20 = require("react-native");
2106
+ var import_jsx_runtime19 = require("react/jsx-runtime");
2107
+ function ProgressBar({ value, showLabel = true, animated = true }) {
2108
+ const clampedValue = Math.max(0, Math.min(1, value));
2109
+ const animValue = (0, import_react7.useRef)(new import_react_native20.Animated.Value(animated ? 0 : clampedValue)).current;
2110
+ (0, import_react7.useEffect)(() => {
2111
+ if (animated) {
2112
+ import_react_native20.Animated.timing(animValue, {
2113
+ toValue: clampedValue,
2114
+ duration: 400,
2115
+ easing: import_react_native20.Easing.out(import_react_native20.Easing.cubic),
2116
+ useNativeDriver: false
2117
+ }).start();
2118
+ } else {
2119
+ animValue.setValue(clampedValue);
2120
+ }
2121
+ }, [clampedValue, animated, animValue]);
2122
+ const fillWidth = animValue.interpolate({
2123
+ inputRange: [0, 1],
2124
+ outputRange: ["0%", "100%"]
2125
+ });
2126
+ const percentage = Math.round(clampedValue * 100);
2127
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_react_native20.View, { style: styles15.container, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(import_react_native20.View, { style: styles15.barRow, children: [
2128
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(import_react_native20.View, { style: styles15.track, children: /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2129
+ import_react_native20.Animated.View,
2130
+ {
2131
+ style: [
2132
+ styles15.fill,
2133
+ { width: fillWidth }
2134
+ ]
2135
+ }
2136
+ ) }),
2137
+ showLabel && /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
2138
+ Text,
2139
+ {
2140
+ variant: "body",
2141
+ textStyle: styles15.label,
2142
+ children: [
2143
+ percentage,
2144
+ "%"
2145
+ ]
2146
+ }
2147
+ )
2148
+ ] }) });
2149
+ }
2150
+ var styles15 = import_react_native20.StyleSheet.create({
2151
+ container: {
2152
+ width: "100%"
2153
+ },
2154
+ barRow: {
2155
+ flexDirection: "row",
2156
+ alignItems: "center",
2157
+ gap: 12
2158
+ },
2159
+ track: {
2160
+ flex: 1,
2161
+ height: 8,
2162
+ borderRadius: 4,
2163
+ backgroundColor: "#e9e8e7",
2164
+ overflow: "hidden"
2165
+ },
2166
+ fill: {
2167
+ height: 8,
2168
+ borderRadius: 4,
2169
+ backgroundColor: "#63ca7e"
2170
+ },
2171
+ label: {
2172
+ fontSize: 14,
2173
+ lineHeight: 21,
2174
+ fontWeight: "500",
2175
+ color: "#737271",
2176
+ minWidth: 34
2177
+ }
2178
+ });
2179
+
2180
+ // components/SearchBar.tsx
2181
+ var import_react8 = require("react");
2182
+ var import_react_native21 = require("react-native");
2183
+ var import_jsx_runtime20 = require("react/jsx-runtime");
2184
+ function SearchBar({
2185
+ label,
2186
+ value,
2187
+ onChangeText,
2188
+ placeholder = "Search",
2189
+ disabled = false,
2190
+ onClear,
2191
+ ...rest
2192
+ }) {
2193
+ const [isFocused, setIsFocused] = (0, import_react8.useState)(false);
2194
+ const [isHovered, setIsHovered] = (0, import_react8.useState)(false);
2195
+ const hasValue = !!value && value.length > 0;
2196
+ const getBorderColor = () => {
2197
+ if (isFocused) {
2198
+ return "#cefe00";
2199
+ }
2200
+ return "#d9d8d7";
2201
+ };
2202
+ const getBoxShadow = () => {
2203
+ if (isFocused) {
2204
+ return {
2205
+ shadowColor: "#fff6d4",
2206
+ shadowOffset: { width: 0, height: 0 },
2207
+ shadowOpacity: 1,
2208
+ shadowRadius: 0,
2209
+ elevation: 0
2210
+ };
2211
+ }
2212
+ return elevation.xs;
2213
+ };
2214
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(import_react_native21.View, { style: [styles16.wrapper, disabled && styles16.disabledWrapper], children: [
2215
+ label && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Text, { variant: "body", textStyle: [styles16.label, { color: "#737271" }], children: label }),
2216
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
2217
+ import_react_native21.Pressable,
2218
+ {
2219
+ disabled,
2220
+ onHoverIn: () => setIsHovered(true),
2221
+ onHoverOut: () => setIsHovered(false),
2222
+ style: [
2223
+ styles16.container,
2224
+ {
2225
+ backgroundColor: isHovered && !isFocused ? "#e9e8e7" : "#faf9f7",
2226
+ borderColor: getBorderColor(),
2227
+ borderWidth: 1,
2228
+ borderRadius: 8
2229
+ },
2230
+ getBoxShadow()
2231
+ ],
2232
+ children: [
2233
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Icon, { name: "magnifying-glass", size: 20, color: "#667085" }),
2234
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2235
+ import_react_native21.TextInput,
2236
+ {
2237
+ style: [styles16.input, { color: hasValue ? "#141414" : "#8e8d8b" }],
2238
+ value,
2239
+ onChangeText,
2240
+ placeholder,
2241
+ placeholderTextColor: "#8e8d8b",
2242
+ editable: !disabled,
2243
+ onFocus: () => setIsFocused(true),
2244
+ onBlur: () => setIsFocused(false),
2245
+ ...rest
2246
+ }
2247
+ ),
2248
+ hasValue && !disabled && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
2249
+ import_react_native21.Pressable,
2250
+ {
2251
+ onPress: () => {
2252
+ onChangeText?.("");
2253
+ onClear?.();
2254
+ },
2255
+ hitSlop: 8,
2256
+ style: styles16.clearButton,
2257
+ children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Icon, { name: "x-circle", size: 16, color: "#737271" })
2258
+ }
2259
+ )
2260
+ ]
2261
+ }
2262
+ )
2263
+ ] });
2264
+ }
2265
+ var styles16 = import_react_native21.StyleSheet.create({
2266
+ wrapper: {
2267
+ gap: 4
2268
+ },
2269
+ disabledWrapper: {
2270
+ opacity: 0.32
2271
+ },
2272
+ label: {
2273
+ fontSize: 14,
2274
+ lineHeight: 21,
2275
+ fontWeight: "500"
2276
+ },
2277
+ container: {
2278
+ flexDirection: "row",
2279
+ alignItems: "center",
2280
+ height: 44,
2281
+ paddingHorizontal: 14,
2282
+ gap: 8
2283
+ },
2284
+ input: {
2285
+ flex: 1,
2286
+ paddingVertical: 0,
2287
+ includeFontPadding: false,
2288
+ fontSize: 14,
2289
+ lineHeight: 21
2290
+ },
2291
+ clearButton: {
2292
+ padding: 2
2293
+ }
2294
+ });
2295
+
2296
+ // components/Slider.tsx
2297
+ var import_react9 = require("react");
2298
+ var import_react_native22 = require("react-native");
2299
+ var import_jsx_runtime21 = require("react/jsx-runtime");
2300
+ function Slider({
2301
+ value,
2302
+ minimumValue = 0,
2303
+ maximumValue = 100,
2304
+ step = 1,
2305
+ onValueChange,
2306
+ disabled = false,
2307
+ showValueLabel = true
2308
+ }) {
2309
+ const trackWidthRef = (0, import_react9.useRef)(0);
2310
+ const range = maximumValue - minimumValue;
2311
+ const percentage = range > 0 ? (value - minimumValue) / range : 0;
2312
+ const clampToStep = (0, import_react9.useCallback)(
2313
+ (raw) => {
2314
+ const stepped = Math.round((raw - minimumValue) / step) * step + minimumValue;
2315
+ return Math.max(minimumValue, Math.min(maximumValue, stepped));
2316
+ },
2317
+ [minimumValue, maximumValue, step]
2318
+ );
2319
+ const panResponder = (0, import_react9.useRef)(
2320
+ import_react_native22.PanResponder.create({
2321
+ onStartShouldSetPanResponder: () => !disabled,
2322
+ onMoveShouldSetPanResponder: () => !disabled,
2323
+ onPanResponderMove: (_, gestureState) => {
2324
+ if (trackWidthRef.current === 0) {
2325
+ return;
2326
+ }
2327
+ const newX = Math.max(
2328
+ 0,
2329
+ Math.min(1, (gestureState.x0 + gestureState.dx) / trackWidthRef.current)
2330
+ );
2331
+ const rawValue = newX * range + minimumValue;
2332
+ onValueChange(clampToStep(rawValue));
2333
+ }
2334
+ })
2335
+ ).current;
2336
+ const onTrackLayout = (0, import_react9.useCallback)((e) => {
2337
+ trackWidthRef.current = e.nativeEvent.layout.width;
2338
+ }, []);
2339
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(import_react_native22.View, { style: [styles17.wrapper, disabled && styles17.disabled], children: [
2340
+ showValueLabel && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
2341
+ Text,
2342
+ {
2343
+ variant: "body",
2344
+ textStyle: [styles17.valueLabel, { color: "#101828" }],
2345
+ children: [
2346
+ String(value),
2347
+ "%"
2348
+ ]
2349
+ }
2350
+ ),
2351
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
2352
+ import_react_native22.View,
2353
+ {
2354
+ onLayout: onTrackLayout,
2355
+ ...panResponder.panHandlers,
2356
+ style: styles17.trackContainer,
2357
+ children: [
2358
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_react_native22.View, { style: styles17.track, children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2359
+ import_react_native22.View,
2360
+ {
2361
+ style: [
2362
+ styles17.fill,
2363
+ { width: `${percentage * 100}%` }
2364
+ ]
2365
+ }
2366
+ ) }),
2367
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
2368
+ import_react_native22.View,
2369
+ {
2370
+ style: [
2371
+ styles17.thumb,
2372
+ {
2373
+ left: `${percentage * 100}%`
2374
+ }
2375
+ ],
2376
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_react_native22.View, { style: styles17.thumbInner })
2377
+ }
2378
+ )
2379
+ ]
2380
+ }
2381
+ )
2382
+ ] });
2383
+ }
2384
+ var styles17 = import_react_native22.StyleSheet.create({
2385
+ wrapper: {
2386
+ gap: spacing.sm
2387
+ },
2388
+ disabled: {
2389
+ opacity: 0.32
2390
+ },
2391
+ valueLabel: {
2392
+ fontSize: 16,
2393
+ lineHeight: 24,
2394
+ fontWeight: "500",
2395
+ textAlign: "center"
2396
+ },
2397
+ trackContainer: {
2398
+ position: "relative",
2399
+ height: 40,
2400
+ justifyContent: "center"
2401
+ },
2402
+ track: {
2403
+ height: 8,
2404
+ borderRadius: 4,
2405
+ backgroundColor: "#e9e8e7",
2406
+ overflow: "hidden"
2407
+ },
2408
+ fill: {
2409
+ height: 8,
2410
+ borderRadius: 4,
2411
+ backgroundColor: "#cefe00"
2412
+ },
2413
+ thumb: {
2414
+ position: "absolute",
2415
+ width: 24,
2416
+ height: 24,
2417
+ marginLeft: -12,
2418
+ top: 8,
2419
+ alignItems: "center",
2420
+ justifyContent: "center"
2421
+ },
2422
+ thumbInner: {
2423
+ width: 24,
2424
+ height: 24,
2425
+ borderRadius: 12,
2426
+ backgroundColor: "#ffffff",
2427
+ borderWidth: 1.5,
2428
+ borderColor: "#cefe00",
2429
+ shadowColor: "#101828",
2430
+ shadowOffset: { width: 0, height: 2 },
2431
+ shadowOpacity: 0.16,
2432
+ shadowRadius: 6,
2433
+ elevation: 4
2434
+ }
2435
+ });
2436
+
2437
+ // components/TabMenu.tsx
2438
+ var import_react10 = require("react");
2439
+ var import_react_native23 = require("react-native");
2440
+ var import_jsx_runtime22 = require("react/jsx-runtime");
2441
+ function TabMenu({ tabs, activeTabId, onTabChange }) {
2442
+ const [hoveredId, setHoveredId] = (0, import_react10.useState)(null);
2443
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_react_native23.View, { style: styles18.container, children: tabs.map((tab) => {
2444
+ const isActive = tab.id === activeTabId;
2445
+ const isHovered = tab.id === hoveredId;
2446
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2447
+ import_react_native23.Pressable,
2448
+ {
2449
+ accessibilityRole: "tab",
2450
+ accessibilityState: { selected: isActive },
2451
+ onPress: () => onTabChange(tab.id),
2452
+ onHoverIn: () => setHoveredId(tab.id),
2453
+ onHoverOut: () => setHoveredId(null),
2454
+ style: [
2455
+ styles18.tab,
2456
+ {
2457
+ borderBottomColor: isActive ? "#cefe00" : "#e9e8e7",
2458
+ borderBottomWidth: isActive ? 2 : 1,
2459
+ backgroundColor: isHovered && !isActive ? "#e9e8e7" : "transparent"
2460
+ }
2461
+ ],
2462
+ children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
2463
+ Text,
2464
+ {
2465
+ variant: "body",
2466
+ textStyle: [
2467
+ styles18.label,
2468
+ {
2469
+ color: isActive ? "#cefe00" : "#737271",
2470
+ fontWeight: isActive ? "700" : "400"
2471
+ }
2472
+ ],
2473
+ children: tab.label
2474
+ }
2475
+ )
2476
+ },
2477
+ tab.id
2478
+ );
2479
+ }) });
2480
+ }
2481
+ var styles18 = import_react_native23.StyleSheet.create({
2482
+ container: {
2483
+ flexDirection: "row"
2484
+ },
2485
+ tab: {
2486
+ flex: 1,
2487
+ alignItems: "center",
2488
+ justifyContent: "center",
2489
+ paddingVertical: 4,
2490
+ paddingBottom: 12
2491
+ },
2492
+ label: {
2493
+ fontSize: 16,
2494
+ lineHeight: 24
2495
+ }
2496
+ });
2497
+ // Annotate the CommonJS export names for ESM import in node:
2498
+ 0 && (module.exports = {
2499
+ Autocomplete,
2500
+ Badge,
2501
+ BottomNavBar,
2502
+ Box,
2503
+ Button,
2504
+ Card,
2505
+ Checkbox,
2506
+ DatePicker,
2507
+ DropdownSelect,
2508
+ Icon,
2509
+ InputField,
2510
+ LinkButton,
2511
+ ProgressBar,
2512
+ SearchBar,
2513
+ SegmentedTabs,
2514
+ Slider,
2515
+ TabMenu,
2516
+ TablePagination,
2517
+ Tag,
2518
+ Text,
2519
+ ThemeProvider,
2520
+ Toggle,
2521
+ colorMap,
2522
+ darkColors,
2523
+ elevation,
2524
+ lightColors,
2525
+ radius,
2526
+ radiusMap,
2527
+ spacing,
2528
+ spacingMap,
2529
+ typography,
2530
+ useTheme
2531
+ });