@12min/ds 1.0.0 → 3.0.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.
@@ -20,21 +20,31 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // index.native.ts
21
21
  var index_native_exports = {};
22
22
  __export(index_native_exports, {
23
- ActionItem: () => ActionItem,
24
23
  Alert: () => Alert,
25
24
  Button: () => Button,
25
+ ButtonIcon: () => ButtonIcon,
26
26
  Checkbox: () => Checkbox,
27
27
  Chip: () => Chip,
28
+ ChoiceCard: () => ChoiceCard,
28
29
  DSThemeProvider: () => DSThemeProvider,
30
+ DismissButton: () => DismissButton,
29
31
  Input: () => Input,
32
+ InputField: () => InputField,
33
+ ListItem: () => ListItem,
30
34
  ProgressBar: () => ProgressBar,
31
35
  RadioGroup: () => RadioGroup,
32
- RadioItem: () => RadioItem,
33
36
  RatingScale: () => RatingScale,
34
37
  Stepper: () => Stepper,
38
+ ToggleSwitch: () => ToggleSwitch,
39
+ borderWidth: () => borderWidth,
35
40
  colors: () => colors,
36
41
  darkTheme: () => darkTheme,
42
+ grid: () => grid,
37
43
  lightTheme: () => lightTheme,
44
+ opacity: () => opacity,
45
+ radius: () => radius,
46
+ shadow: () => shadow,
47
+ spacing: () => spacing,
38
48
  typography: () => typography,
39
49
  useTheme: () => useTheme
40
50
  });
