@boostdev/design-system-components 1.0.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/AGENTS.md +5 -5
  2. package/dist/client.cjs +236 -153
  3. package/dist/client.css +547 -483
  4. package/dist/client.d.cts +53 -94
  5. package/dist/client.d.ts +53 -94
  6. package/dist/client.js +237 -163
  7. package/dist/index.cjs +236 -153
  8. package/dist/index.css +547 -483
  9. package/dist/index.d.cts +53 -94
  10. package/dist/index.d.ts +53 -94
  11. package/dist/index.js +237 -163
  12. package/dist/native/index.cjs +991 -0
  13. package/dist/native/index.d.cts +208 -0
  14. package/dist/native/index.d.ts +208 -0
  15. package/dist/native/index.js +968 -0
  16. package/dist/web-components.d.ts +303 -0
  17. package/dist/web-components.js +1968 -0
  18. package/package.json +27 -5
  19. package/src/components/interaction/Button/Button.module.css +10 -7
  20. package/src/components/interaction/Button/Button.native.spec.tsx +35 -0
  21. package/src/components/interaction/Button/Button.native.stories.tsx +42 -0
  22. package/src/components/interaction/Button/Button.native.tsx +95 -0
  23. package/src/components/interaction/Button/Button.stories.tsx +1 -1
  24. package/src/components/interaction/Button/Button.tsx +2 -2
  25. package/src/components/interaction/Command/Command.mdx +16 -0
  26. package/src/components/interaction/Command/Command.stories.tsx +1 -1
  27. package/src/components/interaction/Command/Command.tsx +2 -2
  28. package/src/components/interaction/Dialog/Dialog.stories.tsx +1 -1
  29. package/src/components/interaction/Dialog/Dialog.tsx +2 -2
  30. package/src/components/interaction/Drawer/Drawer.mdx +14 -0
  31. package/src/components/interaction/Drawer/Drawer.stories.tsx +1 -1
  32. package/src/components/interaction/Drawer/Drawer.tsx +2 -2
  33. package/src/components/interaction/DropdownMenu/DropdownMenu.stories.tsx +1 -1
  34. package/src/components/interaction/DropdownMenu/DropdownMenu.tsx +2 -2
  35. package/src/components/interaction/Popover/Popover.mdx +17 -0
  36. package/src/components/interaction/Popover/Popover.module.css +70 -13
  37. package/src/components/interaction/Popover/Popover.spec.tsx +68 -4
  38. package/src/components/interaction/Popover/Popover.stories.tsx +1 -1
  39. package/src/components/interaction/Popover/Popover.tsx +76 -20
  40. package/src/components/interaction/Rating/Rating.stories.tsx +1 -1
  41. package/src/components/interaction/Rating/Rating.tsx +2 -2
  42. package/src/components/interaction/Toast/Toast.module.css +6 -1
  43. package/src/components/interaction/Toast/Toast.spec.tsx +21 -0
  44. package/src/components/interaction/Toast/Toast.stories.tsx +1 -1
  45. package/src/components/interaction/Toast/Toast.tsx +22 -2
  46. package/src/components/interaction/form/Checkbox/Checkbox.mdx +2 -2
  47. package/src/components/interaction/form/Checkbox/Checkbox.module.css +3 -3
  48. package/src/components/interaction/form/Checkbox/Checkbox.native.spec.tsx +42 -0
  49. package/src/components/interaction/form/Checkbox/Checkbox.native.stories.tsx +36 -0
  50. package/src/components/interaction/form/Checkbox/Checkbox.native.tsx +80 -0
  51. package/src/components/interaction/form/Checkbox/Checkbox.stories.tsx +1 -1
  52. package/src/components/interaction/form/Checkbox/Checkbox.tsx +2 -2
  53. package/src/components/interaction/form/CheckboxGroup/CheckboxGroup.mdx +44 -0
  54. package/src/components/interaction/form/CheckboxGroup/CheckboxGroup.stories.tsx +1 -1
  55. package/src/components/interaction/form/CheckboxGroup/CheckboxGroup.tsx +2 -2
  56. package/src/components/interaction/form/Combobox/Combobox.mdx +21 -0
  57. package/src/components/interaction/form/Combobox/Combobox.module.css +1 -1
  58. package/src/components/interaction/form/Combobox/Combobox.stories.tsx +1 -1
  59. package/src/components/interaction/form/Combobox/Combobox.tsx +2 -2
  60. package/src/components/interaction/form/FileInput/FileInput.mdx +14 -0
  61. package/src/components/interaction/form/FileInput/FileInput.module.css +1 -1
  62. package/src/components/interaction/form/FileInput/FileInput.stories.tsx +1 -1
  63. package/src/components/interaction/form/FileInput/FileInput.tsx +2 -2
  64. package/src/components/interaction/form/FormInput/FormInput.stories.tsx +1 -1
  65. package/src/components/interaction/form/FormInput/FormInput.tsx +2 -2
  66. package/src/components/interaction/form/NumberInput/NumberInput.mdx +16 -0
  67. package/src/components/interaction/form/NumberInput/NumberInput.stories.tsx +1 -1
  68. package/src/components/interaction/form/NumberInput/NumberInput.tsx +2 -2
  69. package/src/components/interaction/form/Radio/Radio.mdx +3 -3
  70. package/src/components/interaction/form/Radio/Radio.module.css +3 -3
  71. package/src/components/interaction/form/Radio/Radio.native.stories.tsx +46 -0
  72. package/src/components/interaction/form/Radio/Radio.native.tsx +79 -0
  73. package/src/components/interaction/form/Radio/Radio.stories.tsx +1 -1
  74. package/src/components/interaction/form/Radio/Radio.tsx +2 -2
  75. package/src/components/interaction/form/RadioGroup/RadioGroup.mdx +45 -0
  76. package/src/components/interaction/form/RadioGroup/RadioGroup.stories.tsx +1 -1
  77. package/src/components/interaction/form/RadioGroup/RadioGroup.tsx +2 -2
  78. package/src/components/interaction/form/SegmentedControl/SegmentedControl.stories.tsx +1 -1
  79. package/src/components/interaction/form/SegmentedControl/SegmentedControl.tsx +2 -2
  80. package/src/components/interaction/form/Select/Select.stories.tsx +1 -1
  81. package/src/components/interaction/form/Select/Select.tsx +2 -2
  82. package/src/components/interaction/form/Slider/Slider.mdx +1 -1
  83. package/src/components/interaction/form/Slider/Slider.module.css +4 -4
  84. package/src/components/interaction/form/Slider/Slider.stories.tsx +1 -1
  85. package/src/components/interaction/form/Slider/Slider.tsx +2 -2
  86. package/src/components/interaction/form/Switch/Switch.mdx +4 -4
  87. package/src/components/interaction/form/Switch/Switch.module.css +3 -3
  88. package/src/components/interaction/form/Switch/Switch.native.spec.tsx +60 -0
  89. package/src/components/interaction/form/Switch/Switch.native.stories.tsx +35 -0
  90. package/src/components/interaction/form/Switch/Switch.native.tsx +59 -0
  91. package/src/components/interaction/form/Switch/Switch.stories.tsx +1 -1
  92. package/src/components/interaction/form/Switch/Switch.tsx +2 -2
  93. package/src/components/interaction/form/Textarea/Textarea.mdx +17 -0
  94. package/src/components/interaction/form/Textarea/Textarea.stories.tsx +1 -1
  95. package/src/components/interaction/form/Textarea/Textarea.tsx +2 -2
  96. package/src/components/interaction/form/atoms/InputContainer.tsx +2 -1
  97. package/src/components/interaction/form/atoms/Label.native.stories.tsx +18 -0
  98. package/src/components/interaction/form/atoms/Label.native.tsx +29 -0
  99. package/src/components/interaction/form/atoms/Label.tsx +5 -3
  100. package/src/components/interaction/form/atoms/Message.native.spec.tsx +30 -0
  101. package/src/components/interaction/form/atoms/Message.native.stories.tsx +22 -0
  102. package/src/components/interaction/form/atoms/Message.native.tsx +34 -0
  103. package/src/components/interaction/form/atoms/Message.tsx +5 -3
  104. package/src/components/layout/ButtonGroup/ButtonGroup.native.stories.tsx +50 -0
  105. package/src/components/layout/ButtonGroup/ButtonGroup.native.tsx +34 -0
  106. package/src/components/layout/ButtonGroup/ButtonGroup.stories.tsx +1 -1
  107. package/src/components/layout/ButtonGroup/ButtonGroup.tsx +2 -2
  108. package/src/components/layout/Card/Card.native.stories.tsx +53 -0
  109. package/src/components/layout/Card/Card.native.tsx +89 -0
  110. package/src/components/layout/Card/Card.stories.tsx +1 -1
  111. package/src/components/layout/Card/Card.tsx +2 -2
  112. package/src/components/layout/IconWrapper/IconWrapper.mdx +2 -2
  113. package/src/components/layout/IconWrapper/IconWrapper.native.spec.tsx +39 -0
  114. package/src/components/layout/IconWrapper/IconWrapper.native.stories.tsx +41 -0
  115. package/src/components/layout/IconWrapper/IconWrapper.native.tsx +20 -0
  116. package/src/components/layout/IconWrapper/IconWrapper.stories.tsx +1 -1
  117. package/src/components/layout/IconWrapper/IconWrapper.tsx +2 -2
  118. package/src/components/layout/SectionHeader/SectionHeader.mdx +13 -0
  119. package/src/components/layout/SectionHeader/SectionHeader.native.stories.tsx +38 -0
  120. package/src/components/layout/SectionHeader/SectionHeader.native.tsx +79 -0
  121. package/src/components/layout/SectionHeader/SectionHeader.stories.tsx +1 -1
  122. package/src/components/layout/SectionHeader/SectionHeader.tsx +2 -2
  123. package/src/components/ui/Accordion/Accordion.mdx +14 -0
  124. package/src/components/ui/Accordion/Accordion.stories.tsx +1 -1
  125. package/src/components/ui/Accordion/Accordion.tsx +2 -2
  126. package/src/components/ui/Alert/Alert.native.stories.tsx +43 -0
  127. package/src/components/ui/Alert/Alert.native.tsx +94 -0
  128. package/src/components/ui/Alert/Alert.stories.tsx +1 -1
  129. package/src/components/ui/Alert/Alert.tsx +2 -2
  130. package/src/components/ui/Avatar/Avatar.native.spec.tsx +47 -0
  131. package/src/components/ui/Avatar/Avatar.native.stories.tsx +34 -0
  132. package/src/components/ui/Avatar/Avatar.native.tsx +85 -0
  133. package/src/components/ui/Avatar/Avatar.stories.tsx +1 -1
  134. package/src/components/ui/Avatar/Avatar.tsx +2 -2
  135. package/src/components/ui/Badge/Badge.mdx +2 -2
  136. package/src/components/ui/Badge/Badge.native.stories.tsx +36 -0
  137. package/src/components/ui/Badge/Badge.native.tsx +50 -0
  138. package/src/components/ui/Badge/Badge.stories.tsx +1 -1
  139. package/src/components/ui/Badge/Badge.tsx +2 -2
  140. package/src/components/ui/Breadcrumb/Breadcrumb.stories.tsx +1 -1
  141. package/src/components/ui/Breadcrumb/Breadcrumb.tsx +2 -2
  142. package/src/components/ui/Calendar/Calendar.mdx +16 -0
  143. package/src/components/ui/Calendar/Calendar.stories.tsx +1 -1
  144. package/src/components/ui/Calendar/Calendar.tsx +2 -2
  145. package/src/components/ui/Carousel/Carousel.stories.tsx +1 -1
  146. package/src/components/ui/Carousel/Carousel.tsx +2 -2
  147. package/src/components/ui/Collapsible/Collapsible.stories.tsx +1 -1
  148. package/src/components/ui/Collapsible/Collapsible.tsx +2 -2
  149. package/src/components/ui/DescriptionList/DescriptionList.stories.tsx +1 -1
  150. package/src/components/ui/DescriptionList/DescriptionList.tsx +2 -2
  151. package/src/components/ui/Link/Link.mdx +14 -0
  152. package/src/components/ui/Link/Link.stories.tsx +1 -1
  153. package/src/components/ui/Link/Link.tsx +2 -2
  154. package/src/components/ui/Loading/Loading.native.spec.tsx +24 -0
  155. package/src/components/ui/Loading/Loading.native.stories.tsx +33 -0
  156. package/src/components/ui/Loading/Loading.native.tsx +29 -0
  157. package/src/components/ui/Loading/Loading.stories.tsx +1 -1
  158. package/src/components/ui/Loading/Loading.tsx +2 -2
  159. package/src/components/ui/NotificationBanner/NotificationBanner.native.stories.tsx +39 -0
  160. package/src/components/ui/NotificationBanner/NotificationBanner.native.tsx +76 -0
  161. package/src/components/ui/NotificationBanner/NotificationBanner.stories.tsx +1 -1
  162. package/src/components/ui/NotificationBanner/NotificationBanner.tsx +2 -2
  163. package/src/components/ui/Pagination/Pagination.module.css +1 -1
  164. package/src/components/ui/Pagination/Pagination.stories.tsx +1 -1
  165. package/src/components/ui/Pagination/Pagination.tsx +2 -2
  166. package/src/components/ui/Progress/Progress.mdx +1 -1
  167. package/src/components/ui/Progress/Progress.module.css +1 -1
  168. package/src/components/ui/Progress/Progress.native.stories.tsx +34 -0
  169. package/src/components/ui/Progress/Progress.native.tsx +84 -0
  170. package/src/components/ui/Progress/Progress.stories.tsx +1 -1
  171. package/src/components/ui/Progress/Progress.tsx +2 -2
  172. package/src/components/ui/ProgressCircle/ProgressCircle.module.css +1 -1
  173. package/src/components/ui/ProgressCircle/ProgressCircle.stories.tsx +1 -1
  174. package/src/components/ui/ProgressCircle/ProgressCircle.tsx +2 -2
  175. package/src/components/ui/Separator/Separator.mdx +14 -0
  176. package/src/components/ui/Separator/Separator.native.stories.tsx +42 -0
  177. package/src/components/ui/Separator/Separator.native.tsx +32 -0
  178. package/src/components/ui/Separator/Separator.stories.tsx +1 -1
  179. package/src/components/ui/Separator/Separator.tsx +2 -2
  180. package/src/components/ui/Skeleton/Skeleton.native.stories.tsx +33 -0
  181. package/src/components/ui/Skeleton/Skeleton.native.tsx +41 -0
  182. package/src/components/ui/Skeleton/Skeleton.stories.tsx +1 -1
  183. package/src/components/ui/Skeleton/Skeleton.tsx +2 -3
  184. package/src/components/ui/SkipLink/SkipLink.stories.tsx +1 -1
  185. package/src/components/ui/SkipLink/SkipLink.tsx +5 -3
  186. package/src/components/ui/Table/Table.mdx +14 -0
  187. package/src/components/ui/Table/Table.stories.tsx +1 -1
  188. package/src/components/ui/Table/Table.tsx +2 -2
  189. package/src/components/ui/Tabs/Tabs.stories.tsx +1 -1
  190. package/src/components/ui/Tabs/Tabs.tsx +2 -2
  191. package/src/components/ui/Tooltip/Tooltip.mdx +14 -0
  192. package/src/components/ui/Tooltip/Tooltip.stories.tsx +1 -1
  193. package/src/components/ui/Tooltip/Tooltip.tsx +2 -2
  194. package/src/components/ui/Typography/Typography.mdx +13 -0
  195. package/src/components/ui/Typography/Typography.native.stories.tsx +38 -0
  196. package/src/components/ui/Typography/Typography.native.tsx +65 -0
  197. package/src/components/ui/Typography/Typography.stories.tsx +1 -1
  198. package/src/components/ui/Typography/Typography.tsx +2 -2
  199. package/src/css/bdc.css +8 -0
  200. package/src/index.ts +1 -0
  201. package/src/native/ThemeContext.tsx +28 -0
  202. package/src/native/tokens.ts +13 -0
  203. package/src/native.ts +39 -0
  204. package/src/react-augment.d.ts +13 -0
  205. package/src/stories/DesignSystem/DarkMode.mdx +130 -0
  206. package/src/types.ts +2 -0
  207. package/src/typings.d.ts +3 -0
  208. package/src/web-components/globals.ts +61 -0
  209. package/src/web-components/index.ts +12 -0
  210. package/src/web-components/interaction/BdsButton.stories.tsx +60 -0
  211. package/src/web-components/interaction/BdsPopover.stories.tsx +70 -0
  212. package/src/web-components/interaction/BdsToastProvider.stories.tsx +73 -0
  213. package/src/web-components/interaction/bds-button.spec.ts +95 -0
  214. package/src/web-components/interaction/bds-button.ts +293 -0
  215. package/src/web-components/interaction/bds-popover.spec.ts +126 -0
  216. package/src/web-components/interaction/bds-popover.ts +217 -0
  217. package/src/web-components/interaction/bds-toast-provider.spec.ts +122 -0
  218. package/src/web-components/interaction/bds-toast-provider.ts +211 -0
  219. package/src/web-components/test/helpers.ts +14 -0
  220. package/src/web-components/ui/BdsAlert.stories.tsx +60 -0
  221. package/src/web-components/ui/BdsBadge.stories.tsx +37 -0
  222. package/src/web-components/ui/bds-alert.spec.ts +109 -0
  223. package/src/web-components/ui/bds-alert.ts +209 -0
  224. package/src/web-components/ui/bds-badge.spec.ts +51 -0
  225. package/src/web-components/ui/bds-badge.ts +88 -0
