@12min/ds 0.1.0 → 1.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,88 +20,716 @@ 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
+ Alert: () => Alert,
25
+ Button: () => Button,
26
+ Checkbox: () => Checkbox,
27
+ Chip: () => Chip,
28
+ DSThemeProvider: () => DSThemeProvider,
29
+ Input: () => Input,
30
+ ProgressBar: () => ProgressBar,
31
+ RadioGroup: () => RadioGroup,
32
+ RadioItem: () => RadioItem,
33
+ RatingScale: () => RatingScale,
34
+ Stepper: () => Stepper,
23
35
  colors: () => colors,
24
36
  darkTheme: () => darkTheme,
25
- lightTheme: () => lightTheme
37
+ lightTheme: () => lightTheme,
38
+ typography: () => typography,
39
+ useTheme: () => useTheme
26
40
  });
27
41
  module.exports = __toCommonJS(index_native_exports);
28
42
 
29
43
  // src/tokens/colors.ts
30
44
  var colors = {
31
- brand: {
32
- primary: "#FF6B35",
33
- secondary: "#1A1A2E"
45
+ marianBlue: {
46
+ 50: "#FAFBFF",
47
+ 100: "#F1F4FE",
48
+ 200: "#E1E7FF",
49
+ 300: "#C3CCF7",
50
+ 400: "#94A5F2",
51
+ 500: "#697DD6",
52
+ 600: "#475CBB",
53
+ 700: "#31428B",
54
+ 800: "#25326A",
55
+ 900: "#131937"
34
56
  },
35
- neutral: {
36
- 0: "#FFFFFF",
37
- 50: "#FAFAFA",
38
- 100: "#F5F5F5",
39
- 200: "#E5E5E5",
40
- 300: "#D4D4D4",
41
- 400: "#A3A3A3",
42
- 500: "#737373",
43
- 600: "#525252",
44
- 700: "#404040",
45
- 800: "#262626",
46
- 900: "#121212"
57
+ midnight: {
58
+ 50: "#707070",
59
+ 100: "#5C5C5C",
60
+ 200: "#525252",
61
+ 300: "#474747",
62
+ 400: "#3D3D3D",
63
+ 500: "#333333",
64
+ 600: "#1E1E1E",
65
+ 700: "#161616",
66
+ 800: "#141414",
67
+ 900: "#0A0A0A"
47
68
  },
48
- success: {
49
- light: "#4ADE80",
50
- default: "#22C55E",
51
- dark: "#16A34A"
69
+ gray: {
70
+ 50: "#B1B5BE",
71
+ 100: "#A6ABB5",
72
+ 200: "#9BA0AB",
73
+ 300: "#9095A2",
74
+ 400: "#858B99",
75
+ 500: "#7A8190",
76
+ 600: "#6F7685",
77
+ 700: "#5E6471",
78
+ 800: "#5D636F",
79
+ 900: "#545964"
52
80
  },
53
- error: {
54
- light: "#F87171",
55
- default: "#EF4444",
56
- dark: "#DC2626"
81
+ mustard: {
82
+ 50: "#FFF2D6",
83
+ 100: "#FFECC2",
84
+ 200: "#FFE5AD",
85
+ 300: "#FFDF99",
86
+ 400: "#FFD885",
87
+ 500: "#FFD270",
88
+ 600: "#FFCB5C",
89
+ 700: "#FFC140",
90
+ 800: "#FFBE33",
91
+ 900: "#FFB81F"
57
92
  },
58
- warning: {
59
- light: "#FCD34D",
60
- default: "#F59E0B",
61
- dark: "#D97706"
93
+ 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"
62
104
  },
63
- info: {
64
- light: "#60A5FA",
65
- default: "#3B82F6",
66
- dark: "#2563EB"
67
- }
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"
116
+ },
117
+ white: "#FFFFFF",
118
+ successBg: "#E5FBE9"
119
+ };
120
+
121
+ // src/tokens/typography.ts
122
+ 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" }
68
137
  };
69
138
 
70
139
  // src/themes/lightTheme.ts
71
140
  var lightTheme = {
72
- background: colors.neutral[0],
73
- surface: colors.neutral[100],
74
- border: colors.neutral[200],
75
- onBackground: colors.neutral[900],
76
- onSurface: colors.neutral[800],
77
- muted: colors.neutral[500],
78
- primary: colors.brand.primary,
79
- secondary: colors.brand.secondary,
80
- success: colors.success.default,
81
- error: colors.error.default,
82
- warning: colors.warning.default,
83
- info: colors.info.default
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]
84
161
  };
85
162
 
86
163
  // src/themes/darkTheme.ts
87
164
  var darkTheme = {
88
- background: colors.neutral[900],
89
- surface: colors.neutral[800],
90
- border: colors.neutral[700],
91
- onBackground: colors.neutral[0],
92
- onSurface: colors.neutral[100],
93
- muted: colors.neutral[400],
94
- primary: colors.brand.primary,
95
- secondary: colors.brand.secondary,
96
- success: colors.success.light,
97
- error: colors.error.light,
98
- warning: colors.warning.light,
99
- info: colors.info.light
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]
185
+ };
186
+
187
+ // src/context/ThemeProvider.tsx
188
+ var import_react = require("react");
189
+ var import_jsx_runtime = require("react/jsx-runtime");
190
+ var DSThemeContext = (0, import_react.createContext)({ theme: lightTheme, colorScheme: "light" });
191
+ function DSThemeProvider({
192
+ colorScheme = "light",
193
+ children
194
+ }) {
195
+ const value = (0, import_react.useMemo)(
196
+ () => ({ theme: colorScheme === "dark" ? darkTheme : lightTheme, colorScheme }),
197
+ [colorScheme]
198
+ );
199
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DSThemeContext.Provider, { value, children });
200
+ }
201
+ function useTheme() {
202
+ return (0, import_react.useContext)(DSThemeContext);
203
+ }
204
+
205
+ // src/components/Button/Button.native.tsx
206
+ var import_react_native = require("react-native");
207
+
208
+ // src/components/Button/Button.styles.ts
209
+ var buttonTokens = {
210
+ 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 }
214
+ },
215
+ borderRadius: 9999
216
+ };
217
+
218
+ // src/components/Button/Button.native.tsx
219
+ var import_jsx_runtime2 = require("react/jsx-runtime");
220
+ function Button({ variant = "primary", size = "md", disabled = false, children, onPress }) {
221
+ 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;
226
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
227
+ import_react_native.Pressable,
228
+ {
229
+ onPress: disabled ? void 0 : onPress,
230
+ style: ({ pressed }) => [
231
+ styles.base,
232
+ {
233
+ height: sizeStyle.height,
234
+ paddingHorizontal: sizeStyle.paddingHorizontal,
235
+ borderRadius,
236
+ backgroundColor: bgColor,
237
+ opacity: disabled ? 0.5 : pressed ? 0.85 : 1
238
+ }
239
+ ],
240
+ accessibilityRole: "button",
241
+ accessibilityState: { disabled },
242
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_react_native.Text, { style: [styles.label, { fontSize: sizeStyle.fontSize, color: textColor }], children })
243
+ }
244
+ );
245
+ }
246
+ var styles = import_react_native.StyleSheet.create({
247
+ base: { flexDirection: "row", alignItems: "center", justifyContent: "center" },
248
+ label: { fontWeight: "600" }
249
+ });
250
+
251
+ // src/components/Chip/Chip.native.tsx
252
+ 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
+ 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;
267
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
268
+ import_react_native2.Pressable,
269
+ {
270
+ onPress,
271
+ style: ({ pressed }) => [
272
+ styles2.base,
273
+ { height: size.height, paddingHorizontal: size.paddingHorizontal, borderRadius, backgroundColor: bg, opacity: pressed ? 0.85 : 1 },
274
+ style
275
+ ],
276
+ 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 })
278
+ }
279
+ );
280
+ }
281
+ var styles2 = import_react_native2.StyleSheet.create({
282
+ base: { flexDirection: "row", alignItems: "center", justifyContent: "center" }
283
+ });
284
+
285
+ // src/components/Alert/Alert.native.tsx
286
+ var import_react_native3 = require("react-native");
287
+
288
+ // src/components/Alert/Alert.styles.ts
289
+ var alertTokens = {
290
+ padding: 20,
291
+ borderRadius: 32
292
+ };
293
+
294
+ // src/components/Alert/Alert.native.tsx
295
+ var import_jsx_runtime4 = require("react/jsx-runtime");
296
+ function Alert({ variant = "info", title, description }) {
297
+ 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
+ ] });
304
+ }
305
+ var styles3 = import_react_native3.StyleSheet.create({
306
+ container: {
307
+ width: "100%",
308
+ borderWidth: 1,
309
+ borderTopLeftRadius: 32,
310
+ borderTopRightRadius: 32,
311
+ borderBottomRightRadius: 32,
312
+ borderBottomLeftRadius: 0
313
+ },
314
+ title: { fontWeight: "600", fontSize: 16, lineHeight: 22 },
315
+ description: { fontWeight: "500", fontSize: 14, lineHeight: 21, marginTop: 12 }
316
+ });
317
+
318
+ // src/components/ProgressBar/ProgressBar.native.tsx
319
+ var import_react_native4 = require("react-native");
320
+
321
+ // src/components/ProgressBar/ProgressBar.styles.ts
322
+ var progressBarTokens = {
323
+ height: 8,
324
+ borderRadius: 999,
325
+ fillBorderRadius: 24
326
+ };
327
+
328
+ // src/components/ProgressBar/ProgressBar.native.tsx
329
+ var import_jsx_runtime5 = require("react/jsx-runtime");
330
+ function ProgressBar({ value }) {
331
+ const { theme } = useTheme();
332
+ const { height, borderRadius, fillBorderRadius } = progressBarTokens;
333
+ const pct = Math.min(100, Math.max(0, value));
334
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
335
+ import_react_native4.View,
336
+ {
337
+ style: [styles4.track, { height, borderRadius, backgroundColor: theme.border }],
338
+ accessibilityRole: "progressbar",
339
+ 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 } })
341
+ }
342
+ );
343
+ }
344
+ var styles4 = import_react_native4.StyleSheet.create({
345
+ track: { width: "100%", overflow: "hidden" }
346
+ });
347
+
348
+ // src/components/Input/Input.native.tsx
349
+ var import_react2 = require("react");
350
+ var import_react_native5 = require("react-native");
351
+
352
+ // src/components/Input/Input.styles.ts
353
+ var inputTokens = {
354
+ height: 48,
355
+ padding: 12,
356
+ gap: 8,
357
+ borderRadius: 12,
358
+ fontSize: 14
359
+ };
360
+
361
+ // 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 }) {
364
+ const { theme } = useTheme();
365
+ const { height, padding, gap, borderRadius, fontSize } = inputTokens;
366
+ const [isFocused, setIsFocused] = (0, import_react2.useState)(false);
367
+ const isDisabled = state === "disabled";
368
+ const isError = state === "error";
369
+ 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: [
375
+ leadingIcon,
376
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
377
+ import_react_native5.TextInput,
378
+ {
379
+ value,
380
+ placeholder,
381
+ placeholderTextColor: textColor,
382
+ editable: !isDisabled,
383
+ onChangeText,
384
+ onFocus: () => {
385
+ setIsFocused(true);
386
+ onFocus?.();
387
+ },
388
+ onBlur: () => {
389
+ setIsFocused(false);
390
+ onBlur?.();
391
+ },
392
+ style: [styles5.input, { fontSize, color: textColor }]
393
+ }
394
+ )
395
+ ] });
396
+ }
397
+ var styles5 = import_react_native5.StyleSheet.create({
398
+ container: { flexDirection: "row", alignItems: "center", borderStyle: "solid" },
399
+ input: { flex: 1, fontWeight: "500", padding: 0 }
400
+ });
401
+
402
+ // src/components/Checkbox/Checkbox.native.tsx
403
+ var import_react_native6 = require("react-native");
404
+
405
+ // src/components/Checkbox/Checkbox.styles.ts
406
+ var checkboxTokens = {
407
+ size: 20,
408
+ borderRadius: 6
100
409
  };