@@ -44,12 +54,12 @@ module.exports = __toCommonJS(index_native_exports);
44
54
  var colors = {
45
55
  marianBlue: {
46
56
  50: "#FAFBFF",
47
- 100: "#F1F4FE",
57
+ 100: "#F6F8FF",
48
58
  200: "#E1E7FF",
49
59
  300: "#C3CCF7",
50
60
  400: "#94A5F2",
51
61
  500: "#697DD6",
52
- 600: "#475CBB",
62
+ 600: "#4357AD",
53
63
  700: "#31428B",
54
64
  800: "#25326A",
55
65
  900: "#131937"
@@ -61,12 +71,15 @@ var colors = {
61
71
  300: "#474747",
62
72
  400: "#3D3D3D",
63
73
  500: "#333333",
64
- 600: "#1E1E1E",
74
+ 600: "#292929",
65
75
  700: "#161616",
66
76
  800: "#141414",
67
77
  900: "#0A0A0A"
68
78
  },
69
79
  gray: {
80
+ 15: "#F4F5F8",
81
+ 25: "#EDEEF1",
82
+ 35: "#DDE0E6",
70
83
  50: "#B1B5BE",
71
84
  100: "#A6ABB5",
72
85
  200: "#9BA0AB",
@@ -78,7 +91,20 @@ var colors = {
78
91
  800: "#5D636F",
79
92
  900: "#545964"
80
93
  },
81
- mustard: {
94
+ amber: {
95
+ 50: "#FFFBEB",
96
+ 100: "#FEF3C7",
97
+ 200: "#FDE68A",
98
+ 300: "#FCD34D",
99
+ 400: "#FBBF24",
100
+ 500: "#F59E0B",
101
+ 600: "#D97706",
102
+ 700: "#B45309",
103
+ 800: "#92400E",
104
+ 900: "#78350F",
105
+ text: "#BA5C0A"
106
+ },
107
+ yellow: {
82
108
  50: "#FFF2D6",
83
109
  100: "#FFECC2",
84
110
  200: "#FFE5AD",
@@ -91,97 +117,337 @@ var colors = {
91
117
  900: "#FFB81F"
92
118
  },
93
119
  ketchup: {
94
- 50: "#FFD6D6",
95
- 100: "#FFC2C2",
96
- 200: "#FFADAD",
97
- 300: "#FF9999",
98
- 400: "#FF8585",
99
- 500: "#FF7070",
100
- 600: "#FF5C5C",
101
- 700: "#FF4040",
102
- 800: "#FF3333",
103
- 900: "#FF1F1F"
120
+ 50: "#FEF2F2",
121
+ 100: "#FEE2E2",
122
+ 200: "#FECACA",
123
+ 300: "#FCA5A5",
124
+ 400: "#F87171",
125
+ 500: "#EF4444",
126
+ 600: "#DC2626",
127
+ 700: "#B91C1C",
128
+ 800: "#991B1B",
129
+ 900: "#7F1D1D",
130
+ text: "#D91F3C"
131
+ },
132
+ green: {
133
+ 50: "#F2FDF4",
134
+ 100: "#E5FBE9",
135
+ 200: "#C7F4D0",
136
+ 300: "#99E5AC",
137
+ 400: "#5FCD80",
138
+ 500: "#36B260",
139
+ 600: "#258F4B",
140
+ 700: "#1B6F3B",
141
+ 800: "#145430",
142
+ 900: "#0E3622",
143
+ text: "#0E8745"
144
+ },
145
+ blue: {
146
+ 50: "#EFF6FF",
147
+ 100: "#DBEAFE",
148
+ 200: "#BFDBFE",
149
+ 300: "#93C5FD",
150
+ 400: "#60A5FA",
151
+ 500: "#3B82F6",
152
+ 600: "#2563EB",
153
+ 700: "#1D4ED8",
154
+ 800: "#1E40AF",
155
+ 900: "#1E3A8A",
156
+ text: "#1E40AF"
157
+ },
158
+ // Single brand accent green — the vibrant tone that was previously green/300
159
+ // before the green scale was retuned to muted values in the Figma v2 palette.
160
+ brandGreen: "#6DFFB4",
161
+ overlayBlack: {
162
+ 5: "#0000000D",
163
+ 8: "#00000014",
164
+ 12: "#0000001F",
165
+ 16: "#00000029"
104
166
  },
105
- mint: {
106
- 50: "#A7F1B7",
107
- 100: "#96EEA9",
108
- 200: "#84EB9A",
109
- 300: "#73E88C",
110
- 400: "#61E57E",
111
- 500: "#50E26F",
112
- 600: "#3EE061",
113
- 700: "#24DC4C",
114
- 800: "#22D348",
115
- 900: "#1FC142"
167
+ overlayWhite: {
168
+ 5: "#FFFFFF0D",
169
+ 8: "#FFFFFF14",
170
+ 12: "#FFFFFF1F",
171
+ 16: "#FFFFFF29"
116
172
  },
117
173
  white: "#FFFFFF",
118
- successBg: "#E5FBE9"
174
+ black: "#000000"
119
175
  };
120
176
 
121
177
  // src/tokens/typography.ts
122
178
  var typography = {
123
- display: { fontSize: 32, fontWeight: "700", lineHeight: 1.2, fontFamily: "Poppins" },
124
- h1: { fontSize: 24, fontWeight: "700", lineHeight: 1.3, fontFamily: "Poppins" },
125
- h2: { fontSize: 20, fontWeight: "600", lineHeight: 1.3, fontFamily: "Poppins" },
126
- h3: { fontSize: 18, fontWeight: "600", lineHeight: 1.4, fontFamily: "Poppins" },
127
- bodyLarge: { fontSize: 16, fontWeight: "400", lineHeight: 1.5, fontFamily: "Inter" },
128
- bodyDefault: { fontSize: 14, fontWeight: "400", lineHeight: 1.5, fontFamily: "Inter" },
129
- bodySmall: { fontSize: 12, fontWeight: "400", lineHeight: 1.5, fontFamily: "Inter" },
130
- labelLarge: { fontSize: 16, fontWeight: "500", lineHeight: 1.5, fontFamily: "Inter" },
131
- labelDefault: { fontSize: 14, fontWeight: "500", lineHeight: 1.5, fontFamily: "Inter" },
132
- labelSmall: { fontSize: 12, fontWeight: "500", lineHeight: 1.5, fontFamily: "Inter" },
133
- caption: { fontSize: 12, fontWeight: "500", lineHeight: 1.5, fontFamily: "Inter" },
134
- overline: { fontSize: 10, fontWeight: "600", lineHeight: 1, fontFamily: "Inter" },
135
- buttonLarge: { fontSize: 16, fontWeight: "600", lineHeight: 1.5, fontFamily: "Inter" },
136
- buttonDefault: { fontSize: 14, fontWeight: "600", lineHeight: 1.5, fontFamily: "Inter" }
179
+ display1: { fontFamily: "Poppins", fontSize: 32, fontWeight: "700", lineHeight: 40, letterSpacing: -1, textTransform: "none" },
180
+ display2: { fontFamily: "Poppins", fontSize: 32, fontWeight: "700", lineHeight: 40, letterSpacing: -1, textTransform: "none" },
181
+ h1: { fontFamily: "Poppins", fontSize: 24, fontWeight: "700", lineHeight: 32, letterSpacing: -1, textTransform: "none" },
182
+ h2: { fontFamily: "Poppins", fontSize: 20, fontWeight: "700", lineHeight: 28, letterSpacing: 0, textTransform: "none" },
183
+ h3: { fontFamily: "Poppins", fontSize: 16, fontWeight: "600", lineHeight: 24, letterSpacing: 0, textTransform: "none" },
184
+ bodyLarge: { fontFamily: "Inter", fontSize: 16, fontWeight: "500", lineHeight: 24, letterSpacing: 0, textTransform: "none" },
185
+ bodyDefault: { fontFamily: "Inter", fontSize: 14, fontWeight: "500", lineHeight: 20, letterSpacing: 0, textTransform: "none" },
186
+ bodySmall: { fontFamily: "Inter", fontSize: 12, fontWeight: "400", lineHeight: 16, letterSpacing: 0.2, textTransform: "none" },
187
+ labelLarge: { fontFamily: "Inter", fontSize: 16, fontWeight: "600", lineHeight: 20, letterSpacing: 0, textTransform: "none" },
188
+ labelDefault: { fontFamily: "Inter", fontSize: 14, fontWeight: "600", lineHeight: 20, letterSpacing: 0, textTransform: "none" },
189
+ labelSmall: { fontFamily: "Inter", fontSize: 12, fontWeight: "600", lineHeight: 16, letterSpacing: 0.2, textTransform: "none" },
190
+ labelTiny: { fontFamily: "Inter", fontSize: 10, fontWeight: "600", lineHeight: 14, letterSpacing: 0, textTransform: "none" },
191
+ caption: { fontFamily: "Inter", fontSize: 12, fontWeight: "500", lineHeight: 16, letterSpacing: 0.5, textTransform: "none" },
192
+ captionUppercase: { fontFamily: "Inter", fontSize: 12, fontWeight: "500", lineHeight: 16, letterSpacing: 0.5, textTransform: "uppercase" },
193
+ overline: { fontFamily: "Inter", fontSize: 10, fontWeight: "600", lineHeight: 16, letterSpacing: 8, textTransform: "uppercase" },
194
+ buttonLarge: { fontFamily: "Inter", fontSize: 16, fontWeight: "600", lineHeight: 20, letterSpacing: 0, textTransform: "none" },
195
+ buttonDefault: { fontFamily: "Inter", fontSize: 14, fontWeight: "600", lineHeight: 20, letterSpacing: 0, textTransform: "none" },
196
+ buttonSmall: { fontFamily: "Inter", fontSize: 12, fontWeight: "600", lineHeight: 16, letterSpacing: 0, textTransform: "none" }
197
+ };
198
+
199
+ // src/tokens/spacing.ts
200
+ var spacing = {
201
+ unit: 4,
202
+ gap: {
203
+ "0.5": 2,
204
+ "1": 4,
205
+ "2": 8,
206
+ "3": 12,
207
+ "4": 16,
208
+ "5": 20,
209
+ "6": 24,
210
+ "8": 32,
211
+ "10": 40,
212
+ "12": 48,
213
+ "14": 56,
214
+ "16": 64,
215
+ "18": 72,
216
+ "20": 80,
217
+ "22": 88,
218
+ "24": 96
219
+ },
220
+ screen: {
221
+ x: 16,
222
+ y: 24
223
+ }
224
+ };
225
+
226
+ // src/tokens/grid.ts
227
+ var grid = {
228
+ // 8px square baseline — line-height/* steps 16/24/32/40 snap; 20 and 28 land on a half-cell
229
+ baseline: 8,
230
+ breakpoints: {
231
+ mobile: 0,
232
+ tablet: 768,
233
+ desktop: 1024
234
+ },
235
+ columns: {
236
+ mobile: 4,
237
+ tablet: 8,
238
+ desktop: 12
239
+ },
240
+ gutter: {
241
+ mobile: 8,
242
+ tablet: 16,
243
+ desktop: 24
244
+ },
245
+ margin: {
246
+ mobile: 20,
247
+ tablet: 24,
248
+ desktop: 32
249
+ }
250
+ };
251
+
252
+ // src/tokens/radius.ts
253
+ var radius = {
254
+ none: 0,
255
+ sm: 8,
256
+ md: 12,
257
+ lg: 16,
258
+ xl: 20,
259
+ "2xl": 24,
260
+ full: 9999,
261
+ button: 16,
262
+ card: 20,
263
+ input: 12,
264
+ chip: 9999,
265
+ badge: 8
266
+ };
267
+
268
+ // src/tokens/borderWidth.ts
269
+ var borderWidth = {
270
+ default: 1,
271
+ strong: 1.5,
272
+ heavy: 2
273
+ };
274
+
275
+ // src/tokens/shadow.ts
276
+ var shadow = {
277
+ sm: { offsetX: 0, offsetY: 1, blur: 3, spread: 0, color: "#000000", opacity: { light: 0.08, dark: 0.4 } },
278
+ md: { offsetX: 0, offsetY: 4, blur: 12, spread: 0, color: "#000000", opacity: { light: 0.1, dark: 0.5 } },
279
+ lg: { offsetX: 0, offsetY: 8, blur: 24, spread: -4, color: "#000000", opacity: { light: 0.12, dark: 0.6 } }
280
+ };
281
+
282
+ // src/tokens/opacity.ts
283
+ var opacity = {
284
+ disabled: 0.4,
285
+ hover: 0.08,
286
+ pressed: 0.12
137
287
  };
138
288
 
139
289
  // src/themes/lightTheme.ts
140
290
  var lightTheme = {
141
- background: colors.marianBlue[50],
142
- surface: colors.marianBlue[100],
143
- border: colors.marianBlue[200],
144
- onBackground: colors.midnight[900],
145
- onSurface: colors.midnight[700],
146
- muted: colors.gray[500],
147
- primary: colors.marianBlue[600],
148
- secondary: colors.midnight[900],
149
- success: colors.mint[800],
150
- error: colors.ketchup[600],
151
- warning: colors.mustard[500],
152
- info: colors.marianBlue[500],
153
- surfaceDisabled: colors.gray[50],
154
- successBg: colors.successBg,
155
- textSecondary: colors.gray[700],
156
- textTertiary: colors.gray[500],
157
- textInverse: colors.white,
158
- borderStrong: colors.marianBlue[600],
159
- borderSubtle: colors.marianBlue[200],
160
- interactivePressed: colors.marianBlue[800]
291
+ bg: {
292
+ primary: colors.marianBlue[600],
293
+ primaryHover: colors.marianBlue[700],
294
+ primaryPressed: colors.marianBlue[800],
295
+ primarySubtle: colors.marianBlue[200],
296
+ primarySubtleHover: colors.marianBlue[300],
297
+ primarySubtlePressed: colors.marianBlue[400],
298
+ surface: colors.white,
299
+ surfaceRaised: colors.marianBlue[50],
300
+ surfaceHover: colors.gray[15],
301
+ surfacePressed: colors.gray[35],
302
+ overlay: colors.marianBlue[900],
303
+ overlaySubtle: colors.overlayBlack[8],
304
+ overlaySubtleHover: colors.overlayBlack[12],
305
+ overlaySubtlePressed: colors.overlayBlack[16],
306
+ success: colors.green[600],
307
+ successSubtle: colors.green[100],
308
+ error: colors.ketchup[600],
309
+ errorSubtle: colors.ketchup[100],
310
+ warning: colors.amber[500],
311
+ warningSubtle: colors.amber[100],
312
+ info: colors.blue[500],
313
+ infoSubtle: colors.blue[100],
314
+ highlight: colors.brandGreen,
315
+ accent: colors.amber[500],
316
+ accentSubtle: colors.amber[100],
317
+ disabled: colors.gray[25]
318
+ },
319
+ text: {
320
+ primary: colors.marianBlue[900],
321
+ secondary: colors.gray[700],
322
+ inverse: colors.white,
323
+ brand: colors.marianBlue[600],
324
+ link: colors.marianBlue[600],
325
+ placeholder: colors.gray[400],
326
+ success: colors.green.text,
327
+ error: colors.ketchup.text,
328
+ warning: colors.amber.text,
329
+ info: colors.blue.text,
330
+ highlight: colors.marianBlue[900],
331
+ accent: colors.amber.text,
332
+ disabled: colors.gray[400],
333
+ onSuccess: colors.white,
334
+ onError: colors.white,
335
+ onWarning: colors.midnight[900],
336
+ onHighlight: colors.midnight[900]
337
+ },
338
+ border: {
339
+ default: colors.marianBlue[200],
340
+ strong: colors.marianBlue[600],
341
+ subtle: colors.overlayBlack[5],
342
+ focus: colors.black,
343
+ accent: colors.amber[700],
344
+ success: colors.green.text,
345
+ error: colors.ketchup[600],
346
+ warning: colors.amber[700],
347
+ info: colors.blue[600],
348
+ disabled: colors.gray[50]
349
+ },
350
+ icon: {
351
+ primary: colors.marianBlue[900],
352
+ secondary: colors.gray[600],
353
+ inverse: colors.white,
354
+ brand: colors.marianBlue[600],
355
+ accent: colors.amber[700],
356
+ success: colors.green.text,
357
+ error: colors.ketchup[600],
358
+ warning: colors.amber[600],
359
+ info: colors.blue[600],
360
+ highlight: colors.marianBlue[900],
361
+ disabled: colors.gray[400]
362
+ },
363
+ interactive: {
364
+ hover: colors.overlayBlack[8],
365
+ pressed: colors.overlayBlack[12],
366
+ selected: colors.marianBlue[700],
367
+ selectedSubtle: colors.marianBlue[200]
368
+ }
161
369
  };
162
370
 
163
371
  // src/themes/darkTheme.ts
164
372
  var darkTheme = {
165
- background: colors.midnight[900],
166
- surface: colors.midnight[700],
167
- border: colors.midnight[500],
168
- onBackground: colors.marianBlue[50],
169
- onSurface: colors.gray[50],
170
- muted: colors.gray[600],
171
- primary: colors.marianBlue[400],
172
- secondary: colors.marianBlue[50],
173
- success: colors.mint[400],
174
- error: colors.ketchup[400],
175
- warning: colors.mustard[400],
176
- info: colors.marianBlue[300],
177
- surfaceDisabled: colors.midnight[600],
178
- successBg: colors.midnight[800],
179
- textSecondary: colors.gray[400],
180
- textTertiary: colors.gray[500],
181
- textInverse: colors.midnight[900],
182
- borderStrong: colors.marianBlue[400],
183
- borderSubtle: colors.midnight[600],
184
- interactivePressed: colors.marianBlue[300]
373
+ bg: {
374
+ primary: colors.marianBlue[600],
375
+ primaryHover: colors.marianBlue[500],
376
+ primaryPressed: colors.marianBlue[600],
377
+ primarySubtle: colors.marianBlue[900],
378
+ primarySubtleHover: colors.marianBlue[800],
379
+ primarySubtlePressed: colors.marianBlue[700],
380
+ surface: colors.midnight[900],
381
+ surfaceRaised: colors.midnight[800],
382
+ surfaceHover: colors.midnight[800],
383
+ surfacePressed: colors.midnight[600],
384
+ overlay: colors.black,
385
+ overlaySubtle: colors.overlayWhite[8],
386
+ overlaySubtleHover: colors.overlayWhite[12],
387
+ overlaySubtlePressed: colors.overlayWhite[16],
388
+ success: colors.green[300],
389
+ successSubtle: colors.green[800],
390
+ error: colors.ketchup[900],
391
+ errorSubtle: colors.ketchup[800],
392
+ warning: colors.amber[900],
393
+ warningSubtle: colors.amber[800],
394
+ info: colors.blue[600],
395
+ infoSubtle: colors.blue[700],
396
+ highlight: colors.brandGreen,
397
+ accent: colors.amber[900],
398
+ accentSubtle: colors.amber[900],
399
+ disabled: colors.midnight[700]
400
+ },
401
+ text: {
402
+ primary: colors.white,
403
+ secondary: colors.gray[300],
404
+ inverse: colors.midnight[900],
405
+ brand: colors.marianBlue[300],
406
+ link: colors.marianBlue[300],
407
+ placeholder: colors.gray[400],
408
+ success: colors.green[500],
409
+ error: colors.ketchup[600],
410
+ warning: colors.amber[500],
411
+ info: colors.blue[100],
412
+ highlight: colors.marianBlue[900],
413
+ accent: colors.amber.text,
414
+ disabled: colors.gray[600],
415
+ onSuccess: colors.white,
416
+ onError: colors.white,
417
+ onWarning: colors.midnight[900],
418
+ onHighlight: colors.midnight[900]
419
+ },
420
+ border: {
421
+ default: colors.midnight[50],
422
+ strong: colors.marianBlue[300],
423
+ subtle: colors.overlayWhite[5],
424
+ focus: colors.white,
425
+ accent: colors.amber.text,
426
+ success: colors.green.text,
427
+ error: colors.ketchup[500],
428
+ warning: colors.amber[600],
429
+ info: colors.blue[500],
430
+ disabled: colors.midnight[700]
431
+ },
432
+ icon: {
433
+ primary: colors.white,
434
+ secondary: colors.gray[400],
435
+ inverse: colors.midnight[900],
436
+ brand: colors.marianBlue[300],
437
+ accent: colors.amber[700],
438
+ success: colors.green.text,
439
+ error: colors.ketchup.text,
440
+ warning: colors.amber[100],
441
+ info: colors.blue[100],
442
+ highlight: colors.marianBlue[900],
443
+ disabled: colors.gray[600]
444
+ },
445
+ interactive: {
446
+ hover: colors.overlayWhite[8],
447
+ pressed: colors.overlayWhite[12],
448
+ selected: colors.marianBlue[800],
449
+ selectedSubtle: colors.marianBlue[900]
450
+ }
185
451
  };
186
452
 
187
453
  // src/context/ThemeProvider.tsx
@@ -208,25 +474,32 @@ var import_react_native = require("react-native");
208
474
  // src/components/Button/Button.styles.ts
209
475
  var buttonTokens = {
210
476
  sizes: {
211
- sm: { height: 36, paddingHorizontal: 14, fontSize: 14 },
212
- md: { height: 48, paddingHorizontal: 16, fontSize: 16 },
213
- lg: { height: 56, paddingHorizontal: 24, fontSize: 18 }
477
+ sm: { height: 32, paddingHorizontal: 12 },
478
+ md: { height: 40, paddingHorizontal: 16 },
479
+ lg: { height: 48, paddingHorizontal: 24 }
214
480
  },
215
- borderRadius: 9999
481
+ borderRadius: radius.full
216
482
  };
217
483
 
218
484
  // src/components/Button/Button.native.tsx
219
485
  var import_jsx_runtime2 = require("react/jsx-runtime");
220
- function Button({ variant = "primary", size = "md", disabled = false, children, onPress }) {
486
+ var textStyleBySize = {
487
+ sm: typography.buttonSmall,
488
+ md: typography.buttonDefault,
489
+ lg: typography.buttonLarge
490
+ };
491
+ function Button({ variant = "primary", size = "lg", disabled = false, children, onPress }) {
221
492
  const { theme } = useTheme();
222
- const { sizes, borderRadius } = buttonTokens;
223
- const sizeStyle = sizes[size];
224
- const bgColor = disabled ? theme.surfaceDisabled : variant === "primary" ? theme.primary : variant === "secondary" ? theme.surface : "transparent";
225
- const textColor = variant === "primary" ? theme.textInverse : variant === "secondary" ? theme.onBackground : theme.primary;
493
+ const { sizes: sizes2, borderRadius } = buttonTokens;
494
+ const sizeStyle = sizes2[size];
495
+ const textStyle = textStyleBySize[size];
496
+ const bgColor = disabled ? variant === "ghost" ? "transparent" : theme.bg.disabled : variant === "primary" ? theme.bg.primary : variant === "secondary" ? theme.bg.primarySubtle : "transparent";
497
+ const textColor = disabled ? theme.text.disabled : variant === "primary" ? theme.text.inverse : variant === "secondary" ? theme.text.primary : theme.text.brand;
226
498
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
227
499
  import_react_native.Pressable,
228
500
  {
229
501
  onPress: disabled ? void 0 : onPress,
502
+ disabled,
230
503
  style: ({ pressed }) => [
231
504
  styles.base,
232
505
  {
@@ -234,147 +507,265 @@ function Button({ variant = "primary", size = "md", disabled = false, children,
234
507
  paddingHorizontal: sizeStyle.paddingHorizontal,
235
508
  borderRadius,
236
509
  backgroundColor: bgColor,
237
- opacity: disabled ? 0.5 : pressed ? 0.85 : 1
510
+ opacity: !disabled && pressed ? 1 - opacity.pressed : 1
238
511
  }
239
512
  ],
240
513
  accessibilityRole: "button",
241
514
  accessibilityState: { disabled },
242
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react_native.Text, { style: [styles.label, { fontSize: sizeStyle.fontSize, color: textColor }], children })
515
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react_native.Text, { style: [textStyle, { color: textColor }], children })
243
516
  }
244
517
  );
245
518
  }
246
519
  var styles = import_react_native.StyleSheet.create({
247
- base: { flexDirection: "row", alignItems: "center", justifyContent: "center" },
248
- label: { fontWeight: "600" }
520
+ base: { flexDirection: "row", alignItems: "center", justifyContent: "center", gap: 8 }
249
521
  });
250
522
 
251
- // src/components/Chip/Chip.native.tsx
523
+ // src/components/ButtonIcon/ButtonIcon.native.tsx
252
524
  var import_react_native2 = require("react-native");
253
-
254
- // src/components/Chip/Chip.styles.ts
255
- var chipTokens = {
256
- size: { height: 48, paddingHorizontal: 16, fontSize: 14 },
257
- borderRadius: 56
258
- };
259
-
260
- // src/components/Chip/Chip.native.tsx
261
525
  var import_jsx_runtime3 = require("react/jsx-runtime");
262
- function Chip({ children, checked = false, onPress, style }) {
263
- const { theme } = useTheme();
264
- const { size, borderRadius } = chipTokens;
265
- const bg = checked ? theme.primary : theme.surface;
266
- const textColor = checked ? theme.textInverse : theme.onBackground;
526
+ var sizeBySize = {
527
+ sm: 40,
528
+ md: 48,
529
+ lg: 64
530
+ };
531
+ function ButtonIcon({ icon, accessibilityLabel, variant = "primary", size = "md", disabled = false, onPress }) {
532
+ const { theme, colorScheme } = useTheme();
533
+ const dimension = sizeBySize[size];
534
+ const bgColor = disabled ? variant === "ghost" ? "transparent" : theme.bg.disabled : variant === "primary" ? theme.bg.primary : variant === "secondary" ? theme.bg.primarySubtle : variant === "overlay" ? colorScheme === "dark" ? colors.overlayWhite[8] : colors.overlayBlack[8] : "transparent";
267
535
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
268
536
  import_react_native2.Pressable,
269
537
  {
270
- onPress,
538
+ onPress: disabled ? void 0 : onPress,
539
+ disabled,
271
540
  style: ({ pressed }) => [
272
541
  styles2.base,
273
- { height: size.height, paddingHorizontal: size.paddingHorizontal, borderRadius, backgroundColor: bg, opacity: pressed ? 0.85 : 1 },
274
- style
542
+ {
543
+ width: dimension,
544
+ height: dimension,
545
+ borderRadius: radius.full,
546
+ backgroundColor: bgColor,
547
+ opacity: !disabled && pressed ? 1 - opacity.pressed : 1
548
+ }
275
549
  ],
276
550
  accessibilityRole: "button",
277
- children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(import_react_native2.Text, { style: { fontSize: size.fontSize, color: textColor, fontWeight: checked ? "600" : "500" }, children })
551
+ accessibilityLabel,
552
+ accessibilityState: { disabled },
553
+ children: icon
278
554
  }
279
555
  );
280
556
  }
281
557
  var styles2 = import_react_native2.StyleSheet.create({
282
- base: { flexDirection: "row", alignItems: "center", justifyContent: "center" }
558
+ base: { alignItems: "center", justifyContent: "center" }
283
559
  });
284
560
 
285
- // src/components/Alert/Alert.native.tsx
561
+ // src/components/DismissButton/DismissButton.native.tsx
286
562
  var import_react_native3 = require("react-native");
563
+ var import_jsx_runtime4 = require("react/jsx-runtime");
564
+ var containerSize = { xs: 20, sm: 32, md: 40 };
565
+ var glyphSize = { xs: 12, sm: 16, md: 20 };
566
+ function DismissButton({ accessibilityLabel = "Fechar", variant = "subtle", size = "sm", disabled = false, onPress }) {
567
+ const { theme, colorScheme } = useTheme();
568
+ const dimension = containerSize[size];
569
+ const glyph2 = glyphSize[size];
570
+ const bgColor = disabled ? variant === "ghost" ? "transparent" : theme.bg.disabled : variant === "subtle" ? colorScheme === "dark" ? colors.overlayWhite[8] : colors.overlayBlack[8] : "transparent";
571
+ const glyphColor = disabled ? theme.text.disabled : theme.icon.primary;
572
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
573
+ import_react_native3.Pressable,
574
+ {
575
+ onPress: disabled ? void 0 : onPress,
576
+ disabled,
577
+ style: ({ pressed }) => [
578
+ styles3.base,
579
+ {
580
+ width: dimension,
581
+ height: dimension,
582
+ borderRadius: radius.full,
583
+ backgroundColor: bgColor,
584
+ opacity: !disabled && pressed ? 1 - opacity.pressed : 1
585
+ }
586
+ ],
587
+ accessibilityRole: "button",
588
+ accessibilityLabel,
589
+ accessibilityState: { disabled },
590
+ children: /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_react_native3.View, { style: { width: glyph2, height: glyph2, alignItems: "center", justifyContent: "center" }, children: [
591
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_native3.View, { style: [styles3.line, { width: glyph2, backgroundColor: glyphColor, transform: [{ rotate: "45deg" }] }] }),
592
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_native3.View, { style: [styles3.line, { width: glyph2, backgroundColor: glyphColor, transform: [{ rotate: "-45deg" }] }] })
593
+ ] })
594
+ }
595
+ );
596
+ }
597
+ var styles3 = import_react_native3.StyleSheet.create({
598
+ base: { alignItems: "center", justifyContent: "center" },
599
+ line: { position: "absolute", height: 2, borderRadius: 1 }
600
+ });
601
+
602
+ // src/components/Chip/Chip.native.tsx
603
+ var import_react_native4 = require("react-native");
287
604
 
288
- // src/components/Alert/Alert.styles.ts
289
- var alertTokens = {
290
- padding: 20,
291
- borderRadius: 32
605
+ // src/components/Chip/Chip.styles.ts
606
+ var chipSizes = {
607
+ sm: { height: 32, paddingHorizontal: 12 },
608
+ md: { height: 44, paddingHorizontal: 16 }
292
609
  };
610
+ var chipRadius = radius.chip;
611
+
612
+ // src/components/Chip/Chip.native.tsx
613
+ var import_jsx_runtime5 = require("react/jsx-runtime");
614
+ function Chip({ children, checked = false, disabled = false, size = "md", leading, trailing, onPress, style }) {
615
+ const { theme } = useTheme();
616
+ const { height, paddingHorizontal } = chipSizes[size];
617
+ const bg = disabled ? theme.bg.disabled : checked ? theme.interactive.selected : "transparent";
618
+ const borderColor = disabled ? theme.border.disabled : checked ? theme.interactive.selected : theme.border.default;
619
+ const textColor = disabled ? theme.text.disabled : checked ? theme.text.inverse : theme.text.primary;
620
+ const baseText = size === "sm" ? typography.caption : typography.bodyDefault;
621
+ const textStyle = { ...baseText, fontWeight: checked ? "600" : baseText.fontWeight };
622
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(
623
+ import_react_native4.Pressable,
624
+ {
625
+ onPress: disabled ? void 0 : onPress,
626
+ disabled,
627
+ style: ({ pressed }) => [
628
+ styles4.base,
629
+ {
630
+ height,
631
+ paddingHorizontal,
632
+ borderRadius: chipRadius,
633
+ backgroundColor: bg,
634
+ borderColor,
635
+ borderWidth: borderWidth.default,
636
+ opacity: !disabled && pressed ? 1 - opacity.pressed : 1
637
+ },
638
+ style
639
+ ],
640
+ accessibilityRole: "button",
641
+ accessibilityState: { selected: checked, disabled },
642
+ children: [
643
+ leading,
644
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_native4.Text, { style: [textStyle, { color: textColor }], children }),
645
+ trailing
646
+ ]
647
+ }
648
+ );
649
+ }
650
+ var styles4 = import_react_native4.StyleSheet.create({
651
+ base: { flexDirection: "row", alignItems: "center", justifyContent: "center", gap: 8, borderStyle: "solid" }
652
+ });
293
653
 
294
654
  // src/components/Alert/Alert.native.tsx
295
- var import_jsx_runtime4 = require("react/jsx-runtime");
296
- function Alert({ variant = "info", title, description }) {
655
+ var import_react_native5 = require("react-native");
656
+ var import_jsx_runtime6 = require("react/jsx-runtime");
657
+ var glyph = { success: "\u2713", info: "i", warning: "!", error: "\u2715" };
658
+ function Alert({ variant = "info", size = "default", layout = "stacked", title, description, onDismiss }) {
297
659
  const { theme } = useTheme();
298
- const { padding, borderRadius } = alertTokens;
299
- const bg = variant === "success" ? theme.successBg : theme.surface;
300
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_react_native3.View, { style: [styles3.container, { backgroundColor: bg, padding, borderColor: theme.border }], children: [
301
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_native3.Text, { style: [styles3.title, { color: theme.onBackground }], children: title }),
302
- description && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_native3.Text, { style: [styles3.description, { color: theme.muted }], children: description })
303
- ] });
660
+ const bg = { success: theme.bg.successSubtle, info: theme.bg.infoSubtle, warning: theme.bg.warningSubtle, error: theme.bg.errorSubtle }[variant];
661
+ const iconColor = { success: theme.icon.success, info: theme.icon.info, warning: theme.icon.warning, error: theme.icon.error }[variant];
662
+ const borderColor = theme.border.subtle;
663
+ const padding = size === "compact" ? 12 : 20;
664
+ const outerGap = size === "compact" ? 8 : 12;
665
+ const iconEl = /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native5.View, { style: [styles5.icon, { borderColor: iconColor }], children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native5.Text, { style: { color: iconColor, fontSize: 13, fontWeight: "700", lineHeight: 16 }, children: glyph[variant] }) });
666
+ const bodyEl = description ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native5.Text, { style: [typography.bodyDefault, { color: theme.text.secondary, flex: layout === "inline" ? 1 : void 0 }], children: description }) : null;
667
+ const closeEl = onDismiss ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native5.Pressable, { onPress: onDismiss, accessibilityRole: "button", accessibilityLabel: "Fechar", style: styles5.close, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native5.Text, { style: { color: theme.text.primary, fontSize: 16, lineHeight: 20 }, children: "\u2715" }) }) : null;
668
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
669
+ import_react_native5.View,
670
+ {
671
+ style: [styles5.container, { backgroundColor: bg, borderColor, padding, gap: outerGap }],
672
+ accessibilityRole: variant === "error" ? "alert" : void 0,
673
+ accessibilityLiveRegion: variant === "error" ? "assertive" : "polite",
674
+ children: [
675
+ layout === "inline" ? /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_jsx_runtime6.Fragment, { children: [
676
+ iconEl,
677
+ bodyEl
678
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_react_native5.View, { style: styles5.content, children: [
679
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_react_native5.View, { style: styles5.header, children: [
680
+ iconEl,
681
+ title ? /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_react_native5.Text, { style: [typography.h3, styles5.title, { color: theme.text.primary }], children: title }) : null
682
+ ] }),
683
+ bodyEl
684
+ ] }),
685
+ closeEl
686
+ ]
687
+ }
688
+ );
304
689
  }
