@sincpro/mobile-ui 3.0.1 → 3.2.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 (314) hide show
  1. package/dist/Actions/Actions.Button.d.ts +6 -6
  2. package/dist/Actions/Actions.Button.js +650 -180
  3. package/dist/Actions/Actions.Dock.d.ts +1 -1
  4. package/dist/Actions/Actions.Dock.js +297 -18
  5. package/dist/Actions/Actions.FAB.js +100 -12
  6. package/dist/Actions/Actions.FilterButton.d.ts +17 -0
  7. package/dist/Actions/Actions.FilterButton.js +263 -33
  8. package/dist/Actions/Actions.IconButton.d.ts +1 -0
  9. package/dist/Actions/Actions.IconButton.js +196 -33
  10. package/dist/Actions/index.js +13 -13
  11. package/dist/Dialog/Confirmation.context.js +82 -16
  12. package/dist/Dialog/Dialog.ActionSheet.js +200 -41
  13. package/dist/Dialog/Dialog.Confirmation.js +168 -31
  14. package/dist/Dialog/Dialog.EditValue.js +437 -62
  15. package/dist/Dialog/Dialog.Sheet.d.ts +7 -3
  16. package/dist/Dialog/Dialog.Sheet.js +267 -15
  17. package/dist/Dialog/OverlayHost.d.ts +24 -0
  18. package/dist/Dialog/OverlayHost.js +230 -0
  19. package/dist/Dialog/SheetSurface.d.ts +43 -0
  20. package/dist/Dialog/SheetSurface.js +495 -0
  21. package/dist/Dialog/dialog-actions.d.ts +17 -0
  22. package/dist/Dialog/dialog-actions.js +59 -0
  23. package/dist/Dialog/index.d.ts +4 -1
  24. package/dist/Dialog/index.js +8 -7
  25. package/dist/Dialog/overlay.store.d.ts +24 -0
  26. package/dist/Dialog/overlay.store.js +59 -0
  27. package/dist/Dialog/requestConfirmation.js +20 -10
  28. package/dist/Display/Display.Accordion.js +185 -13
  29. package/dist/Display/Display.AmountSummary.js +206 -15
  30. package/dist/Display/Display.Avatar.js +93 -31
  31. package/dist/Display/Display.AvatarGroup.js +132 -17
  32. package/dist/Display/Display.Badge.d.ts +18 -2
  33. package/dist/Display/Display.Badge.js +117 -49
  34. package/dist/Display/Display.Card.js +163 -26
  35. package/dist/Display/Display.Carousel.js +459 -105
  36. package/dist/Display/Display.Chip.d.ts +4 -1
  37. package/dist/Display/Display.Chip.js +165 -31
  38. package/dist/Display/Display.CircleButton.d.ts +1 -0
  39. package/dist/Display/Display.CircleButton.js +86 -27
  40. package/dist/Display/Display.CopyableText.js +289 -66
  41. package/dist/Display/Display.CountRecords.js +60 -3
  42. package/dist/Display/Display.DataTable.js +123 -13
  43. package/dist/Display/Display.Date.js +243 -33
  44. package/dist/Display/Display.Divider.d.ts +10 -10
  45. package/dist/Display/Display.Divider.js +67 -20
  46. package/dist/Display/Display.ExpoImage.js +97 -8
  47. package/dist/Display/Display.GradientSurface.d.ts +9 -4
  48. package/dist/Display/Display.GradientSurface.js +196 -46
  49. package/dist/Display/Display.Icon.js +129 -15
  50. package/dist/Display/Display.IconBadge.js +95 -25
  51. package/dist/Display/Display.Image.d.ts +7 -1
  52. package/dist/Display/Display.Image.js +344 -39
  53. package/dist/Display/Display.KeyValue.js +90 -5
  54. package/dist/Display/Display.ListGroup.js +181 -9
  55. package/dist/Display/Display.ListItem.js +324 -28
  56. package/dist/Display/Display.Logo.js +84 -29
  57. package/dist/Display/Display.MediaCard.js +125 -4
  58. package/dist/Display/Display.MediaEmbed.d.ts +0 -5
  59. package/dist/Display/Display.MediaEmbed.js +170 -26
  60. package/dist/Display/Display.MenuButton.d.ts +2 -2
  61. package/dist/Display/Display.MenuButton.js +380 -94
  62. package/dist/Display/Display.MenuCard.js +122 -18
  63. package/dist/Display/Display.MenuGrid.js +43 -3
  64. package/dist/Display/Display.Monetary.js +90 -5
  65. package/dist/Display/Display.Pattern.js +306 -47
  66. package/dist/Display/Display.PriceTag.js +117 -14
  67. package/dist/Display/Display.ProductCard.js +154 -4
  68. package/dist/Display/Display.Rating.js +92 -11
  69. package/dist/Display/Display.SearchHistory.js +132 -6
  70. package/dist/Display/Display.SectionHeader.d.ts +5 -1
  71. package/dist/Display/Display.SectionHeader.js +125 -12
  72. package/dist/Display/Display.Stat.js +62 -3
  73. package/dist/Display/Display.StatCard.js +131 -7
  74. package/dist/Display/Display.StatusBadge.d.ts +29 -0
  75. package/dist/Display/Display.StatusBadge.js +68 -0
  76. package/dist/Display/Display.StatusDot.js +93 -18
  77. package/dist/Display/Display.Story.js +285 -35
  78. package/dist/Display/Display.StoryTray.js +354 -34
  79. package/dist/Display/Display.StoryViewer.js +571 -72
  80. package/dist/Display/Display.SwipeableRow.js +148 -20
  81. package/dist/Display/Display.Tag.d.ts +4 -1
  82. package/dist/Display/Display.Tag.js +66 -4
  83. package/dist/Display/Display.Timeline.js +102 -13
  84. package/dist/Display/Display.Tooltip.js +122 -26
  85. package/dist/Display/chevron.d.ts +6 -0
  86. package/dist/Display/chevron.js +32 -0
  87. package/dist/Display/count-badge.d.ts +21 -0
  88. package/dist/Display/count-badge.js +124 -0
  89. package/dist/Display/group-title.d.ts +10 -0
  90. package/dist/Display/group-title.js +53 -0
  91. package/dist/Display/icon-font.d.ts +3 -0
  92. package/dist/Display/icon-font.ios.d.ts +3 -0
  93. package/dist/Display/icon-font.ios.js +4 -0
  94. package/dist/Display/icon-font.js +7 -0
  95. package/dist/Display/icon-glyphs.d.ts +2 -0
  96. package/dist/Display/icon-glyphs.js +87 -0
  97. package/dist/Display/icon-map.d.ts +15 -11
  98. package/dist/Display/icon-map.js +344 -84
  99. package/dist/Display/icon-registry.d.ts +21 -0
  100. package/dist/Display/icon-registry.js +21 -0
  101. package/dist/Display/index.d.ts +6 -1
  102. package/dist/Display/index.js +53 -48
  103. package/dist/Display/pill.d.ts +16 -0
  104. package/dist/Display/pill.js +47 -0
  105. package/dist/Feedback/ErrorBoundary.js +35 -23
  106. package/dist/Feedback/Feedback.Banner.js +202 -24
  107. package/dist/Feedback/Feedback.DomainSplashScreen.js +246 -70
  108. package/dist/Feedback/Feedback.Empty.js +54 -3
  109. package/dist/Feedback/Feedback.EmptyState.js +114 -5
  110. package/dist/Feedback/Feedback.Error.d.ts +1 -1
  111. package/dist/Feedback/Feedback.Error.js +130 -5
  112. package/dist/Feedback/Feedback.Loading.d.ts +1 -1
  113. package/dist/Feedback/Feedback.Loading.js +70 -3
  114. package/dist/Feedback/Feedback.PermissionCard.js +161 -5
  115. package/dist/Feedback/Feedback.Progress.js +199 -41
  116. package/dist/Feedback/Feedback.ProgressCircle.js +184 -12
  117. package/dist/Feedback/Feedback.Skeleton.js +149 -36
  118. package/dist/Feedback/Feedback.Spinner.js +407 -79
  119. package/dist/Feedback/Feedback.Splash.js +240 -33
  120. package/dist/Feedback/Feedback.State.d.ts +17 -0
  121. package/dist/Feedback/Feedback.State.js +104 -0
  122. package/dist/Feedback/Toast.context.js +883 -167
  123. package/dist/Feedback/index.d.ts +3 -0
  124. package/dist/Feedback/index.js +15 -13
  125. package/dist/Form/Form.Checkbox.js +212 -22
  126. package/dist/Form/Form.ControlledCheckbox.d.ts +1 -1
  127. package/dist/Form/Form.ControlledCheckbox.js +46 -4
  128. package/dist/Form/Form.ControlledDropdown.d.ts +1 -1
  129. package/dist/Form/Form.ControlledDropdown.js +62 -4
  130. package/dist/Form/Form.ControlledInput.d.ts +4 -3
  131. package/dist/Form/Form.ControlledInput.js +72 -4
  132. package/dist/Form/Form.ControlledMonetaryInput.d.ts +6 -3
  133. package/dist/Form/Form.ControlledMonetaryInput.js +50 -4
  134. package/dist/Form/Form.ControlledRadioButton.d.ts +2 -2
  135. package/dist/Form/Form.ControlledRadioButton.js +45 -4
  136. package/dist/Form/Form.DatePicker.js +507 -107
  137. package/dist/Form/Form.Dropdown.js +303 -52
  138. package/dist/Form/Form.ErrorSummary.js +236 -44
  139. package/dist/Form/Form.Field.d.ts +24 -0
  140. package/dist/Form/Form.Field.js +55 -0
  141. package/dist/Form/Form.FractionalQuantityInput.js +508 -96
  142. package/dist/Form/Form.Input.d.ts +17 -3
  143. package/dist/Form/Form.Input.js +497 -29
  144. package/dist/Form/Form.KeyboardForm.d.ts +22 -8
  145. package/dist/Form/Form.KeyboardForm.js +83 -8
  146. package/dist/Form/Form.KeyboardToolbarHost.d.ts +14 -0
  147. package/dist/Form/Form.KeyboardToolbarHost.js +223 -0
  148. package/dist/Form/Form.MonetaryInput.js +164 -17
  149. package/dist/Form/Form.PickerField.d.ts +31 -0
  150. package/dist/Form/Form.PickerField.js +539 -0
  151. package/dist/Form/Form.PinInput.js +150 -15
  152. package/dist/Form/Form.QuantitySelector.js +229 -25
  153. package/dist/Form/Form.RadioButton.d.ts +1 -0
  154. package/dist/Form/Form.RadioButton.js +26 -29
  155. package/dist/Form/Form.Select.d.ts +2 -1
  156. package/dist/Form/Form.Select.js +388 -60
  157. package/dist/Form/Form.Slider.js +133 -10
  158. package/dist/Form/Form.Switch.js +99 -4
  159. package/dist/Form/choice-row.d.ts +15 -0
  160. package/dist/Form/choice-row.js +236 -0
  161. package/dist/Form/index.d.ts +11 -6
  162. package/dist/Form/index.js +26 -27
  163. package/dist/Form/input-text.d.ts +7 -0
  164. package/dist/Form/input-text.js +18 -0
  165. package/dist/Navigation/Navigation.AppBar.d.ts +3 -4
  166. package/dist/Navigation/Navigation.AppBar.js +535 -99
  167. package/dist/Navigation/Navigation.BottomNav.js +363 -98
  168. package/dist/Navigation/Navigation.CollapsingHeader.d.ts +28 -13
  169. package/dist/Navigation/Navigation.CollapsingHeader.js +369 -36
  170. package/dist/Navigation/Navigation.FloatingBar.js +71 -11
  171. package/dist/Navigation/Navigation.Menu.js +309 -95
  172. package/dist/Navigation/Navigation.MenuSection.js +80 -11
  173. package/dist/Navigation/Navigation.RowItem.d.ts +4 -2
  174. package/dist/Navigation/Navigation.RowItem.js +93 -8
  175. package/dist/Navigation/Navigation.Search.js +241 -27
  176. package/dist/Navigation/Navigation.SearchBar.d.ts +7 -1
  177. package/dist/Navigation/Navigation.SearchBar.js +218 -29
  178. package/dist/Navigation/Navigation.SearchSuggestions.js +77 -3
  179. package/dist/Navigation/Navigation.SegmentedControl.js +152 -14
  180. package/dist/Navigation/Navigation.Steps.js +105 -11
  181. package/dist/Navigation/Navigation.Tabs.js +449 -41
  182. package/dist/Navigation/index.d.ts +9 -4
  183. package/dist/Navigation/index.js +13 -13
  184. package/dist/Typography/Typography.Heading.js +33 -3
  185. package/dist/Typography/Typography.SelectableText.js +95 -7
  186. package/dist/Typography/Typography.Text.d.ts +4 -2
  187. package/dist/Typography/Typography.Text.js +217 -7
  188. package/dist/Typography/index.js +3 -3
  189. package/dist/branding.js +29 -13
  190. package/dist/icons/AddItemIcon.js +76 -2
  191. package/dist/icons/ArrangeCircle.js +82 -2
  192. package/dist/icons/ArrowDownIcon.js +63 -3
  193. package/dist/icons/ArrowUpIcon.js +63 -3
  194. package/dist/icons/BoxIcon.js +64 -2
  195. package/dist/icons/BoxTimeIcon.js +63 -2
  196. package/dist/icons/CalendarIcon.js +145 -2
  197. package/dist/icons/CardIcon.js +80 -2
  198. package/dist/icons/CashierIcon.js +39 -2
  199. package/dist/icons/CreditIcon.js +76 -3
  200. package/dist/icons/DuoIcon.js +75 -2
  201. package/dist/icons/HomeIcon.js +39 -2
  202. package/dist/icons/HomeIconOutlined.js +53 -2
  203. package/dist/icons/LogoIcon.js +87 -2
  204. package/dist/icons/MoneyReceiveIcon.js +86 -2
  205. package/dist/icons/PinIcon.js +39 -2
  206. package/dist/icons/ProfileIcon.js +47 -2
  207. package/dist/icons/SettingsIcon.js +114 -2
  208. package/dist/icons/SinpeIcon.js +60 -2
  209. package/dist/icons/ToggleOffIcon.js +53 -2
  210. package/dist/icons/WalletMoneyIcon.js +81 -2
  211. package/dist/index.d.ts +1 -0
  212. package/dist/index.js +8 -2
  213. package/dist/layouts/AuthContainer.d.ts +4 -5
  214. package/dist/layouts/AuthContainer.js +231 -7
  215. package/dist/layouts/BottomInset.js +4 -1
  216. package/dist/layouts/Container.d.ts +2 -2
  217. package/dist/layouts/Container.js +45 -3
  218. package/dist/layouts/GradientContainer.js +37 -5
  219. package/dist/layouts/PlainLayout.js +19 -3
  220. package/dist/layouts/ScrollContainer.d.ts +14 -9
  221. package/dist/layouts/ScrollContainer.js +125 -4
  222. package/dist/layouts/edges.d.ts +2 -0
  223. package/dist/layouts/edges.js +1 -0
  224. package/dist/primitives/AspectRatio.js +75 -3
  225. package/dist/primitives/Box.js +45 -3
  226. package/dist/primitives/Pressable.js +95 -5
  227. package/dist/primitives/Row.js +84 -13
  228. package/dist/primitives/Spacer.js +42 -5
  229. package/dist/primitives/Stack.js +66 -7
  230. package/dist/primitives/index.js +1 -1
  231. package/dist/theme/active.d.ts +2 -0
  232. package/dist/theme/active.js +33 -18
  233. package/dist/theme/build.js +118 -87
  234. package/dist/theme/color.js +87 -87
  235. package/dist/theme/components/ThemedActivityIndicator.d.ts +2 -15
  236. package/dist/theme/components/ThemedActivityIndicator.js +35 -3
  237. package/dist/theme/components/index.js +1 -0
  238. package/dist/theme/contrast.js +32 -33
  239. package/dist/theme/css-vars.js +71 -75
  240. package/dist/theme/dark.js +116 -97
  241. package/dist/theme/default.js +116 -97
  242. package/dist/theme/define.js +16 -12
  243. package/dist/theme/index.d.ts +1 -0
  244. package/dist/theme/index.js +7 -6
  245. package/dist/theme/on-dark-surface.d.ts +12 -0
  246. package/dist/theme/on-dark-surface.js +13 -0
  247. package/dist/theme/theme.js +1 -0
  248. package/dist/theme/tw.js +3 -1
  249. package/dist/theme/types.js +0 -18
  250. package/dist/theme/typography.d.ts +1 -1
  251. package/dist/theme/typography.js +337 -303
  252. package/dist/theme/useTheme.d.ts +4 -0
  253. package/dist/theme/useTheme.js +7 -3
  254. package/dist/theme/useThemeVars.d.ts +9 -0
  255. package/dist/theme/useThemeVars.js +23 -0
  256. package/dist/theme/validate.js +175 -166
  257. package/dist/tokens/index.js +1 -1
  258. package/dist/tokens/motion.js +30 -13
  259. package/dist/utils/async.d.ts +14 -0
  260. package/dist/utils/async.js +22 -0
  261. package/dist/utils/criteria.js +66 -85
  262. package/dist/utils/date.d.ts +8 -2
  263. package/dist/utils/date.js +63 -50
  264. package/dist/utils/image.js +8 -8
  265. package/dist/utils/intl.d.ts +1 -0
  266. package/dist/utils/intl.js +13 -0
  267. package/dist/utils/keys.js +3 -5
  268. package/dist/utils/monetary.d.ts +1 -0
  269. package/dist/utils/monetary.js +28 -24
  270. package/dist/utils/progress.js +2 -3
  271. package/dist/utils/quantity.js +25 -26
  272. package/dist/utils/reorder.js +11 -20
  273. package/dist/utils/search.d.ts +4 -0
  274. package/dist/utils/search.js +12 -0
  275. package/dist/utils/serializer.js +38 -38
  276. package/dist/utils/useReducedMotion.js +32 -30
  277. package/dist/views/AppSplashView.js +117 -3
  278. package/dist/views/AuthFormView.d.ts +4 -5
  279. package/dist/views/AuthFormView.js +119 -11
  280. package/dist/views/FormViewV2.context.js +75 -23
  281. package/dist/views/FormViewV2.d.ts +4 -5
  282. package/dist/views/FormViewV2.js +658 -92
  283. package/dist/views/ListViewV2.context.js +91 -47
  284. package/dist/views/ListViewV2.d.ts +84 -43
  285. package/dist/views/ListViewV2.js +1350 -200
  286. package/dist/views/Wizard/Wizard.context.js +248 -84
  287. package/dist/views/Wizard/Wizard.js +260 -67
  288. package/dist/views/types/IListView.js +34 -31
  289. package/dist/widgets/CollectionOptions.js +557 -138
  290. package/dist/widgets/FilterBar.js +159 -7
  291. package/dist/widgets/FilterBuilder.js +375 -102
  292. package/dist/widgets/JSONViewer.js +275 -129
  293. package/dist/widgets/PromoBanner.js +336 -42
  294. package/dist/widgets/PromoModal.d.ts +2 -2
  295. package/dist/widgets/PromoModal.js +389 -62
  296. package/dist/widgets/QueryChoice.js +150 -8
  297. package/dist/widgets/QuickActions.js +120 -31
  298. package/dist/widgets/ReorderableList.js +399 -128
  299. package/dist/widgets/TimeZoneSelectorModal.js +458 -51
  300. package/dist/widgets/index.js +3 -3
  301. package/package.json +6 -1
  302. package/tailwind.preset.js +7 -5
  303. package/dist/Form/Form.InputField.d.ts +0 -10
  304. package/dist/Form/Form.InputField.js +0 -38
  305. package/dist/Form/Form.KeyboardToolbar.d.ts +0 -22
  306. package/dist/Form/Form.KeyboardToolbar.js +0 -66
  307. package/dist/Form/Form.PasswordInput.d.ts +0 -9
  308. package/dist/Form/Form.PasswordInput.js +0 -17
  309. package/dist/Form/Form.TextInput.d.ts +0 -8
  310. package/dist/Form/Form.TextInput.js +0 -8
  311. package/dist/primitives/BaseButton.d.ts +0 -150
  312. package/dist/primitives/BaseButton.js +0 -229
  313. package/dist/utils/useSheetTranslation.d.ts +0 -5
  314. package/dist/utils/useSheetTranslation.js +0 -23