410
+
411
+ // src/components/Checkbox/Checkbox.native.tsx
412
+ var import_jsx_runtime7 = require("react/jsx-runtime");
413
+ function Checkbox({ checked = false, onChange, disabled = false }) {
414
+ const { theme } = useTheme();
415
+ const { size, borderRadius } = checkboxTokens;
416
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
417
+ import_react_native6.Pressable,
418
+ {
419
+ onPress: disabled ? void 0 : () => onChange?.(!checked),
420
+ 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
+ }
431
+ ],
432
+ accessibilityRole: "checkbox",
433
+ 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 }] }) })
435
+ }
436
+ );
437
+ }
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 }] }
442
+ });
443
+
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
455
+ };
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 }) {
460
+ 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,
469
+ {
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
+ ]
488
+ }
489
+ );
490
+ }
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
+
501
+ // src/components/RadioGroup/RadioGroup.native.tsx
502
+ var import_react_native8 = require("react-native");
503
+ var import_jsx_runtime9 = require("react/jsx-runtime");
504
+ 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 });
506
+ }
507
+
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 }) {
524
+ 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,
529
+ {
530
+ onPress,
531
+ style: ({ pressed }) => [
532
+ styles8.container,
533
+ {
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
544
+ ],
545
+ accessibilityRole: "button",
546
+ 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
+ ] })
553
+ ] }),
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" }) })
555
+ ]
556
+ }
557
+ );
558
+ }
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 }
568
+ });
569
+
570
+ // src/components/Stepper/Stepper.native.tsx
571
+ var import_react_native10 = require("react-native");
572
+
573
+ // src/components/Stepper/Stepper.styles.ts
574
+ var stepperTokens = {
575
+ trackHeight: 4,
576
+ trackRadius: 8,
577
+ dotSize: 4,
578
+ labelFontSize: 10,
579
+ gap: 4
580
+ };
581
+
582
+ // src/components/Stepper/Stepper.native.tsx
583
+ var import_jsx_runtime11 = require("react/jsx-runtime");
584
+ function Stepper({ steps, currentStep, style }) {
585
+ 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
+ }) });
613
+ }
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
+
624
+ // src/components/RatingScale/RatingScale.native.tsx
625
+ var import_react_native11 = require("react-native");
626
+
627
+ // src/components/RatingScale/RatingScale.styles.ts
628
+ var ratingScaleTokens = {
629
+ itemWidth: 60,
630
+ circleSize: 60,
631
+ circlePadding: 8,
632
+ circleRadius: 30,
633
+ emojiFontSize: 38,
634
+ emojiLineHeight: 44,
635
+ labelFontSize: 12,
636
+ numberFontSize: 10,
637
+ itemGap: 8,
638
+ labelNumberGap: 11
639
+ };
640
+ 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" }
646
+ ];
647
+
648
+ // 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 }) {
651
+ 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) => {
654
+ const itemValue = index + 1;
655
+ const selected = value === itemValue;
656
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(
657
+ import_react_native11.Pressable,
658
+ {
659
+ onPress: () => onChange?.(itemValue),
660
+ style: styles10.item,
661
+ accessibilityRole: "button",
662
+ accessibilityState: { selected },
663
+ children: [
664
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
665
+ import_react_native11.View,
666
+ {
667
+ style: [
668
+ styles10.circle,
669
+ {
670
+ width: circleSize,
671
+ height: circleSize,
672
+ borderRadius: circleRadius,
673
+ padding: circlePadding,
674
+ backgroundColor: selected ? theme.primary : theme.surface,
675
+ borderWidth: selected ? 0 : 1,
676
+ borderColor: theme.border
677
+ }
678
+ ],
679
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_native11.Text, { style: [styles10.emoji, { fontSize: emojiFontSize, lineHeight: emojiLineHeight }], children: option.emoji })
680
+ }
681
+ ),
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
+ ] })
700
+ ]
701
+ },
702
+ itemValue
703
+ );
704
+ }) });
705
+ }
706
+ var styles10 = import_react_native11.StyleSheet.create({
707
+ container: { flexDirection: "row", justifyContent: "space-between" },
708
+ item: { alignItems: "center", gap: 8 },
709
+ circle: { alignItems: "center", justifyContent: "center", overflow: "hidden" },
710
+ emoji: { textAlign: "center" },
711
+ labelContainer: { alignItems: "center" },
712
+ label: { textAlign: "center", lineHeight: 16 },
713
+ number: { fontWeight: "600", letterSpacing: 0.8, textAlign: "center", lineHeight: 10 }
714
+ });
101
715
  // Annotate the CommonJS export names for ESM import in node:
102
716
  0 && (module.exports = {
717
+ ActionItem,
718
+ Alert,
719
+ Button,
720
+ Checkbox,
721
+ Chip,
722
+ DSThemeProvider,
723
+ Input,
724
+ ProgressBar,
725
+ RadioGroup,
726
+ RadioItem,
727
+ RatingScale,
728
+ Stepper,
103
729
  colors,
104
730
  darkTheme,
105
- lightTheme
731
+ lightTheme,
732
+ typography,
733
+ useTheme
106
734
  });
107
735
  //# sourceMappingURL=index.native.js.map