305
- var styles3 = import_react_native3.StyleSheet.create({
690
+ var styles5 = import_react_native5.StyleSheet.create({
306
691
  container: {
307
692
  width: "100%",
308
- borderWidth: 1,
309
- borderTopLeftRadius: 32,
310
- borderTopRightRadius: 32,
311
- borderBottomRightRadius: 32,
693
+ flexDirection: "row",
694
+ alignItems: "flex-start",
695
+ borderWidth: borderWidth.default,
696
+ borderStyle: "solid",
697
+ borderTopLeftRadius: 24,
698
+ borderTopRightRadius: 24,
699
+ borderBottomRightRadius: 24,
312
700
  borderBottomLeftRadius: 0
313
701
  },
314
- title: { fontWeight: "600", fontSize: 16, lineHeight: 22 },
315
- description: { fontWeight: "500", fontSize: 14, lineHeight: 21, marginTop: 12 }
702
+ content: { flex: 1, flexDirection: "column", gap: 8 },
703
+ header: { flexDirection: "row", alignItems: "center", gap: 12 },
704
+ title: { flex: 1 },
705
+ icon: { width: 24, height: 24, borderRadius: 12, borderWidth: 2, alignItems: "center", justifyContent: "center" },
706
+ close: {}
316
707
  });
317
708
 
318
709
  // src/components/ProgressBar/ProgressBar.native.tsx
319
- var import_react_native4 = require("react-native");
710
+ var import_react_native6 = require("react-native");
320
711
 
321
712
  // src/components/ProgressBar/ProgressBar.styles.ts
322
713
  var progressBarTokens = {
323
714
  height: 8,
324
- borderRadius: 999,
325
- fillBorderRadius: 24
715
+ borderRadius: radius.full,
716
+ fillBorderRadius: radius.full
326
717
  };
327
718
 
328
719
  // src/components/ProgressBar/ProgressBar.native.tsx
329
- var import_jsx_runtime5 = require("react/jsx-runtime");
720
+ var import_jsx_runtime7 = require("react/jsx-runtime");
330
721
  function ProgressBar({ value }) {
331
722
  const { theme } = useTheme();
332
723
  const { height, borderRadius, fillBorderRadius } = progressBarTokens;
333
724
  const pct = Math.min(100, Math.max(0, value));
334
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
335
- import_react_native4.View,
725
+ const trackColor = theme.bg.surfaceHover;
726
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
727
+ import_react_native6.View,
336
728
  {
337
- style: [styles4.track, { height, borderRadius, backgroundColor: theme.border }],
729
+ style: [styles6.track, { height, borderRadius, backgroundColor: trackColor }],
338
730
  accessibilityRole: "progressbar",
339
731
  accessibilityValue: { min: 0, max: 100, now: pct },
340
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_native4.View, { style: { height, width: `${pct}%`, borderRadius: fillBorderRadius, backgroundColor: theme.primary } })
732
+ children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native6.View, { style: { height, width: `${pct}%`, borderRadius: fillBorderRadius, backgroundColor: theme.bg.primary } })
341
733
  }
342
734
  );