@@ -3,21 +3,40 @@ import { resolveOnColor } from "./contrast.js";
3
3
  import { DEFAULT_DARK_THEME } from "./dark.js";
4
4
  import { DEFAULT_THEME } from "./default.js";
5
5
  import { mergeTheme } from "./define.js";
6
- const STATE_LIGHT = { hover: 0.08, press: 0.12, focus: 0.12, drag: 0.16 };
7
- const STATE_DARK = { hover: 0.1, press: 0.16, focus: 0.14, drag: 0.2 };
8
- const MATERIAL_LIGHT = { blur: 24, opacity: 0.78, borderOpacity: 0.18 };
9
- const MATERIAL_DARK = { blur: 28, opacity: 0.62, borderOpacity: 0.22 };
6
+ const STATE_LIGHT = {
7
+ hover: 0.08,
8
+ press: 0.12,
9
+ focus: 0.12,
10
+ drag: 0.16
11
+ };
12
+ const STATE_DARK = {
13
+ hover: 0.1,
14
+ press: 0.16,
15
+ focus: 0.14,
16
+ drag: 0.2
17
+ };
18
+ const MATERIAL_LIGHT = {
19
+ blur: 24,
20
+ opacity: 0.78,
21
+ borderOpacity: 0.18
22
+ };
23
+ const MATERIAL_DARK = {
24
+ blur: 28,
25
+ opacity: 0.62,
26
+ borderOpacity: 0.22
27
+ };
10
28
  const SUCCESS = "#2F6B3C";