@@ -0,0 +1,968 @@
1
+ // src/native/ThemeContext.tsx
2
+ import { createContext, useContext, useMemo } from "react";
3
+ import { useColorScheme } from "react-native";
4
+
5
+ // src/native/tokens.ts
6
+ import { colors, spacing, font, border, zIndex, animation } from "@boostdev/design-system-foundation/native";
7
+ var lineHeight = {
8
+ display: Math.round(font.size.display * font.lineHeight.display),
9
+ heading1: Math.round(font.size.heading1 * font.lineHeight.heading),
10
+ heading2: Math.round(font.size.heading2 * font.lineHeight.heading),
11
+ heading3: Math.round(font.size.heading3 * font.lineHeight.heading),
12
+ body: Math.round(font.size.body * font.lineHeight.body),
13
+ bodyS: Math.round(font.size.bodyS * font.lineHeight.body)
14
+ };
15
+
16
+ // src/native/ThemeContext.tsx
17
+ import { jsx } from "react/jsx-runtime";
18
+ var ThemeContext = createContext(null);
19
+ function ThemeProvider({ children }) {
20
+ const scheme = useColorScheme();
21
+ const isDark = scheme === "dark";
22
+ const value = useMemo(
23
+ () => ({ colors: isDark ? colors.dark : colors.light, isDark }),
24
+ [isDark]
25
+ );
26
+ return /* @__PURE__ */ jsx(ThemeContext.Provider, { value, children });
27
+ }
28
+ function useTheme() {
29
+ const ctx = useContext(ThemeContext);
30
+ if (!ctx) throw new Error("useTheme must be used within ThemeProvider");
31
+ return ctx;
32
+ }
33
+
34
+ // src/components/ui/Typography/Typography.native.tsx
35
+ import { StyleSheet, Text } from "react-native";
36
+ import { jsx as jsx2 } from "react/jsx-runtime";
37
+ var styles = StyleSheet.create({
38
+ base: {
39
+ fontFamily: font.family.body,
40
+ fontWeight: font.weight.body
41
+ },
42
+ h1: {
43
+ fontSize: font.size.heading1,
44
+ fontFamily: font.family.heading,
45
+ fontWeight: font.weight.heading,
46
+ lineHeight: lineHeight.heading1
47
+ },
48
+ h2: {
49
+ fontSize: font.size.heading2,
50
+ fontFamily: font.family.heading,
51
+ fontWeight: font.weight.heading,
52
+ lineHeight: lineHeight.heading2
53
+ },
54
+ h3: {
55
+ fontSize: font.size.heading3,
56
+ fontFamily: font.family.heading,
57
+ fontWeight: font.weight.heading,
58
+ lineHeight: lineHeight.heading3
59
+ },
60
+ body: {
61
+ fontSize: font.size.body,
62
+ lineHeight: lineHeight.body
63
+ },
64
+ body_s: {
65
+ fontSize: font.size.bodyS,
66
+ lineHeight: lineHeight.bodyS
67
+ }
68
+ });
69
+ var accessibilityRoles = {
70
+ h1: "header",
71
+ h2: "header",
72
+ h3: "header",
73
+ body: "text",
74
+ body_s: "text"
75
+ };
76
+ function Typography({ variant = "body", children, style }) {
77
+ const { colors: colors2 } = useTheme();
78
+ return /* @__PURE__ */ jsx2(
79
+ Text,
80
+ {
81
+ accessibilityRole: accessibilityRoles[variant],
82
+ style: [styles.base, styles[variant], { color: colors2.colorOnBg }, style],
83
+ children
84
+ }
85
+ );
86
+ }
87
+
88
+ // src/components/ui/Badge/Badge.native.tsx
89
+ import { StyleSheet as StyleSheet2, View, Text as Text2 } from "react-native";
90
+ import { jsx as jsx3 } from "react/jsx-runtime";
91
+ var styles2 = StyleSheet2.create({
92
+ badge: {
93
+ alignSelf: "flex-start",
94
+ flexDirection: "row",
95
+ alignItems: "center",
96
+ justifyContent: "center",
97
+ paddingVertical: spacing.xxs,
98
+ paddingHorizontal: spacing.xs,
99
+ borderRadius: 999
100
+ },
101
+ text: {
102
+ fontSize: font.size.bodyS,
103
+ fontFamily: font.family.body,
104
+ fontWeight: font.weight.semibold,
105
+ lineHeight: font.size.bodyS
106
+ }
107
+ });
108
+ function Badge({ children, variant = "primary", style }) {
109
+ const { colors: colors2 } = useTheme();
110
+ const variantColors = {
111
+ primary: { bg: colors2.colorInteractive, text: colors2.colorOnInteractive },
112
+ secondary: { bg: colors2.colorBgSubtle, text: colors2.colorOnBgSubtle },
113
+ success: { bg: colors2.colorSuccess, text: colors2.colorOnSuccess },
114
+ error: { bg: colors2.colorError, text: colors2.colorOnError },
115
+ warning: { bg: colors2.colorWarning, text: colors2.colorOnWarning }
116
+ };
117
+ const { bg, text } = variantColors[variant];
118
+ return /* @__PURE__ */ jsx3(View, { style: [styles2.badge, { backgroundColor: bg }, style], children: /* @__PURE__ */ jsx3(Text2, { style: [styles2.text, { color: text }], children }) });
119
+ }
120
+
121
+ // src/components/ui/Avatar/Avatar.native.tsx
122
+ import { StyleSheet as StyleSheet3, View as View2, Text as Text3, Image } from "react-native";
123
+ import { jsx as jsx4 } from "react/jsx-runtime";
124
+ var sizeMap = {
125
+ small: { container: 32, fontSize: font.size.bodyS },
126
+ medium: { container: 48, fontSize: font.size.body },
127
+ large: { container: 72, fontSize: font.size.heading3 }
128
+ };
129
+ function getInitials(name) {
130
+ return name.split(" ").filter(Boolean).slice(0, 2).map((word) => word[0].toUpperCase()).join("");
131
+ }
132
+ var styles3 = StyleSheet3.create({
133
+ container: {
134
+ borderRadius: 999,
135
+ overflow: "hidden",
136
+ alignItems: "center",
137
+ justifyContent: "center"
138
+ },
139
+ image: {
140
+ width: "100%",
141
+ height: "100%"
142
+ },
143
+ initials: {
144
+ fontFamily: font.family.body,
145
+ fontWeight: font.weight.semibold
146
+ }
147
+ });
148
+ function Avatar({ src, alt, name, size = "medium", style }) {
149
+ const { colors: colors2 } = useTheme();
150
+ const { container, fontSize } = sizeMap[size];
151
+ const label = alt ?? name ?? "User avatar";
152
+ if (src) {
153
+ return /* @__PURE__ */ jsx4(
154
+ View2,
155
+ {
156
+ style: [styles3.container, { width: container, height: container }, style],
157
+ accessibilityLabel: label,
158
+ accessibilityRole: "image",
159
+ children: /* @__PURE__ */ jsx4(Image, { source: { uri: src }, style: styles3.image })
160
+ }
161
+ );
162
+ }
163
+ const initials = name ? getInitials(name) : "";
164
+ return /* @__PURE__ */ jsx4(
165
+ View2,
166
+ {
167
+ style: [
168
+ styles3.container,
169
+ { width: container, height: container, backgroundColor: colors2.colorBlue },
170
+ style
171
+ ],
172
+ accessibilityLabel: label,
173
+ accessibilityRole: "image",
174
+ children: /* @__PURE__ */ jsx4(
175
+ Text3,
176
+ {
177
+ style: [styles3.initials, { fontSize, color: colors2.colorOnBlue }],
178
+ importantForAccessibility: "no",
179
+ accessibilityElementsHidden: true,
180
+ children: initials
181
+ }
182
+ )
183
+ }
184
+ );
185
+ }
186
+
187
+ // src/components/ui/Separator/Separator.native.tsx
188
+ import { StyleSheet as StyleSheet4, View as View3 } from "react-native";
189
+ import { jsx as jsx5 } from "react/jsx-runtime";
190
+ var styles4 = StyleSheet4.create({
191
+ horizontal: {
192
+ height: StyleSheet4.hairlineWidth,
193
+ width: "100%"
194
+ },
195
+ vertical: {
196
+ width: StyleSheet4.hairlineWidth,
197
+ alignSelf: "stretch"
198
+ }
199
+ });
200
+ function Separator({ orientation = "horizontal", style }) {
201
+ const { colors: colors2 } = useTheme();
202
+ return /* @__PURE__ */ jsx5(
203
+ View3,
204
+ {
205
+ accessibilityRole: "none",
206
+ style: [
207
+ orientation === "vertical" ? styles4.vertical : styles4.horizontal,
208
+ { backgroundColor: colors2.colorBgSubtle },
209
+ style
210
+ ]
211
+ }
212
+ );
213
+ }
214
+
215
+ // src/components/ui/Loading/Loading.native.tsx
216
+ import { ActivityIndicator } from "react-native";
217
+ import { jsx as jsx6 } from "react/jsx-runtime";
218
+ var rnSize = {
219
+ small: "small",
220
+ medium: "large",
221
+ large: "large"
222
+ };
223
+ function Loading({ size = "medium", accessibilityLabel = "Loading", style }) {
224
+ const { colors: colors2 } = useTheme();
225
+ return /* @__PURE__ */ jsx6(
226
+ ActivityIndicator,
227
+ {
228
+ size: rnSize[size],
229
+ color: colors2.colorInteractive,
230
+ style,
231
+ accessibilityRole: "progressbar",
232
+ accessibilityLabel
233
+ }
234
+ );
235
+ }
236
+
237
+ // src/components/ui/Progress/Progress.native.tsx
238
+ import { StyleSheet as StyleSheet5, View as View4, Text as Text4 } from "react-native";
239
+ import { jsx as jsx7, jsxs } from "react/jsx-runtime";
240
+ var trackHeight = {
241
+ small: 4,
242
+ medium: 8,
243
+ large: 12
244
+ };
245
+ var styles5 = StyleSheet5.create({
246
+ container: {
247
+ width: "100%"
248
+ },
249
+ labelRow: {
250
+ flexDirection: "row",
251
+ justifyContent: "space-between",
252
+ marginBottom: spacing.xxs
253
+ },
254
+ labelText: {
255
+ fontSize: font.size.bodyS,
256
+ fontFamily: font.family.body,
257
+ lineHeight: lineHeight.bodyS
258
+ },
259
+ track: {
260
+ width: "100%",
261
+ borderRadius: border.radius.xs,
262
+ overflow: "hidden"
263
+ },
264
+ fill: {
265
+ height: "100%",
266
+ borderRadius: border.radius.xs
267
+ }
268
+ });
269
+ function Progress({
270
+ value,
271
+ max = 100,
272
+ label,
273
+ showLabel = false,
274
+ size = "medium",
275
+ style
276
+ }) {
277
+ const { colors: colors2 } = useTheme();
278
+ const percentage = Math.min(100, Math.max(0, value / max * 100));
279
+ const height = trackHeight[size];
280
+ return /* @__PURE__ */ jsxs(View4, { style: [styles5.container, style], children: [
281
+ showLabel && /* @__PURE__ */ jsxs(View4, { style: styles5.labelRow, children: [
282
+ /* @__PURE__ */ jsx7(Text4, { style: [styles5.labelText, { color: colors2.colorOnBg }], children: label }),
283
+ /* @__PURE__ */ jsxs(Text4, { style: [styles5.labelText, { color: colors2.colorOnBgSubtle }], children: [
284
+ Math.round(percentage),
285
+ "%"
286
+ ] })
287
+ ] }),
288
+ /* @__PURE__ */ jsx7(
289
+ View4,
290
+ {
291
+ style: [styles5.track, { height, backgroundColor: colors2.colorBgSubtle }],
292
+ accessibilityRole: "progressbar",
293
+ accessibilityLabel: label,
294
+ accessibilityValue: { min: 0, max, now: value },
295
+ children: /* @__PURE__ */ jsx7(
296
+ View4,
297
+ {
298
+ style: [
299
+ styles5.fill,
300
+ { width: `${percentage}%`, backgroundColor: colors2.colorInteractive }
301
+ ]
302
+ }
303
+ )
304
+ }
305
+ )
306
+ ] });
307
+ }
308
+
309
+ // src/components/ui/Skeleton/Skeleton.native.tsx
310
+ import { useEffect, useRef } from "react";
311
+ import { Animated, StyleSheet as StyleSheet6 } from "react-native";
312
+ import { jsx as jsx8 } from "react/jsx-runtime";
313
+ var styles6 = StyleSheet6.create({
314
+ skeleton: {
315
+ borderRadius: 4,
316
+ overflow: "hidden"
317
+ }
318
+ });
319
+ function Skeleton({ style }) {
320
+ const { colors: colors2 } = useTheme();
321
+ const opacity = useRef(new Animated.Value(1)).current;
322
+ useEffect(() => {
323
+ const anim = Animated.loop(
324
+ Animated.sequence([
325
+ Animated.timing(opacity, { toValue: 0.4, duration: 700, useNativeDriver: true }),
326
+ Animated.timing(opacity, { toValue: 1, duration: 700, useNativeDriver: true })
327
+ ])
328
+ );
329
+ anim.start();
330
+ return () => anim.stop();
331
+ }, [opacity]);
332
+ return /* @__PURE__ */ jsx8(
333
+ Animated.View,
334
+ {
335
+ importantForAccessibility: "no-hide-descendants",
336
+ style: [
337
+ styles6.skeleton,
338
+ { backgroundColor: colors2.colorBgSubtle, opacity },
339
+ style
340
+ ]
341
+ }
342
+ );
343
+ }
344
+
345
+ // src/components/ui/Alert/Alert.native.tsx
346
+ import { StyleSheet as StyleSheet7, View as View5, Text as Text5, Pressable } from "react-native";
347
+ import { jsx as jsx9, jsxs as jsxs2 } from "react/jsx-runtime";
348
+ var styles7 = StyleSheet7.create({
349
+ alert: {
350
+ flexDirection: "row",
351
+ alignItems: "flex-start",
352
+ padding: spacing.m,
353
+ borderRadius: border.radius.s,
354
+ gap: spacing.xs
355
+ },
356
+ icon: {
357
+ flexShrink: 0,
358
+ marginTop: 2
359
+ },
360
+ content: {
361
+ flex: 1,
362
+ gap: spacing.xxs
363
+ },
364
+ title: {
365
+ fontSize: font.size.body,
366
+ fontFamily: font.family.body,
367
+ fontWeight: font.weight.semibold,
368
+ lineHeight: lineHeight.body
369
+ },
370
+ body: {
371
+ fontSize: font.size.bodyS,
372
+ fontFamily: font.family.body,
373
+ lineHeight: lineHeight.bodyS
374
+ },
375
+ dismiss: {
376
+ padding: spacing.xxs,
377
+ flexShrink: 0
378
+ }
379
+ });
380
+ function Alert({
381
+ variant = "info",
382
+ icon,
383
+ title,
384
+ children,
385
+ onDismiss,
386
+ style
387
+ }) {
388
+ const { colors: colors2 } = useTheme();
389
+ const isUrgent = variant === "error" || variant === "warning";
390
+ const variantColors = {
391
+ info: { bg: colors2.colorBlueSubtle, text: colors2.colorOnBlueSubtle },
392
+ success: { bg: colors2.colorSuccessSubtle, text: colors2.colorOnSuccessSubtle },
393
+ warning: { bg: colors2.colorOrangeSubtle, text: colors2.colorOnOrangeSubtle },
394
+ error: { bg: colors2.colorRedSubtle, text: colors2.colorOnRedSubtle }
395
+ };
396
+ const { bg, text } = variantColors[variant];
397
+ return /* @__PURE__ */ jsxs2(
398
+ View5,
399
+ {
400
+ accessibilityRole: isUrgent ? "alert" : "none",
401
+ accessibilityLiveRegion: isUrgent ? "assertive" : "polite",
402
+ style: [styles7.alert, { backgroundColor: bg }, style],
403
+ children: [
404
+ icon && /* @__PURE__ */ jsx9(View5, { style: styles7.icon, children: icon }),
405
+ /* @__PURE__ */ jsxs2(View5, { style: styles7.content, children: [
406
+ title && /* @__PURE__ */ jsx9(Text5, { style: [styles7.title, { color: text }], children: title }),
407
+ /* @__PURE__ */ jsx9(Text5, { style: [styles7.body, { color: text }], children })
408
+ ] }),
409
+ onDismiss && /* @__PURE__ */ jsx9(
410
+ Pressable,
411
+ {
412
+ onPress: onDismiss,
413
+ style: styles7.dismiss,
414
+ accessibilityLabel: "Dismiss alert",
415
+ accessibilityRole: "button",
416
+ hitSlop: 8,
417
+ children: /* @__PURE__ */ jsx9(Text5, { style: { color: text, fontSize: 16 }, children: "\u2715" })
418
+ }
419
+ )
420
+ ]
421
+ }
422
+ );
423
+ }
424
+
425
+ // src/components/ui/NotificationBanner/NotificationBanner.native.tsx
426
+ import { StyleSheet as StyleSheet8, View as View6, Text as Text6, Pressable as Pressable2 } from "react-native";
427
+ import { jsx as jsx10, jsxs as jsxs3 } from "react/jsx-runtime";
428
+ var styles8 = StyleSheet8.create({
429
+ banner: {
430
+ flexDirection: "row",
431
+ alignItems: "center",
432
+ paddingVertical: spacing.s,
433
+ paddingHorizontal: spacing.m,
434
+ gap: spacing.xs
435
+ },
436
+ content: {
437
+ flex: 1,
438
+ fontSize: font.size.bodyS,
439
+ fontFamily: font.family.body,
440
+ lineHeight: lineHeight.bodyS
441
+ },
442
+ dismiss: {
443
+ padding: spacing.xxs,
444
+ flexShrink: 0
445
+ }
446
+ });
447
+ function NotificationBanner({
448
+ variant = "info",
449
+ children,
450
+ action,
451
+ onDismiss,
452
+ style
453
+ }) {
454
+ const { colors: colors2 } = useTheme();
455
+ const isUrgent = variant === "error" || variant === "warning";
456
+ const variantColors = {
457
+ info: { bg: colors2.colorBlueSubtle, text: colors2.colorOnBlueSubtle },
458
+ success: { bg: colors2.colorSuccessSubtle, text: colors2.colorOnSuccessSubtle },
459
+ warning: { bg: colors2.colorOrangeSubtle, text: colors2.colorOnOrangeSubtle },
460
+ error: { bg: colors2.colorRedSubtle, text: colors2.colorOnRedSubtle }
461
+ };
462
+ const { bg, text } = variantColors[variant];
463
+ return /* @__PURE__ */ jsxs3(
464
+ View6,
465
+ {
466
+ accessibilityRole: isUrgent ? "alert" : "none",
467
+ accessibilityLiveRegion: isUrgent ? "assertive" : "polite",
468
+ style: [styles8.banner, { backgroundColor: bg }, style],
469
+ children: [
470
+ /* @__PURE__ */ jsx10(Text6, { style: [styles8.content, { color: text }], children }),
471
+ action,
472
+ onDismiss && /* @__PURE__ */ jsx10(
473
+ Pressable2,
474
+ {
475
+ onPress: onDismiss,
476
+ style: styles8.dismiss,
477
+ accessibilityLabel: "Dismiss notification",
478
+ accessibilityRole: "button",
479
+ hitSlop: 8,
480
+ children: /* @__PURE__ */ jsx10(Text6, { style: { color: text, fontSize: 16 }, children: "\u2715" })
481
+ }
482
+ )
483
+ ]
484
+ }
485
+ );
486
+ }
487
+
488
+ // src/components/layout/Card/Card.native.tsx
489
+ import { StyleSheet as StyleSheet9, View as View7, Pressable as Pressable3 } from "react-native";
490
+ import { jsx as jsx11 } from "react/jsx-runtime";
491
+ var paddingMap = {
492
+ none: 0,
493
+ small: spacing.s,
494
+ medium: spacing.m,
495
+ large: spacing.xxl
496
+ };
497
+ var alignMap = {
498
+ start: "flex-start",
499
+ center: "center",
500
+ end: "flex-end"
501
+ };
502
+ var styles9 = StyleSheet9.create({
503
+ card: {
504
+ borderRadius: border.radius.s,
505
+ overflow: "hidden"
506
+ }
507
+ });
508
+ function Card({
509
+ children,
510
+ variant = "default",
511
+ padding = "medium",
512
+ textAlign = "start",
513
+ style,
514
+ onPress,
515
+ accessibilityLabel
516
+ }) {
517
+ const { colors: colors2 } = useTheme();
518
+ const variantStyle = {
519
+ backgroundColor: colors2.colorBg,
520
+ ...variant === "elevated" && {
521
+ shadowColor: "#000",
522
+ shadowOffset: { width: 0, height: 2 },
523
+ shadowOpacity: 0.1,
524
+ shadowRadius: 8,
525
+ elevation: 4
526
+ },
527
+ ...variant === "outlined" && {
528
+ borderWidth: 1,
529
+ borderColor: colors2.colorBgSubtle
530
+ }
531
+ };
532
+ const inner = {
533
+ padding: paddingMap[padding],
534
+ alignItems: alignMap[textAlign]
535
+ };
536
+ if (onPress) {
537
+ return /* @__PURE__ */ jsx11(
538
+ Pressable3,
539
+ {
540
+ onPress,
541
+ accessibilityRole: "button",
542
+ accessibilityLabel,
543
+ style: ({ pressed }) => [styles9.card, variantStyle, inner, pressed && { opacity: 0.8 }, style],
544
+ children
545
+ }
546
+ );
547
+ }
548
+ return /* @__PURE__ */ jsx11(View7, { style: [styles9.card, variantStyle, inner, style], children });
549
+ }
550
+
551
+ // src/components/layout/SectionHeader/SectionHeader.native.tsx
552
+ import { StyleSheet as StyleSheet10, View as View8, Text as Text7 } from "react-native";
553
+ import { jsx as jsx12, jsxs as jsxs4 } from "react/jsx-runtime";
554
+ var alignMap2 = {
555
+ start: "flex-start",
556
+ center: "center",
557
+ end: "flex-end"
558
+ };
559
+ var titleStyles = StyleSheet10.create({
560
+ small: {
561
+ fontSize: font.size.heading3,
562
+ fontFamily: font.family.heading,
563
+ fontWeight: font.weight.heading,
564
+ lineHeight: lineHeight.heading3
565
+ },
566
+ medium: {
567
+ fontSize: font.size.heading2,
568
+ fontFamily: font.family.heading,
569
+ fontWeight: font.weight.heading,
570
+ lineHeight: lineHeight.heading2
571
+ },
572
+ large: {
573
+ fontSize: font.size.heading1,
574
+ fontFamily: font.family.heading,
575
+ fontWeight: font.weight.heading,
576
+ lineHeight: lineHeight.heading1
577
+ }
578
+ });
579
+ var styles10 = StyleSheet10.create({
580
+ container: {
581
+ gap: spacing.xxs
582
+ },
583
+ subtitle: {
584
+ fontSize: font.size.bodyS,
585
+ fontFamily: font.family.body,
586
+ lineHeight: lineHeight.bodyS
587
+ }
588
+ });
589
+ function SectionHeader({
590
+ title,
591
+ subtitle,
592
+ alignment = "start",
593
+ size = "medium",
594
+ style
595
+ }) {
596
+ const { colors: colors2 } = useTheme();
597
+ const align = alignMap2[alignment];
598
+ return /* @__PURE__ */ jsxs4(View8, { style: [styles10.container, { alignItems: align }, style], children: [
599
+ /* @__PURE__ */ jsx12(
600
+ Text7,
601
+ {
602
+ accessibilityRole: "header",
603
+ style: [titleStyles[size], { color: colors2.colorOnBg }],
604
+ children: title
605
+ }
606
+ ),
607
+ subtitle && /* @__PURE__ */ jsx12(Text7, { style: [styles10.subtitle, { color: colors2.colorOnBgSubtle }], children: subtitle })
608
+ ] });
609
+ }
610
+
611
+ // src/components/layout/IconWrapper/IconWrapper.native.tsx
612
+ import { View as View9 } from "react-native";
613
+ import { jsx as jsx13 } from "react/jsx-runtime";
614
+ function IconWrapper({ children, style, accessibilityElementsHidden }) {
615
+ return /* @__PURE__ */ jsx13(
616
+ View9,
617
+ {
618
+ style: [{ alignItems: "center", justifyContent: "center" }, style],
619
+ importantForAccessibility: accessibilityElementsHidden ? "no-hide-descendants" : "auto",
620
+ accessibilityElementsHidden,
621
+ children
622
+ }
623
+ );
624
+ }
625
+
626
+ // src/components/layout/ButtonGroup/ButtonGroup.native.tsx
627
+ import { StyleSheet as StyleSheet11, View as View10 } from "react-native";
628
+ import { jsx as jsx14 } from "react/jsx-runtime";
629
+ var styles11 = StyleSheet11.create({
630
+ group: {
631
+ flexDirection: "row",
632
+ flexWrap: "wrap",
633
+ gap: spacing.xs
634
+ },
635
+ column: {
636
+ flexDirection: "column",
637
+ gap: spacing.xs
638
+ }
639
+ });
640
+ function ButtonGroup({ children, variant, accessibilityLabel, style }) {
641
+ const isColumn = variant === "card" || variant === "modal";
642
+ return /* @__PURE__ */ jsx14(
643
+ View10,
644
+ {
645
+ accessibilityLabel,
646
+ style: [isColumn ? styles11.column : styles11.group, style],
647
+ children
648
+ }
649
+ );
650
+ }
651
+
652
+ // src/components/interaction/Button/Button.native.tsx
653
+ import { StyleSheet as StyleSheet12, Pressable as Pressable4, Text as Text8, View as View11 } from "react-native";
654
+ import { jsx as jsx15, jsxs as jsxs5 } from "react/jsx-runtime";
655
+ var sizeTokens = {
656
+ small: { height: 36, px: spacing.m, fontSize: font.size.bodyS, radius: border.radius.xs },
657
+ medium: { height: 48, px: spacing.m, fontSize: font.size.body, radius: border.radius.s },
658
+ large: { height: 56, px: spacing.xxl, fontSize: font.size.heading3, radius: border.radius.m }
659
+ };
660
+ var styles12 = StyleSheet12.create({
661
+ pressable: {
662
+ flexDirection: "row",
663
+ alignItems: "center",
664
+ justifyContent: "center",
665
+ gap: spacing.xs,
666
+ alignSelf: "flex-start"
667
+ },
668
+ label: {
669
+ fontFamily: font.family.body,
670
+ fontWeight: font.weight.semibold,
671
+ includeFontPadding: false
672
+ }
673
+ });
674
+ function Button({
675
+ children,
676
+ variant = "default",
677
+ size = "medium",
678
+ iconStart,
679
+ iconEnd,
680
+ disabled = false,
681
+ onPress,
682
+ accessibilityLabel,
683
+ style
684
+ }) {
685
+ const { colors: colors2 } = useTheme();
686
+ const { height, px, fontSize, radius } = sizeTokens[size];
687
+ const primaryColor = colors2.colorGreen;
688
+ const onPrimaryColor = colors2.colorOnGreen;
689
+ const ghostTextColor = colors2.colorGreenStrong;
690
+ const containerStyle = {
691
+ height,
692
+ paddingHorizontal: px,
693
+ borderRadius: radius,
694
+ opacity: disabled ? 0.4 : 1,
695
+ ...variant === "default" && { backgroundColor: primaryColor },
696
+ ...variant === "ghost" && {
697
+ backgroundColor: "transparent",
698
+ borderWidth: 1,
699
+ borderColor: ghostTextColor
700
+ }
701
+ };
702
+ const textColor = variant === "default" ? onPrimaryColor : ghostTextColor;
703
+ return /* @__PURE__ */ jsxs5(
704
+ Pressable4,
705
+ {
706
+ onPress,
707
+ disabled,
708
+ accessibilityRole: "button",
709
+ accessibilityLabel,
710
+ accessibilityState: { disabled },
711
+ style: ({ pressed }) => [styles12.pressable, containerStyle, pressed && { opacity: 0.75 }, style],
712
+ children: [
713
+ iconStart && /* @__PURE__ */ jsx15(View11, { importantForAccessibility: "no-hide-descendants", accessibilityElementsHidden: true, children: iconStart }),
714
+ children && /* @__PURE__ */ jsx15(Text8, { style: [styles12.label, { fontSize, color: textColor }], children }),
715
+ iconEnd && /* @__PURE__ */ jsx15(View11, { importantForAccessibility: "no-hide-descendants", children: iconEnd })
716
+ ]
717
+ }
718
+ );
719
+ }
720
+
721
+ // src/components/interaction/form/Switch/Switch.native.tsx
722
+ import { Switch as RNSwitch, View as View12, StyleSheet as StyleSheet14 } from "react-native";
723
+
724
+ // src/components/interaction/form/atoms/Label.native.tsx
725
+ import { Text as Text9 } from "react-native";
726
+ import { jsx as jsx16 } from "react/jsx-runtime";
727
+ function Label({ label, style }) {
728
+ const { colors: colors2 } = useTheme();
729
+ return /* @__PURE__ */ jsx16(
730
+ Text9,
731
+ {
732
+ style: [
733
+ {
734
+ fontFamily: font.family.body,
735
+ fontSize: font.size.body,
736
+ lineHeight: lineHeight.body,
737
+ fontWeight: font.weight.semibold,
738
+ color: colors2.colorOnBg
739
+ },
740
+ style
741
+ ],
742
+ children: label
743
+ }
744
+ );
745
+ }
746
+
747
+ // src/components/interaction/form/atoms/Message.native.tsx
748
+ import { StyleSheet as StyleSheet13, Text as Text10 } from "react-native";
749
+ import { jsx as jsx17 } from "react/jsx-runtime";
750
+ var styles13 = StyleSheet13.create({
751
+ base: {
752
+ fontFamily: font.family.body,
753
+ fontSize: font.size.bodyS,
754
+ lineHeight: lineHeight.bodyS
755
+ }
756
+ });
757
+ function Message({ message, type, style }) {
758
+ const { colors: colors2 } = useTheme();
759
+ if (!message) return null;
760
+ const color = type === "error" ? colors2.colorError : colors2.colorOnBgSubtle;
761
+ return /* @__PURE__ */ jsx17(
762
+ Text10,
763
+ {
764
+ accessibilityRole: type === "error" ? "alert" : "none",
765
+ accessibilityLiveRegion: type === "error" ? "assertive" : "polite",
766
+ style: [styles13.base, { color }, style],
767
+ children: message
768
+ }
769
+ );
770
+ }
771
+
772
+ // src/components/interaction/form/Switch/Switch.native.tsx
773
+ import { jsx as jsx18, jsxs as jsxs6 } from "react/jsx-runtime";
774
+ var styles14 = StyleSheet14.create({
775
+ container: {
776
+ gap: spacing.xxs
777
+ },
778
+ row: {
779
+ flexDirection: "row",
780
+ alignItems: "center",
781
+ gap: spacing.xs
782
+ }
783
+ });
784
+ function Switch({
785
+ label,
786
+ value = false,
787
+ onChange,
788
+ disabled = false,
789
+ error,
790
+ hint,
791
+ style
792
+ }) {
793
+ const { colors: colors2 } = useTheme();
794
+ return /* @__PURE__ */ jsxs6(View12, { style: [styles14.container, style], children: [
795
+ /* @__PURE__ */ jsxs6(View12, { style: styles14.row, children: [
796
+ /* @__PURE__ */ jsx18(
797
+ RNSwitch,
798
+ {
799
+ value,
800
+ onValueChange: onChange,
801
+ disabled,
802
+ accessibilityLabel: label,
803
+ accessibilityRole: "switch",
804
+ accessibilityState: { checked: value, disabled },
805
+ thumbColor: value ? colors2.colorOnInteractive : colors2.colorOnBg,
806
+ trackColor: { false: colors2.colorBgSubtle, true: colors2.colorInteractive }
807
+ }
808
+ ),
809
+ /* @__PURE__ */ jsx18(Label, { label })
810
+ ] }),
811
+ /* @__PURE__ */ jsx18(Message, { type: "error", message: error }),
812
+ /* @__PURE__ */ jsx18(Message, { type: "hint", message: hint })
813
+ ] });
814
+ }
815
+
816
+ // src/components/interaction/form/Checkbox/Checkbox.native.tsx
817
+ import { StyleSheet as StyleSheet15, View as View13, Pressable as Pressable5 } from "react-native";
818
+ import { jsx as jsx19, jsxs as jsxs7 } from "react/jsx-runtime";
819
+ var BOX = 22;
820
+ var styles15 = StyleSheet15.create({
821
+ container: {
822
+ gap: spacing.xxs
823
+ },
824
+ row: {
825
+ flexDirection: "row",
826
+ alignItems: "center",
827
+ gap: spacing.xs,
828
+ minHeight: 44
829
+ },
830
+ box: {
831
+ width: BOX,
832
+ height: BOX,
833
+ borderRadius: border.radius.xs,
834
+ borderWidth: 2,
835
+ alignItems: "center",
836
+ justifyContent: "center"
837
+ },
838
+ checkmark: {
839
+ fontSize: 14,
840
+ fontWeight: "700",
841
+ lineHeight: 16
842
+ }
843
+ });
844
+ function Checkbox({
845
+ label,
846
+ name,
847
+ checked = false,
848
+ onChange,
849
+ disabled = false,
850
+ error,
851
+ hint,
852
+ style
853
+ }) {
854
+ const { colors: colors2 } = useTheme();
855
+ const borderColor = error ? colors2.colorError : checked ? colors2.colorInteractive : colors2.colorBgSubtle;
856
+ const bgColor = checked ? colors2.colorInteractive : "transparent";
857
+ return /* @__PURE__ */ jsxs7(View13, { style: [styles15.container, style], children: [
858
+ /* @__PURE__ */ jsxs7(
859
+ Pressable5,
860
+ {
861
+ onPress: () => !disabled && onChange?.(!checked),
862
+ accessibilityRole: "checkbox",
863
+ accessibilityLabel: typeof label === "string" ? label : name,
864
+ accessibilityState: { checked, disabled },
865
+ disabled,
866
+ style: ({ pressed }) => [styles15.row, pressed && { opacity: 0.7 }, disabled && { opacity: 0.4 }],
867
+ children: [
868
+ /* @__PURE__ */ jsx19(View13, { style: [styles15.box, { borderColor, backgroundColor: bgColor }], children: checked && /* @__PURE__ */ jsx19(Label, { label: "\u2713", style: [styles15.checkmark, { color: colors2.colorOnInteractive }] }) }),
869
+ /* @__PURE__ */ jsx19(Label, { label })
870
+ ]
871
+ }
872
+ ),
873
+ /* @__PURE__ */ jsx19(Message, { type: "error", message: error }),
874
+ /* @__PURE__ */ jsx19(Message, { type: "hint", message: hint })
875
+ ] });
876
+ }
877
+
878
+ // src/components/interaction/form/Radio/Radio.native.tsx
879
+ import { StyleSheet as StyleSheet16, View as View14, Pressable as Pressable6 } from "react-native";
880
+ import { jsx as jsx20, jsxs as jsxs8 } from "react/jsx-runtime";
881
+ var DOT = 22;
882
+ var INNER = 10;
883
+ var styles16 = StyleSheet16.create({
884
+ container: {
885
+ gap: spacing.xxs
886
+ },
887
+ row: {
888
+ flexDirection: "row",
889
+ alignItems: "center",
890
+ gap: spacing.xs,
891
+ minHeight: 44
892
+ },
893
+ outer: {
894
+ width: DOT,
895
+ height: DOT,
896
+ borderRadius: DOT / 2,
897
+ borderWidth: 2,
898
+ alignItems: "center",
899
+ justifyContent: "center"
900
+ },
901
+ inner: {
902
+ width: INNER,
903
+ height: INNER,
904
+ borderRadius: INNER / 2
905
+ }
906
+ });
907
+ function Radio({
908
+ label,
909
+ name,
910
+ checked = false,
911
+ onChange,
912
+ disabled = false,
913
+ error,
914
+ hint,
915
+ style
916
+ }) {
917
+ const { colors: colors2 } = useTheme();
918
+ const borderColor = error ? colors2.colorError : checked ? colors2.colorInteractive : colors2.colorBgSubtle;
919
+ return /* @__PURE__ */ jsxs8(View14, { style: [styles16.container, style], children: [
920
+ /* @__PURE__ */ jsxs8(
921
+ Pressable6,
922
+ {
923
+ onPress: () => !disabled && onChange?.(),
924
+ accessibilityRole: "radio",
925
+ accessibilityLabel: typeof label === "string" ? label : name,
926
+ accessibilityState: { checked, disabled },
927
+ disabled,
928
+ style: ({ pressed }) => [styles16.row, pressed && { opacity: 0.7 }, disabled && { opacity: 0.4 }],
929
+ children: [
930
+ /* @__PURE__ */ jsx20(View14, { style: [styles16.outer, { borderColor }], children: checked && /* @__PURE__ */ jsx20(View14, { style: [styles16.inner, { backgroundColor: colors2.colorInteractive }] }) }),
931
+ /* @__PURE__ */ jsx20(Label, { label })
932
+ ]
933
+ }
934
+ ),
935
+ /* @__PURE__ */ jsx20(Message, { type: "error", message: error }),
936
+ /* @__PURE__ */ jsx20(Message, { type: "hint", message: hint })
937
+ ] });
938
+ }
939
+ export {
940
+ Alert,
941
+ Avatar,
942
+ Badge,
943
+ Button,
944
+ ButtonGroup,
945
+ Card,
946
+ Checkbox,
947
+ IconWrapper,
948
+ Label,
949
+ Loading,
950
+ Message,
951
+ NotificationBanner,
952
+ Progress,
953
+ Radio,
954
+ SectionHeader,
955
+ Separator,
956
+ Skeleton,
957
+ Switch,
958
+ ThemeProvider,
959
+ Typography,
960
+ animation,
961
+ border,
962
+ colors,
963
+ font,
964
+ lineHeight,
965
+ spacing,
966
+ useTheme,
967
+ zIndex
968
+ };