343
735
  }
344
- var styles4 = import_react_native4.StyleSheet.create({
736
+ var styles6 = import_react_native6.StyleSheet.create({
345
737
  track: { width: "100%", overflow: "hidden" }
346
738
  });
347
739
 
348
740
  // src/components/Input/Input.native.tsx
349
741
  var import_react2 = require("react");
350
- var import_react_native5 = require("react-native");
742
+ var import_react_native7 = require("react-native");
351
743
 
352
744
  // src/components/Input/Input.styles.ts
353
745
  var inputTokens = {
354
746
  height: 48,
355
747
  padding: 12,
356
748
  gap: 8,
357
- borderRadius: 12,
358
- fontSize: 14
749
+ borderRadius: radius.input
359
750
  };
360
751
 
361
752
  // src/components/Input/Input.native.tsx
362
- var import_jsx_runtime6 = require("react/jsx-runtime");
363
- function Input({ value, placeholder = "exemplo@email.com", state = "default", leadingIcon, onChangeText, onFocus, onBlur, style }) {
753
+ var import_jsx_runtime8 = require("react/jsx-runtime");
754
+ function Input({ value, placeholder = "exemplo@email.com", state = "default", leadingIcon, trailingIcon, onChangeText, onFocus, onBlur, style }) {
364
755
  const { theme } = useTheme();
365
- const { height, padding, gap, borderRadius, fontSize } = inputTokens;
756
+ const { height, padding, gap, borderRadius } = inputTokens;
366
757
  const [isFocused, setIsFocused] = (0, import_react2.useState)(false);
367
758
  const isDisabled = state === "disabled";
368
759
  const isError = state === "error";
369
760
  const isFilled = state === "filled";
370
- const bg = isDisabled ? theme.background : theme.surface;
371
- const borderColor = isDisabled ? theme.muted : isError ? theme.error : isFocused ? theme.primary : theme.border;
372
- const borderWidth = isFocused ? 2 : 1;
373
- const textColor = isDisabled ? theme.muted : isError ? theme.error : isFilled || isFocused ? theme.onBackground : theme.muted;
374
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(import_react_native5.View, { style: [styles5.container, { height, padding, gap, borderRadius, backgroundColor: bg, borderColor, borderWidth }, style], children: [
761
+ const bg = isDisabled ? theme.bg.disabled : theme.bg.surface;
762
+ const borderColor = isDisabled ? theme.border.disabled : isError ? theme.border.error : isFocused ? theme.border.focus : theme.border.default;
763
+ const inputBorderWidth = isFocused ? borderWidth.heavy : borderWidth.default;
764
+ const textColor = isDisabled ? theme.text.disabled : isError ? theme.text.error : isFilled || isFocused ? theme.text.primary : theme.text.secondary;
765
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native7.View, { style: [styles7.container, { height, padding, gap, borderRadius, backgroundColor: bg, borderColor, borderWidth: inputBorderWidth }, style], children: [
375
766
  leadingIcon,
376
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
377
- import_react_native5.TextInput,
767
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
768
+ import_react_native7.TextInput,
378
769
  {
379
770
  value,
380
771
  placeholder,
@@ -389,346 +780,425 @@ function Input({ value, placeholder = "exemplo@email.com", state = "default", le
389
780
  setIsFocused(false);
390
781
  onBlur?.();
391
782
  },
392
- style: [styles5.input, { fontSize, color: textColor }]
783
+ style: [typography.bodyDefault, styles7.input, { color: textColor }]
393
784
  }
394
- )
785
+ ),
786
+ trailingIcon
395
787
  ] });
396
788
  }
397
- var styles5 = import_react_native5.StyleSheet.create({
789
+ var styles7 = import_react_native7.StyleSheet.create({
398
790
  container: { flexDirection: "row", alignItems: "center", borderStyle: "solid" },
399
- input: { flex: 1, fontWeight: "500", padding: 0 }
791
+ input: { flex: 1, padding: 0 }
400
792
  });
401
793
 
794
+ // src/components/InputField/InputField.native.tsx
795
+ var import_react_native8 = require("react-native");
796
+ var import_jsx_runtime9 = require("react/jsx-runtime");
797
+ function InputField({
798
+ label,
799
+ required,
800
+ helperText,
801
+ error,
802
+ value,
803
+ placeholder,
804
+ disabled,
805
+ leadingIcon,
806
+ trailingIcon,
807
+ onChangeText,
808
+ onFocus,
809
+ onBlur
810
+ }) {
811
+ const { theme } = useTheme();
812
+ const state = disabled ? "disabled" : error ? "error" : "default";
813
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_react_native8.View, { style: { gap: 8, width: "100%" }, children: [
814
+ label && /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(import_react_native8.Text, { style: [typography.labelDefault, { color: theme.text.primary }], children: [
815
+ label,
816
+ required && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native8.Text, { style: { color: theme.text.error }, children: " *" })
817
+ ] }),
818
+ /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
819
+ Input,
820
+ {
821
+ state,
822
+ value,
823
+ placeholder,
824
+ leadingIcon,
825
+ trailingIcon,
826
+ onChangeText,
827
+ onFocus,
828
+ onBlur
829
+ }
830
+ ),
831
+ helperText && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native8.Text, { style: [typography.caption, { color: error ? theme.text.error : theme.text.secondary }], children: helperText })
832
+ ] });
833
+ }
834
+
402
835
  // src/components/Checkbox/Checkbox.native.tsx
403
- var import_react_native6 = require("react-native");
836
+ var import_react_native9 = require("react-native");
404
837
 
405
838
  // src/components/Checkbox/Checkbox.styles.ts
406
- var checkboxTokens = {
407
- size: 20,
408
- borderRadius: 6
839
+ var checkboxSizes = {
840
+ xs: { box: 16, radius: 4 },
841
+ sm: { box: 20, radius: 5 },
842
+ md: { box: 24, radius: 6 }
409
843
  };
410
844
 
411
845
  // src/components/Checkbox/Checkbox.native.tsx
412
- var import_jsx_runtime7 = require("react/jsx-runtime");
413
- function Checkbox({ checked = false, onChange, disabled = false }) {
846
+ var import_jsx_runtime10 = require("react/jsx-runtime");
847
+ function Checkbox({ checked = false, onChange, disabled = false, size = "sm" }) {
414
848
  const { theme } = useTheme();
415
- const { size, borderRadius } = checkboxTokens;
416
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
417
- import_react_native6.Pressable,
849
+ const { box, radius: radius2 } = checkboxSizes[size];
850
+ const boxBg = checked ? disabled ? theme.bg.disabled : theme.interactive.selected : "transparent";
851
+ const boxBorder = checked ? boxBg : disabled ? theme.text.disabled : theme.icon.secondary;
852
+ const checkColor = disabled ? theme.text.disabled : colors.white;
853
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
854
+ import_react_native9.Pressable,
418
855
  {
419
856
  onPress: disabled ? void 0 : () => onChange?.(!checked),
857
+ disabled,
420
858
  style: ({ pressed }) => [
421
- styles6.base,
422
- {
423
- width: size,
424
- height: size,
425
- borderRadius,
426
- backgroundColor: checked ? theme.primary : "transparent",
427
- borderWidth: checked ? 0 : 1,
428
- borderColor: theme.primary,
429
- opacity: disabled ? 0.5 : pressed ? 0.85 : 1
430
- }
859
+ styles8.wrapper,
860
+ // state layer: interactive/selected at ~12% (8-digit hex alpha).
861
+ { backgroundColor: !disabled && pressed ? `${theme.interactive.selected}1F` : "transparent" }
431
862
  ],
432
863
  accessibilityRole: "checkbox",
433
864
  accessibilityState: { checked, disabled },
434
- children: checked && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native6.View, { style: styles6.checkmark, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_react_native6.View, { style: [styles6.checkLine, { borderColor: theme.textInverse }] }) })
865
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
866
+ import_react_native9.View,
867
+ {
868
+ style: [
869
+ styles8.box,
870
+ {
871
+ width: box,
872
+ height: box,
873
+ borderRadius: radius2,
874
+ backgroundColor: boxBg,
875
+ borderColor: boxBorder,
876
+ borderWidth: checked ? 0 : borderWidth.heavy
877
+ }
878
+ ],
879
+ children: checked && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
880
+ import_react_native9.View,
881
+ {
882
+ style: {
883
+ width: box * 0.5,
884
+ height: box * 0.4,
885
+ borderLeftWidth: 1.5,
886
+ borderBottomWidth: 1.5,
887
+ borderColor: checkColor,
888
+ transform: [{ rotate: "-45deg" }, { translateY: -box * 0.1 }]
889
+ }
890
+ }
891
+ )
892
+ }
893
+ )
435
894
  }
436
895
  );