11
29
  const WARNING = "#7E5E12";
12
30
  const DANGER = "#9B3B30";
13
31
  const INFO = "#0F5C6E";
14
32
  function deriveBrandText(brand, mode) {
15
- if (mode === "light") {
16
- return shiftLightness(brand, -0.28);
17
- }
18
- // Dark surfaces need a light brand text — mix toward white until AA-friendly.
19
- return mixHex(brand, "#FFFFFF", 0.62);
33
+ if (mode === "light") {
34
+ return shiftLightness(brand, -0.28);
35
+ }
36
+ // Dark surfaces need a light brand text — mix toward white until AA-friendly.
37
+ return mixHex(brand, "#FFFFFF", 0.62);
20
38
  }
39
+
21
40
  /**
22
41
  * Builds a complete `ThemeTokens` from a brand seed — Material-style derivation
23
42
  * for mobile apps that rebrand without hand-authoring every token.
@@ -33,82 +52,94 @@ function deriveBrandText(brand, mode) {
33
52
  * }));
34
53
  */
35
54
  export function buildThemeFromBrand(opts) {
36
- const { name, brand, mode } = opts;
37
- const base = mode === "light" ? DEFAULT_THEME : DEFAULT_DARK_THEME;
38
- const secondary = opts.secondary ?? shiftLightness(brand, mode === "light" ? -0.18 : -0.08);
39
- const accent = opts.accent ?? brand;
40
- const brandText = opts.brandText ?? deriveBrandText(brand, mode);
41
- const primaryC = containerPair(brand, mode);
42
- const secondaryC = containerPair(secondary, mode);
43
- const accentC = containerPair(accent, mode);
44
- const successC = containerPair(SUCCESS, mode);
45
- const warningC = containerPair(WARNING, mode);
46
- const dangerC = containerPair(DANGER, mode);
47
- const infoC = containerPair(INFO, mode);
48
- const page = mode === "light" ? mixHex(brand, "#FFFFFF", 0.96) : "#0C0C0C";
49
- const card = mode === "light" ? "#FFFFFF" : "#161616";
50
- const muted = mode === "light" ? mixHex(brand, "#FFFFFF", 0.92) : mixHex(brand, "#000000", 0.88);
51
- const bgAccent = primaryC.container;
52
- const hover = mode === "light" ? mixHex(brand, "#FFFFFF", 0.9) : mixHex(brand, "#000000", 0.82);
53
- const disabled = mode === "light" ? mixHex(brand, "#FFFFFF", 0.86) : mixHex("#FFFFFF", "#000000", 0.85);
54
- return mergeTheme(base, {
55
- name,
56
- primary: brand,
57
- secondary,
58
- accent,
59
- bg: {
60
- page,
61
- card,
62
- popover: card,
63
- muted,
64
- accent: bgAccent,
65
- hover,
66
- disabled,
67
- inverse: mode === "light" ? "#0C0C0C" : mixHex(brand, "#FFFFFF", 0.94),
68
- containerLowest: mode === "light" ? page : "#0A0A0A",
69
- container: muted,
70
- containerHigh: mode === "light" ? mixHex(brand, "#FFFFFF", 0.84) : "#1E1E1E",
71
- },
72
- text: {
73
- accent: brandText,
74
- onPrimary: resolveOnColor(brand),
75
- onSecondary: resolveOnColor(secondary),
76
- onAccent: resolveOnColor(accent),
77
- onDanger: resolveOnColor(DANGER),
78
- onSuccess: resolveOnColor(SUCCESS),
79
- },
80
- border: {
81
- focus: brandText,
82
- default: mode === "light" ? mixHex(brand, "#FFFFFF", 0.82) : "#262626",
83
- light: muted,
84
- strong: mode === "light" ? mixHex(brand, "#000000", 0.25) : "#3A3A3A",
85
- },
86
- ring: brandText,
87
- success: SUCCESS,
88
- warning: WARNING,
89
- danger: DANGER,
90
- info: INFO,
91
- container: {
92
- primary: primaryC.container,
93
- onPrimary: primaryC.onContainer,
94
- secondary: secondaryC.container,
95
- onSecondary: secondaryC.onContainer,
96
- accent: accentC.container,
97
- onAccent: accentC.onContainer,
98
- success: successC.container,
99
- onSuccess: successC.onContainer,
100
- warning: warningC.container,
101
- onWarning: warningC.onContainer,
102
- danger: dangerC.container,
103
- onDanger: dangerC.onContainer,
104
- info: infoC.container,
105
- onInfo: infoC.onContainer,
106
- },
107
- state: mode === "light" ? { ...STATE_LIGHT } : { ...STATE_DARK },
108
- material: mode === "light" ? { ...MATERIAL_LIGHT } : { ...MATERIAL_DARK },
109
- gradient: {
110
- primary: [shiftLightness(brand, 0.12), brand],
111
- accent: [brand, secondary],
112
- },
113
- });
55
+ const {
56
+ name,
57
+ brand,
58
+ mode
59
+ } = opts;
60
+ const base = mode === "light" ? DEFAULT_THEME : DEFAULT_DARK_THEME;
61
+ const secondary = opts.secondary ?? shiftLightness(brand, mode === "light" ? -0.18 : -0.08);
62
+ const accent = opts.accent ?? brand;
63
+ const brandText = opts.brandText ?? deriveBrandText(brand, mode);
64
+ const primaryC = containerPair(brand, mode);
65
+ const secondaryC = containerPair(secondary, mode);
66
+ const accentC = containerPair(accent, mode);
67
+ const successC = containerPair(SUCCESS, mode);
68
+ const warningC = containerPair(WARNING, mode);
69
+ const dangerC = containerPair(DANGER, mode);
70
+ const infoC = containerPair(INFO, mode);
71
+ const page = mode === "light" ? mixHex(brand, "#FFFFFF", 0.96) : "#0C0C0C";
72
+ const card = mode === "light" ? "#FFFFFF" : "#161616";
73
+ const muted = mode === "light" ? mixHex(brand, "#FFFFFF", 0.92) : mixHex(brand, "#000000", 0.88);
74
+ const bgAccent = primaryC.container;
75
+ const hover = mode === "light" ? mixHex(brand, "#FFFFFF", 0.9) : mixHex(brand, "#000000", 0.82);
76
+ const disabled = mode === "light" ? mixHex(brand, "#FFFFFF", 0.86) : mixHex("#FFFFFF", "#000000", 0.85);
77
+ return mergeTheme(base, {
78
+ name,
79
+ primary: brand,
80
+ secondary,
81
+ accent,
82
+ bg: {
83
+ page,
84
+ card,
85
+ popover: card,
86
+ muted,
87
+ accent: bgAccent,
88
+ hover,
89
+ disabled,
90
+ inverse: mode === "light" ? "#0C0C0C" : mixHex(brand, "#FFFFFF", 0.94),
91
+ containerLowest: mode === "light" ? page : "#0A0A0A",
92
+ container: muted,
93
+ containerHigh: mode === "light" ? mixHex(brand, "#FFFFFF", 0.84) : "#1E1E1E"
94
+ },
95
+ text: {
96
+ accent: brandText,
97
+ onPrimary: resolveOnColor(brand),
98
+ onSecondary: resolveOnColor(secondary),
99
+ onAccent: resolveOnColor(accent),
100
+ onDanger: resolveOnColor(DANGER),
101
+ onSuccess: resolveOnColor(SUCCESS)
102
+ },
103
+ border: {
104
+ focus: brandText,
105
+ default: mode === "light" ? mixHex(brand, "#FFFFFF", 0.82) : "#262626",
106
+ light: muted,
107
+ strong: mode === "light" ? mixHex(brand, "#000000", 0.25) : "#3A3A3A"
108
+ },
109
+ ring: brandText,
110
+ success: SUCCESS,
111
+ warning: WARNING,
112
+ danger: DANGER,
113
+ info: INFO,
114
+ container: {
115
+ primary: primaryC.container,
116
+ onPrimary: primaryC.onContainer,
117
+ secondary: secondaryC.container,
118
+ onSecondary: secondaryC.onContainer,
119
+ accent: accentC.container,
120
+ onAccent: accentC.onContainer,
121
+ success: successC.container,
122
+ onSuccess: successC.onContainer,
123
+ warning: warningC.container,
124
+ onWarning: warningC.onContainer,
125
+ danger: dangerC.container,
126
+ onDanger: dangerC.onContainer,
127
+ info: infoC.container,
128
+ onInfo: infoC.onContainer
129
+ },
130
+ state: mode === "light" ? {
131
+ ...STATE_LIGHT
132
+ } : {
133
+ ...STATE_DARK
134
+ },
135
+ material: mode === "light" ? {
136
+ ...MATERIAL_LIGHT
137
+ } : {
138
+ ...MATERIAL_DARK
139
+ },
140
+ gradient: {
141
+ primary: [shiftLightness(brand, 0.12), brand],
142
+ accent: [brand, secondary]
143
+ }
144
+ });
114
145
  }