437
896
  }
438
- var styles6 = import_react_native6.StyleSheet.create({
439
- base: { alignItems: "center", justifyContent: "center" },
440
- checkmark: { width: 10, height: 8, alignItems: "center", justifyContent: "center" },
441
- checkLine: { width: 10, height: 8, borderLeftWidth: 1.5, borderBottomWidth: 1.5, transform: [{ rotate: "-45deg" }, { translateY: -2 }] }
897
+ var styles8 = import_react_native9.StyleSheet.create({
898
+ wrapper: { padding: 4, borderRadius: 9999, alignItems: "center", justifyContent: "center" },
899
+ box: { alignItems: "center", justifyContent: "center" }
442
900
  });
443
901
 
444
- // src/components/RadioItem/RadioItem.native.tsx
445
- var import_react_native7 = require("react-native");
446
-
447
- // src/components/RadioItem/RadioItem.styles.ts
448
- var radioItemTokens = {
449
- height: 48,
450
- padding: 16,
451
- gap: 12,
452
- borderRadius: 16,
453
- radioSize: 20,
454
- fontSize: 14
902
+ // src/components/ToggleSwitch/ToggleSwitch.native.tsx
903
+ var import_react3 = require("react");
904
+ var import_react_native10 = require("react-native");
905
+ var import_jsx_runtime11 = require("react/jsx-runtime");
906
+ var sizes = {
907
+ xs: { w: 32, h: 20, knob: 16 },
908
+ sm: { w: 40, h: 24, knob: 20 },
909
+ md: { w: 52, h: 32, knob: 28 }
455
910
  };
456
-
457
- // src/components/RadioItem/RadioItem.native.tsx
458
- var import_jsx_runtime8 = require("react/jsx-runtime");
459
- function RadioItem({ label, description, selected = false, icon, onPress, style }) {
911
+ function ToggleSwitch({ value = false, onChange, disabled = false, size = "sm", accessibilityLabel }) {
460
912
  const { theme } = useTheme();
461
- const { height, padding, gap, borderRadius, radioSize, fontSize } = radioItemTokens;
462
- const bg = selected ? theme.primary : theme.surface;
463
- const textColor = selected ? theme.textInverse : theme.onBackground;
464
- const descColor = selected ? theme.textInverse : theme.textSecondary;
465
- const descOpacity = selected ? 0.8 : 1;
466
- const radioBorderColor = selected ? theme.textInverse : theme.onBackground;
467
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
468
- import_react_native7.Pressable,
913
+ const { w, h, knob } = sizes[size];
914
+ const travel = w - knob - 4;
915
+ const anim = (0, import_react3.useRef)(new import_react_native10.Animated.Value(value ? 1 : 0)).current;
916
+ (0, import_react3.useEffect)(() => {
917
+ import_react_native10.Animated.timing(anim, { toValue: value ? 1 : 0, duration: 150, useNativeDriver: true }).start();
918
+ }, [value, anim]);
919
+ const translateX = anim.interpolate({ inputRange: [0, 1], outputRange: [0, travel] });
920
+ const trackColor = disabled ? theme.bg.disabled : value ? theme.interactive.selected : theme.bg.disabled;
921
+ const knobColor = disabled ? theme.text.disabled : theme.text.inverse;
922
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
923
+ import_react_native10.Pressable,
469
924
  {
470
- onPress,
471
- style: ({ pressed }) => [
472
- styles7.container,
473
- { height, paddingHorizontal: padding, gap, borderRadius, backgroundColor: bg, opacity: pressed ? 0.9 : 1 },
474
- style
475
- ],
476
- accessibilityRole: "radio",
477
- accessibilityState: { selected },
478
- children: [
479
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native7.View, { style: styles7.left, children: [
480
- icon && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native7.View, { style: styles7.icon, children: icon }),
481
- /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(import_react_native7.View, { style: styles7.textContainer, children: [
482
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native7.Text, { style: [styles7.label, { fontSize, color: textColor, fontWeight: selected ? "700" : "500" }], children: label }),
483
- description && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native7.Text, { style: [styles7.description, { color: descColor, opacity: descOpacity }], children: description })
484
- ] })
485
- ] }),
486
- /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_native7.View, { style: [styles7.radio, { width: radioSize, height: radioSize, borderRadius: radioSize / 2, borderColor: radioBorderColor }] })
487
- ]
925
+ onPress: disabled ? void 0 : () => onChange?.(!value),
926
+ disabled,
927
+ style: { width: w, height: h, borderRadius: radius.full, backgroundColor: trackColor, padding: 2, justifyContent: "center" },
928
+ accessibilityRole: "switch",
929
+ accessibilityState: { checked: value, disabled },
930
+ accessibilityLabel,
931
+ children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
932
+ import_react_native10.Animated.View,
933
+ {
934
+ style: { width: knob, height: knob, borderRadius: radius.full, backgroundColor: knobColor, transform: [{ translateX }] }
935
+ }
936
+ )
488
937
  }
489
938
  );
490
939
  }
491
- var styles7 = import_react_native7.StyleSheet.create({
492
- container: { flexDirection: "row", alignItems: "center", justifyContent: "space-between" },
493
- left: { flexDirection: "row", alignItems: "center", gap: 12 },
494
- icon: { width: 20, height: 20 },
495
- textContainer: { flexDirection: "column", gap: 2 },
496
- label: { lineHeight: 21 },
497
- description: { fontSize: 12, fontWeight: "400", lineHeight: 18, letterSpacing: 0.024 },
498
- radio: { borderWidth: 1 }
499
- });
500
940
 
501
941
  // src/components/RadioGroup/RadioGroup.native.tsx
502
- var import_react_native8 = require("react-native");
503
- var import_jsx_runtime9 = require("react/jsx-runtime");
942
+ var import_react_native11 = require("react-native");
943
+ var import_jsx_runtime12 = require("react/jsx-runtime");
504
944
  function RadioGroup({ children, label, style }) {
505
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(import_react_native8.View, { accessibilityRole: "radiogroup", accessibilityLabel: label, style: [{ gap: 8 }, style], children });
945
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native11.View, { accessibilityRole: "radiogroup", accessibilityLabel: label, style: [{ gap: 8 }, style], children });
506
946
  }
507
947
 
508
- // src/components/ActionItem/ActionItem.native.tsx
509
- var import_react_native9 = require("react-native");
510
-
511
- // src/components/ActionItem/ActionItem.styles.ts
512
- var actionItemTokens = {
513
- height: 56,
514
- padding: 16,
515
- gap: 20,
516
- innerGap: 16,
517
- borderRadius: 16,
518
- fontSize: 14
519
- };
520
-
521
- // src/components/ActionItem/ActionItem.native.tsx
522
- var import_jsx_runtime10 = require("react/jsx-runtime");
523
- function ActionItem({ label, description, selected = false, icon, onPress, style }) {
948
+ // src/components/ChoiceCard/ChoiceCard.native.tsx
949
+ var import_react_native12 = require("react-native");
950
+ var import_jsx_runtime13 = require("react/jsx-runtime");
951
+ function Trailing({ type, selected, disabled }) {
524
952
  const { theme } = useTheme();
525
- const { height, padding, gap, innerGap, borderRadius, fontSize } = actionItemTokens;
526
- const bg = selected ? theme.border : theme.surface;
527
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
528
- import_react_native9.Pressable,
953
+ const offColor = disabled ? theme.text.disabled : theme.icon.secondary;
954
+ const onColor = theme.interactive.selected;
955
+ if (type === "action") {
956
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_native12.View, { style: [styles9.caret, { borderColor: disabled ? theme.text.disabled : theme.icon.secondary }] });
957
+ }
958
+ if (type === "checkbox") {
959
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_native12.View, { style: [styles9.indicator, styles9.checkbox, { borderColor: selected ? onColor : offColor, backgroundColor: selected ? onColor : "transparent" }], children: selected && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_native12.View, { style: [styles9.check, { borderColor: colors.white }] }) });
960
+ }
961
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_native12.View, { style: [styles9.indicator, styles9.radio, { borderColor: selected ? onColor : offColor }], children: selected && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_native12.View, { style: [styles9.dot, { backgroundColor: onColor }] }) });
962
+ }
963
+ function ChoiceCard({ type = "radio", label, description, selected = false, disabled = false, leading, showTrailing = true, onPress }) {
964
+ const { theme } = useTheme();
965
+ const isSelected = type === "action" ? false : selected;
966
+ const baseBg = disabled ? theme.bg.surface : isSelected ? theme.bg.primarySubtle : theme.bg.surface;
967
+ const pressedBg = isSelected ? theme.bg.primarySubtlePressed : theme.bg.surfacePressed;
968
+ const borderColor = disabled ? theme.border.disabled : isSelected ? theme.border.strong : theme.border.default;
969
+ const textColor = disabled ? theme.text.disabled : theme.text.primary;
970
+ const descColor = disabled ? theme.text.disabled : theme.text.secondary;
971
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
972
+ import_react_native12.Pressable,
529
973
  {
530
- onPress,
974
+ onPress: disabled ? void 0 : onPress,
975
+ disabled,
976
+ accessibilityRole: type === "radio" ? "radio" : type === "checkbox" ? "checkbox" : "button",
977
+ accessibilityState: { selected: isSelected, checked: isSelected, disabled },
531
978
  style: ({ pressed }) => [
532
- styles8.container,
979
+ styles9.card,
533
980
  {
534
- height,
535
- paddingHorizontal: padding,
536
- gap,
537
- borderRadius,
538
- backgroundColor: bg,
539
- borderWidth: selected ? 2 : 0,
540
- borderColor: selected ? theme.primary : "transparent",
541
- opacity: pressed ? 0.9 : 1
542
- },
543
- style
981
+ backgroundColor: !disabled && pressed ? pressedBg : baseBg,
982
+ borderColor,
983
+ borderWidth: isSelected ? borderWidth.heavy : borderWidth.default
984
+ }
544
985
  ],
545
- accessibilityRole: "button",
546
986
  children: [
547
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native9.View, { style: [styles8.content, { gap: innerGap }], children: [
548
- icon && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native9.View, { style: styles8.icon, children: icon }),
549
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_react_native9.View, { style: styles8.textContainer, children: [
550
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native9.Text, { style: [styles8.label, { fontSize, color: theme.onBackground }], numberOfLines: 1, children: label }),
551
- description && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native9.Text, { style: [styles8.description, { color: theme.textSecondary }], numberOfLines: 1, children: description })
552
- ] })
987
+ leading && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_native12.View, { style: styles9.leading, children: leading }),
988
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(import_react_native12.View, { style: styles9.text, children: [
989
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_native12.Text, { style: [description ? typography.labelDefault : typography.bodyDefault, { color: textColor }], children: label }),
990
+ description ? /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_native12.Text, { style: [typography.bodyDefault, { color: descColor }], children: description }) : null
553
991
  ] }),