@@ -2,108 +2,108 @@
2
2
  * Color primitives for theme derivation (HSL). Used by buildThemeFromBrand
3
3
  * and container/tonal helpers — keeps brand math in one place.
4
4
  */
5
+
5
6
  export function hexToRgb(hex) {
6
- const h = hex.trim().replace(/^#/, "");
7
- const full = h.length === 3
8
- ? h
9
- .split("")
10
- .map((c) => c + c)
11
- .join("")
12
- : h;
13
- return {
14
- r: Number.parseInt(full.slice(0, 2), 16),
15
- g: Number.parseInt(full.slice(2, 4), 16),
16
- b: Number.parseInt(full.slice(4, 6), 16),
17
- };
7
+ const h = hex.trim().replace(/^#/, "");
8
+ const full = h.length === 3 ? h.split("").map(c => c + c).join("") : h;
9
+ return {
10
+ r: Number.parseInt(full.slice(0, 2), 16),
11
+ g: Number.parseInt(full.slice(2, 4), 16),
12
+ b: Number.parseInt(full.slice(4, 6), 16)
13
+ };
18
14
  }
19
15
  export function rgbToHex(r, g, b) {
20
- const clamp = (n) => Math.max(0, Math.min(255, Math.round(n)));
21
- return ("#" +
22
- [clamp(r), clamp(g), clamp(b)]
23
- .map((n) => n.toString(16).padStart(2, "0"))
24
- .join("")
25
- .toUpperCase());
16
+ const clamp = n => Math.max(0, Math.min(255, Math.round(n)));
17
+ return "#" + [clamp(r), clamp(g), clamp(b)].map(n => n.toString(16).padStart(2, "0")).join("").toUpperCase();
26
18
  }
27
19
  export function hexToHsl(hex) {
28
- const { r, g, b } = hexToRgb(hex);
29
- const rn = r / 255;
30
- const gn = g / 255;
31
- const bn = b / 255;
32
- const max = Math.max(rn, gn, bn);
33
- const min = Math.min(rn, gn, bn);
34
- const l = (max + min) / 2;
35
- if (max === min)
36
- return { h: 0, s: 0, l };
37
- const d = max - min;
38
- const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
39
- let h = 0;
40
- if (max === rn)
41
- h = ((gn - bn) / d + (gn < bn ? 6 : 0)) / 6;
42
- else if (max === gn)
43
- h = ((bn - rn) / d + 2) / 6;
44
- else
45
- h = ((rn - gn) / d + 4) / 6;
46
- return { h: h * 360, s, l };
20
+ const {
21
+ r,
22
+ g,
23
+ b
24
+ } = hexToRgb(hex);
25
+ const rn = r / 255;
26
+ const gn = g / 255;
27
+ const bn = b / 255;
28
+ const max = Math.max(rn, gn, bn);
29
+ const min = Math.min(rn, gn, bn);
30
+ const l = (max + min) / 2;
31
+ if (max === min) return {
32
+ h: 0,
33
+ s: 0,
34
+ l
35
+ };
36
+ const d = max - min;
37
+ const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
38
+ let h = 0;
39
+ if (max === rn) h = ((gn - bn) / d + (gn < bn ? 6 : 0)) / 6;else if (max === gn) h = ((bn - rn) / d + 2) / 6;else h = ((rn - gn) / d + 4) / 6;
40
+ return {
41
+ h: h * 360,
42
+ s,
43
+ l
44
+ };
47
45
  }
48
- export function hslToHex({ h, s, l }) {
49
- const hh = ((h % 360) + 360) % 360;
50
- const c = (1 - Math.abs(2 * l - 1)) * s;
51
- const x = c * (1 - Math.abs(((hh / 60) % 2) - 1));
52
- const m = l - c / 2;
53
- let rn = 0;
54
- let gn = 0;
55
- let bn = 0;
56
- if (hh < 60) {
57
- rn = c;
58
- gn = x;
59
- }
60
- else if (hh < 120) {
61
- rn = x;
62
- gn = c;
63
- }
64
- else if (hh < 180) {
65
- gn = c;
66
- bn = x;
67
- }
68
- else if (hh < 240) {
69
- gn = x;
70
- bn = c;
71
- }
72
- else if (hh < 300) {
73
- rn = x;
74
- bn = c;
75
- }
76
- else {
77
- rn = c;
78
- bn = x;
79
- }
80
- return rgbToHex((rn + m) * 255, (gn + m) * 255, (bn + m) * 255);
46
+ export function hslToHex({
47
+ h,
48
+ s,
49
+ l
50
+ }) {
51
+ const hh = (h % 360 + 360) % 360;
52
+ const c = (1 - Math.abs(2 * l - 1)) * s;
53
+ const x = c * (1 - Math.abs(hh / 60 % 2 - 1));
54
+ const m = l - c / 2;
55
+ let rn = 0;
56
+ let gn = 0;
57
+ let bn = 0;
58
+ if (hh < 60) {
59
+ rn = c;
60
+ gn = x;
61
+ } else if (hh < 120) {
62
+ rn = x;
63
+ gn = c;
64
+ } else if (hh < 180) {
65
+ gn = c;
66
+ bn = x;
67
+ } else if (hh < 240) {
68
+ gn = x;
69
+ bn = c;
70
+ } else if (hh < 300) {
71
+ rn = x;
72
+ bn = c;
73
+ } else {
74
+ rn = c;
75
+ bn = x;
76
+ }
77
+ return rgbToHex((rn + m) * 255, (gn + m) * 255, (bn + m) * 255);
81
78
  }
79
+
82
80
  /** Mix two hex colors. `t=0` → a, `t=1` → b. */
83
81
  export function mixHex(a, b, t) {
84
- const A = hexToRgb(a);
85
- const B = hexToRgb(b);
86
- const u = Math.max(0, Math.min(1, t));
87
- return rgbToHex(A.r + (B.r - A.r) * u, A.g + (B.g - A.g) * u, A.b + (B.b - A.b) * u);
82
+ const A = hexToRgb(a);
83
+ const B = hexToRgb(b);
84
+ const u = Math.max(0, Math.min(1, t));
85
+ return rgbToHex(A.r + (B.r - A.r) * u, A.g + (B.g - A.g) * u, A.b + (B.b - A.b) * u);
88
86
  }
87
+
89
88
  /** Shift lightness in HSL. delta in [-1, 1] absolute L change. */
90
89
  export function shiftLightness(hex, delta) {
91
- const hsl = hexToHsl(hex);
92
- return hslToHex({
93
- ...hsl,
94
- l: Math.max(0, Math.min(1, hsl.l + delta)),
95
- });
90
+ const hsl = hexToHsl(hex);
91
+ return hslToHex({
92
+ ...hsl,
93
+ l: Math.max(0, Math.min(1, hsl.l + delta))
94
+ });
96
95
  }
96
+
97
97
  /** Soft container fill + on-container ink (M3-style tonal pair). */
98
98
  export function containerPair(seed, mode) {
99
- if (mode === "light") {
100
- return {
101
- container: mixHex(seed, "#FFFFFF", 0.88),
102
- onContainer: shiftLightness(seed, -0.22),
103
- };
104
- }
99
+ if (mode === "light") {
105
100
  return {
106
- container: mixHex(seed, "#000000", 0.72),
107
- onContainer: mixHex(seed, "#FFFFFF", 0.45),
101
+ container: mixHex(seed, "#FFFFFF", 0.88),
102
+ onContainer: shiftLightness(seed, -0.22)
108
103
  };
104
+ }
105
+ return {
106
+ container: mixHex(seed, "#000000", 0.72),
107
+ onContainer: mixHex(seed, "#FFFFFF", 0.45)
108
+ };
109
109
  }
@@ -1,21 +1,8 @@
1
1
  import type { ActivityIndicatorProps } from "react-native";
2
- /**
3
- * ============================================================================
4
- * THEMED ACTIVITY INDICATOR
5
- * ============================================================================
6
- *
7
- * Wrapper de ActivityIndicator que usa color primary.
8
- * NOTA: Como no podemos usar hooks, usa el color hardcoded de Distribution.
9
- * Para cambiar color, pasar prop color directamente.
10
- *
11
- * USO:
12
- * ```tsx
13
- * <ThemedActivityIndicator />
14
- * <ThemedActivityIndicator size="large" color="#8B5CF6" />
15
- * ```
16
- */
17
2
  interface ThemedActivityIndicatorProps extends Omit<ActivityIndicatorProps, "color"> {
3
+ /** Defaults to the theme `primary`. */
18
4
  color?: string;
19
5
  }
6
+ /** ActivityIndicator in the theme `primary` unless a color is given. */
20
7
  export declare function ThemedActivityIndicator({ color, ...props }: ThemedActivityIndicatorProps): import("react").JSX.Element;
21
8
  export {};
@@ -1,5 +1,37 @@
1
- import { jsx as _jsx } from "nativewind/jsx-runtime";
1
+ import { c as _c } from "react/compiler-runtime";
2
+ import { useTheme } from "../useTheme.js";
2
3
  import { ActivityIndicator as RNActivityIndicator } from "react-native";
3
- export function ThemedActivityIndicator({ color = "#0075FF", ...props }) {
4
- return _jsx(RNActivityIndicator, { color: color, ...props });
4
+ import { jsx as _jsx } from "nativewind/jsx-runtime";
5
+ /** ActivityIndicator in the theme `primary` unless a color is given. */
6
+ export function ThemedActivityIndicator(t0) {
7
+ const $ = _c(6);
8
+ let color;
9
+ let props;
10
+ if ($[0] !== t0) {
11
+ ({
12
+ color,
13
+ ...props
14
+ } = t0);
15
+ $[0] = t0;
16
+ $[1] = color;
17
+ $[2] = props;
18
+ } else {
19
+ color = $[1];
20
+ props = $[2];
21
+ }
22
+ const theme = useTheme();
23
+ const t1 = color ?? theme.primary;
24
+ let t2;
25
+ if ($[3] !== props || $[4] !== t1) {
26
+ t2 = _jsx(RNActivityIndicator, {
27
+ color: t1,
28
+ ...props
29
+ });
30
+ $[3] = props;
31
+ $[4] = t1;
32
+ $[5] = t2;
33
+ } else {
34
+ t2 = $[5];
35
+ }
36
+ return t2;
5
37
  }
@@ -6,4 +6,5 @@
6
6
  * Components that need access to theme tokens via hook.
7
7
  * Estos son el 1% de casos donde className no es suficiente.
8
8
  */
9
+
9
10
  export { ThemedActivityIndicator } from "./ThemedActivityIndicator.js";
@@ -2,33 +2,34 @@
2
2
  * WCAG 2.1 contrast helpers for theme authors.
3
3
  * Used by `validateTheme` and by consumers building brand palettes.
4
4
  */
5
+
5
6
  export function parseHex(hex) {
6
- const h = hex.trim().replace(/^#/, "");
7
- const full = h.length === 3
8
- ? h
9
- .split("")
10
- .map((c) => c + c)
11
- .join("")
12
- : h;
13
- return {
14
- r: Number.parseInt(full.slice(0, 2), 16),
15
- g: Number.parseInt(full.slice(2, 4), 16),
16
- b: Number.parseInt(full.slice(4, 6), 16),
17
- };
7
+ const h = hex.trim().replace(/^#/, "");
8
+ const full = h.length === 3 ? h.split("").map(c => c + c).join("") : h;
9
+ return {
10
+ r: Number.parseInt(full.slice(0, 2), 16),
11
+ g: Number.parseInt(full.slice(2, 4), 16),
12
+ b: Number.parseInt(full.slice(4, 6), 16)
13
+ };
18
14
  }
19
15
  export function relativeLuminance(hex) {
20
- const { r, g, b } = parseHex(hex);
21
- const norm = (c) => {
22
- const s = c / 255;
23
- return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);
24
- };
25
- return 0.2126 * norm(r) + 0.7152 * norm(g) + 0.0722 * norm(b);
16
+ const {
17
+ r,
18
+ g,
19
+ b
20
+ } = parseHex(hex);
21
+ const norm = c => {
22
+ const s = c / 255;
23
+ return s <= 0.03928 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);
24
+ };
25
+ return 0.2126 * norm(r) + 0.7152 * norm(g) + 0.0722 * norm(b);
26
26
  }
27
+
27
28
  /** Contrast ratio between two sRGB hex colors (WCAG 2.1). */
28
29
  export function contrastRatio(fg, bg) {
29
- const L1 = relativeLuminance(fg);
30
- const L2 = relativeLuminance(bg);
31
- return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05);
30
+ const L1 = relativeLuminance(fg);
31
+ const L2 = relativeLuminance(bg);
32
+ return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05);
32
33
  }
33
34
  const DEFAULT_ON_LIGHT = "#FFFFFF";
34
35
  const DEFAULT_ON_DARK = "#0A0A0A";
@@ -41,17 +42,15 @@ const DEFAULT_ON_DARK = "#0A0A0A";
41
42
  * text: { onPrimary: resolveOnColor("#0B1F4A") } // → #FFFFFF
42
43
  */
43
44
  export function resolveOnColor(fill, options = {}) {
44
- const light = options.light ?? DEFAULT_ON_LIGHT;
45
- const dark = options.dark ?? DEFAULT_ON_DARK;
46
- const min = options.minRatio ?? 4.5;
47
- const withLight = contrastRatio(light, fill);
48
- const withDark = contrastRatio(dark, fill);
49
- if (withLight >= min && withDark >= min) {
50
- return withLight >= withDark ? light : dark;
51
- }
52
- if (withLight >= min)
53
- return light;
54
- if (withDark >= min)
55
- return dark;
45
+ const light = options.light ?? DEFAULT_ON_LIGHT;
46
+ const dark = options.dark ?? DEFAULT_ON_DARK;
47
+ const min = options.minRatio ?? 4.5;
48
+ const withLight = contrastRatio(light, fill);
49
+ const withDark = contrastRatio(dark, fill);
50
+ if (withLight >= min && withDark >= min) {
56
51
  return withLight >= withDark ? light : dark;
52
+ }
53
+ if (withLight >= min) return light;
54
+ if (withDark >= min) return dark;
55
+ return withLight >= withDark ? light : dark;
57
56
  }