554
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native9.View, { style: styles8.chevron, children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_react_native9.Text, { style: [styles8.chevronText, { color: theme.onBackground }], children: "\u203A" }) })
992
+ showTrailing && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Trailing, { type, selected: isSelected, disabled })
555
993
  ]
556
994
  }
557
995
  );
558
996
  }
559
- var styles8 = import_react_native9.StyleSheet.create({
560
- container: { flexDirection: "row", alignItems: "center", justifyContent: "space-between" },
561
- content: { flex: 1, flexDirection: "row", alignItems: "center", minWidth: 0 },
562
- icon: { width: 24, height: 24, overflow: "hidden", flexShrink: 0 },
563
- textContainer: { flex: 1, flexDirection: "column", gap: 4, minWidth: 0 },
564
- label: { fontWeight: "500", lineHeight: 21 },
565
- description: { fontSize: 12, fontWeight: "400", lineHeight: 18, letterSpacing: 0.024 },
566
- chevron: { width: 24, height: 24, alignItems: "center", justifyContent: "center", flexShrink: 0 },
567
- chevronText: { fontSize: 20 }
997
+ var styles9 = import_react_native12.StyleSheet.create({
998
+ card: { width: "100%", flexDirection: "row", alignItems: "center", gap: 12, padding: 16, borderRadius: 20, borderStyle: "solid" },
999
+ leading: { width: 24, height: 24, alignItems: "center", justifyContent: "center" },
1000
+ text: { flex: 1, flexDirection: "column", gap: 4 },
1001
+ indicator: { width: 24, height: 24, alignItems: "center", justifyContent: "center", borderWidth: 2 },
1002
+ checkbox: { borderRadius: 6 },
1003
+ radio: { borderRadius: 12 },
1004
+ dot: { width: 12, height: 12, borderRadius: 6 },
1005
+ check: { width: 12, height: 8, borderLeftWidth: 2, borderBottomWidth: 2, transform: [{ rotate: "-45deg" }, { translateY: -1 }] },
1006
+ caret: { width: 10, height: 10, borderTopWidth: 2, borderRightWidth: 2, transform: [{ rotate: "45deg" }] }
1007
+ });
1008
+
1009
+ // src/components/ListItem/ListItem.native.tsx
1010
+ var import_react_native13 = require("react-native");
1011
+ var import_jsx_runtime14 = require("react/jsx-runtime");
1012
+ function TrailingVisual({ trailing, selected, disabled }) {
1013
+ const { theme } = useTheme();
1014
+ const offColor = disabled ? theme.text.disabled : theme.icon.secondary;
1015
+ const onColor = theme.interactive.selected;
1016
+ if (trailing === "action") {
1017
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_native13.View, { style: [styles10.caret, { borderColor: disabled ? theme.text.disabled : theme.icon.secondary }] });
1018
+ }
1019
+ if (trailing === "checkbox") {
1020
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_native13.View, { style: [styles10.indicator, styles10.checkbox, { borderColor: selected ? onColor : offColor, backgroundColor: selected ? onColor : "transparent" }], children: selected && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_native13.View, { style: [styles10.check, { borderColor: colors.white }] }) });
1021
+ }
1022
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_native13.View, { style: [styles10.indicator, styles10.radio, { borderColor: selected ? onColor : offColor }], children: selected && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_native13.View, { style: [styles10.dot, { backgroundColor: onColor }] }) });
1023
+ }
1024
+ function ListItem({ trailing = "none", label, description, selected = false, disabled = false, leading, switchValue = false, onSwitchChange, onPress }) {
1025
+ const { theme } = useTheme();
1026
+ const isSelected = trailing === "radio" || trailing === "checkbox" ? selected : false;
1027
+ const textColor = disabled ? theme.text.disabled : theme.text.primary;
1028
+ const descColor = disabled ? theme.text.disabled : theme.text.secondary;
1029
+ const selectedBg = theme.bg.primarySubtle;
1030
+ const selectedPressedBg = theme.bg.primarySubtlePressed;
1031
+ const neutralPressedBg = theme.bg.surfacePressed;
1032
+ const rowStyle = (pressed) => [
1033
+ styles10.row,
1034
+ { padding: description ? 16 : 10 },
1035
+ isSelected ? { backgroundColor: !disabled && pressed ? selectedPressedBg : selectedBg } : { backgroundColor: !disabled && pressed ? neutralPressedBg : "transparent" }
1036
+ ];
1037
+ const content = /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_jsx_runtime14.Fragment, { children: [
1038
+ leading && /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_native13.View, { style: styles10.leading, children: leading }),
1039
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)(import_react_native13.View, { style: styles10.text, children: [
1040
+ /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_native13.Text, { style: [description ? typography.labelDefault : typography.bodyDefault, { color: textColor }], children: label }),
1041
+ description ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_native13.Text, { style: [typography.bodyDefault, { color: descColor }], children: description }) : null
1042
+ ] }),
1043
+ trailing === "switch" ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ToggleSwitch, { size: "sm", value: switchValue, onChange: onSwitchChange, disabled, accessibilityLabel: label }) : trailing !== "none" ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(TrailingVisual, { trailing, selected: isSelected, disabled }) : null
1044
+ ] });
1045
+ if (trailing === "switch" || trailing === "none") {
1046
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_native13.View, { style: rowStyle(false), children: content });
1047
+ }
1048
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1049
+ import_react_native13.Pressable,
1050
+ {
1051
+ onPress: disabled ? void 0 : onPress,
1052
+ disabled,
1053
+ accessibilityRole: trailing === "radio" ? "radio" : trailing === "checkbox" ? "checkbox" : "button",
1054
+ accessibilityState: { selected: isSelected, checked: isSelected, disabled },
1055
+ style: ({ pressed }) => rowStyle(pressed),
1056
+ children: content
1057
+ }
1058
+ );
1059
+ }
1060
+ var styles10 = import_react_native13.StyleSheet.create({
1061
+ row: { width: "100%", flexDirection: "row", alignItems: "center", gap: 12 },
1062
+ leading: { width: 24, height: 24, alignItems: "center", justifyContent: "center" },
1063
+ text: { flex: 1, flexDirection: "column", gap: 4 },
1064
+ indicator: { width: 24, height: 24, alignItems: "center", justifyContent: "center", borderWidth: 2 },
1065
+ checkbox: { borderRadius: 6 },
1066
+ radio: { borderRadius: 12 },
1067
+ dot: { width: 12, height: 12, borderRadius: 6 },
1068
+ check: { width: 12, height: 8, borderLeftWidth: 2, borderBottomWidth: 2, transform: [{ rotate: "-45deg" }, { translateY: -1 }] },
1069
+ caret: { width: 10, height: 10, borderTopWidth: 2, borderRightWidth: 2, transform: [{ rotate: "45deg" }] }
568
1070
  });
569
1071
 
570
1072
  // src/components/Stepper/Stepper.native.tsx
571
- var import_react_native10 = require("react-native");
1073
+ var import_react_native14 = require("react-native");
572
1074
 
573
1075
  // src/components/Stepper/Stepper.styles.ts
574
1076
  var stepperTokens = {
575
- trackHeight: 4,
576
- trackRadius: 8,
577
- dotSize: 4,
578
- labelFontSize: 10,
1077
+ segmentHeight: 4,
1078
+ segmentRadius: radius.full,
579
1079
  gap: 4
580
1080
  };
581
1081
 
582
1082
  // src/components/Stepper/Stepper.native.tsx
583
- var import_jsx_runtime11 = require("react/jsx-runtime");
584
- function Stepper({ steps, currentStep, style }) {
1083
+ var import_jsx_runtime15 = require("react/jsx-runtime");
1084
+ function Stepper({ totalSteps, currentStep, style }) {
585
1085
  const { theme } = useTheme();
586
- const { trackHeight, trackRadius, dotSize, labelFontSize, gap } = stepperTokens;
587
- const getState = (i) => i < currentStep ? "completed" : i === currentStep ? "active" : "upcoming";
588
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native10.View, { style: [styles9.container, { gap }, style], children: steps.map((step, i) => {
589
- const state = getState(i);
590
- const isLast = i === steps.length - 1;
591
- const trackBg = state === "completed" ? theme.primary : theme.border;
592
- const dotBg = state === "completed" ? theme.primary : theme.border;
593
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native10.View, { style: { flexDirection: "row", alignItems: "flex-end", flex: 1 }, children: [
594
- /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_react_native10.View, { style: styles9.stepItem, children: [
595
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native10.View, { style: styles9.labelRow, children: /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
596
- import_react_native10.Text,
597
- {
598
- style: [styles9.label, { fontSize: labelFontSize, color: theme.onBackground, opacity: state === "active" ? 1 : 0 }],
599
- numberOfLines: 1,
600
- children: step.label
601
- }
602
- ) }),
603
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native10.View, { style: [styles9.track, { height: trackHeight, borderRadius: trackRadius, backgroundColor: trackBg }], children: state === "active" && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
604
- import_react_native10.View,
605
- {
606
- style: [styles9.trackFill, { height: trackHeight, borderRadius: trackRadius, backgroundColor: theme.onBackground, right: 12 }]
607
- }
608
- ) })
609
- ] }),
610
- !isLast && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_react_native10.View, { style: [styles9.dot, { width: dotSize, height: dotSize, borderRadius: dotSize / 2, backgroundColor: dotBg }] })
611
- ] }, step.label);
612
- }) });
1086
+ const { segmentHeight, segmentRadius, gap } = stepperTokens;
1087
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1088
+ import_react_native14.View,
1089
+ {
1090
+ style: [{ flexDirection: "row", alignItems: "flex-start", width: "100%", gap }, style],
1091
+ accessibilityRole: "progressbar",
1092
+ accessibilityValue: { min: 1, max: totalSteps, now: currentStep },
1093
+ accessibilityLabel: `Etapa ${currentStep} de ${totalSteps}`,
1094
+ children: Array.from({ length: totalSteps }, (_, i) => {
1095
+ const color = i < currentStep - 1 ? theme.bg.primary : i === currentStep - 1 ? theme.bg.primarySubtle : theme.bg.disabled;
1096
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(import_react_native14.View, { style: { flex: 1, height: segmentHeight, borderRadius: segmentRadius, backgroundColor: color } }, i);
1097
+ })
1098
+ }
1099
+ );
613
1100
  }
614
- var styles9 = import_react_native10.StyleSheet.create({
615
- container: { width: "100%", flexDirection: "row", alignItems: "flex-end" },
616
- stepItem: { flex: 1, flexDirection: "column", gap: 4 },
617
- labelRow: { height: 12, justifyContent: "flex-end" },
618
- label: { fontWeight: "600", letterSpacing: 0.8, textTransform: "uppercase" },
619
- track: { overflow: "hidden", position: "relative" },
620
- trackFill: { position: "absolute", left: 0 },
621
- dot: { alignSelf: "flex-end" }
622
- });
623
1101
 
624
1102
  // src/components/RatingScale/RatingScale.native.tsx
625
- var import_react_native11 = require("react-native");
1103
+ var import_react_native15 = require("react-native");
626
1104
 
627
1105
  // src/components/RatingScale/RatingScale.styles.ts
628
1106
  var ratingScaleTokens = {
629
1107
  itemWidth: 60,
630
1108
  circleSize: 60,
631
- circlePadding: 8,
632
1109
  circleRadius: 30,
633
- emojiFontSize: 38,
634
- emojiLineHeight: 44,
635
- labelFontSize: 12,
636
- numberFontSize: 10,
637
- itemGap: 8,
638
- labelNumberGap: 11
1110
+ emojiFontSize: 28,
1111
+ emojiLineHeight: 34,
1112
+ itemGap: 6
639
1113
  };
640
1114
  var DEFAULT_OPTIONS = [
641
- { emoji: "\u{1F61E}", label: "Nada\na ver" },
642
- { emoji: "\u{1F641}", label: "Pouco\na ver" },
643
- { emoji: "\u{1F610}", label: "Mais ou\nmenos" },
644
- { emoji: "\u{1F642}", label: "Tem\na ver" },
645
- { emoji: "\u{1F60A}", label: "Totalmente\neu" }
1115
+ { emoji: "\u{1F621}", label: "P\xE9ssimo" },
1116
+ { emoji: "\u{1F615}", label: "Ruim" },
1117
+ { emoji: "\u{1F610}", label: "Neutro" },
1118
+ { emoji: "\u{1F60A}", label: "Bom" },
1119
+ { emoji: "\u{1F60D}", label: "\xD3timo" }
646
1120
  ];
647
1121
 
648
1122
  // src/components/RatingScale/RatingScale.native.tsx
649
- var import_jsx_runtime12 = require("react/jsx-runtime");
650
- function RatingScale({ value = null, onChange, options = DEFAULT_OPTIONS, style }) {
1123
+ var import_jsx_runtime16 = require("react/jsx-runtime");
1124
+ function RatingScale({ value = null, onChange, options = DEFAULT_OPTIONS, disabled = false, style }) {
651
1125
  const { theme } = useTheme();
652
- const { itemWidth, circleSize, circlePadding, circleRadius, emojiFontSize, emojiLineHeight, labelFontSize, numberFontSize, labelNumberGap } = ratingScaleTokens;
653
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native11.View, { style: [styles10.container, style], children: options.map((option, index) => {
1126
+ const { circleSize, circleRadius, emojiFontSize, emojiLineHeight, itemGap } = ratingScaleTokens;
1127
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_native15.View, { style: [styles11.container, style], children: options.map((option, index) => {
654
1128
  const itemValue = index + 1;
655
1129
  const selected = value === itemValue;
656
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
657
- import_react_native11.Pressable,
1130
+ const circleBg = disabled ? theme.bg.disabled : selected ? theme.bg.primarySubtle : theme.bg.surface;
1131
+ const circleBorderColor = disabled ? theme.border.disabled : selected ? theme.border.strong : theme.border.default;
1132
+ const labelColor = disabled ? theme.text.disabled : theme.text.primary;
1133
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
1134
+ import_react_native15.Pressable,
658
1135
  {
659
- onPress: () => onChange?.(itemValue),
660
- style: styles10.item,
661
- accessibilityRole: "button",
662
- accessibilityState: { selected },
1136
+ onPress: disabled ? void 0 : () => onChange?.(itemValue),
1137
+ disabled,
1138
+ style: [styles11.item, { gap: itemGap }],
1139
+ accessibilityRole: "radio",
1140
+ accessibilityState: { selected, disabled },
663
1141
  children: [
664
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
665
- import_react_native11.View,
1142
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1143
+ import_react_native15.View,
666
1144
  {
667
1145
  style: [
668
- styles10.circle,
1146
+ styles11.circle,
669
1147
  {
670
1148
  width: circleSize,
671
1149
  height: circleSize,
672
1150
  borderRadius: circleRadius,
673
- padding: circlePadding,
674
- backgroundColor: selected ? theme.primary : theme.surface,
675
- borderWidth: selected ? 0 : 1,
676
- borderColor: theme.border
1151
+ backgroundColor: circleBg,
1152
+ borderWidth: selected ? borderWidth.heavy : borderWidth.default,
1153
+ borderColor: circleBorderColor
677
1154
  }
678
1155
  ],
679
- children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native11.Text, { style: [styles10.emoji, { fontSize: emojiFontSize, lineHeight: emojiLineHeight }], children: option.emoji })
1156
+ children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_native15.Text, { style: [styles11.emoji, { fontSize: emojiFontSize, lineHeight: emojiLineHeight, opacity: disabled ? 0.4 : 1 }], children: option.emoji })
680
1157
  }
681
1158
  ),
682
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_react_native11.View, { style: [styles10.labelContainer, { gap: labelNumberGap }], children: [
683
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
684
- import_react_native11.Text,
685
- {
686
- style: [
687
- styles10.label,
688
- {
689
- fontSize: labelFontSize,
690
- color: selected ? theme.primary : theme.onBackground,
691
- fontWeight: selected ? "700" : "500",
692
- width: itemWidth
693
- }
694
- ],
695
- children: option.label
696
- }
697
- ),
698
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native11.Text, { style: [styles10.number, { fontSize: numberFontSize, color: theme.textTertiary }], children: itemValue })
699
- ] })
1159
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_native15.Text, { style: [typography.caption, styles11.label, { color: labelColor }], children: option.label }),
1160
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_native15.Text, { style: [styles11.number, { color: theme.text.disabled }], children: itemValue })
700
1161
  ]
701
1162
  },
702
1163
  itemValue
703
1164
  );
704
1165
  }) });
705
1166
  }
706
- var styles10 = import_react_native11.StyleSheet.create({
707
- container: { flexDirection: "row", justifyContent: "space-between" },
708
- item: { alignItems: "center", gap: 8 },
1167
+ var styles11 = import_react_native15.StyleSheet.create({
1168
+ container: { flexDirection: "row", alignItems: "center", justifyContent: "center", gap: 8, padding: 16 },
1169
+ item: { flex: 1, alignItems: "center" },
709
1170
  circle: { alignItems: "center", justifyContent: "center", overflow: "hidden" },
710
1171
  emoji: { textAlign: "center" },
711
- labelContainer: { alignItems: "center" },
712
- label: { textAlign: "center", lineHeight: 16 },
713
- number: { fontWeight: "600", letterSpacing: 0.8, textAlign: "center", lineHeight: 10 }
1172
+ label: { textAlign: "center" },
1173
+ number: { textAlign: "center", fontFamily: "Inter", fontSize: 10, fontWeight: "600", letterSpacing: 0.8 }
714
1174
  });
715
1175
  // Annotate the CommonJS export names for ESM import in node:
716
1176
  0 && (module.exports = {
717
- ActionItem,
718
1177
  Alert,
719
1178
  Button,
1179
+ ButtonIcon,
720
1180
  Checkbox,
721
1181
  Chip,
1182
+ ChoiceCard,
722
1183
  DSThemeProvider,
1184
+ DismissButton,
723
1185
  Input,
1186
+ InputField,
1187
+ ListItem,
724
1188
  ProgressBar,
725
1189
  RadioGroup,
726
- RadioItem,
727
1190
  RatingScale,
728
1191
  Stepper,
1192
+ ToggleSwitch,
1193
+ borderWidth,
729
1194
  colors,
730
1195
  darkTheme,
1196
+ grid,
731
1197
  lightTheme,
1198
+ opacity,
1199
+ radius,
1200
+ shadow,
1201
+ spacing,
732
1202
  typography,
733
1203
  useTheme
734
1204
  });