@krizaka/ui 3.19.0 → 3.21.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 (241) hide show
  1. package/dist/action-bar.js +4 -4
  2. package/dist/argument-card.js +1 -1
  3. package/dist/avatar/defaults.js +6 -1
  4. package/dist/avatar/defaults.js.map +1 -1
  5. package/dist/avatar.js +6 -1
  6. package/dist/avatar.js.map +1 -1
  7. package/dist/blocks.css +1 -1
  8. package/dist/button.js +3 -2
  9. package/dist/card.js +3 -3
  10. package/dist/chat.js +1 -1
  11. package/dist/{chunk-276PTQMQ.js → chunk-3BC4XQ6C.js} +2 -1
  12. package/dist/{chunk-2NB27LM7.js → chunk-3IN6TOPM.js} +4 -4
  13. package/dist/{chunk-VDR2EP6K.js → chunk-4QN5YJ3D.js} +17 -5
  14. package/dist/chunk-4QN5YJ3D.js.map +1 -0
  15. package/dist/{chunk-YIBKJ36L.js → chunk-KB7OLYIJ.js} +7 -2
  16. package/dist/{chunk-YIBKJ36L.js.map → chunk-KB7OLYIJ.js.map} +1 -1
  17. package/dist/chunk-TDG7ED2W.js +1 -0
  18. package/dist/chunk-TDG7ED2W.js.map +1 -0
  19. package/dist/code-block.js +17 -5
  20. package/dist/code-block.js.map +1 -1
  21. package/dist/data-table.js +1 -1
  22. package/dist/date-picker.js +2 -2
  23. package/dist/date-picker.js.map +1 -1
  24. package/dist/file-upload.js +2 -2
  25. package/dist/file-upload.js.map +1 -1
  26. package/dist/force-update-screen.d.ts +80 -0
  27. package/dist/force-update-screen.js +38 -0
  28. package/dist/force-update-screen.js.map +1 -0
  29. package/dist/maintenance-screen.d.ts +68 -0
  30. package/dist/maintenance-screen.js +35 -0
  31. package/dist/maintenance-screen.js.map +1 -0
  32. package/dist/match-dialog.js +2 -2
  33. package/dist/media-grid.d.ts +66 -3
  34. package/dist/media-grid.js +313 -66
  35. package/dist/media-grid.js.map +1 -1
  36. package/dist/native.d.ts +68 -1
  37. package/dist/native.js +773 -682
  38. package/dist/native.js.map +1 -1
  39. package/dist/nav-bar.d.ts +30 -7
  40. package/dist/nav-bar.js +69 -15
  41. package/dist/nav-bar.js.map +1 -1
  42. package/dist/page-hero.js +3 -3
  43. package/dist/progress.js +2 -2
  44. package/dist/progress.js.map +1 -1
  45. package/dist/radio-group.js +1 -1
  46. package/dist/settings-layout.js +1 -1
  47. package/dist/settings-layout.js.map +1 -1
  48. package/dist/tabs.js +2 -2
  49. package/dist/tabs.js.map +1 -1
  50. package/dist/update-prompt.d.ts +86 -0
  51. package/dist/update-prompt.js +41 -0
  52. package/dist/update-prompt.js.map +1 -0
  53. package/dist/vertical-video.d.ts +7 -1
  54. package/dist/vertical-video.js +7 -5
  55. package/dist/vertical-video.js.map +1 -1
  56. package/dist/video-player.d.ts +1 -1
  57. package/dist/video-player.js +16 -3
  58. package/dist/video-player.js.map +1 -1
  59. package/package.json +50 -8
  60. package/registry/achievement.json +16 -2
  61. package/registry/action-bar.json +16 -2
  62. package/registry/action-sheet.json +15 -0
  63. package/registry/activity-feed.json +13 -2
  64. package/registry/alert.json +15 -2
  65. package/registry/app-shell.json +15 -2
  66. package/registry/argument-card.json +16 -2
  67. package/registry/audio-player.json +15 -2
  68. package/registry/auth-layout.json +15 -2
  69. package/registry/avatar.json +14 -3
  70. package/registry/badge.json +13 -2
  71. package/registry/button.json +13 -2
  72. package/registry/card-grid.json +16 -2
  73. package/registry/card.json +13 -2
  74. package/registry/catalogue-page.json +15 -2
  75. package/registry/changelog-page.json +15 -2
  76. package/registry/chat.json +15 -4
  77. package/registry/checkbox.json +13 -2
  78. package/registry/chip-link.json +15 -2
  79. package/registry/chip.json +13 -2
  80. package/registry/choice-grid.json +16 -2
  81. package/registry/cn.json +12 -0
  82. package/registry/code-block.json +15 -2
  83. package/registry/combobox.json +13 -2
  84. package/registry/command.json +15 -2
  85. package/registry/component-page.json +15 -2
  86. package/registry/confirm-button.json +15 -2
  87. package/registry/contact-page.json +15 -2
  88. package/registry/continue-prompt.json +16 -2
  89. package/registry/countdown.json +13 -2
  90. package/registry/cta-panel.json +16 -2
  91. package/registry/dashboard-layout.json +15 -2
  92. package/registry/data-table.json +15 -2
  93. package/registry/date-picker.json +15 -4
  94. package/registry/decision-list.json +16 -2
  95. package/registry/description-list.json +13 -2
  96. package/registry/detail-layout.json +15 -2
  97. package/registry/dialog.json +13 -2
  98. package/registry/docs-article-page.json +15 -2
  99. package/registry/docs-hub-page.json +15 -2
  100. package/registry/docs-layout.json +15 -2
  101. package/registry/document-viewer.json +15 -2
  102. package/registry/dropdown-menu.json +15 -2
  103. package/registry/empty-state.json +13 -2
  104. package/registry/error-page.json +14 -2
  105. package/registry/examples/chat/conversation.js +2 -2
  106. package/registry/examples/chat/conversation.tsx +4 -3
  107. package/registry/examples/force-update-screen/default.d.ts +4 -0
  108. package/registry/examples/force-update-screen/default.js +25 -0
  109. package/registry/examples/force-update-screen/default.tsx +19 -0
  110. package/registry/examples/force-update-screen/native/default.d.ts +4 -0
  111. package/registry/examples/force-update-screen/native/default.dark.png +0 -0
  112. package/registry/examples/force-update-screen/native/default.js +24 -0
  113. package/registry/examples/force-update-screen/native/default.light.png +0 -0
  114. package/registry/examples/force-update-screen/native/default.tsx +18 -0
  115. package/registry/examples/glow-card/plans.js +9 -12
  116. package/registry/examples/glow-card/plans.tsx +18 -14
  117. package/registry/examples/maintenance-screen/default.d.ts +4 -0
  118. package/registry/examples/maintenance-screen/default.js +22 -0
  119. package/registry/examples/maintenance-screen/default.tsx +16 -0
  120. package/registry/examples/maintenance-screen/native/default.d.ts +4 -0
  121. package/registry/examples/maintenance-screen/native/default.dark.png +0 -0
  122. package/registry/examples/maintenance-screen/native/default.js +21 -0
  123. package/registry/examples/maintenance-screen/native/default.light.png +0 -0
  124. package/registry/examples/maintenance-screen/native/default.tsx +15 -0
  125. package/registry/examples/media-grid/loading.d.ts +4 -0
  126. package/registry/examples/media-grid/loading.js +28 -0
  127. package/registry/examples/media-grid/loading.tsx +25 -0
  128. package/registry/examples/nav-bar/family-product.js +16 -13
  129. package/registry/examples/nav-bar/family-product.tsx +19 -19
  130. package/registry/examples/update-prompt/default.d.ts +4 -0
  131. package/registry/examples/update-prompt/default.js +24 -0
  132. package/registry/examples/update-prompt/default.tsx +18 -0
  133. package/registry/examples/update-prompt/native/default.d.ts +4 -0
  134. package/registry/examples/update-prompt/native/default.dark.png +0 -0
  135. package/registry/examples/update-prompt/native/default.js +23 -0
  136. package/registry/examples/update-prompt/native/default.light.png +0 -0
  137. package/registry/examples/update-prompt/native/default.tsx +17 -0
  138. package/registry/examples/vertical-video/rail.js +3 -2
  139. package/registry/examples/vertical-video/rail.tsx +4 -3
  140. package/registry/fab.json +15 -0
  141. package/registry/field.json +13 -2
  142. package/registry/file-upload.json +15 -2
  143. package/registry/filter-bar.json +15 -2
  144. package/registry/force-update-screen.json +323 -0
  145. package/registry/form.json +13 -2
  146. package/registry/gallery-page.json +15 -2
  147. package/registry/glow-card.json +18 -4
  148. package/registry/goal-gauge.json +13 -2
  149. package/registry/header.json +15 -0
  150. package/registry/how-it-works-page.json +15 -2
  151. package/registry/image-cropper.json +15 -2
  152. package/registry/image-viewer.json +15 -0
  153. package/registry/index.json +1864 -8
  154. package/registry/iso.json +15 -2
  155. package/registry/kanban.json +15 -2
  156. package/registry/kbd.json +14 -2
  157. package/registry/landing-page.json +15 -2
  158. package/registry/landscape.json +15 -2
  159. package/registry/legal-page.json +15 -2
  160. package/registry/link-card.json +16 -2
  161. package/registry/list.json +13 -2
  162. package/registry/loader.json +13 -2
  163. package/registry/longform-page.json +15 -2
  164. package/registry/maintenance-screen.json +259 -0
  165. package/registry/map.json +14 -3
  166. package/registry/markdown.json +13 -2
  167. package/registry/marketing-layout.json +15 -2
  168. package/registry/marquee.json +15 -2
  169. package/registry/mascot-quote.json +16 -2
  170. package/registry/mascot-state.json +13 -2
  171. package/registry/mascots.json +13 -2
  172. package/registry/match-dialog.json +13 -2
  173. package/registry/media-capture.json +13 -2
  174. package/registry/media-grid.json +342 -14
  175. package/registry/media-picker.json +15 -0
  176. package/registry/meter.json +13 -2
  177. package/registry/nav-bar.json +61 -14
  178. package/registry/number-ticker.json +13 -2
  179. package/registry/onboarding.json +15 -0
  180. package/registry/otp-input.json +15 -0
  181. package/registry/page-header.json +15 -2
  182. package/registry/page-hero.json +16 -2
  183. package/registry/page.json +16 -2
  184. package/registry/pagination.json +13 -2
  185. package/registry/permission-prompt.json +15 -0
  186. package/registry/photo-grid.json +13 -2
  187. package/registry/pointer-light.json +15 -2
  188. package/registry/popover.json +15 -2
  189. package/registry/pricing-page.json +15 -2
  190. package/registry/product-page.json +15 -2
  191. package/registry/profile-card.json +13 -2
  192. package/registry/progress.json +14 -3
  193. package/registry/promise-card.json +16 -2
  194. package/registry/pull-to-refresh.json +15 -0
  195. package/registry/radio-group.json +14 -3
  196. package/registry/recipes.json +14 -2
  197. package/registry/screen.json +15 -0
  198. package/registry/scroll-stage.json +15 -2
  199. package/registry/search-field.json +13 -2
  200. package/registry/section-backdrop.json +15 -2
  201. package/registry/segmented.json +15 -0
  202. package/registry/separator.json +15 -2
  203. package/registry/settings-layout.json +16 -3
  204. package/registry/showcase.json +13 -2
  205. package/registry/site-footer.json +16 -3
  206. package/registry/sites.json +15 -2
  207. package/registry/skeleton.json +13 -2
  208. package/registry/skip-link.json +14 -2
  209. package/registry/slider.json +13 -2
  210. package/registry/slot.json +14 -2
  211. package/registry/spinner.json +13 -2
  212. package/registry/splash-handoff.json +15 -0
  213. package/registry/split-view.json +15 -2
  214. package/registry/stage-banner.json +15 -2
  215. package/registry/stat.json +15 -2
  216. package/registry/status-page.json +15 -2
  217. package/registry/step-progress.json +13 -2
  218. package/registry/stepper.json +13 -2
  219. package/registry/swipe-deck.json +13 -2
  220. package/registry/swipeable-row.json +15 -0
  221. package/registry/switch.json +13 -2
  222. package/registry/tab-bar.json +15 -0
  223. package/registry/tabs.json +15 -4
  224. package/registry/tag-input.json +15 -2
  225. package/registry/tag-selector.json +13 -2
  226. package/registry/terminal-replay.json +15 -2
  227. package/registry/theme.json +13 -2
  228. package/registry/toast.json +13 -2
  229. package/registry/toc.json +15 -2
  230. package/registry/tooltip.json +14 -2
  231. package/registry/tree-view.json +15 -2
  232. package/registry/txt.json +13 -0
  233. package/registry/update-prompt.json +316 -0
  234. package/registry/verified-badge.json +13 -2
  235. package/registry/vertical-video.json +32 -6
  236. package/registry/video-player.json +16 -5
  237. package/registry/video-trimmer.json +15 -2
  238. package/registry/virtual.json +15 -2
  239. package/dist/chunk-VDR2EP6K.js.map +0 -1
  240. /package/dist/{chunk-276PTQMQ.js.map → chunk-3BC4XQ6C.js.map} +0 -0
  241. /package/dist/{chunk-2NB27LM7.js.map → chunk-3IN6TOPM.js.map} +0 -0
package/dist/native.js CHANGED
@@ -15,8 +15,13 @@ var resolveTone = (a) => a.tone === void 0 ? defaultAvatarToneOf(a.seed) : clamp
15
15
  function defaultAvatarFile(kind, tone3, size) {
16
16
  return size === "svg" ? `${kind}-${tone3}.svg` : `${kind}-${tone3}-${size}.webp`;
17
17
  }
18
+ function trimTrailingSlashes(value) {
19
+ let end = value.length;
20
+ while (end > 0 && value.charCodeAt(end - 1) === 47) end--;
21
+ return value.slice(0, end);
22
+ }
18
23
  function defaultAvatarUrl(avatar, { size = 256, base = DEFAULT_AVATAR_BASE } = {}) {
19
- return `${base.replace(/\/+$/, "")}/${avatar.brand}/${defaultAvatarFile(avatar.kind ?? "person", resolveTone(avatar), size)}`;
24
+ return `${trimTrailingSlashes(base)}/${avatar.brand}/${defaultAvatarFile(avatar.kind ?? "person", resolveTone(avatar), size)}`;
20
25
  }
21
26
 
22
27
  // src/countdown/core.ts
@@ -2587,8 +2592,32 @@ var styles20 = StyleSheet20.create({
2587
2592
  disabled: { opacity: 0.5 }
2588
2593
  });
2589
2594
 
2595
+ // src/native/force-update-screen.tsx
2596
+ import { StyleSheet as StyleSheet21, View as View19 } from "react-native";
2597
+ import { jsx as jsx23, jsxs as jsxs20 } from "react/jsx-runtime";
2598
+ function ForceUpdateScreen({ title, message, versionLabel, mark, updateLabel, onUpdate, retryLabel, onRetry, fill = true, style }) {
2599
+ const { theme } = useTheme();
2600
+ return /* @__PURE__ */ jsxs20(View19, { style: [styles21.root, fill ? styles21.fill : null, { backgroundColor: theme.surface0 }, style], children: [
2601
+ mark ? /* @__PURE__ */ jsx23(View19, { accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants", style: styles21.mark, children: mark }) : null,
2602
+ /* @__PURE__ */ jsx23(Txt, { variant: "title", style: styles21.centred, children: title }),
2603
+ message ? /* @__PURE__ */ jsx23(Txt, { tone: "secondary", style: styles21.centred, children: message }) : null,
2604
+ versionLabel ? /* @__PURE__ */ jsx23(Txt, { variant: "mono", tone: "secondary", style: styles21.centred, children: versionLabel }) : null,
2605
+ /* @__PURE__ */ jsxs20(View19, { style: styles21.actions, children: [
2606
+ /* @__PURE__ */ jsx23(Button, { label: updateLabel, variant: "primary", size: "lg", onPress: onUpdate }),
2607
+ retryLabel && onRetry ? /* @__PURE__ */ jsx23(Button, { label: retryLabel, variant: "ghost", onPress: onRetry }) : null
2608
+ ] })
2609
+ ] });
2610
+ }
2611
+ var styles21 = StyleSheet21.create({
2612
+ root: { alignItems: "center", justifyContent: "center", gap: 12, padding: 24 },
2613
+ fill: { flex: 1 },
2614
+ mark: { width: 96, height: 96, alignItems: "center", justifyContent: "center" },
2615
+ centred: { textAlign: "center", maxWidth: 340 },
2616
+ actions: { marginTop: 8, gap: 8, alignSelf: "stretch", maxWidth: 340, width: "100%" }
2617
+ });
2618
+
2590
2619
  // src/native/goal-gauge.tsx
2591
- import { Animated as Animated7, StyleSheet as StyleSheet21, View as View19 } from "react-native";
2620
+ import { Animated as Animated7, StyleSheet as StyleSheet22, View as View20 } from "react-native";
2592
2621
 
2593
2622
  // src/native/story-motion.ts
2594
2623
  import * as React17 from "react";
@@ -2611,17 +2640,17 @@ function useEntrance(animated, delay = 0, duration = 700) {
2611
2640
  }
2612
2641
 
2613
2642
  // src/native/goal-gauge.tsx
2614
- import { jsx as jsx23, jsxs as jsxs20 } from "react/jsx-runtime";
2643
+ import { jsx as jsx24, jsxs as jsxs21 } from "react/jsx-runtime";
2615
2644
  function Cell({ lit, animate, order, animated, arcade }) {
2616
2645
  const { theme } = useTheme();
2617
2646
  const t = useEntrance(animated && animate, 300 + order * 100, 350);
2618
2647
  const spentOpacity = arcade ? 0.14 : 1;
2619
2648
  const opacity = !animate ? 1 : lit ? t.interpolate({ inputRange: [0, 1], outputRange: [0.25, 1] }) : t.interpolate({ inputRange: [0, 1], outputRange: [1, arcade ? 0.14 : 1] });
2620
2649
  const color = lit || arcade ? theme.accent : theme.surface3;
2621
- return /* @__PURE__ */ jsx23(
2650
+ return /* @__PURE__ */ jsx24(
2622
2651
  Animated7.View,
2623
2652
  {
2624
- style: [styles21.cell, arcade ? styles21.cellArcade : null, { backgroundColor: color, opacity: lit || animate ? opacity : spentOpacity }]
2653
+ style: [styles22.cell, arcade ? styles22.cellArcade : null, { backgroundColor: color, opacity: lit || animate ? opacity : spentOpacity }]
2625
2654
  }
2626
2655
  );
2627
2656
  }
@@ -2631,8 +2660,8 @@ function GoalGauge({ label, segments, value, valueText, mode = "fill", showLabel
2631
2660
  const lit = Math.min(total, Math.max(0, Math.round(value ?? total)));
2632
2661
  const words2 = valueText ?? `${lit} / ${total}`;
2633
2662
  const arcade = variant === "arcade";
2634
- return /* @__PURE__ */ jsxs20(
2635
- View19,
2663
+ return /* @__PURE__ */ jsxs21(
2664
+ View20,
2636
2665
  {
2637
2666
  accessible: true,
2638
2667
  role: "meter",
@@ -2642,22 +2671,22 @@ function GoalGauge({ label, segments, value, valueText, mode = "fill", showLabel
2642
2671
  "aria-valuenow": lit,
2643
2672
  "aria-valuetext": words2,
2644
2673
  ...props,
2645
- style: [styles21.root, style],
2674
+ style: [styles22.root, style],
2646
2675
  children: [
2647
- showLabel ? /* @__PURE__ */ jsxs20(View19, { "aria-hidden": true, style: [styles21.head, arcade ? styles21.headArcade : null], children: [
2648
- /* @__PURE__ */ jsx23(Txt, { variant: arcade ? "mono" : "caption", tone: "secondary", children: arcade ? label.toUpperCase() : label }),
2649
- arcade ? null : /* @__PURE__ */ jsx23(Txt, { variant: "caption", children: words2 })
2676
+ showLabel ? /* @__PURE__ */ jsxs21(View20, { "aria-hidden": true, style: [styles22.head, arcade ? styles22.headArcade : null], children: [
2677
+ /* @__PURE__ */ jsx24(Txt, { variant: arcade ? "mono" : "caption", tone: "secondary", children: arcade ? label.toUpperCase() : label }),
2678
+ arcade ? null : /* @__PURE__ */ jsx24(Txt, { variant: "caption", children: words2 })
2650
2679
  ] }) : null,
2651
- /* @__PURE__ */ jsx23(View19, { "aria-hidden": true, style: [styles21.cells, arcade ? [styles21.cellsArcade, { borderColor: theme.borderSubtle, backgroundColor: theme.surface1 }] : null], children: Array.from({ length: total }, (_, i) => {
2680
+ /* @__PURE__ */ jsx24(View20, { "aria-hidden": true, style: [styles22.cells, arcade ? [styles22.cellsArcade, { borderColor: theme.borderSubtle, backgroundColor: theme.surface1 }] : null], children: Array.from({ length: total }, (_, i) => {
2652
2681
  const on = i < lit;
2653
2682
  const animate = mode === "fill" ? on : !on;
2654
- return /* @__PURE__ */ jsx23(Cell, { lit: on, animate, order: mode === "fill" ? i : i - lit, animated, arcade }, i);
2683
+ return /* @__PURE__ */ jsx24(Cell, { lit: on, animate, order: mode === "fill" ? i : i - lit, animated, arcade }, i);
2655
2684
  }) })
2656
2685
  ]
2657
2686
  }
2658
2687
  );
2659
2688
  }
2660
- var styles21 = StyleSheet21.create({
2689
+ var styles22 = StyleSheet22.create({
2661
2690
  root: { alignSelf: "stretch", gap: 8 },
2662
2691
  head: { flexDirection: "row", justifyContent: "space-between", alignItems: "baseline", gap: 12 },
2663
2692
  headArcade: { justifyContent: "center" },
@@ -2669,9 +2698,9 @@ var styles21 = StyleSheet21.create({
2669
2698
 
2670
2699
  // src/native/header.tsx
2671
2700
  import * as React18 from "react";
2672
- import { Animated as Animated8, Pressable as Pressable12, StyleSheet as StyleSheet22, View as View20 } from "react-native";
2701
+ import { Animated as Animated8, Pressable as Pressable12, StyleSheet as StyleSheet23, View as View21 } from "react-native";
2673
2702
  import Svg8, { Path as Path6 } from "react-native-svg";
2674
- import { jsx as jsx24, jsxs as jsxs21 } from "react/jsx-runtime";
2703
+ import { jsx as jsx25, jsxs as jsxs22 } from "react/jsx-runtime";
2675
2704
  var BAR = 44;
2676
2705
  var LARGE = 52;
2677
2706
  function Header({ title, subtitle, scrollY, size = "large", backLabel, onBack, actions, children, style }) {
@@ -2684,21 +2713,21 @@ function Header({ title, subtitle, scrollY, size = "large", backLabel, onBack, a
2684
2713
  const largeOpacity = progress.interpolate({ inputRange: [0, 0.7], outputRange: [1, 0], extrapolate: "clamp" });
2685
2714
  const largeShift = reduce ? 0 : progress.interpolate({ inputRange: [0, 1], outputRange: [0, -10] });
2686
2715
  const largeHeight = progress.interpolate({ inputRange: [0, 1], outputRange: [LARGE + (subtitle ? 18 : 0), 0] });
2687
- return /* @__PURE__ */ jsxs21(View20, { style: [{ paddingTop: insets.top, backgroundColor: theme.surface0 }, style], children: [
2688
- /* @__PURE__ */ jsxs21(View20, { style: styles22.bar, children: [
2689
- /* @__PURE__ */ jsx24(View20, { style: styles22.side, children: onBack && backLabel ? /* @__PURE__ */ jsxs21(Pressable12, { role: "button", "aria-label": backLabel, onPress: onBack, hitSlop: 8, style: styles22.back, children: [
2690
- /* @__PURE__ */ jsx24(Svg8, { width: 22, height: 22, viewBox: "0 0 24 24", "aria-hidden": true, children: /* @__PURE__ */ jsx24(Path6, { d: "M15 5l-7 7 7 7", stroke: theme.accentText, strokeWidth: 2.4, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" }) }),
2691
- /* @__PURE__ */ jsx24(Txt, { variant: "label", tone: "accent", numberOfLines: 1, children: backLabel })
2716
+ return /* @__PURE__ */ jsxs22(View21, { style: [{ paddingTop: insets.top, backgroundColor: theme.surface0 }, style], children: [
2717
+ /* @__PURE__ */ jsxs22(View21, { style: styles23.bar, children: [
2718
+ /* @__PURE__ */ jsx25(View21, { style: styles23.side, children: onBack && backLabel ? /* @__PURE__ */ jsxs22(Pressable12, { role: "button", "aria-label": backLabel, onPress: onBack, hitSlop: 8, style: styles23.back, children: [
2719
+ /* @__PURE__ */ jsx25(Svg8, { width: 22, height: 22, viewBox: "0 0 24 24", "aria-hidden": true, children: /* @__PURE__ */ jsx25(Path6, { d: "M15 5l-7 7 7 7", stroke: theme.accentText, strokeWidth: 2.4, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" }) }),
2720
+ /* @__PURE__ */ jsx25(Txt, { variant: "label", tone: "accent", numberOfLines: 1, children: backLabel })
2692
2721
  ] }) : null }),
2693
- /* @__PURE__ */ jsx24(Animated8.View, { style: [styles22.middle, { opacity: smallOpacity }], "aria-hidden": large, children: /* @__PURE__ */ jsx24(Txt, { variant: "label", numberOfLines: 1, role: large ? void 0 : "heading", children: title }) }),
2694
- /* @__PURE__ */ jsx24(View20, { style: [styles22.side, styles22.right], children: actions })
2722
+ /* @__PURE__ */ jsx25(Animated8.View, { style: [styles23.middle, { opacity: smallOpacity }], "aria-hidden": large, children: /* @__PURE__ */ jsx25(Txt, { variant: "label", numberOfLines: 1, role: large ? void 0 : "heading", children: title }) }),
2723
+ /* @__PURE__ */ jsx25(View21, { style: [styles23.side, styles23.right], children: actions })
2695
2724
  ] }),
2696
- large ? /* @__PURE__ */ jsx24(Animated8.View, { style: { height: largeHeight, overflow: "hidden" }, children: /* @__PURE__ */ jsxs21(Animated8.View, { style: [styles22.large, { opacity: largeOpacity, transform: [{ translateY: largeShift }] }], children: [
2697
- /* @__PURE__ */ jsx24(Txt, { variant: "display", numberOfLines: 1, role: "heading", style: styles22.largeTitle, children: title }),
2698
- subtitle ? /* @__PURE__ */ jsx24(Txt, { variant: "caption", tone: "secondary", children: subtitle }) : null
2725
+ large ? /* @__PURE__ */ jsx25(Animated8.View, { style: { height: largeHeight, overflow: "hidden" }, children: /* @__PURE__ */ jsxs22(Animated8.View, { style: [styles23.large, { opacity: largeOpacity, transform: [{ translateY: largeShift }] }], children: [
2726
+ /* @__PURE__ */ jsx25(Txt, { variant: "display", numberOfLines: 1, role: "heading", style: styles23.largeTitle, children: title }),
2727
+ subtitle ? /* @__PURE__ */ jsx25(Txt, { variant: "caption", tone: "secondary", children: subtitle }) : null
2699
2728
  ] }) }) : null,
2700
- children ? /* @__PURE__ */ jsx24(View20, { style: styles22.children, children }) : null,
2701
- /* @__PURE__ */ jsx24(Animated8.View, { "aria-hidden": true, style: [styles22.rule, { backgroundColor: theme.borderSubtle, opacity: smallOpacity }] })
2729
+ children ? /* @__PURE__ */ jsx25(View21, { style: styles23.children, children }) : null,
2730
+ /* @__PURE__ */ jsx25(Animated8.View, { "aria-hidden": true, style: [styles23.rule, { backgroundColor: theme.borderSubtle, opacity: smallOpacity }] })
2702
2731
  ] });
2703
2732
  }
2704
2733
  function useCollapsingHeader() {
@@ -2706,7 +2735,7 @@ function useCollapsingHeader() {
2706
2735
  const onScroll = React18.useMemo(() => Animated8.event([{ nativeEvent: { contentOffset: { y: scrollY } } }], { useNativeDriver: false }), [scrollY]);
2707
2736
  return { scrollY, onScroll };
2708
2737
  }
2709
- var styles22 = StyleSheet22.create({
2738
+ var styles23 = StyleSheet23.create({
2710
2739
  bar: { height: BAR, flexDirection: "row", alignItems: "center", paddingHorizontal: 8 },
2711
2740
  side: { flex: 1, flexDirection: "row", alignItems: "center" },
2712
2741
  right: { justifyContent: "flex-end", gap: 4 },
@@ -2715,13 +2744,13 @@ var styles22 = StyleSheet22.create({
2715
2744
  large: { paddingHorizontal: 16, paddingBottom: 6 },
2716
2745
  largeTitle: { fontSize: 32, lineHeight: 40 },
2717
2746
  children: { paddingHorizontal: 16, paddingBottom: 8 },
2718
- rule: { height: StyleSheet22.hairlineWidth }
2747
+ rule: { height: StyleSheet23.hairlineWidth }
2719
2748
  });
2720
2749
 
2721
2750
  // src/native/image-viewer.tsx
2722
2751
  import * as React19 from "react";
2723
- import { AccessibilityInfo as AccessibilityInfo5, Animated as Animated9, Image as Image3, Modal as Modal3, PanResponder, Pressable as Pressable13, StyleSheet as StyleSheet23, useWindowDimensions, View as View21 } from "react-native";
2724
- import { jsx as jsx25, jsxs as jsxs22 } from "react/jsx-runtime";
2752
+ import { AccessibilityInfo as AccessibilityInfo5, Animated as Animated9, Image as Image3, Modal as Modal3, PanResponder, Pressable as Pressable13, StyleSheet as StyleSheet24, useWindowDimensions, View as View22 } from "react-native";
2753
+ import { jsx as jsx26, jsxs as jsxs23 } from "react/jsx-runtime";
2725
2754
  var MAX_SCALE = 4;
2726
2755
  function ImageViewer({ images, index, onIndexChange, closeLabel, positionLabel = (n, total) => `${n} / ${total}` }) {
2727
2756
  const { theme, insets, haptic } = useTheme();
@@ -2809,12 +2838,12 @@ function ImageViewer({ images, index, onIndexChange, closeLabel, positionLabel =
2809
2838
  if (!open) return null;
2810
2839
  const image = images[index];
2811
2840
  const backdrop = dismiss2.interpolate({ inputRange: [0, height / 2], outputRange: [1, 0.3], extrapolate: "clamp" });
2812
- return /* @__PURE__ */ jsxs22(Modal3, { ...modalName(image.alt), visible: true, transparent: true, animationType: reduce ? "none" : "fade", onRequestClose: () => onIndexChange(null), statusBarTranslucent: true, children: [
2813
- /* @__PURE__ */ jsx25(Animated9.View, { style: [StyleSheet23.absoluteFill, { backgroundColor: theme.media, opacity: backdrop }] }),
2814
- /* @__PURE__ */ jsx25(
2815
- View21,
2841
+ return /* @__PURE__ */ jsxs23(Modal3, { ...modalName(image.alt), visible: true, transparent: true, animationType: reduce ? "none" : "fade", onRequestClose: () => onIndexChange(null), statusBarTranslucent: true, children: [
2842
+ /* @__PURE__ */ jsx26(Animated9.View, { style: [StyleSheet24.absoluteFill, { backgroundColor: theme.media, opacity: backdrop }] }),
2843
+ /* @__PURE__ */ jsx26(
2844
+ View22,
2816
2845
  {
2817
- style: StyleSheet23.absoluteFill,
2846
+ style: StyleSheet24.absoluteFill,
2818
2847
  accessible: true,
2819
2848
  role: "img",
2820
2849
  "aria-label": `${image.alt}, ${positionLabel(index + 1, images.length)}`,
@@ -2826,21 +2855,21 @@ function ImageViewer({ images, index, onIndexChange, closeLabel, positionLabel =
2826
2855
  if (name === "escape") onIndexChange(null);
2827
2856
  },
2828
2857
  ...responder.panHandlers,
2829
- children: /* @__PURE__ */ jsx25(Animated9.View, { style: { width, height, transform: [{ translateX: pan.x }, { translateY: Animated9.add(pan.y, dismiss2) }, { scale }] }, children: /* @__PURE__ */ jsx25(Image3, { source: { uri: image.uri }, resizeMode: "contain", style: { width, height }, accessibilityIgnoresInvertColors: true }) })
2858
+ children: /* @__PURE__ */ jsx26(Animated9.View, { style: { width, height, transform: [{ translateX: pan.x }, { translateY: Animated9.add(pan.y, dismiss2) }, { scale }] }, children: /* @__PURE__ */ jsx26(Image3, { source: { uri: image.uri }, resizeMode: "contain", style: { width, height }, accessibilityIgnoresInvertColors: true }) })
2830
2859
  }
2831
2860
  ),
2832
- /* @__PURE__ */ jsxs22(View21, { pointerEvents: "box-none", style: [styles23.top, { paddingTop: insets.top + 8 }], children: [
2833
- /* @__PURE__ */ jsx25(View21, { "aria-hidden": true, style: [styles23.counter, { backgroundColor: theme.scrimStrong }], children: /* @__PURE__ */ jsx25(Txt, { variant: "label", tone: "onMedia", children: positionLabel(index + 1, images.length) }) }),
2834
- /* @__PURE__ */ jsx25(Pressable13, { role: "button", "aria-label": closeLabel, hitSlop: 12, onPress: () => onIndexChange(null), style: [styles23.close, { backgroundColor: theme.scrimStrong }], children: /* @__PURE__ */ jsx25(Txt, { tone: "onMedia", style: styles23.cross, "aria-hidden": true, children: "\xD7" }) })
2861
+ /* @__PURE__ */ jsxs23(View22, { pointerEvents: "box-none", style: [styles24.top, { paddingTop: insets.top + 8 }], children: [
2862
+ /* @__PURE__ */ jsx26(View22, { "aria-hidden": true, style: [styles24.counter, { backgroundColor: theme.scrimStrong }], children: /* @__PURE__ */ jsx26(Txt, { variant: "label", tone: "onMedia", children: positionLabel(index + 1, images.length) }) }),
2863
+ /* @__PURE__ */ jsx26(Pressable13, { role: "button", "aria-label": closeLabel, hitSlop: 12, onPress: () => onIndexChange(null), style: [styles24.close, { backgroundColor: theme.scrimStrong }], children: /* @__PURE__ */ jsx26(Txt, { tone: "onMedia", style: styles24.cross, "aria-hidden": true, children: "\xD7" }) })
2835
2864
  ] }),
2836
- image.caption ? /* @__PURE__ */ jsx25(View21, { pointerEvents: "none", style: [styles23.caption, { paddingBottom: insets.bottom + 16, backgroundColor: theme.scrimStrong }], children: /* @__PURE__ */ jsx25(Txt, { tone: "onMedia", children: image.caption }) }) : null
2865
+ image.caption ? /* @__PURE__ */ jsx26(View22, { pointerEvents: "none", style: [styles24.caption, { paddingBottom: insets.bottom + 16, backgroundColor: theme.scrimStrong }], children: /* @__PURE__ */ jsx26(Txt, { tone: "onMedia", children: image.caption }) }) : null
2837
2866
  ] });
2838
2867
  }
2839
2868
  function prefetchNeighbours(images, index) {
2840
2869
  if (index === null) return;
2841
2870
  for (const i of [index - 1, index + 1]) if (images[i]) void Image3.prefetch(images[i].uri).catch(() => void 0);
2842
2871
  }
2843
- var styles23 = StyleSheet23.create({
2872
+ var styles24 = StyleSheet24.create({
2844
2873
  top: { position: "absolute", top: 0, left: 0, right: 0, flexDirection: "row", alignItems: "center", justifyContent: "space-between", paddingHorizontal: 16 },
2845
2874
  counter: { paddingHorizontal: 10, paddingVertical: 4, borderRadius: 999 },
2846
2875
  close: { width: 40, height: 40, borderRadius: 20, alignItems: "center", justifyContent: "center" },
@@ -2849,7 +2878,7 @@ var styles23 = StyleSheet23.create({
2849
2878
  });
2850
2879
 
2851
2880
  // src/native/KachizakaMark.tsx
2852
- import { View as View22 } from "react-native";
2881
+ import { View as View23 } from "react-native";
2853
2882
  import Svg9, { Circle as Circle3, Defs as Defs4, LinearGradient as LinearGradient4, Path as Path7, RadialGradient as RadialGradient2, Stop as Stop4 } from "react-native-svg";
2854
2883
 
2855
2884
  // src/marks/kachizaka-geometry.ts
@@ -2879,41 +2908,41 @@ var KACHIZAKA = {
2879
2908
  };
2880
2909
 
2881
2910
  // src/native/KachizakaMark.tsx
2882
- import { jsx as jsx26, jsxs as jsxs23 } from "react/jsx-runtime";
2911
+ import { jsx as jsx27, jsxs as jsxs24 } from "react/jsx-runtime";
2883
2912
  function KachizakaMark({ size = 48, animated = true, title, neutral }) {
2884
2913
  const { theme } = useTheme();
2885
2914
  const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, 28e3);
2886
2915
  const id = useSvgId("kzm");
2887
2916
  const viewBox = size < 48 ? KACHIZAKA.croppedViewBox : KACHIZAKA.viewBox;
2888
2917
  const stroke = neutral ?? theme.textMuted;
2889
- const gradient = /* @__PURE__ */ jsx26(LinearGradient4, { id: `${id}a`, gradientUnits: "userSpaceOnUse", x1: KACHIZAKA.gradient.x1, y1: KACHIZAKA.gradient.y1, x2: KACHIZAKA.gradient.x2, y2: KACHIZAKA.gradient.y2, children: KACHIZAKA.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx26(Stop4, { offset, stopColor: color }, offset)) });
2918
+ const gradient = /* @__PURE__ */ jsx27(LinearGradient4, { id: `${id}a`, gradientUnits: "userSpaceOnUse", x1: KACHIZAKA.gradient.x1, y1: KACHIZAKA.gradient.y1, x2: KACHIZAKA.gradient.x2, y2: KACHIZAKA.gradient.y2, children: KACHIZAKA.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx27(Stop4, { offset, stopColor: color }, offset)) });
2890
2919
  const fill = `url(#${id}a)`;
2891
- return /* @__PURE__ */ jsxs23(View22, { style: { width: size, height: size }, ...markA11y(title), children: [
2892
- /* @__PURE__ */ jsxs23(Svg9, { viewBox, style: layer, children: [
2893
- /* @__PURE__ */ jsxs23(Defs4, { children: [
2894
- /* @__PURE__ */ jsxs23(RadialGradient2, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
2895
- /* @__PURE__ */ jsx26(Stop4, { offset: "0%", stopColor: KACHIZAKA.glow.color, stopOpacity: KACHIZAKA.glow.opacity }),
2896
- /* @__PURE__ */ jsx26(Stop4, { offset: "100%", stopColor: KACHIZAKA.glow.color, stopOpacity: 0 })
2920
+ return /* @__PURE__ */ jsxs24(View23, { style: { width: size, height: size }, ...markA11y(title), children: [
2921
+ /* @__PURE__ */ jsxs24(Svg9, { viewBox, style: layer, children: [
2922
+ /* @__PURE__ */ jsxs24(Defs4, { children: [
2923
+ /* @__PURE__ */ jsxs24(RadialGradient2, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
2924
+ /* @__PURE__ */ jsx27(Stop4, { offset: "0%", stopColor: KACHIZAKA.glow.color, stopOpacity: KACHIZAKA.glow.opacity }),
2925
+ /* @__PURE__ */ jsx27(Stop4, { offset: "100%", stopColor: KACHIZAKA.glow.color, stopOpacity: 0 })
2897
2926
  ] }),
2898
2927
  gradient
2899
2928
  ] }),
2900
- size >= 48 ? /* @__PURE__ */ jsx26(Circle3, { cx: KACHIZAKA.center, cy: KACHIZAKA.center, r: 190, fill: `url(#${id}g)` }) : null,
2901
- /* @__PURE__ */ jsx26(Circle3, { cx: KACHIZAKA.center, cy: KACHIZAKA.center, r: KACHIZAKA.ring.r, stroke, strokeWidth: KACHIZAKA.ring.width, opacity: 0.35, fill: "none" }),
2902
- /* @__PURE__ */ jsx26(Path7, { d: KACHIZAKA.handles, stroke: fill, strokeWidth: KACHIZAKA.handleWidth, strokeLinecap: "round", fill: "none" }),
2903
- /* @__PURE__ */ jsx26(Path7, { d: KACHIZAKA.base, fill }),
2904
- /* @__PURE__ */ jsx26(Path7, { d: KACHIZAKA.cup, fill })
2929
+ size >= 48 ? /* @__PURE__ */ jsx27(Circle3, { cx: KACHIZAKA.center, cy: KACHIZAKA.center, r: 190, fill: `url(#${id}g)` }) : null,
2930
+ /* @__PURE__ */ jsx27(Circle3, { cx: KACHIZAKA.center, cy: KACHIZAKA.center, r: KACHIZAKA.ring.r, stroke, strokeWidth: KACHIZAKA.ring.width, opacity: 0.35, fill: "none" }),
2931
+ /* @__PURE__ */ jsx27(Path7, { d: KACHIZAKA.handles, stroke: fill, strokeWidth: KACHIZAKA.handleWidth, strokeLinecap: "round", fill: "none" }),
2932
+ /* @__PURE__ */ jsx27(Path7, { d: KACHIZAKA.base, fill }),
2933
+ /* @__PURE__ */ jsx27(Path7, { d: KACHIZAKA.cup, fill })
2905
2934
  ] }),
2906
- /* @__PURE__ */ jsx26(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs23(Svg9, { viewBox, style: layer, children: [
2907
- /* @__PURE__ */ jsx26(Defs4, { children: gradient }),
2908
- /* @__PURE__ */ jsx26(Circle3, { cx: KACHIZAKA.center, cy: KACHIZAKA.center, r: KACHIZAKA.orbit.r, stroke, strokeWidth: KACHIZAKA.orbit.width, strokeDasharray: KACHIZAKA.orbit.dash, opacity: 0.6, fill: "none" }),
2909
- /* @__PURE__ */ jsx26(Circle3, { cx: KACHIZAKA.node.at[0], cy: KACHIZAKA.node.at[1], r: KACHIZAKA.node.r, fill })
2935
+ /* @__PURE__ */ jsx27(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs24(Svg9, { viewBox, style: layer, children: [
2936
+ /* @__PURE__ */ jsx27(Defs4, { children: gradient }),
2937
+ /* @__PURE__ */ jsx27(Circle3, { cx: KACHIZAKA.center, cy: KACHIZAKA.center, r: KACHIZAKA.orbit.r, stroke, strokeWidth: KACHIZAKA.orbit.width, strokeDasharray: KACHIZAKA.orbit.dash, opacity: 0.6, fill: "none" }),
2938
+ /* @__PURE__ */ jsx27(Circle3, { cx: KACHIZAKA.node.at[0], cy: KACHIZAKA.node.at[1], r: KACHIZAKA.node.r, fill })
2910
2939
  ] }) }),
2911
- /* @__PURE__ */ jsx26(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsx26(Svg9, { viewBox, style: layer, children: /* @__PURE__ */ jsx26(Path7, { d: KACHIZAKA.star, fill: KACHIZAKA.starColor }) }) })
2940
+ /* @__PURE__ */ jsx27(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsx27(Svg9, { viewBox, style: layer, children: /* @__PURE__ */ jsx27(Path7, { d: KACHIZAKA.star, fill: KACHIZAKA.starColor }) }) })
2912
2941
  ] });
2913
2942
  }
2914
2943
 
2915
2944
  // src/native/KrizakaMark.tsx
2916
- import { View as View23 } from "react-native";
2945
+ import { View as View24 } from "react-native";
2917
2946
  import Svg10, { Circle as Circle4, Defs as Defs5, G as Group, LinearGradient as LinearGradient5, Path as Path8, RadialGradient as RadialGradient3, Stop as Stop5 } from "react-native-svg";
2918
2947
 
2919
2948
  // src/marks/krizaka-geometry.ts
@@ -2936,39 +2965,39 @@ var KRIZAKA = {
2936
2965
  };
2937
2966
 
2938
2967
  // src/native/KrizakaMark.tsx
2939
- import { Fragment as Fragment5, jsx as jsx27, jsxs as jsxs24 } from "react/jsx-runtime";
2968
+ import { Fragment as Fragment5, jsx as jsx28, jsxs as jsxs25 } from "react/jsx-runtime";
2940
2969
  function KrizakaMark({ size = 48, animated = true, title, neutral }) {
2941
2970
  const { theme } = useTheme();
2942
2971
  const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated);
2943
2972
  const id = useSvgId("kzm");
2944
2973
  const viewBox = size < 48 ? KRIZAKA.croppedViewBox : KRIZAKA.viewBox;
2945
2974
  const stroke = neutral ?? theme.textMuted;
2946
- const blue = /* @__PURE__ */ jsx27(LinearGradient5, { id: `${id}b`, gradientUnits: "userSpaceOnUse", x1: KRIZAKA.blue.x1 + KRIZAKA.offset, y1: KRIZAKA.blue.y1 + KRIZAKA.offset, x2: KRIZAKA.blue.x2 + KRIZAKA.offset, y2: KRIZAKA.blue.y2 + KRIZAKA.offset, children: KRIZAKA.blue.stops.map(([offset, color]) => /* @__PURE__ */ jsx27(Stop5, { offset, stopColor: color }, offset)) });
2947
- const dot = (c) => /* @__PURE__ */ jsxs24(Fragment5, { children: [
2948
- /* @__PURE__ */ jsx27(Circle4, { cx: c.cx, cy: c.cy, r: c.r, fill: `url(#${id}b)` }),
2949
- /* @__PURE__ */ jsx27(Circle4, { cx: c.cx, cy: c.cy, r: c.inner, fill: KRIZAKA.highlight })
2975
+ const blue = /* @__PURE__ */ jsx28(LinearGradient5, { id: `${id}b`, gradientUnits: "userSpaceOnUse", x1: KRIZAKA.blue.x1 + KRIZAKA.offset, y1: KRIZAKA.blue.y1 + KRIZAKA.offset, x2: KRIZAKA.blue.x2 + KRIZAKA.offset, y2: KRIZAKA.blue.y2 + KRIZAKA.offset, children: KRIZAKA.blue.stops.map(([offset, color]) => /* @__PURE__ */ jsx28(Stop5, { offset, stopColor: color }, offset)) });
2976
+ const dot = (c) => /* @__PURE__ */ jsxs25(Fragment5, { children: [
2977
+ /* @__PURE__ */ jsx28(Circle4, { cx: c.cx, cy: c.cy, r: c.r, fill: `url(#${id}b)` }),
2978
+ /* @__PURE__ */ jsx28(Circle4, { cx: c.cx, cy: c.cy, r: c.inner, fill: KRIZAKA.highlight })
2950
2979
  ] });
2951
- return /* @__PURE__ */ jsxs24(View23, { style: { width: size, height: size }, ...markA11y(title), children: [
2952
- /* @__PURE__ */ jsxs24(Svg10, { viewBox, style: layer, children: [
2953
- /* @__PURE__ */ jsxs24(Defs5, { children: [
2954
- /* @__PURE__ */ jsxs24(RadialGradient3, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
2955
- /* @__PURE__ */ jsx27(Stop5, { offset: "0%", stopColor: KRIZAKA.glow.color, stopOpacity: KRIZAKA.glow.opacity }),
2956
- /* @__PURE__ */ jsx27(Stop5, { offset: "100%", stopColor: KRIZAKA.glow.color, stopOpacity: 0 })
2980
+ return /* @__PURE__ */ jsxs25(View24, { style: { width: size, height: size }, ...markA11y(title), children: [
2981
+ /* @__PURE__ */ jsxs25(Svg10, { viewBox, style: layer, children: [
2982
+ /* @__PURE__ */ jsxs25(Defs5, { children: [
2983
+ /* @__PURE__ */ jsxs25(RadialGradient3, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
2984
+ /* @__PURE__ */ jsx28(Stop5, { offset: "0%", stopColor: KRIZAKA.glow.color, stopOpacity: KRIZAKA.glow.opacity }),
2985
+ /* @__PURE__ */ jsx28(Stop5, { offset: "100%", stopColor: KRIZAKA.glow.color, stopOpacity: 0 })
2957
2986
  ] }),
2958
- /* @__PURE__ */ jsxs24(LinearGradient5, { id: `${id}i`, gradientUnits: "userSpaceOnUse", x1: KRIZAKA.ink.x1 + KRIZAKA.offset, y1: KRIZAKA.ink.y1 + KRIZAKA.offset, x2: KRIZAKA.ink.x2 + KRIZAKA.offset, y2: KRIZAKA.ink.y2 + KRIZAKA.offset, children: [
2959
- /* @__PURE__ */ jsx27(Stop5, { offset: "0%", stopColor: theme.textSecondary }),
2960
- /* @__PURE__ */ jsx27(Stop5, { offset: "100%", stopColor: theme.textPrimary })
2987
+ /* @__PURE__ */ jsxs25(LinearGradient5, { id: `${id}i`, gradientUnits: "userSpaceOnUse", x1: KRIZAKA.ink.x1 + KRIZAKA.offset, y1: KRIZAKA.ink.y1 + KRIZAKA.offset, x2: KRIZAKA.ink.x2 + KRIZAKA.offset, y2: KRIZAKA.ink.y2 + KRIZAKA.offset, children: [
2988
+ /* @__PURE__ */ jsx28(Stop5, { offset: "0%", stopColor: theme.textSecondary }),
2989
+ /* @__PURE__ */ jsx28(Stop5, { offset: "100%", stopColor: theme.textPrimary })
2961
2990
  ] }),
2962
2991
  blue
2963
2992
  ] }),
2964
- size >= 48 ? /* @__PURE__ */ jsx27(Circle4, { cx: 200, cy: 200, r: 190, fill: `url(#${id}g)` }) : null,
2965
- /* @__PURE__ */ jsx27(Circle4, { cx: 200, cy: 200, r: KRIZAKA.ring.r, stroke, strokeWidth: KRIZAKA.ring.width, opacity: 0.35, fill: "none" }),
2966
- /* @__PURE__ */ jsx27(Group, { transform: `translate(${KRIZAKA.offset} ${KRIZAKA.offset})`, children: /* @__PURE__ */ jsx27(Path8, { d: KRIZAKA.shield, stroke: `url(#${id}i)`, strokeWidth: KRIZAKA.stroke, strokeLinecap: "round", strokeLinejoin: "round", fill: "none" }) })
2993
+ size >= 48 ? /* @__PURE__ */ jsx28(Circle4, { cx: 200, cy: 200, r: 190, fill: `url(#${id}g)` }) : null,
2994
+ /* @__PURE__ */ jsx28(Circle4, { cx: 200, cy: 200, r: KRIZAKA.ring.r, stroke, strokeWidth: KRIZAKA.ring.width, opacity: 0.35, fill: "none" }),
2995
+ /* @__PURE__ */ jsx28(Group, { transform: `translate(${KRIZAKA.offset} ${KRIZAKA.offset})`, children: /* @__PURE__ */ jsx28(Path8, { d: KRIZAKA.shield, stroke: `url(#${id}i)`, strokeWidth: KRIZAKA.stroke, strokeLinecap: "round", strokeLinejoin: "round", fill: "none" }) })
2967
2996
  ] }),
2968
- /* @__PURE__ */ jsx27(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsx27(Svg10, { viewBox, style: layer, children: /* @__PURE__ */ jsx27(Circle4, { cx: 200, cy: 200, r: KRIZAKA.orbit.r, stroke, strokeWidth: KRIZAKA.orbit.width, strokeDasharray: KRIZAKA.orbit.dash, opacity: 0.6, fill: "none" }) }) }),
2969
- /* @__PURE__ */ jsx27(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs24(Svg10, { viewBox, style: layer, children: [
2970
- /* @__PURE__ */ jsx27(Defs5, { children: blue }),
2971
- /* @__PURE__ */ jsxs24(Group, { transform: `translate(${KRIZAKA.offset} ${KRIZAKA.offset})`, children: [
2997
+ /* @__PURE__ */ jsx28(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsx28(Svg10, { viewBox, style: layer, children: /* @__PURE__ */ jsx28(Circle4, { cx: 200, cy: 200, r: KRIZAKA.orbit.r, stroke, strokeWidth: KRIZAKA.orbit.width, strokeDasharray: KRIZAKA.orbit.dash, opacity: 0.6, fill: "none" }) }) }),
2998
+ /* @__PURE__ */ jsx28(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs25(Svg10, { viewBox, style: layer, children: [
2999
+ /* @__PURE__ */ jsx28(Defs5, { children: blue }),
3000
+ /* @__PURE__ */ jsxs25(Group, { transform: `translate(${KRIZAKA.offset} ${KRIZAKA.offset})`, children: [
2972
3001
  dot(KRIZAKA.node),
2973
3002
  dot(KRIZAKA.core)
2974
3003
  ] })
@@ -2978,11 +3007,11 @@ function KrizakaMark({ size = 48, animated = true, title, neutral }) {
2978
3007
 
2979
3008
  // src/native/loader.tsx
2980
3009
  import * as React22 from "react";
2981
- import { AccessibilityInfo as AccessibilityInfo7, Animated as Animated11, Easing as Easing5, StyleSheet as StyleSheet24, View as View29 } from "react-native";
3010
+ import { AccessibilityInfo as AccessibilityInfo7, Animated as Animated11, Easing as Easing5, StyleSheet as StyleSheet25, View as View30 } from "react-native";
2982
3011
  import Svg16, { Circle as Circle10, Path as Path14 } from "react-native-svg";
2983
3012
 
2984
3013
  // src/native/OrazakaMark.tsx
2985
- import { View as View24 } from "react-native";
3014
+ import { View as View25 } from "react-native";
2986
3015
  import Svg11, { Circle as Circle5, Defs as Defs6, LinearGradient as LinearGradient6, Path as Path9, RadialGradient as RadialGradient4, Stop as Stop6 } from "react-native-svg";
2987
3016
 
2988
3017
  // src/marks/orazaka-geometry.ts
@@ -3012,40 +3041,40 @@ var ORAZAKA = {
3012
3041
  };
3013
3042
 
3014
3043
  // src/native/OrazakaMark.tsx
3015
- import { jsx as jsx28, jsxs as jsxs25 } from "react/jsx-runtime";
3044
+ import { jsx as jsx29, jsxs as jsxs26 } from "react/jsx-runtime";
3016
3045
  function OrazakaMark({ size = 48, animated = true, title, neutral }) {
3017
3046
  const { theme } = useTheme();
3018
3047
  const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated);
3019
3048
  const id = useSvgId("ozm");
3020
3049
  const viewBox = size < 48 ? ORAZAKA.croppedViewBox : ORAZAKA.viewBox;
3021
3050
  const stroke = neutral ?? theme.textMuted;
3022
- const gradient = /* @__PURE__ */ jsx28(LinearGradient6, { id: `${id}a`, gradientUnits: "userSpaceOnUse", x1: ORAZAKA.gradient.x1, y1: ORAZAKA.gradient.y1, x2: ORAZAKA.gradient.x2, y2: ORAZAKA.gradient.y2, children: ORAZAKA.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx28(Stop6, { offset, stopColor: color }, offset)) });
3051
+ const gradient = /* @__PURE__ */ jsx29(LinearGradient6, { id: `${id}a`, gradientUnits: "userSpaceOnUse", x1: ORAZAKA.gradient.x1, y1: ORAZAKA.gradient.y1, x2: ORAZAKA.gradient.x2, y2: ORAZAKA.gradient.y2, children: ORAZAKA.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx29(Stop6, { offset, stopColor: color }, offset)) });
3023
3052
  const fill = `url(#${id}a)`;
3024
- return /* @__PURE__ */ jsxs25(View24, { style: { width: size, height: size }, ...markA11y(title), children: [
3025
- /* @__PURE__ */ jsxs25(Svg11, { viewBox, style: layer, children: [
3026
- /* @__PURE__ */ jsx28(Defs6, { children: /* @__PURE__ */ jsxs25(RadialGradient4, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
3027
- /* @__PURE__ */ jsx28(Stop6, { offset: "0%", stopColor: ORAZAKA.glow.color, stopOpacity: ORAZAKA.glow.opacity }),
3028
- /* @__PURE__ */ jsx28(Stop6, { offset: "100%", stopColor: ORAZAKA.glow.color, stopOpacity: 0 })
3053
+ return /* @__PURE__ */ jsxs26(View25, { style: { width: size, height: size }, ...markA11y(title), children: [
3054
+ /* @__PURE__ */ jsxs26(Svg11, { viewBox, style: layer, children: [
3055
+ /* @__PURE__ */ jsx29(Defs6, { children: /* @__PURE__ */ jsxs26(RadialGradient4, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
3056
+ /* @__PURE__ */ jsx29(Stop6, { offset: "0%", stopColor: ORAZAKA.glow.color, stopOpacity: ORAZAKA.glow.opacity }),
3057
+ /* @__PURE__ */ jsx29(Stop6, { offset: "100%", stopColor: ORAZAKA.glow.color, stopOpacity: 0 })
3029
3058
  ] }) }),
3030
- size >= 48 ? /* @__PURE__ */ jsx28(Circle5, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: 190, fill: `url(#${id}g)` }) : null,
3031
- /* @__PURE__ */ jsx28(Circle5, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.orbit.r, stroke, strokeWidth: ORAZAKA.orbit.width, strokeDasharray: ORAZAKA.orbit.dash, opacity: 0.6, fill: "none" }),
3032
- /* @__PURE__ */ jsx28(Circle5, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.ring.r, stroke, strokeWidth: ORAZAKA.ring.width, opacity: 0.35, fill: "none" })
3059
+ size >= 48 ? /* @__PURE__ */ jsx29(Circle5, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: 190, fill: `url(#${id}g)` }) : null,
3060
+ /* @__PURE__ */ jsx29(Circle5, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.orbit.r, stroke, strokeWidth: ORAZAKA.orbit.width, strokeDasharray: ORAZAKA.orbit.dash, opacity: 0.6, fill: "none" }),
3061
+ /* @__PURE__ */ jsx29(Circle5, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.ring.r, stroke, strokeWidth: ORAZAKA.ring.width, opacity: 0.35, fill: "none" })
3033
3062
  ] }),
3034
- /* @__PURE__ */ jsx28(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs25(Svg11, { viewBox, style: layer, children: [
3035
- /* @__PURE__ */ jsx28(Defs6, { children: gradient }),
3036
- ORAZAKA.shards.map((d) => /* @__PURE__ */ jsx28(Path9, { d, fill, stroke: fill, strokeWidth: ORAZAKA.shardStroke, strokeLinejoin: "round" }, d))
3063
+ /* @__PURE__ */ jsx29(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs26(Svg11, { viewBox, style: layer, children: [
3064
+ /* @__PURE__ */ jsx29(Defs6, { children: gradient }),
3065
+ ORAZAKA.shards.map((d) => /* @__PURE__ */ jsx29(Path9, { d, fill, stroke: fill, strokeWidth: ORAZAKA.shardStroke, strokeLinejoin: "round" }, d))
3037
3066
  ] }) }),
3038
- /* @__PURE__ */ jsx28(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs25(Svg11, { viewBox, style: layer, children: [
3039
- /* @__PURE__ */ jsx28(Defs6, { children: gradient }),
3040
- /* @__PURE__ */ jsx28(Circle5, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.core.r, fill }),
3041
- /* @__PURE__ */ jsx28(Circle5, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.core.inner, fill: ORAZAKA.highlight })
3067
+ /* @__PURE__ */ jsx29(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs26(Svg11, { viewBox, style: layer, children: [
3068
+ /* @__PURE__ */ jsx29(Defs6, { children: gradient }),
3069
+ /* @__PURE__ */ jsx29(Circle5, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.core.r, fill }),
3070
+ /* @__PURE__ */ jsx29(Circle5, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.core.inner, fill: ORAZAKA.highlight })
3042
3071
  ] }) })
3043
3072
  ] });
3044
3073
  }
3045
3074
 
3046
3075
  // src/native/OrochiaMark.tsx
3047
3076
  import { useEffect as useEffect12, useState as useState20 } from "react";
3048
- import { AccessibilityInfo as AccessibilityInfo6, Animated as Animated10, Easing as Easing4, View as View25 } from "react-native";
3077
+ import { AccessibilityInfo as AccessibilityInfo6, Animated as Animated10, Easing as Easing4, View as View26 } from "react-native";
3049
3078
  import Svg12, { Circle as Circle6, Defs as Defs7, Ellipse, G as Group2, LinearGradient as LinearGradient7, Path as Path10, RadialGradient as RadialGradient5, Stop as Stop7 } from "react-native-svg";
3050
3079
 
3051
3080
  // src/marks/orochia-geometry.ts
@@ -3073,7 +3102,7 @@ var OROCHIA = {
3073
3102
  };
3074
3103
 
3075
3104
  // src/native/OrochiaMark.tsx
3076
- import { jsx as jsx29, jsxs as jsxs26 } from "react/jsx-runtime";
3105
+ import { jsx as jsx30, jsxs as jsxs27 } from "react/jsx-runtime";
3077
3106
  var CENTER = OROCHIA.offset + 180;
3078
3107
  function OrochiaMark({ size = 48, animated = true, title, neutral: neutralProp }) {
3079
3108
  const { theme } = useTheme();
@@ -3105,33 +3134,33 @@ function OrochiaMark({ size = 48, animated = true, title, neutral: neutralProp }
3105
3134
  const viewBox = size < 48 ? OROCHIA.croppedViewBox : OROCHIA.viewBox;
3106
3135
  const layer = { position: "absolute", width: size, height: size };
3107
3136
  const a11y = title ? { accessible: true, accessibilityRole: "image", accessibilityLabel: title } : { accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants" };
3108
- const bodyGradient = /* @__PURE__ */ jsx29(LinearGradient7, { id: "body", gradientUnits: "userSpaceOnUse", x1: OROCHIA.body.x1 + OROCHIA.offset, y1: OROCHIA.body.y1 + OROCHIA.offset, x2: OROCHIA.body.x2 + OROCHIA.offset, y2: OROCHIA.body.y2 + OROCHIA.offset, children: OROCHIA.body.stops.map(([offset, color]) => /* @__PURE__ */ jsx29(Stop7, { offset, stopColor: color }, offset)) });
3109
- return /* @__PURE__ */ jsxs26(View25, { style: { width: size, height: size }, ...a11y, children: [
3110
- /* @__PURE__ */ jsxs26(Svg12, { viewBox, style: layer, children: [
3111
- /* @__PURE__ */ jsx29(Defs7, { children: /* @__PURE__ */ jsxs26(RadialGradient5, { id: "glow", cx: "50%", cy: "50%", r: "50%", children: [
3112
- /* @__PURE__ */ jsx29(Stop7, { offset: "0%", stopColor: OROCHIA.glow.color, stopOpacity: OROCHIA.glow.opacity }),
3113
- /* @__PURE__ */ jsx29(Stop7, { offset: "100%", stopColor: OROCHIA.glow.color, stopOpacity: 0 })
3137
+ const bodyGradient = /* @__PURE__ */ jsx30(LinearGradient7, { id: "body", gradientUnits: "userSpaceOnUse", x1: OROCHIA.body.x1 + OROCHIA.offset, y1: OROCHIA.body.y1 + OROCHIA.offset, x2: OROCHIA.body.x2 + OROCHIA.offset, y2: OROCHIA.body.y2 + OROCHIA.offset, children: OROCHIA.body.stops.map(([offset, color]) => /* @__PURE__ */ jsx30(Stop7, { offset, stopColor: color }, offset)) });
3138
+ return /* @__PURE__ */ jsxs27(View26, { style: { width: size, height: size }, ...a11y, children: [
3139
+ /* @__PURE__ */ jsxs27(Svg12, { viewBox, style: layer, children: [
3140
+ /* @__PURE__ */ jsx30(Defs7, { children: /* @__PURE__ */ jsxs27(RadialGradient5, { id: "glow", cx: "50%", cy: "50%", r: "50%", children: [
3141
+ /* @__PURE__ */ jsx30(Stop7, { offset: "0%", stopColor: OROCHIA.glow.color, stopOpacity: OROCHIA.glow.opacity }),
3142
+ /* @__PURE__ */ jsx30(Stop7, { offset: "100%", stopColor: OROCHIA.glow.color, stopOpacity: 0 })
3114
3143
  ] }) }),
3115
- /* @__PURE__ */ jsx29(Circle6, { cx: CENTER, cy: CENTER, r: 170, fill: "url(#glow)" }),
3116
- /* @__PURE__ */ jsx29(Circle6, { cx: CENTER, cy: CENTER, r: OROCHIA.ring.r, stroke: neutral, strokeWidth: OROCHIA.ring.width, opacity: 0.35, fill: "none" })
3144
+ /* @__PURE__ */ jsx30(Circle6, { cx: CENTER, cy: CENTER, r: 170, fill: "url(#glow)" }),
3145
+ /* @__PURE__ */ jsx30(Circle6, { cx: CENTER, cy: CENTER, r: OROCHIA.ring.r, stroke: neutral, strokeWidth: OROCHIA.ring.width, opacity: 0.35, fill: "none" })
3117
3146
  ] }),
3118
- /* @__PURE__ */ jsx29(Animated10.View, { style: [layer, { transform: [{ rotate: spin.interpolate({ inputRange: [0, 1], outputRange: ["0deg", "360deg"] }) }] }], children: /* @__PURE__ */ jsx29(Svg12, { viewBox, style: layer, children: /* @__PURE__ */ jsx29(Circle6, { cx: CENTER, cy: CENTER, r: OROCHIA.orbit.r, stroke: neutral, strokeWidth: OROCHIA.orbit.width, strokeDasharray: OROCHIA.orbit.dash, opacity: 0.6, fill: "none" }) }) }),
3119
- /* @__PURE__ */ jsxs26(Svg12, { viewBox, style: layer, children: [
3120
- /* @__PURE__ */ jsx29(Defs7, { children: bodyGradient }),
3121
- /* @__PURE__ */ jsxs26(Group2, { transform: `translate(${OROCHIA.offset} ${OROCHIA.offset})`, children: [
3122
- /* @__PURE__ */ jsx29(Path10, { d: OROCHIA.arc, stroke: "url(#body)", strokeWidth: 22, strokeLinecap: "round", fill: "none" }),
3123
- /* @__PURE__ */ jsx29(Path10, { d: OROCHIA.arc, stroke: OROCHIA.scales.color, strokeOpacity: OROCHIA.scales.opacity, strokeWidth: OROCHIA.scales.width, strokeLinecap: "round", strokeDasharray: OROCHIA.scales.dash, fill: "none" }),
3124
- /* @__PURE__ */ jsx29(Path10, { d: OROCHIA.neck, stroke: "url(#body)", strokeWidth: 14, strokeLinecap: "round", fill: "none" }),
3125
- /* @__PURE__ */ jsx29(Path10, { d: OROCHIA.tail, stroke: "url(#body)", strokeWidth: 6, strokeLinecap: "round", fill: "none" }),
3126
- /* @__PURE__ */ jsx29(Ellipse, { cx: OROCHIA.head.cx, cy: OROCHIA.head.cy, rx: OROCHIA.head.rx, ry: OROCHIA.head.ry, rotation: OROCHIA.head.rotate, origin: `${OROCHIA.head.cx}, ${OROCHIA.head.cy}`, fill: "url(#body)" }),
3127
- /* @__PURE__ */ jsx29(Path10, { d: OROCHIA.tongue.d, stroke: OROCHIA.tongue.color, strokeWidth: 3, strokeLinecap: "round", fill: "none" })
3147
+ /* @__PURE__ */ jsx30(Animated10.View, { style: [layer, { transform: [{ rotate: spin.interpolate({ inputRange: [0, 1], outputRange: ["0deg", "360deg"] }) }] }], children: /* @__PURE__ */ jsx30(Svg12, { viewBox, style: layer, children: /* @__PURE__ */ jsx30(Circle6, { cx: CENTER, cy: CENTER, r: OROCHIA.orbit.r, stroke: neutral, strokeWidth: OROCHIA.orbit.width, strokeDasharray: OROCHIA.orbit.dash, opacity: 0.6, fill: "none" }) }) }),
3148
+ /* @__PURE__ */ jsxs27(Svg12, { viewBox, style: layer, children: [
3149
+ /* @__PURE__ */ jsx30(Defs7, { children: bodyGradient }),
3150
+ /* @__PURE__ */ jsxs27(Group2, { transform: `translate(${OROCHIA.offset} ${OROCHIA.offset})`, children: [
3151
+ /* @__PURE__ */ jsx30(Path10, { d: OROCHIA.arc, stroke: "url(#body)", strokeWidth: 22, strokeLinecap: "round", fill: "none" }),
3152
+ /* @__PURE__ */ jsx30(Path10, { d: OROCHIA.arc, stroke: OROCHIA.scales.color, strokeOpacity: OROCHIA.scales.opacity, strokeWidth: OROCHIA.scales.width, strokeLinecap: "round", strokeDasharray: OROCHIA.scales.dash, fill: "none" }),
3153
+ /* @__PURE__ */ jsx30(Path10, { d: OROCHIA.neck, stroke: "url(#body)", strokeWidth: 14, strokeLinecap: "round", fill: "none" }),
3154
+ /* @__PURE__ */ jsx30(Path10, { d: OROCHIA.tail, stroke: "url(#body)", strokeWidth: 6, strokeLinecap: "round", fill: "none" }),
3155
+ /* @__PURE__ */ jsx30(Ellipse, { cx: OROCHIA.head.cx, cy: OROCHIA.head.cy, rx: OROCHIA.head.rx, ry: OROCHIA.head.ry, rotation: OROCHIA.head.rotate, origin: `${OROCHIA.head.cx}, ${OROCHIA.head.cy}`, fill: "url(#body)" }),
3156
+ /* @__PURE__ */ jsx30(Path10, { d: OROCHIA.tongue.d, stroke: OROCHIA.tongue.color, strokeWidth: 3, strokeLinecap: "round", fill: "none" })
3128
3157
  ] })
3129
3158
  ] }),
3130
- /* @__PURE__ */ jsx29(Animated10.View, { style: [layer, { opacity: pulse.interpolate({ inputRange: [0, 1], outputRange: [0.85, 1] }) }], children: /* @__PURE__ */ jsxs26(Svg12, { viewBox, style: layer, children: [
3131
- /* @__PURE__ */ jsx29(Defs7, { children: /* @__PURE__ */ jsx29(LinearGradient7, { id: "flame", x1: "50%", y1: "100%", x2: "50%", y2: "0%", children: OROCHIA.flameGradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx29(Stop7, { offset, stopColor: color }, offset)) }) }),
3132
- /* @__PURE__ */ jsxs26(Group2, { transform: `translate(${OROCHIA.offset} ${OROCHIA.offset})`, children: [
3133
- /* @__PURE__ */ jsx29(Circle6, { cx: OROCHIA.eye.cx, cy: OROCHIA.eye.cy, r: OROCHIA.eye.r, fill: OROCHIA.eye.color }),
3134
- /* @__PURE__ */ jsx29(Path10, { d: OROCHIA.flame.d, transform: `translate(${OROCHIA.flame.translate[0]} ${OROCHIA.flame.translate[1]}) scale(${OROCHIA.flame.scale})`, fill: "url(#flame)" })
3159
+ /* @__PURE__ */ jsx30(Animated10.View, { style: [layer, { opacity: pulse.interpolate({ inputRange: [0, 1], outputRange: [0.85, 1] }) }], children: /* @__PURE__ */ jsxs27(Svg12, { viewBox, style: layer, children: [
3160
+ /* @__PURE__ */ jsx30(Defs7, { children: /* @__PURE__ */ jsx30(LinearGradient7, { id: "flame", x1: "50%", y1: "100%", x2: "50%", y2: "0%", children: OROCHIA.flameGradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx30(Stop7, { offset, stopColor: color }, offset)) }) }),
3161
+ /* @__PURE__ */ jsxs27(Group2, { transform: `translate(${OROCHIA.offset} ${OROCHIA.offset})`, children: [
3162
+ /* @__PURE__ */ jsx30(Circle6, { cx: OROCHIA.eye.cx, cy: OROCHIA.eye.cy, r: OROCHIA.eye.r, fill: OROCHIA.eye.color }),
3163
+ /* @__PURE__ */ jsx30(Path10, { d: OROCHIA.flame.d, transform: `translate(${OROCHIA.flame.translate[0]} ${OROCHIA.flame.translate[1]}) scale(${OROCHIA.flame.scale})`, fill: "url(#flame)" })
3135
3164
  ] })
3136
3165
  ] }) })
3137
3166
  ] });
@@ -3139,7 +3168,7 @@ function OrochiaMark({ size = 48, animated = true, title, neutral: neutralProp }
3139
3168
 
3140
3169
  // src/native/YasakiaMark.tsx
3141
3170
  import React21 from "react";
3142
- import { View as View26 } from "react-native";
3171
+ import { View as View27 } from "react-native";
3143
3172
  import Svg13, { Circle as Circle7, Defs as Defs8, LinearGradient as LinearGradient8, Path as Path11, RadialGradient as RadialGradient6, Stop as Stop8 } from "react-native-svg";
3144
3173
 
3145
3174
  // src/marks/yasakia-geometry.ts
@@ -3170,54 +3199,54 @@ var YASAKIA = {
3170
3199
  };
3171
3200
 
3172
3201
  // src/native/YasakiaMark.tsx
3173
- import { jsx as jsx30, jsxs as jsxs27 } from "react/jsx-runtime";
3202
+ import { jsx as jsx31, jsxs as jsxs28 } from "react/jsx-runtime";
3174
3203
  function YasakiaMark({ size = 48, animated = true, title, neutral }) {
3175
3204
  const { theme } = useTheme();
3176
3205
  const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated);
3177
3206
  const id = useSvgId("yzm");
3178
3207
  const viewBox = size < 48 ? YASAKIA.croppedViewBox : YASAKIA.viewBox;
3179
3208
  const stroke = neutral ?? theme.textMuted;
3180
- const gradient = /* @__PURE__ */ jsx30(LinearGradient8, { id: `${id}a`, gradientUnits: "userSpaceOnUse", x1: YASAKIA.gradient.x1, y1: YASAKIA.gradient.y1, x2: YASAKIA.gradient.x2, y2: YASAKIA.gradient.y2, children: YASAKIA.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx30(Stop8, { offset, stopColor: color }, offset)) });
3209
+ const gradient = /* @__PURE__ */ jsx31(LinearGradient8, { id: `${id}a`, gradientUnits: "userSpaceOnUse", x1: YASAKIA.gradient.x1, y1: YASAKIA.gradient.y1, x2: YASAKIA.gradient.x2, y2: YASAKIA.gradient.y2, children: YASAKIA.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx31(Stop8, { offset, stopColor: color }, offset)) });
3181
3210
  const fill = `url(#${id}a)`;
3182
- return /* @__PURE__ */ jsxs27(View26, { style: { width: size, height: size }, ...markA11y(title), children: [
3183
- /* @__PURE__ */ jsxs27(Svg13, { viewBox, style: layer, children: [
3184
- /* @__PURE__ */ jsxs27(Defs8, { children: [
3185
- /* @__PURE__ */ jsxs27(RadialGradient6, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
3186
- /* @__PURE__ */ jsx30(Stop8, { offset: "0%", stopColor: YASAKIA.glow.color, stopOpacity: YASAKIA.glow.opacity }),
3187
- /* @__PURE__ */ jsx30(Stop8, { offset: "100%", stopColor: YASAKIA.glow.color, stopOpacity: 0 })
3211
+ return /* @__PURE__ */ jsxs28(View27, { style: { width: size, height: size }, ...markA11y(title), children: [
3212
+ /* @__PURE__ */ jsxs28(Svg13, { viewBox, style: layer, children: [
3213
+ /* @__PURE__ */ jsxs28(Defs8, { children: [
3214
+ /* @__PURE__ */ jsxs28(RadialGradient6, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
3215
+ /* @__PURE__ */ jsx31(Stop8, { offset: "0%", stopColor: YASAKIA.glow.color, stopOpacity: YASAKIA.glow.opacity }),
3216
+ /* @__PURE__ */ jsx31(Stop8, { offset: "100%", stopColor: YASAKIA.glow.color, stopOpacity: 0 })
3188
3217
  ] }),
3189
3218
  gradient
3190
3219
  ] }),
3191
- size >= 48 ? /* @__PURE__ */ jsx30(Circle7, { cx: YASAKIA.center, cy: YASAKIA.center, r: 190, fill: `url(#${id}g)` }) : null,
3192
- /* @__PURE__ */ jsx30(Circle7, { cx: YASAKIA.center, cy: YASAKIA.center, r: YASAKIA.ring.r, stroke, strokeWidth: YASAKIA.ring.width, opacity: 0.35, fill: "none" }),
3193
- YASAKIA.voices.map((v, i) => /* @__PURE__ */ jsxs27(React21.Fragment, { children: [
3194
- /* @__PURE__ */ jsx30(Path11, { d: v.body, fill }),
3195
- /* @__PURE__ */ jsx30(Path11, { d: v.tail, fill }),
3196
- i === 0 ? /* @__PURE__ */ jsx30(Path11, { d: `${v.body} ${v.tail}`, fill: YASAKIA.shade.color, opacity: YASAKIA.shade.opacity }) : null
3220
+ size >= 48 ? /* @__PURE__ */ jsx31(Circle7, { cx: YASAKIA.center, cy: YASAKIA.center, r: 190, fill: `url(#${id}g)` }) : null,
3221
+ /* @__PURE__ */ jsx31(Circle7, { cx: YASAKIA.center, cy: YASAKIA.center, r: YASAKIA.ring.r, stroke, strokeWidth: YASAKIA.ring.width, opacity: 0.35, fill: "none" }),
3222
+ YASAKIA.voices.map((v, i) => /* @__PURE__ */ jsxs28(React21.Fragment, { children: [
3223
+ /* @__PURE__ */ jsx31(Path11, { d: v.body, fill }),
3224
+ /* @__PURE__ */ jsx31(Path11, { d: v.tail, fill }),
3225
+ i === 0 ? /* @__PURE__ */ jsx31(Path11, { d: `${v.body} ${v.tail}`, fill: YASAKIA.shade.color, opacity: YASAKIA.shade.opacity }) : null
3197
3226
  ] }, v.body))
3198
3227
  ] }),
3199
- /* @__PURE__ */ jsx30(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs27(Svg13, { viewBox, style: layer, children: [
3200
- /* @__PURE__ */ jsx30(Defs8, { children: gradient }),
3201
- /* @__PURE__ */ jsx30(Circle7, { cx: YASAKIA.center, cy: YASAKIA.center, r: YASAKIA.orbit.r, stroke, strokeWidth: YASAKIA.orbit.width, strokeDasharray: YASAKIA.orbit.dash, opacity: 0.6, fill: "none" }),
3202
- YASAKIA.pair.at.map(([cx, cy]) => /* @__PURE__ */ jsx30(Circle7, { cx, cy, r: YASAKIA.pair.r, fill }, cx))
3228
+ /* @__PURE__ */ jsx31(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs28(Svg13, { viewBox, style: layer, children: [
3229
+ /* @__PURE__ */ jsx31(Defs8, { children: gradient }),
3230
+ /* @__PURE__ */ jsx31(Circle7, { cx: YASAKIA.center, cy: YASAKIA.center, r: YASAKIA.orbit.r, stroke, strokeWidth: YASAKIA.orbit.width, strokeDasharray: YASAKIA.orbit.dash, opacity: 0.6, fill: "none" }),
3231
+ YASAKIA.pair.at.map(([cx, cy]) => /* @__PURE__ */ jsx31(Circle7, { cx, cy, r: YASAKIA.pair.r, fill }, cx))
3203
3232
  ] }) }),
3204
- /* @__PURE__ */ jsx30(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs27(Svg13, { viewBox, style: layer, children: [
3205
- /* @__PURE__ */ jsxs27(Defs8, { children: [
3233
+ /* @__PURE__ */ jsx31(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs28(Svg13, { viewBox, style: layer, children: [
3234
+ /* @__PURE__ */ jsxs28(Defs8, { children: [
3206
3235
  gradient,
3207
- /* @__PURE__ */ jsxs27(LinearGradient8, { id: `${id}l`, gradientUnits: "userSpaceOnUse", x1: 0, y1: YASAKIA.lens.y1, x2: 0, y2: YASAKIA.lens.y2, children: [
3208
- /* @__PURE__ */ jsx30(Stop8, { offset: "0%", stopColor: YASAKIA.highlight.color, stopOpacity: YASAKIA.highlight.from }),
3209
- /* @__PURE__ */ jsx30(Stop8, { offset: "100%", stopColor: YASAKIA.highlight.color, stopOpacity: YASAKIA.highlight.to })
3236
+ /* @__PURE__ */ jsxs28(LinearGradient8, { id: `${id}l`, gradientUnits: "userSpaceOnUse", x1: 0, y1: YASAKIA.lens.y1, x2: 0, y2: YASAKIA.lens.y2, children: [
3237
+ /* @__PURE__ */ jsx31(Stop8, { offset: "0%", stopColor: YASAKIA.highlight.color, stopOpacity: YASAKIA.highlight.from }),
3238
+ /* @__PURE__ */ jsx31(Stop8, { offset: "100%", stopColor: YASAKIA.highlight.color, stopOpacity: YASAKIA.highlight.to })
3210
3239
  ] })
3211
3240
  ] }),
3212
- /* @__PURE__ */ jsx30(Path11, { d: YASAKIA.lens.d, fill }),
3213
- /* @__PURE__ */ jsx30(Path11, { d: YASAKIA.lens.d, fill: `url(#${id}l)` })
3241
+ /* @__PURE__ */ jsx31(Path11, { d: YASAKIA.lens.d, fill }),
3242
+ /* @__PURE__ */ jsx31(Path11, { d: YASAKIA.lens.d, fill: `url(#${id}l)` })
3214
3243
  ] }) })
3215
3244
  ] });
3216
3245
  }
3217
3246
  var YazakiaMark = YasakiaMark;
3218
3247
 
3219
3248
  // src/native/YomizakaMark.tsx
3220
- import { View as View27 } from "react-native";
3249
+ import { View as View28 } from "react-native";
3221
3250
  import Svg14, { Circle as Circle8, Defs as Defs9, LinearGradient as LinearGradient9, Path as Path12, RadialGradient as RadialGradient7, Stop as Stop9 } from "react-native-svg";
3222
3251
 
3223
3252
  // src/marks/yomizaka-geometry.ts
@@ -3251,48 +3280,48 @@ var YOMIZAKA = {
3251
3280
  };
3252
3281
 
3253
3282
  // src/native/YomizakaMark.tsx
3254
- import { jsx as jsx31, jsxs as jsxs28 } from "react/jsx-runtime";
3283
+ import { jsx as jsx32, jsxs as jsxs29 } from "react/jsx-runtime";
3255
3284
  function YomizakaMark({ size = 48, animated = true, title, neutral }) {
3256
3285
  const { theme } = useTheme();
3257
3286
  const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, 32e3);
3258
3287
  const id = useSvgId("ymm");
3259
3288
  const viewBox = size < 48 ? YOMIZAKA.croppedViewBox : YOMIZAKA.viewBox;
3260
3289
  const stroke = neutral ?? theme.textMuted;
3261
- const gradient = /* @__PURE__ */ jsx31(LinearGradient9, { id: `${id}a`, gradientUnits: "userSpaceOnUse", x1: YOMIZAKA.gradient.x1, y1: YOMIZAKA.gradient.y1, x2: YOMIZAKA.gradient.x2, y2: YOMIZAKA.gradient.y2, children: YOMIZAKA.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx31(Stop9, { offset, stopColor: color }, offset)) });
3290
+ const gradient = /* @__PURE__ */ jsx32(LinearGradient9, { id: `${id}a`, gradientUnits: "userSpaceOnUse", x1: YOMIZAKA.gradient.x1, y1: YOMIZAKA.gradient.y1, x2: YOMIZAKA.gradient.x2, y2: YOMIZAKA.gradient.y2, children: YOMIZAKA.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx32(Stop9, { offset, stopColor: color }, offset)) });
3262
3291
  const fill = `url(#${id}a)`;
3263
- return /* @__PURE__ */ jsxs28(View27, { style: { width: size, height: size }, ...markA11y(title), children: [
3264
- /* @__PURE__ */ jsxs28(Svg14, { viewBox, style: layer, children: [
3265
- /* @__PURE__ */ jsxs28(Defs9, { children: [
3266
- /* @__PURE__ */ jsxs28(RadialGradient7, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
3267
- /* @__PURE__ */ jsx31(Stop9, { offset: "0%", stopColor: YOMIZAKA.glow.color, stopOpacity: YOMIZAKA.glow.opacity }),
3268
- /* @__PURE__ */ jsx31(Stop9, { offset: "100%", stopColor: YOMIZAKA.glow.color, stopOpacity: 0 })
3292
+ return /* @__PURE__ */ jsxs29(View28, { style: { width: size, height: size }, ...markA11y(title), children: [
3293
+ /* @__PURE__ */ jsxs29(Svg14, { viewBox, style: layer, children: [
3294
+ /* @__PURE__ */ jsxs29(Defs9, { children: [
3295
+ /* @__PURE__ */ jsxs29(RadialGradient7, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
3296
+ /* @__PURE__ */ jsx32(Stop9, { offset: "0%", stopColor: YOMIZAKA.glow.color, stopOpacity: YOMIZAKA.glow.opacity }),
3297
+ /* @__PURE__ */ jsx32(Stop9, { offset: "100%", stopColor: YOMIZAKA.glow.color, stopOpacity: 0 })
3269
3298
  ] }),
3270
3299
  gradient
3271
3300
  ] }),
3272
- size >= 48 ? /* @__PURE__ */ jsx31(Circle8, { cx: YOMIZAKA.center, cy: YOMIZAKA.center, r: 190, fill: `url(#${id}g)` }) : null,
3273
- /* @__PURE__ */ jsx31(Circle8, { cx: YOMIZAKA.center, cy: YOMIZAKA.center, r: YOMIZAKA.ring.r, stroke, strokeWidth: YOMIZAKA.ring.width, opacity: 0.35, fill: "none" }),
3274
- /* @__PURE__ */ jsx31(Path12, { d: YOMIZAKA.page, fill }),
3275
- /* @__PURE__ */ jsx31(Path12, { d: YOMIZAKA.lines, stroke: YOMIZAKA.line.color, strokeOpacity: YOMIZAKA.line.opacity, strokeWidth: YOMIZAKA.line.width, strokeLinecap: "round", fill: "none" }),
3276
- /* @__PURE__ */ jsx31(Path12, { d: YOMIZAKA.handle, stroke: fill, strokeWidth: YOMIZAKA.handleWidth, strokeLinecap: "round", fill: "none" })
3301
+ size >= 48 ? /* @__PURE__ */ jsx32(Circle8, { cx: YOMIZAKA.center, cy: YOMIZAKA.center, r: 190, fill: `url(#${id}g)` }) : null,
3302
+ /* @__PURE__ */ jsx32(Circle8, { cx: YOMIZAKA.center, cy: YOMIZAKA.center, r: YOMIZAKA.ring.r, stroke, strokeWidth: YOMIZAKA.ring.width, opacity: 0.35, fill: "none" }),
3303
+ /* @__PURE__ */ jsx32(Path12, { d: YOMIZAKA.page, fill }),
3304
+ /* @__PURE__ */ jsx32(Path12, { d: YOMIZAKA.lines, stroke: YOMIZAKA.line.color, strokeOpacity: YOMIZAKA.line.opacity, strokeWidth: YOMIZAKA.line.width, strokeLinecap: "round", fill: "none" }),
3305
+ /* @__PURE__ */ jsx32(Path12, { d: YOMIZAKA.handle, stroke: fill, strokeWidth: YOMIZAKA.handleWidth, strokeLinecap: "round", fill: "none" })
3277
3306
  ] }),
3278
- /* @__PURE__ */ jsx31(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs28(Svg14, { viewBox, style: layer, children: [
3279
- /* @__PURE__ */ jsx31(Defs9, { children: gradient }),
3280
- /* @__PURE__ */ jsx31(Circle8, { cx: YOMIZAKA.center, cy: YOMIZAKA.center, r: YOMIZAKA.orbit.r, stroke, strokeWidth: YOMIZAKA.orbit.width, strokeDasharray: YOMIZAKA.orbit.dash, opacity: 0.6, fill: "none" }),
3281
- /* @__PURE__ */ jsx31(Circle8, { cx: YOMIZAKA.node.at[0], cy: YOMIZAKA.node.at[1], r: YOMIZAKA.node.r, fill })
3307
+ /* @__PURE__ */ jsx32(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs29(Svg14, { viewBox, style: layer, children: [
3308
+ /* @__PURE__ */ jsx32(Defs9, { children: gradient }),
3309
+ /* @__PURE__ */ jsx32(Circle8, { cx: YOMIZAKA.center, cy: YOMIZAKA.center, r: YOMIZAKA.orbit.r, stroke, strokeWidth: YOMIZAKA.orbit.width, strokeDasharray: YOMIZAKA.orbit.dash, opacity: 0.6, fill: "none" }),
3310
+ /* @__PURE__ */ jsx32(Circle8, { cx: YOMIZAKA.node.at[0], cy: YOMIZAKA.node.at[1], r: YOMIZAKA.node.r, fill })
3282
3311
  ] }) }),
3283
- /* @__PURE__ */ jsx31(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs28(Svg14, { viewBox, style: layer, children: [
3284
- /* @__PURE__ */ jsxs28(Defs9, { children: [
3312
+ /* @__PURE__ */ jsx32(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs29(Svg14, { viewBox, style: layer, children: [
3313
+ /* @__PURE__ */ jsxs29(Defs9, { children: [
3285
3314
  gradient,
3286
- /* @__PURE__ */ jsx31(LinearGradient9, { id: `${id}c`, x1: "50%", y1: "100%", x2: "50%", y2: "0%", children: YOMIZAKA.coreGradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx31(Stop9, { offset, stopColor: color }, offset)) })
3315
+ /* @__PURE__ */ jsx32(LinearGradient9, { id: `${id}c`, x1: "50%", y1: "100%", x2: "50%", y2: "0%", children: YOMIZAKA.coreGradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx32(Stop9, { offset, stopColor: color }, offset)) })
3287
3316
  ] }),
3288
- /* @__PURE__ */ jsx31(Circle8, { cx: YOMIZAKA.lens.cx, cy: YOMIZAKA.lens.cy, r: YOMIZAKA.lens.r, stroke: fill, strokeWidth: YOMIZAKA.lens.width, fill: `url(#${id}c)` }),
3289
- /* @__PURE__ */ jsx31(Circle8, { cx: YOMIZAKA.lens.glint.cx, cy: YOMIZAKA.lens.glint.cy, r: YOMIZAKA.lens.glint.r, fill: YOMIZAKA.highlight })
3317
+ /* @__PURE__ */ jsx32(Circle8, { cx: YOMIZAKA.lens.cx, cy: YOMIZAKA.lens.cy, r: YOMIZAKA.lens.r, stroke: fill, strokeWidth: YOMIZAKA.lens.width, fill: `url(#${id}c)` }),
3318
+ /* @__PURE__ */ jsx32(Circle8, { cx: YOMIZAKA.lens.glint.cx, cy: YOMIZAKA.lens.glint.cy, r: YOMIZAKA.lens.glint.r, fill: YOMIZAKA.highlight })
3290
3319
  ] }) })
3291
3320
  ] });
3292
3321
  }
3293
3322
 
3294
3323
  // src/native/YororisMark.tsx
3295
- import { View as View28 } from "react-native";
3324
+ import { View as View29 } from "react-native";
3296
3325
  import Svg15, { Circle as Circle9, Defs as Defs10, LinearGradient as LinearGradient10, Path as Path13, RadialGradient as RadialGradient8, Stop as Stop10 } from "react-native-svg";
3297
3326
 
3298
3327
  // src/marks/yororis-geometry.ts
@@ -3329,58 +3358,58 @@ var YORORIS = {
3329
3358
  };
3330
3359
 
3331
3360
  // src/native/YororisMark.tsx
3332
- import { jsx as jsx32, jsxs as jsxs29 } from "react/jsx-runtime";
3361
+ import { jsx as jsx33, jsxs as jsxs30 } from "react/jsx-runtime";
3333
3362
  function YororisMark({ size = 48, animated = true, title, neutral }) {
3334
3363
  const { theme } = useTheme();
3335
3364
  const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, 36e3);
3336
3365
  const id = useSvgId("yrm");
3337
3366
  const viewBox = size < 48 ? YORORIS.croppedViewBox : YORORIS.viewBox;
3338
3367
  const stroke = neutral ?? theme.textMuted;
3339
- const gradient = /* @__PURE__ */ jsx32(LinearGradient10, { id: `${id}a`, gradientUnits: "userSpaceOnUse", x1: YORORIS.gradient.x1, y1: YORORIS.gradient.y1, x2: YORORIS.gradient.x2, y2: YORORIS.gradient.y2, children: YORORIS.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx32(Stop10, { offset, stopColor: color }, offset)) });
3368
+ const gradient = /* @__PURE__ */ jsx33(LinearGradient10, { id: `${id}a`, gradientUnits: "userSpaceOnUse", x1: YORORIS.gradient.x1, y1: YORORIS.gradient.y1, x2: YORORIS.gradient.x2, y2: YORORIS.gradient.y2, children: YORORIS.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx33(Stop10, { offset, stopColor: color }, offset)) });
3340
3369
  const fill = `url(#${id}a)`;
3341
- return /* @__PURE__ */ jsxs29(View28, { style: { width: size, height: size }, ...markA11y(title), children: [
3342
- /* @__PURE__ */ jsxs29(Svg15, { viewBox, style: layer, children: [
3343
- /* @__PURE__ */ jsxs29(Defs10, { children: [
3344
- /* @__PURE__ */ jsxs29(RadialGradient8, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
3345
- /* @__PURE__ */ jsx32(Stop10, { offset: "0%", stopColor: YORORIS.glow.color, stopOpacity: YORORIS.glow.opacity }),
3346
- /* @__PURE__ */ jsx32(Stop10, { offset: "100%", stopColor: YORORIS.glow.color, stopOpacity: 0 })
3370
+ return /* @__PURE__ */ jsxs30(View29, { style: { width: size, height: size }, ...markA11y(title), children: [
3371
+ /* @__PURE__ */ jsxs30(Svg15, { viewBox, style: layer, children: [
3372
+ /* @__PURE__ */ jsxs30(Defs10, { children: [
3373
+ /* @__PURE__ */ jsxs30(RadialGradient8, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
3374
+ /* @__PURE__ */ jsx33(Stop10, { offset: "0%", stopColor: YORORIS.glow.color, stopOpacity: YORORIS.glow.opacity }),
3375
+ /* @__PURE__ */ jsx33(Stop10, { offset: "100%", stopColor: YORORIS.glow.color, stopOpacity: 0 })
3347
3376
  ] }),
3348
3377
  gradient
3349
3378
  ] }),
3350
- size >= 48 ? /* @__PURE__ */ jsx32(Circle9, { cx: YORORIS.center, cy: YORORIS.center, r: 190, fill: `url(#${id}g)` }) : null,
3351
- /* @__PURE__ */ jsx32(Circle9, { cx: YORORIS.center, cy: YORORIS.center, r: YORORIS.ring.r, stroke, strokeWidth: YORORIS.ring.width, opacity: 0.35, fill: "none" }),
3352
- /* @__PURE__ */ jsx32(Path13, { d: YORORIS.stem, stroke: fill, strokeWidth: YORORIS.stroke, strokeLinecap: "round", fill: "none" }),
3353
- YORORIS.leaves.map((d) => /* @__PURE__ */ jsx32(Path13, { d, fill }, d)),
3354
- /* @__PURE__ */ jsx32(Path13, { d: YORORIS.veins, stroke: YORORIS.vein.color, strokeOpacity: YORORIS.vein.opacity, strokeWidth: YORORIS.vein.width, strokeLinecap: "round", strokeDasharray: YORORIS.vein.dash, fill: "none" })
3379
+ size >= 48 ? /* @__PURE__ */ jsx33(Circle9, { cx: YORORIS.center, cy: YORORIS.center, r: 190, fill: `url(#${id}g)` }) : null,
3380
+ /* @__PURE__ */ jsx33(Circle9, { cx: YORORIS.center, cy: YORORIS.center, r: YORORIS.ring.r, stroke, strokeWidth: YORORIS.ring.width, opacity: 0.35, fill: "none" }),
3381
+ /* @__PURE__ */ jsx33(Path13, { d: YORORIS.stem, stroke: fill, strokeWidth: YORORIS.stroke, strokeLinecap: "round", fill: "none" }),
3382
+ YORORIS.leaves.map((d) => /* @__PURE__ */ jsx33(Path13, { d, fill }, d)),
3383
+ /* @__PURE__ */ jsx33(Path13, { d: YORORIS.veins, stroke: YORORIS.vein.color, strokeOpacity: YORORIS.vein.opacity, strokeWidth: YORORIS.vein.width, strokeLinecap: "round", strokeDasharray: YORORIS.vein.dash, fill: "none" })
3355
3384
  ] }),
3356
- /* @__PURE__ */ jsx32(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs29(Svg15, { viewBox, style: layer, children: [
3357
- /* @__PURE__ */ jsx32(Defs10, { children: gradient }),
3358
- /* @__PURE__ */ jsx32(Circle9, { cx: YORORIS.center, cy: YORORIS.center, r: YORORIS.orbit.r, stroke, strokeWidth: YORORIS.orbit.width, strokeDasharray: YORORIS.orbit.dash, opacity: 0.6, fill: "none" }),
3359
- /* @__PURE__ */ jsx32(Circle9, { cx: YORORIS.moment.at[0], cy: YORORIS.moment.at[1], r: YORORIS.moment.r, fill })
3385
+ /* @__PURE__ */ jsx33(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs30(Svg15, { viewBox, style: layer, children: [
3386
+ /* @__PURE__ */ jsx33(Defs10, { children: gradient }),
3387
+ /* @__PURE__ */ jsx33(Circle9, { cx: YORORIS.center, cy: YORORIS.center, r: YORORIS.orbit.r, stroke, strokeWidth: YORORIS.orbit.width, strokeDasharray: YORORIS.orbit.dash, opacity: 0.6, fill: "none" }),
3388
+ /* @__PURE__ */ jsx33(Circle9, { cx: YORORIS.moment.at[0], cy: YORORIS.moment.at[1], r: YORORIS.moment.r, fill })
3360
3389
  ] }) }),
3361
- /* @__PURE__ */ jsx32(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs29(Svg15, { viewBox, style: layer, children: [
3362
- /* @__PURE__ */ jsx32(Defs10, { children: /* @__PURE__ */ jsx32(LinearGradient10, { id: `${id}c`, x1: "50%", y1: "100%", x2: "50%", y2: "0%", children: YORORIS.coreGradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx32(Stop10, { offset, stopColor: color }, offset)) }) }),
3363
- /* @__PURE__ */ jsx32(Circle9, { cx: YORORIS.core.cx, cy: YORORIS.core.cy, r: YORORIS.core.r, fill: `url(#${id}c)` }),
3364
- /* @__PURE__ */ jsx32(Circle9, { cx: YORORIS.core.cx, cy: YORORIS.core.cy, r: YORORIS.core.inner, fill: YORORIS.highlight })
3390
+ /* @__PURE__ */ jsx33(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs30(Svg15, { viewBox, style: layer, children: [
3391
+ /* @__PURE__ */ jsx33(Defs10, { children: /* @__PURE__ */ jsx33(LinearGradient10, { id: `${id}c`, x1: "50%", y1: "100%", x2: "50%", y2: "0%", children: YORORIS.coreGradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx33(Stop10, { offset, stopColor: color }, offset)) }) }),
3392
+ /* @__PURE__ */ jsx33(Circle9, { cx: YORORIS.core.cx, cy: YORORIS.core.cy, r: YORORIS.core.r, fill: `url(#${id}c)` }),
3393
+ /* @__PURE__ */ jsx33(Circle9, { cx: YORORIS.core.cx, cy: YORORIS.core.cy, r: YORORIS.core.inner, fill: YORORIS.highlight })
3365
3394
  ] }) })
3366
3395
  ] });
3367
3396
  }
3368
3397
 
3369
3398
  // src/native/ProductMark.tsx
3370
- import { jsx as jsx33 } from "react/jsx-runtime";
3399
+ import { jsx as jsx34 } from "react/jsx-runtime";
3371
3400
  function ProductMark({ id, ...props }) {
3372
- if (id === "krizaka") return /* @__PURE__ */ jsx33(KrizakaMark, { ...props });
3373
- if (id === "orazaka") return /* @__PURE__ */ jsx33(OrazakaMark, { ...props });
3374
- if (id === "yasakia" || id === "yazakia") return /* @__PURE__ */ jsx33(YasakiaMark, { ...props });
3375
- if (id === "yororis") return /* @__PURE__ */ jsx33(YororisMark, { ...props });
3376
- if (id === "yomizaka") return /* @__PURE__ */ jsx33(YomizakaMark, { ...props });
3377
- if (id === "kachizaka") return /* @__PURE__ */ jsx33(KachizakaMark, { ...props });
3378
- if (id === "akinaza") return /* @__PURE__ */ jsx33(AkinazaMark, { ...props });
3379
- return /* @__PURE__ */ jsx33(OrochiaMark, { ...props });
3401
+ if (id === "krizaka") return /* @__PURE__ */ jsx34(KrizakaMark, { ...props });
3402
+ if (id === "orazaka") return /* @__PURE__ */ jsx34(OrazakaMark, { ...props });
3403
+ if (id === "yasakia" || id === "yazakia") return /* @__PURE__ */ jsx34(YasakiaMark, { ...props });
3404
+ if (id === "yororis") return /* @__PURE__ */ jsx34(YororisMark, { ...props });
3405
+ if (id === "yomizaka") return /* @__PURE__ */ jsx34(YomizakaMark, { ...props });
3406
+ if (id === "kachizaka") return /* @__PURE__ */ jsx34(KachizakaMark, { ...props });
3407
+ if (id === "akinaza") return /* @__PURE__ */ jsx34(AkinazaMark, { ...props });
3408
+ return /* @__PURE__ */ jsx34(OrochiaMark, { ...props });
3380
3409
  }
3381
3410
 
3382
3411
  // src/native/loader.tsx
3383
- import { jsx as jsx34, jsxs as jsxs30 } from "react/jsx-runtime";
3412
+ import { jsx as jsx35, jsxs as jsxs31 } from "react/jsx-runtime";
3384
3413
  var HEX = "M12 3 19.79 7.5 19.79 16.5 12 21 4.21 16.5 4.21 7.5Z";
3385
3414
  var PERIMETER = 54;
3386
3415
  function LoaderGlyph({ state = "loading", value, size = 20, color }) {
@@ -3397,12 +3426,12 @@ function LoaderGlyph({ state = "loading", value, size = 20, color }) {
3397
3426
  const stroke = color ?? (state === "success" ? theme.success : state === "error" ? theme.danger : theme.accent);
3398
3427
  const fill = state !== "loading" ? 1 : known ? Math.min(1, Math.max(0, value)) : 0.3;
3399
3428
  const rotate = spin.interpolate({ inputRange: [0, 1], outputRange: ["0deg", "360deg"] });
3400
- return /* @__PURE__ */ jsx34(Animated11.View, { "aria-hidden": true, style: { width: size, height: size, transform: state === "loading" && !known ? [{ rotate }] : [] }, children: /* @__PURE__ */ jsxs30(Svg16, { width: size, height: size, viewBox: "0 0 24 24", fill: "none", children: [
3401
- /* @__PURE__ */ jsx34(Path14, { d: HEX, stroke, strokeOpacity: 0.22, strokeWidth: 2.2, strokeLinejoin: "round" }),
3402
- /* @__PURE__ */ jsx34(Path14, { d: HEX, stroke, strokeWidth: 2.2, strokeLinejoin: "round", strokeLinecap: "round", strokeDasharray: `${fill * PERIMETER} ${PERIMETER}` }),
3403
- state === "loading" ? /* @__PURE__ */ jsx34(Circle10, { cx: 12, cy: 12, r: 2.6, fill: stroke }) : null,
3404
- state === "success" ? /* @__PURE__ */ jsx34(Path14, { d: "M8.3 12.3l2.6 2.6 4.9-5.3", stroke, strokeWidth: 2.2, strokeLinecap: "round", strokeLinejoin: "round" }) : null,
3405
- state === "error" ? /* @__PURE__ */ jsx34(Path14, { d: "M9.4 9.4l5.2 5.2M14.6 9.4l-5.2 5.2", stroke, strokeWidth: 2.2, strokeLinecap: "round" }) : null
3429
+ return /* @__PURE__ */ jsx35(Animated11.View, { "aria-hidden": true, style: { width: size, height: size, transform: state === "loading" && !known ? [{ rotate }] : [] }, children: /* @__PURE__ */ jsxs31(Svg16, { width: size, height: size, viewBox: "0 0 24 24", fill: "none", children: [
3430
+ /* @__PURE__ */ jsx35(Path14, { d: HEX, stroke, strokeOpacity: 0.22, strokeWidth: 2.2, strokeLinejoin: "round" }),
3431
+ /* @__PURE__ */ jsx35(Path14, { d: HEX, stroke, strokeWidth: 2.2, strokeLinejoin: "round", strokeLinecap: "round", strokeDasharray: `${fill * PERIMETER} ${PERIMETER}` }),
3432
+ state === "loading" ? /* @__PURE__ */ jsx35(Circle10, { cx: 12, cy: 12, r: 2.6, fill: stroke }) : null,
3433
+ state === "success" ? /* @__PURE__ */ jsx35(Path14, { d: "M8.3 12.3l2.6 2.6 4.9-5.3", stroke, strokeWidth: 2.2, strokeLinecap: "round", strokeLinejoin: "round" }) : null,
3434
+ state === "error" ? /* @__PURE__ */ jsx35(Path14, { d: "M9.4 9.4l5.2 5.2M14.6 9.4l-5.2 5.2", stroke, strokeWidth: 2.2, strokeLinecap: "round" }) : null
3406
3435
  ] }) });
3407
3436
  }
3408
3437
  function useDelayedWait(active, delay = 250, minDuration = 600) {
@@ -3454,22 +3483,22 @@ function Loader({ label, status = "loading", successLabel, errorLabel, value, et
3454
3483
  const known = phase === "loading" && typeof value === "number" && Number.isFinite(value);
3455
3484
  const detail = phase === "loading" ? [known ? `${Math.round(Math.min(1, Math.max(0, value)) * 100)} %` : null, eta].filter(Boolean).join(" \xB7 ") : "";
3456
3485
  const stacked = variant !== "inline";
3457
- const box = /* @__PURE__ */ jsxs30(View29, { style: [stacked ? styles24.stacked : styles24.inline, variant === "overlay" ? { backgroundColor: alpha(theme.surface1, 0.92), borderColor: theme.borderDefault, borderRadius: radius3.lg, ...styles24.card } : null], children: [
3458
- product && phase === "loading" ? /* @__PURE__ */ jsx34(ProductMark, { id: product, size: GLYPH[variant], animated: true }) : /* @__PURE__ */ jsx34(LoaderGlyph, { state: phase, value: known ? value : null, size: GLYPH[variant] }),
3459
- /* @__PURE__ */ jsxs30(View29, { style: stacked ? styles24.center : styles24.text, children: [
3460
- /* @__PURE__ */ jsx34(Txt, { variant: variant === "page" ? "title" : "label", style: stacked ? styles24.centered : null, children: words2 }),
3461
- detail ? /* @__PURE__ */ jsx34(Txt, { variant: "caption", tone: "secondary", style: stacked ? styles24.centered : null, children: detail }) : null
3486
+ const box = /* @__PURE__ */ jsxs31(View30, { style: [stacked ? styles25.stacked : styles25.inline, variant === "overlay" ? { backgroundColor: alpha(theme.surface1, 0.92), borderColor: theme.borderDefault, borderRadius: radius3.lg, ...styles25.card } : null], children: [
3487
+ product && phase === "loading" ? /* @__PURE__ */ jsx35(ProductMark, { id: product, size: GLYPH[variant], animated: true }) : /* @__PURE__ */ jsx35(LoaderGlyph, { state: phase, value: known ? value : null, size: GLYPH[variant] }),
3488
+ /* @__PURE__ */ jsxs31(View30, { style: stacked ? styles25.center : styles25.text, children: [
3489
+ /* @__PURE__ */ jsx35(Txt, { variant: variant === "page" ? "title" : "label", style: stacked ? styles25.centered : null, children: words2 }),
3490
+ detail ? /* @__PURE__ */ jsx35(Txt, { variant: "caption", tone: "secondary", style: stacked ? styles25.centered : null, children: detail }) : null
3462
3491
  ] })
3463
3492
  ] });
3464
3493
  const a11y = { accessible: true, role: "progressbar", "aria-label": words2, "aria-busy": phase === "loading", accessibilityLiveRegion: "polite" };
3465
3494
  if (variant === "overlay" || variant === "page")
3466
- return /* @__PURE__ */ jsx34(View29, { ...a11y, style: [StyleSheet24.absoluteFill, styles24.cover, variant === "page" ? { backgroundColor: alpha(theme.surface0, 0.86) } : null, style], children: box });
3467
- return /* @__PURE__ */ jsx34(View29, { ...a11y, style: [variant === "block" ? styles24.block : null, style], children: box });
3495
+ return /* @__PURE__ */ jsx35(View30, { ...a11y, style: [StyleSheet25.absoluteFill, styles25.cover, variant === "page" ? { backgroundColor: alpha(theme.surface0, 0.86) } : null, style], children: box });
3496
+ return /* @__PURE__ */ jsx35(View30, { ...a11y, style: [variant === "block" ? styles25.block : null, style], children: box });
3468
3497
  }
3469
- var styles24 = StyleSheet24.create({
3498
+ var styles25 = StyleSheet25.create({
3470
3499
  inline: { flexDirection: "row", alignItems: "center", gap: 10 },
3471
3500
  stacked: { alignItems: "center", gap: 10 },
3472
- card: { paddingHorizontal: 24, paddingVertical: 20, borderWidth: StyleSheet24.hairlineWidth },
3501
+ card: { paddingHorizontal: 24, paddingVertical: 20, borderWidth: StyleSheet25.hairlineWidth },
3473
3502
  text: { flexShrink: 1, gap: 2 },
3474
3503
  center: { alignItems: "center", gap: 2 },
3475
3504
  centered: { textAlign: "center" },
@@ -3477,13 +3506,36 @@ var styles24 = StyleSheet24.create({
3477
3506
  cover: { alignItems: "center", justifyContent: "center", zIndex: 10 }
3478
3507
  });
3479
3508
 
3509
+ // src/native/maintenance-screen.tsx
3510
+ import { StyleSheet as StyleSheet26, View as View31 } from "react-native";
3511
+ import { jsx as jsx36, jsxs as jsxs32 } from "react/jsx-runtime";
3512
+ function MaintenanceScreen({ title, message, mark, retryLabel, onRetry, fill = true, style }) {
3513
+ const { theme } = useTheme();
3514
+ return /* @__PURE__ */ jsxs32(View31, { style: [styles26.root, fill ? styles26.fill : null, { backgroundColor: theme.surface0 }, style], children: [
3515
+ mark ? /* @__PURE__ */ jsx36(View31, { accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants", style: styles26.mark, children: mark }) : null,
3516
+ /* @__PURE__ */ jsxs32(View31, { role: "status", style: styles26.text, children: [
3517
+ /* @__PURE__ */ jsx36(Txt, { variant: "title", style: styles26.centred, children: title }),
3518
+ message ? /* @__PURE__ */ jsx36(Txt, { tone: "secondary", style: styles26.centred, children: message }) : null
3519
+ ] }),
3520
+ retryLabel && onRetry ? /* @__PURE__ */ jsx36(View31, { style: styles26.actions, children: /* @__PURE__ */ jsx36(Button, { label: retryLabel, variant: "secondary", onPress: onRetry }) }) : null
3521
+ ] });
3522
+ }
3523
+ var styles26 = StyleSheet26.create({
3524
+ root: { alignItems: "center", justifyContent: "center", gap: 12, padding: 24 },
3525
+ fill: { flex: 1 },
3526
+ mark: { width: 96, height: 96, alignItems: "center", justifyContent: "center" },
3527
+ text: { gap: 8, alignItems: "center" },
3528
+ centred: { textAlign: "center", maxWidth: 340 },
3529
+ actions: { marginTop: 8, alignSelf: "stretch", maxWidth: 340, width: "100%" }
3530
+ });
3531
+
3480
3532
  // src/native/mascot-state.tsx
3481
3533
  import * as React24 from "react";
3482
- import { AccessibilityInfo as AccessibilityInfo9, Animated as Animated13, Easing as Easing7, StyleSheet as StyleSheet25, View as View31 } from "react-native";
3534
+ import { AccessibilityInfo as AccessibilityInfo9, Animated as Animated13, Easing as Easing7, StyleSheet as StyleSheet27, View as View33 } from "react-native";
3483
3535
 
3484
3536
  // src/native/mascots.tsx
3485
3537
  import { useEffect as useEffect14, useState as useState22 } from "react";
3486
- import { AccessibilityInfo as AccessibilityInfo8, Animated as Animated12, Easing as Easing6, View as View30 } from "react-native";
3538
+ import { AccessibilityInfo as AccessibilityInfo8, Animated as Animated12, Easing as Easing6, View as View32 } from "react-native";
3487
3539
  import Svg17, { Circle as Circle11, Defs as Defs11, Ellipse as Ellipse2, G, LinearGradient as LinearGradient11, Path as Path15, Rect as Rect3, Stop as Stop11 } from "react-native-svg";
3488
3540
 
3489
3541
  // src/mascots/geometry.ts
@@ -3686,7 +3738,7 @@ var SHADE = "#000000";
3686
3738
  var PARCEL = ["#f59e0b", "#d97706", "#b45309"];
3687
3739
 
3688
3740
  // src/native/mascots.tsx
3689
- import { jsx as jsx35, jsxs as jsxs31 } from "react/jsx-runtime";
3741
+ import { jsx as jsx37, jsxs as jsxs33 } from "react/jsx-runtime";
3690
3742
  function useBob(animated) {
3691
3743
  const [y] = useState22(() => new Animated12.Value(0));
3692
3744
  useEffect14(() => {
@@ -3720,52 +3772,52 @@ function Mascot({ bird = "owl", mood = "welcome", tone: tone3 = "brand", size =
3720
3772
  const look3 = mood === "thinking" ? 1.4 : 0;
3721
3773
  const rot = (deg, [x, y]) => `rotate(${deg} ${x} ${y})`;
3722
3774
  const [wl, wr] = g.wings;
3723
- return /* @__PURE__ */ jsx35(View30, { style: [{ width: size, height: size }, style], ...markA11y(title), children: /* @__PURE__ */ jsx35(Animated12.View, { style: { transform: [{ translateY: bob }] }, children: /* @__PURE__ */ jsxs31(Svg17, { width: size, height: size, viewBox: "0 0 120 120", children: [
3724
- /* @__PURE__ */ jsx35(Defs11, { children: /* @__PURE__ */ jsxs31(LinearGradient11, { id, x1: "0", y1: "0", x2: "0", y2: "1", children: [
3725
- /* @__PURE__ */ jsx35(Stop11, { offset: "0%", stopColor: p.from }),
3726
- /* @__PURE__ */ jsx35(Stop11, { offset: "100%", stopColor: p.to })
3775
+ return /* @__PURE__ */ jsx37(View32, { style: [{ width: size, height: size }, style], ...markA11y(title), children: /* @__PURE__ */ jsx37(Animated12.View, { style: { transform: [{ translateY: bob }] }, children: /* @__PURE__ */ jsxs33(Svg17, { width: size, height: size, viewBox: "0 0 120 120", children: [
3776
+ /* @__PURE__ */ jsx37(Defs11, { children: /* @__PURE__ */ jsxs33(LinearGradient11, { id, x1: "0", y1: "0", x2: "0", y2: "1", children: [
3777
+ /* @__PURE__ */ jsx37(Stop11, { offset: "0%", stopColor: p.from }),
3778
+ /* @__PURE__ */ jsx37(Stop11, { offset: "100%", stopColor: p.to })
3727
3779
  ] }) }),
3728
- /* @__PURE__ */ jsx35(Ellipse2, { cx: g.shadow[0], cy: g.shadow[1], rx: g.shadow[2], ry: g.shadow[3], fill: SHADE, opacity: 0.14 }),
3729
- mood === "empty" && /* @__PURE__ */ jsx35(Path15, { d: MOOD_PARTS.tray, stroke: outline, strokeWidth: 1.6, strokeDasharray: "3 3", fill: "none" }),
3730
- g.legs.map((d) => /* @__PURE__ */ jsx35(Path15, { d, stroke: p.beak, strokeWidth: 2.6, strokeLinecap: "round", fill: "none" }, d)),
3731
- g.back?.map((d) => d.endsWith("Z") ? /* @__PURE__ */ jsx35(Path15, { d, fill: p.detail, ...line }, d) : /* @__PURE__ */ jsx35(Path15, { d, stroke: outline, strokeWidth: 1.4, fill: "none" }, d)),
3732
- g.parcel?.map((d, i) => /* @__PURE__ */ jsx35(Path15, { d, fill: PARCEL[i], ...line }, d)),
3733
- /* @__PURE__ */ jsx35(Path15, { d: g.body, fill: body, ...line }),
3734
- /* @__PURE__ */ jsx35(Path15, { d: g.belly, fill: LIGHT, opacity: 0.28 }),
3780
+ /* @__PURE__ */ jsx37(Ellipse2, { cx: g.shadow[0], cy: g.shadow[1], rx: g.shadow[2], ry: g.shadow[3], fill: SHADE, opacity: 0.14 }),
3781
+ mood === "empty" && /* @__PURE__ */ jsx37(Path15, { d: MOOD_PARTS.tray, stroke: outline, strokeWidth: 1.6, strokeDasharray: "3 3", fill: "none" }),
3782
+ g.legs.map((d) => /* @__PURE__ */ jsx37(Path15, { d, stroke: p.beak, strokeWidth: 2.6, strokeLinecap: "round", fill: "none" }, d)),
3783
+ g.back?.map((d) => d.endsWith("Z") ? /* @__PURE__ */ jsx37(Path15, { d, fill: p.detail, ...line }, d) : /* @__PURE__ */ jsx37(Path15, { d, stroke: outline, strokeWidth: 1.4, fill: "none" }, d)),
3784
+ g.parcel?.map((d, i) => /* @__PURE__ */ jsx37(Path15, { d, fill: PARCEL[i], ...line }, d)),
3785
+ /* @__PURE__ */ jsx37(Path15, { d: g.body, fill: body, ...line }),
3786
+ /* @__PURE__ */ jsx37(Path15, { d: g.belly, fill: LIGHT, opacity: 0.28 }),
3735
3787
  [wl, wr].map((w, i) => {
3736
3788
  const turn = mood === "success" ? i === 0 ? 28 : -28 : mood === "welcome" && i === 1 ? -20 : 0;
3737
- return /* @__PURE__ */ jsxs31(G, { transform: turn ? rot(turn, w.pivot) : void 0, children: [
3738
- /* @__PURE__ */ jsx35(Path15, { d: w.d, fill: p.wing, ...line }),
3739
- /* @__PURE__ */ jsx35(Path15, { d: w.d, fill: SHADE, opacity: 0.16 })
3789
+ return /* @__PURE__ */ jsxs33(G, { transform: turn ? rot(turn, w.pivot) : void 0, children: [
3790
+ /* @__PURE__ */ jsx37(Path15, { d: w.d, fill: p.wing, ...line }),
3791
+ /* @__PURE__ */ jsx37(Path15, { d: w.d, fill: SHADE, opacity: 0.16 })
3740
3792
  ] }, i);
3741
3793
  }),
3742
- g.neck && /* @__PURE__ */ jsx35(Path15, { d: g.neck.d, stroke: body, strokeWidth: g.neck.width, strokeLinecap: "round", fill: "none" }),
3743
- g.head.r > 0 && /* @__PURE__ */ jsx35(Circle11, { cx: g.head.cx, cy: g.head.cy, r: g.head.r, fill: body, ...line }),
3744
- g.details.map((d) => /* @__PURE__ */ jsx35(Path15, { d, fill: p.detail, ...line }, d)),
3745
- g.visor && /* @__PURE__ */ jsx35(Rect3, { x: g.visor.x, y: g.visor.y, width: g.visor.w, height: g.visor.h, rx: 4, fill: theme.surface0, ...line }),
3794
+ g.neck && /* @__PURE__ */ jsx37(Path15, { d: g.neck.d, stroke: body, strokeWidth: g.neck.width, strokeLinecap: "round", fill: "none" }),
3795
+ g.head.r > 0 && /* @__PURE__ */ jsx37(Circle11, { cx: g.head.cx, cy: g.head.cy, r: g.head.r, fill: body, ...line }),
3796
+ g.details.map((d) => /* @__PURE__ */ jsx37(Path15, { d, fill: p.detail, ...line }, d)),
3797
+ g.visor && /* @__PURE__ */ jsx37(Rect3, { x: g.visor.x, y: g.visor.y, width: g.visor.w, height: g.visor.h, rx: 4, fill: theme.surface0, ...line }),
3746
3798
  g.eyes.at.map(
3747
- (at, i) => mood === "empty" && g.eyes.white > 0 ? /* @__PURE__ */ jsxs31(G, { children: [
3748
- /* @__PURE__ */ jsx35(Circle11, { cx: at[0], cy: at[1], r: g.eyes.white, fill: LIGHT, ...line }),
3749
- /* @__PURE__ */ jsx35(Circle11, { cx: at[0], cy: at[1] + g.eyes.pupil * 0.7, r: g.eyes.pupil, fill: SHADE }),
3750
- /* @__PURE__ */ jsx35(Path15, { d: upperLid(at, g.eyes.white), fill: p.detail, ...line })
3751
- ] }, i) : mood === "success" || mood === "empty" ? /* @__PURE__ */ jsx35(Path15, { d: mood === "success" ? archEye(at, eyeR * 0.85) : lidEye(at, eyeR * 0.8), stroke: g.visor ? p.eye : outline, strokeWidth: 2.2, strokeLinecap: "round", fill: "none" }, i) : /* @__PURE__ */ jsxs31(G, { children: [
3752
- g.eyes.white > 0 && /* @__PURE__ */ jsx35(Circle11, { cx: at[0], cy: at[1], r: g.eyes.white, fill: LIGHT, ...line }),
3753
- /* @__PURE__ */ jsx35(Circle11, { cx: at[0] + look3, cy: at[1] - look3, r: g.eyes.pupil, fill: g.visor ? p.eye : SHADE })
3799
+ (at, i) => mood === "empty" && g.eyes.white > 0 ? /* @__PURE__ */ jsxs33(G, { children: [
3800
+ /* @__PURE__ */ jsx37(Circle11, { cx: at[0], cy: at[1], r: g.eyes.white, fill: LIGHT, ...line }),
3801
+ /* @__PURE__ */ jsx37(Circle11, { cx: at[0], cy: at[1] + g.eyes.pupil * 0.7, r: g.eyes.pupil, fill: SHADE }),
3802
+ /* @__PURE__ */ jsx37(Path15, { d: upperLid(at, g.eyes.white), fill: p.detail, ...line })
3803
+ ] }, i) : mood === "success" || mood === "empty" ? /* @__PURE__ */ jsx37(Path15, { d: mood === "success" ? archEye(at, eyeR * 0.85) : lidEye(at, eyeR * 0.8), stroke: g.visor ? p.eye : outline, strokeWidth: 2.2, strokeLinecap: "round", fill: "none" }, i) : /* @__PURE__ */ jsxs33(G, { children: [
3804
+ g.eyes.white > 0 && /* @__PURE__ */ jsx37(Circle11, { cx: at[0], cy: at[1], r: g.eyes.white, fill: LIGHT, ...line }),
3805
+ /* @__PURE__ */ jsx37(Circle11, { cx: at[0] + look3, cy: at[1] - look3, r: g.eyes.pupil, fill: g.visor ? p.eye : SHADE })
3754
3806
  ] }, i)
3755
3807
  ),
3756
- g.glasses && g.eyes.at.map(([x, y]) => /* @__PURE__ */ jsx35(Circle11, { cx: x, cy: y, r: 6.5, fill: "none", stroke: outline, strokeWidth: 1.3 }, x)),
3757
- mood === "error" && g.eyes.at.map((at, i) => /* @__PURE__ */ jsx35(Path15, { d: brow(at, eyeR, g.eyes.at.length === 1 ? 1 : i === 0 ? -1 : 1), stroke: outline, strokeWidth: 2, strokeLinecap: "round" }, i)),
3758
- /* @__PURE__ */ jsx35(Path15, { d: g.beak, fill: p.beak, ...line }),
3759
- mood === "thinking" && MOOD_PARTS.dots.map(([cx, cy, r], i) => /* @__PURE__ */ jsx35(Circle11, { cx, cy, r, fill: theme.textSecondary, opacity: 0.5 + i * 0.25 }, cx)),
3760
- (mood === "success" || mood === "error") && /* @__PURE__ */ jsx35(Circle11, { cx: MOOD_PARTS.badge.cx, cy: MOOD_PARTS.badge.cy, r: MOOD_PARTS.badge.r, fill: mood === "success" ? theme.success : theme.danger }),
3761
- mood === "success" && /* @__PURE__ */ jsx35(Path15, { d: MOOD_PARTS.check, stroke: theme.surface0, strokeWidth: 2.6, strokeLinecap: "round", strokeLinejoin: "round", fill: "none" }),
3762
- mood === "error" && /* @__PURE__ */ jsx35(Path15, { d: MOOD_PARTS.bang.line, stroke: theme.surface0, strokeWidth: 2.8, strokeLinecap: "round" }),
3763
- mood === "error" && /* @__PURE__ */ jsx35(Circle11, { cx: MOOD_PARTS.bang.dot[0], cy: MOOD_PARTS.bang.dot[1], r: 1.6, fill: theme.surface0 })
3808
+ g.glasses && g.eyes.at.map(([x, y]) => /* @__PURE__ */ jsx37(Circle11, { cx: x, cy: y, r: 6.5, fill: "none", stroke: outline, strokeWidth: 1.3 }, x)),
3809
+ mood === "error" && g.eyes.at.map((at, i) => /* @__PURE__ */ jsx37(Path15, { d: brow(at, eyeR, g.eyes.at.length === 1 ? 1 : i === 0 ? -1 : 1), stroke: outline, strokeWidth: 2, strokeLinecap: "round" }, i)),
3810
+ /* @__PURE__ */ jsx37(Path15, { d: g.beak, fill: p.beak, ...line }),
3811
+ mood === "thinking" && MOOD_PARTS.dots.map(([cx, cy, r], i) => /* @__PURE__ */ jsx37(Circle11, { cx, cy, r, fill: theme.textSecondary, opacity: 0.5 + i * 0.25 }, cx)),
3812
+ (mood === "success" || mood === "error") && /* @__PURE__ */ jsx37(Circle11, { cx: MOOD_PARTS.badge.cx, cy: MOOD_PARTS.badge.cy, r: MOOD_PARTS.badge.r, fill: mood === "success" ? theme.success : theme.danger }),
3813
+ mood === "success" && /* @__PURE__ */ jsx37(Path15, { d: MOOD_PARTS.check, stroke: theme.surface0, strokeWidth: 2.6, strokeLinecap: "round", strokeLinejoin: "round", fill: "none" }),
3814
+ mood === "error" && /* @__PURE__ */ jsx37(Path15, { d: MOOD_PARTS.bang.line, stroke: theme.surface0, strokeWidth: 2.8, strokeLinecap: "round" }),
3815
+ mood === "error" && /* @__PURE__ */ jsx37(Circle11, { cx: MOOD_PARTS.bang.dot[0], cy: MOOD_PARTS.bang.dot[1], r: 1.6, fill: theme.surface0 })
3764
3816
  ] }) }) });
3765
3817
  }
3766
3818
 
3767
3819
  // src/native/mascot-state.tsx
3768
- import { jsx as jsx36, jsxs as jsxs32 } from "react/jsx-runtime";
3820
+ import { jsx as jsx38, jsxs as jsxs34 } from "react/jsx-runtime";
3769
3821
  var SIZE = { sm: 64, md: 96, lg: 128 };
3770
3822
  function useArrival(animated) {
3771
3823
  const [value] = React24.useState(() => new Animated13.Value(animated ? 0 : 1));
@@ -3786,30 +3838,30 @@ function useArrival(animated) {
3786
3838
  function MascotState({ bird = "owl", mood = "empty", title, description, action, size = "md", layout = "stacked", tone: tone3, animated = true, style, ...props }) {
3787
3839
  const opacity = useArrival(animated);
3788
3840
  const inline = layout === "inline";
3789
- return /* @__PURE__ */ jsxs32(
3841
+ return /* @__PURE__ */ jsxs34(
3790
3842
  Animated13.View,
3791
3843
  {
3792
3844
  role: mood === "error" ? "alert" : "status",
3793
3845
  accessibilityLiveRegion: mood === "error" ? "assertive" : "polite",
3794
3846
  "aria-busy": mood === "thinking" ? true : void 0,
3795
3847
  ...props,
3796
- style: [inline ? styles25.inline : styles25.stacked, { opacity, transform: [{ translateY: opacity.interpolate({ inputRange: [0, 1], outputRange: [6, 0] }) }] }, style],
3848
+ style: [inline ? styles27.inline : styles27.stacked, { opacity, transform: [{ translateY: opacity.interpolate({ inputRange: [0, 1], outputRange: [6, 0] }) }] }, style],
3797
3849
  children: [
3798
- /* @__PURE__ */ jsx36(Mascot, { bird, mood, tone: tone3, size: SIZE[size], animated }),
3799
- /* @__PURE__ */ jsxs32(View31, { style: inline ? styles25.wordsInline : styles25.words, children: [
3800
- /* @__PURE__ */ jsx36(Txt, { variant: "label", role: "heading", style: inline ? null : styles25.center, children: title }),
3801
- description ? /* @__PURE__ */ jsx36(Txt, { tone: "secondary", style: inline ? null : styles25.center, children: description }) : null,
3802
- action ? /* @__PURE__ */ jsx36(View31, { style: [styles25.action, inline ? null : styles25.actionCentred], children: action }) : null
3850
+ /* @__PURE__ */ jsx38(Mascot, { bird, mood, tone: tone3, size: SIZE[size], animated }),
3851
+ /* @__PURE__ */ jsxs34(View33, { style: inline ? styles27.wordsInline : styles27.words, children: [
3852
+ /* @__PURE__ */ jsx38(Txt, { variant: "label", role: "heading", style: inline ? null : styles27.center, children: title }),
3853
+ description ? /* @__PURE__ */ jsx38(Txt, { tone: "secondary", style: inline ? null : styles27.center, children: description }) : null,
3854
+ action ? /* @__PURE__ */ jsx38(View33, { style: [styles27.action, inline ? null : styles27.actionCentred], children: action }) : null
3803
3855
  ] })
3804
3856
  ]
3805
3857
  }
3806
3858
  );
3807
3859
  }
3808
- var ErrorState = (props) => /* @__PURE__ */ jsx36(MascotState, { mood: "error", ...props });
3809
- var SuccessState = (props) => /* @__PURE__ */ jsx36(MascotState, { mood: "success", ...props });
3810
- var LoadingState = (props) => /* @__PURE__ */ jsx36(MascotState, { mood: "thinking", ...props });
3811
- var WelcomeState = (props) => /* @__PURE__ */ jsx36(MascotState, { mood: "welcome", ...props });
3812
- var styles25 = StyleSheet25.create({
3860
+ var ErrorState = (props) => /* @__PURE__ */ jsx38(MascotState, { mood: "error", ...props });
3861
+ var SuccessState = (props) => /* @__PURE__ */ jsx38(MascotState, { mood: "success", ...props });
3862
+ var LoadingState = (props) => /* @__PURE__ */ jsx38(MascotState, { mood: "thinking", ...props });
3863
+ var WelcomeState = (props) => /* @__PURE__ */ jsx38(MascotState, { mood: "welcome", ...props });
3864
+ var styles27 = StyleSheet27.create({
3813
3865
  stacked: { alignItems: "center", justifyContent: "center", gap: 12, paddingVertical: 40, paddingHorizontal: 24 },
3814
3866
  inline: { flexDirection: "row", alignItems: "center", gap: 16 },
3815
3867
  words: { alignItems: "center", gap: 6 },
@@ -3821,9 +3873,9 @@ var styles25 = StyleSheet25.create({
3821
3873
 
3822
3874
  // src/native/match-dialog.tsx
3823
3875
  import * as React25 from "react";
3824
- import { AccessibilityInfo as AccessibilityInfo10, Animated as Animated14, Easing as Easing8, Modal as Modal4, Pressable as Pressable14, StyleSheet as StyleSheet26, View as View32 } from "react-native";
3876
+ import { AccessibilityInfo as AccessibilityInfo10, Animated as Animated14, Easing as Easing8, Modal as Modal4, Pressable as Pressable14, StyleSheet as StyleSheet28, View as View34 } from "react-native";
3825
3877
  import Svg18, { Path as Path16 } from "react-native-svg";
3826
- import { jsx as jsx37, jsxs as jsxs33 } from "react/jsx-runtime";
3878
+ import { jsx as jsx39, jsxs as jsxs35 } from "react/jsx-runtime";
3827
3879
  function MatchDialog({ open, onOpenChange, title, description, people, primaryLabel, onPrimary, secondaryLabel }) {
3828
3880
  const { theme, haptic } = useTheme();
3829
3881
  const reduce = useReducedMotion();
@@ -3843,17 +3895,17 @@ function MatchDialog({ open, onOpenChange, title, description, people, primaryLa
3843
3895
  }
3844
3896
  }, [open, reduce, t]);
3845
3897
  const side = (dir) => ({ transform: [{ translateX: t.interpolate({ inputRange: [0, 1], outputRange: [dir * 110, dir * 50] }) }, { rotate: dir === -1 ? "-8deg" : "8deg" }] });
3846
- return /* @__PURE__ */ jsx37(Modal4, { ...modalName(title), visible: open, transparent: true, animationType: reduce ? "none" : "fade", onRequestClose: () => onOpenChange(false), statusBarTranslucent: true, children: /* @__PURE__ */ jsxs33(View32, { accessibilityViewIsModal: true, style: [styles26.screen, { backgroundColor: theme.accent }], children: [
3847
- /* @__PURE__ */ jsx37(View32, { style: [StyleSheet26.absoluteFill, { backgroundColor: theme.accent2, opacity: 0.55 }] }),
3848
- /* @__PURE__ */ jsx37(Txt, { variant: "display", tone: "onAccent", style: styles26.title, children: title }),
3849
- description ? /* @__PURE__ */ jsx37(Txt, { tone: "onAccent", style: styles26.center, children: description }) : null,
3850
- /* @__PURE__ */ jsxs33(View32, { style: styles26.pair, "aria-hidden": true, children: [
3851
- /* @__PURE__ */ jsx37(Animated14.View, { style: [styles26.photo, side(-1), { borderColor: theme.onAccent }], children: /* @__PURE__ */ jsx37(Avatar, { src: people[0].src, alt: "", fallback: people[0].name.charAt(0), size: 112 }) }),
3852
- /* @__PURE__ */ jsx37(Animated14.View, { style: [styles26.photo, side(1), { borderColor: theme.onAccent }], children: /* @__PURE__ */ jsx37(Avatar, { src: people[1].src, alt: "", fallback: people[1].name.charAt(0), size: 112 }) }),
3853
- /* @__PURE__ */ jsx37(Animated14.View, { style: [styles26.heart, { backgroundColor: theme.onAccent, transform: [{ scale: t }] }], children: /* @__PURE__ */ jsx37(Svg18, { width: 26, height: 26, viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx37(Path16, { d: "M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z", fill: theme.accent }) }) })
3898
+ return /* @__PURE__ */ jsx39(Modal4, { ...modalName(title), visible: open, transparent: true, animationType: reduce ? "none" : "fade", onRequestClose: () => onOpenChange(false), statusBarTranslucent: true, children: /* @__PURE__ */ jsxs35(View34, { accessibilityViewIsModal: true, style: [styles28.screen, { backgroundColor: theme.accent }], children: [
3899
+ /* @__PURE__ */ jsx39(View34, { style: [StyleSheet28.absoluteFill, { backgroundColor: theme.accent2, opacity: 0.55 }] }),
3900
+ /* @__PURE__ */ jsx39(Txt, { variant: "display", tone: "onAccent", style: styles28.title, children: title }),
3901
+ description ? /* @__PURE__ */ jsx39(Txt, { tone: "onAccent", style: styles28.center, children: description }) : null,
3902
+ /* @__PURE__ */ jsxs35(View34, { style: styles28.pair, "aria-hidden": true, children: [
3903
+ /* @__PURE__ */ jsx39(Animated14.View, { style: [styles28.photo, side(-1), { borderColor: theme.onAccent }], children: /* @__PURE__ */ jsx39(Avatar, { src: people[0].src, alt: "", fallback: people[0].name.charAt(0), size: 112 }) }),
3904
+ /* @__PURE__ */ jsx39(Animated14.View, { style: [styles28.photo, side(1), { borderColor: theme.onAccent }], children: /* @__PURE__ */ jsx39(Avatar, { src: people[1].src, alt: "", fallback: people[1].name.charAt(0), size: 112 }) }),
3905
+ /* @__PURE__ */ jsx39(Animated14.View, { style: [styles28.heart, { backgroundColor: theme.onAccent, transform: [{ scale: t }] }], children: /* @__PURE__ */ jsx39(Svg18, { width: 26, height: 26, viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx39(Path16, { d: "M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z", fill: theme.accent }) }) })
3854
3906
  ] }),
3855
- /* @__PURE__ */ jsxs33(View32, { style: styles26.actions, children: [
3856
- /* @__PURE__ */ jsx37(
3907
+ /* @__PURE__ */ jsxs35(View34, { style: styles28.actions, children: [
3908
+ /* @__PURE__ */ jsx39(
3857
3909
  Button,
3858
3910
  {
3859
3911
  label: primaryLabel,
@@ -3864,11 +3916,11 @@ function MatchDialog({ open, onOpenChange, title, description, people, primaryLa
3864
3916
  }
3865
3917
  }
3866
3918
  ),
3867
- /* @__PURE__ */ jsx37(Pressable14, { role: "button", onPress: () => onOpenChange(false), style: ({ pressed }) => [styles26.secondary, { borderColor: theme.onAccent, opacity: pressed ? 0.8 : 1 }], children: /* @__PURE__ */ jsx37(Txt, { variant: "label", tone: "onAccent", children: secondaryLabel }) })
3919
+ /* @__PURE__ */ jsx39(Pressable14, { role: "button", onPress: () => onOpenChange(false), style: ({ pressed }) => [styles28.secondary, { borderColor: theme.onAccent, opacity: pressed ? 0.8 : 1 }], children: /* @__PURE__ */ jsx39(Txt, { variant: "label", tone: "onAccent", children: secondaryLabel }) })
3868
3920
  ] })
3869
3921
  ] }) });
3870
3922
  }
3871
- var styles26 = StyleSheet26.create({
3923
+ var styles28 = StyleSheet28.create({
3872
3924
  screen: { flex: 1, alignItems: "center", justifyContent: "center", gap: 12, padding: 32 },
3873
3925
  title: { textAlign: "center", fontSize: 40, lineHeight: 46 },
3874
3926
  center: { textAlign: "center", maxWidth: 300 },
@@ -3880,9 +3932,9 @@ var styles26 = StyleSheet26.create({
3880
3932
  });
3881
3933
 
3882
3934
  // src/native/meter.tsx
3883
- import { StyleSheet as StyleSheet27, View as View33 } from "react-native";
3935
+ import { StyleSheet as StyleSheet29, View as View35 } from "react-native";
3884
3936
  import Svg19, { Circle as Circle12 } from "react-native-svg";
3885
- import { jsx as jsx38, jsxs as jsxs34 } from "react/jsx-runtime";
3937
+ import { jsx as jsx40, jsxs as jsxs36 } from "react/jsx-runtime";
3886
3938
  var THICK = { sm: 6, md: 8, lg: 12 };
3887
3939
  var RING = { sm: 56, md: 96, lg: 144 };
3888
3940
  var partColor = (t, i) => [t.accent, t.warning, t.success, t.textSecondary, t.danger][i % 5];
@@ -3895,10 +3947,10 @@ function Meter({ label, value = 0, min = 0, max = 100, valueText, thresholds, op
3895
3947
  const words2 = valueText ?? `${Math.round(ratio * 100)} %`;
3896
3948
  const shares = (parts ?? []).map((p, i) => ({ ...p, color: partColor(theme, i), ratio: Math.min(1, Math.max(0, p.value / span)), words: p.valueText ?? `${Math.round(p.value / span * 100)} %` }));
3897
3949
  const a11y = parts ? { role: "group", "aria-label": `${label}: ${shares.map((p) => `${p.label} ${p.words}`).join(", ")}` } : { role: "meter", "aria-label": label, "aria-valuemin": min, "aria-valuemax": max, "aria-valuenow": Math.min(max, Math.max(min, value)), "aria-valuetext": words2 };
3898
- const legend = parts ? /* @__PURE__ */ jsx38(View33, { style: styles27.legend, "aria-hidden": true, children: shares.map((p, i) => /* @__PURE__ */ jsxs34(View33, { style: styles27.legendItem, children: [
3899
- /* @__PURE__ */ jsx38(View33, { style: [styles27.swatch, { backgroundColor: p.color }] }),
3900
- /* @__PURE__ */ jsx38(Txt, { variant: "caption", children: p.label }),
3901
- /* @__PURE__ */ jsx38(Txt, { variant: "caption", tone: "secondary", children: p.words })
3950
+ const legend = parts ? /* @__PURE__ */ jsx40(View35, { style: styles29.legend, "aria-hidden": true, children: shares.map((p, i) => /* @__PURE__ */ jsxs36(View35, { style: styles29.legendItem, children: [
3951
+ /* @__PURE__ */ jsx40(View35, { style: [styles29.swatch, { backgroundColor: p.color }] }),
3952
+ /* @__PURE__ */ jsx40(Txt, { variant: "caption", children: p.label }),
3953
+ /* @__PURE__ */ jsx40(Txt, { variant: "caption", tone: "secondary", children: p.words })
3902
3954
  ] }, i)) }) : null;
3903
3955
  if (variant === "ring") {
3904
3956
  const side = RING[size];
@@ -3910,27 +3962,27 @@ function Meter({ label, value = 0, min = 0, max = 100, valueText, thresholds, op
3910
3962
  offset += p.ratio;
3911
3963
  return arc;
3912
3964
  }) : [{ color: tone3, len: ratio, start: 0 }];
3913
- return /* @__PURE__ */ jsxs34(View33, { accessible: true, ...a11y, style: [styles27.ringRoot, style], children: [
3914
- /* @__PURE__ */ jsxs34(View33, { style: { width: side, height: side }, children: [
3915
- /* @__PURE__ */ jsxs34(Svg19, { width: side, height: side, viewBox: "0 0 100 100", style: { transform: [{ rotate: "-90deg" }] }, children: [
3916
- /* @__PURE__ */ jsx38(Circle12, { cx: 50, cy: 50, r, fill: "none", stroke: theme.borderDefault, strokeWidth: 9 }),
3917
- arcs.map((a, i) => /* @__PURE__ */ jsx38(Circle12, { cx: 50, cy: 50, r, fill: "none", stroke: a.color, strokeWidth: 9, strokeDasharray: `${Math.max(0, a.len * c - (parts ? 2 : 0))} ${c}`, strokeDashoffset: -a.start * c, strokeLinecap: parts ? "butt" : "round" }, i))
3965
+ return /* @__PURE__ */ jsxs36(View35, { accessible: true, ...a11y, style: [styles29.ringRoot, style], children: [
3966
+ /* @__PURE__ */ jsxs36(View35, { style: { width: side, height: side }, children: [
3967
+ /* @__PURE__ */ jsxs36(Svg19, { width: side, height: side, viewBox: "0 0 100 100", style: { transform: [{ rotate: "-90deg" }] }, children: [
3968
+ /* @__PURE__ */ jsx40(Circle12, { cx: 50, cy: 50, r, fill: "none", stroke: theme.borderDefault, strokeWidth: 9 }),
3969
+ arcs.map((a, i) => /* @__PURE__ */ jsx40(Circle12, { cx: 50, cy: 50, r, fill: "none", stroke: a.color, strokeWidth: 9, strokeDasharray: `${Math.max(0, a.len * c - (parts ? 2 : 0))} ${c}`, strokeDashoffset: -a.start * c, strokeLinecap: parts ? "butt" : "round" }, i))
3918
3970
  ] }),
3919
- children !== void 0 ? /* @__PURE__ */ jsx38(View33, { style: [StyleSheet27.absoluteFill, styles27.center], children }) : null
3971
+ children !== void 0 ? /* @__PURE__ */ jsx40(View35, { style: [StyleSheet29.absoluteFill, styles29.center], children }) : null
3920
3972
  ] }),
3921
3973
  legend
3922
3974
  ] });
3923
3975
  }
3924
- return /* @__PURE__ */ jsxs34(View33, { accessible: true, ...a11y, style: [styles27.root, style], children: [
3925
- showLabel ? /* @__PURE__ */ jsxs34(View33, { style: styles27.header, "aria-hidden": true, children: [
3926
- /* @__PURE__ */ jsx38(Txt, { variant: "caption", numberOfLines: 1, style: styles27.caption, children: label }),
3927
- !parts ? /* @__PURE__ */ jsx38(Txt, { variant: "caption", tone: "secondary", children: words2 }) : null
3976
+ return /* @__PURE__ */ jsxs36(View35, { accessible: true, ...a11y, style: [styles29.root, style], children: [
3977
+ showLabel ? /* @__PURE__ */ jsxs36(View35, { style: styles29.header, "aria-hidden": true, children: [
3978
+ /* @__PURE__ */ jsx40(Txt, { variant: "caption", numberOfLines: 1, style: styles29.caption, children: label }),
3979
+ !parts ? /* @__PURE__ */ jsx40(Txt, { variant: "caption", tone: "secondary", children: words2 }) : null
3928
3980
  ] }) : null,
3929
- /* @__PURE__ */ jsx38(View33, { style: [styles27.track, { height: THICK[size], backgroundColor: theme.surface3 }], children: parts ? shares.map((p, i) => /* @__PURE__ */ jsx38(View33, { style: { width: `${p.ratio * 100}%`, backgroundColor: p.color } }, i)) : /* @__PURE__ */ jsx38(View33, { style: [styles27.fill, { width: `${ratio * 100}%`, backgroundColor: tone3 }] }) }),
3981
+ /* @__PURE__ */ jsx40(View35, { style: [styles29.track, { height: THICK[size], backgroundColor: theme.surface3 }], children: parts ? shares.map((p, i) => /* @__PURE__ */ jsx40(View35, { style: { width: `${p.ratio * 100}%`, backgroundColor: p.color } }, i)) : /* @__PURE__ */ jsx40(View35, { style: [styles29.fill, { width: `${ratio * 100}%`, backgroundColor: tone3 }] }) }),
3930
3982
  legend
3931
3983
  ] });
3932
3984
  }
3933
- var styles27 = StyleSheet27.create({
3985
+ var styles29 = StyleSheet29.create({
3934
3986
  root: { width: "100%", gap: 6 },
3935
3987
  header: { flexDirection: "row", alignItems: "baseline", gap: 8 },
3936
3988
  caption: { flex: 1, fontWeight: "600" },
@@ -3946,7 +3998,7 @@ var styles27 = StyleSheet27.create({
3946
3998
  // src/native/number-ticker.tsx
3947
3999
  import * as React26 from "react";
3948
4000
  import { AccessibilityInfo as AccessibilityInfo11, Animated as Animated15, Easing as Easing9, Text as Text13 } from "react-native";
3949
- import { jsx as jsx39 } from "react/jsx-runtime";
4001
+ import { jsx as jsx41 } from "react/jsx-runtime";
3950
4002
  function NumberTicker({ value, locale, format, trigger = "mount", duration = 1100, announce, variant = "display", tone: tone3 = "text", style }) {
3951
4003
  const reduce = useReducedMotion();
3952
4004
  const writer = React26.useMemo(() => new Intl.NumberFormat(locale, format), [locale, format]);
@@ -3974,13 +4026,13 @@ function NumberTicker({ value, locale, format, trigger = "mount", duration = 110
3974
4026
  };
3975
4027
  }, [value, reduce, trigger, duration, announce, anim, writer]);
3976
4028
  const digits = Number.isInteger(value) ? Math.round(shown) : shown;
3977
- return /* @__PURE__ */ jsx39(Txt, { variant, tone: tone3, "aria-label": writer.format(value), style: [{ fontVariant: ["tabular-nums"] }, style], children: /* @__PURE__ */ jsx39(Text13, { "aria-hidden": true, children: writer.format(digits) }) });
4029
+ return /* @__PURE__ */ jsx41(Txt, { variant, tone: tone3, "aria-label": writer.format(value), style: [{ fontVariant: ["tabular-nums"] }, style], children: /* @__PURE__ */ jsx41(Text13, { "aria-hidden": true, children: writer.format(digits) }) });
3978
4030
  }
3979
4031
 
3980
4032
  // src/native/onboarding.tsx
3981
4033
  import * as React27 from "react";
3982
- import { ScrollView as ScrollView5, StyleSheet as StyleSheet28, View as View34 } from "react-native";
3983
- import { jsx as jsx40, jsxs as jsxs35 } from "react/jsx-runtime";
4034
+ import { ScrollView as ScrollView5, StyleSheet as StyleSheet30, View as View36 } from "react-native";
4035
+ import { jsx as jsx42, jsxs as jsxs37 } from "react/jsx-runtime";
3984
4036
  function Onboarding({ slides, labels, onDone, style }) {
3985
4037
  const { theme, insets, haptic } = useTheme();
3986
4038
  const [width, setWidth] = React27.useState(0);
@@ -3995,18 +4047,18 @@ function Onboarding({ slides, labels, onDone, style }) {
3995
4047
  const onScroll = (e) => {
3996
4048
  if (width > 0) setPage(Math.round(e.nativeEvent.contentOffset.x / width));
3997
4049
  };
3998
- return /* @__PURE__ */ jsxs35(View34, { style: [styles28.root, { backgroundColor: theme.surface0, paddingTop: insets.top + 8, paddingBottom: insets.bottom + 16 }, style], onLayout: (e) => setWidth(e.nativeEvent.layout.width), children: [
3999
- /* @__PURE__ */ jsx40(View34, { style: styles28.top, children: !last ? /* @__PURE__ */ jsx40(Button, { label: labels.skip, variant: "ghost", size: "sm", onPress: onDone }) : /* @__PURE__ */ jsx40(View34, { style: styles28.spacer }) }),
4000
- /* @__PURE__ */ jsx40(ScrollView5, { ref: scroller, tabIndex: 0, horizontal: true, pagingEnabled: true, showsHorizontalScrollIndicator: false, onMomentumScrollEnd: onScroll, style: styles28.flex, children: slides.map((slide, i) => /* @__PURE__ */ jsxs35(View34, { style: [styles28.slide, { width: width || void 0 }], accessible: true, "aria-label": `${labels.position(i + 1, slides.length)}. ${slide.title}. ${slide.description}`, "aria-hidden": i !== page, children: [
4001
- slide.visual ? /* @__PURE__ */ jsx40(View34, { style: styles28.visual, children: slide.visual }) : null,
4002
- /* @__PURE__ */ jsx40(Txt, { variant: "display", style: styles28.centred, children: slide.title }),
4003
- /* @__PURE__ */ jsx40(Txt, { tone: "secondary", style: [styles28.centred, styles28.description], children: slide.description })
4050
+ return /* @__PURE__ */ jsxs37(View36, { style: [styles30.root, { backgroundColor: theme.surface0, paddingTop: insets.top + 8, paddingBottom: insets.bottom + 16 }, style], onLayout: (e) => setWidth(e.nativeEvent.layout.width), children: [
4051
+ /* @__PURE__ */ jsx42(View36, { style: styles30.top, children: !last ? /* @__PURE__ */ jsx42(Button, { label: labels.skip, variant: "ghost", size: "sm", onPress: onDone }) : /* @__PURE__ */ jsx42(View36, { style: styles30.spacer }) }),
4052
+ /* @__PURE__ */ jsx42(ScrollView5, { ref: scroller, tabIndex: 0, horizontal: true, pagingEnabled: true, showsHorizontalScrollIndicator: false, onMomentumScrollEnd: onScroll, style: styles30.flex, children: slides.map((slide, i) => /* @__PURE__ */ jsxs37(View36, { style: [styles30.slide, { width: width || void 0 }], accessible: true, "aria-label": `${labels.position(i + 1, slides.length)}. ${slide.title}. ${slide.description}`, "aria-hidden": i !== page, children: [
4053
+ slide.visual ? /* @__PURE__ */ jsx42(View36, { style: styles30.visual, children: slide.visual }) : null,
4054
+ /* @__PURE__ */ jsx42(Txt, { variant: "display", style: styles30.centred, children: slide.title }),
4055
+ /* @__PURE__ */ jsx42(Txt, { tone: "secondary", style: [styles30.centred, styles30.description], children: slide.description })
4004
4056
  ] }, i)) }),
4005
- /* @__PURE__ */ jsx40(View34, { style: styles28.dots, "aria-hidden": true, children: slides.map((_, i) => /* @__PURE__ */ jsx40(View34, { style: [styles28.dot, { width: i === page ? 22 : 8, backgroundColor: i === page ? theme.accent : theme.borderStrong }] }, i)) }),
4006
- /* @__PURE__ */ jsx40(View34, { style: styles28.bottom, children: /* @__PURE__ */ jsx40(Button, { label: last ? labels.done : labels.next, variant: last ? "gradient" : "primary", size: "lg", onPress: () => last ? onDone() : go(page + 1) }) })
4057
+ /* @__PURE__ */ jsx42(View36, { style: styles30.dots, "aria-hidden": true, children: slides.map((_, i) => /* @__PURE__ */ jsx42(View36, { style: [styles30.dot, { width: i === page ? 22 : 8, backgroundColor: i === page ? theme.accent : theme.borderStrong }] }, i)) }),
4058
+ /* @__PURE__ */ jsx42(View36, { style: styles30.bottom, children: /* @__PURE__ */ jsx42(Button, { label: last ? labels.done : labels.next, variant: last ? "gradient" : "primary", size: "lg", onPress: () => last ? onDone() : go(page + 1) }) })
4007
4059
  ] });
4008
4060
  }
4009
- var styles28 = StyleSheet28.create({
4061
+ var styles30 = StyleSheet30.create({
4010
4062
  root: { flex: 1 },
4011
4063
  top: { flexDirection: "row", justifyContent: "flex-end", paddingHorizontal: 16, minHeight: 32 },
4012
4064
  spacer: { height: 32 },
@@ -4022,8 +4074,8 @@ var styles28 = StyleSheet28.create({
4022
4074
 
4023
4075
  // src/native/otp-input.tsx
4024
4076
  import * as React28 from "react";
4025
- import { Platform as Platform2, Pressable as Pressable15, StyleSheet as StyleSheet29, TextInput as TextInput5, View as View35 } from "react-native";
4026
- import { jsx as jsx41, jsxs as jsxs36 } from "react/jsx-runtime";
4077
+ import { Platform as Platform2, Pressable as Pressable15, StyleSheet as StyleSheet31, TextInput as TextInput5, View as View37 } from "react-native";
4078
+ import { jsx as jsx43, jsxs as jsxs38 } from "react/jsx-runtime";
4027
4079
  function OtpInput({ label, length = 6, value, onValueChange, onComplete, mode = "numeric", invalid, disabled, autoFocus, style }) {
4028
4080
  const { theme, radius: radius3, haptic } = useTheme();
4029
4081
  const [own, setOwn] = React28.useState("");
@@ -4042,14 +4094,14 @@ function OtpInput({ label, length = 6, value, onValueChange, onComplete, mode =
4042
4094
  onComplete?.(next);
4043
4095
  }
4044
4096
  };
4045
- return /* @__PURE__ */ jsxs36(Pressable15, { onPress: () => input.current?.focus(), disabled, accessible: false, style: [styles29.root, style], children: [
4046
- /* @__PURE__ */ jsx41(View35, { style: styles29.boxes, "aria-hidden": true, children: Array.from({ length }, (_, i) => {
4097
+ return /* @__PURE__ */ jsxs38(Pressable15, { onPress: () => input.current?.focus(), disabled, accessible: false, style: [styles31.root, style], children: [
4098
+ /* @__PURE__ */ jsx43(View37, { style: styles31.boxes, "aria-hidden": true, children: Array.from({ length }, (_, i) => {
4047
4099
  const active = focused && i === Math.min(code.length, length - 1);
4048
- return /* @__PURE__ */ jsx41(
4049
- View35,
4100
+ return /* @__PURE__ */ jsx43(
4101
+ View37,
4050
4102
  {
4051
4103
  style: [
4052
- styles29.box,
4104
+ styles31.box,
4053
4105
  {
4054
4106
  borderRadius: radius3.md,
4055
4107
  backgroundColor: theme.surface2,
@@ -4057,12 +4109,12 @@ function OtpInput({ label, length = 6, value, onValueChange, onComplete, mode =
4057
4109
  borderWidth: invalid || active ? 2 : 1
4058
4110
  }
4059
4111
  ],
4060
- children: /* @__PURE__ */ jsx41(Txt, { variant: "title", children: code[i] ?? "" })
4112
+ children: /* @__PURE__ */ jsx43(Txt, { variant: "title", children: code[i] ?? "" })
4061
4113
  },
4062
4114
  i
4063
4115
  );
4064
4116
  }) }),
4065
- /* @__PURE__ */ jsx41(
4117
+ /* @__PURE__ */ jsx43(
4066
4118
  TextInput5,
4067
4119
  {
4068
4120
  ref: input,
@@ -4081,12 +4133,12 @@ function OtpInput({ label, length = 6, value, onValueChange, onComplete, mode =
4081
4133
  caretHidden: true,
4082
4134
  onFocus: () => setFocused(true),
4083
4135
  onBlur: () => setFocused(false),
4084
- style: styles29.hidden
4136
+ style: styles31.hidden
4085
4137
  }
4086
4138
  )
4087
4139
  ] });
4088
4140
  }
4089
- var styles29 = StyleSheet29.create({
4141
+ var styles31 = StyleSheet31.create({
4090
4142
  root: { alignSelf: "flex-start" },
4091
4143
  boxes: { flexDirection: "row", gap: 8 },
4092
4144
  box: { width: 46, height: 56, alignItems: "center", justifyContent: "center" },
@@ -4094,11 +4146,11 @@ var styles29 = StyleSheet29.create({
4094
4146
  });
4095
4147
 
4096
4148
  // src/native/pagination.tsx
4097
- import { Pressable as Pressable16, StyleSheet as StyleSheet30, Text as Text14, View as View36 } from "react-native";
4149
+ import { Pressable as Pressable16, StyleSheet as StyleSheet32, Text as Text14, View as View38 } from "react-native";
4098
4150
  import Svg20, { Path as Path17 } from "react-native-svg";
4099
- import { jsx as jsx42, jsxs as jsxs37 } from "react/jsx-runtime";
4151
+ import { jsx as jsx44, jsxs as jsxs39 } from "react/jsx-runtime";
4100
4152
  function Chevron3({ direction, color }) {
4101
- return /* @__PURE__ */ jsx42(Svg20, { width: 18, height: 18, viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: 2.2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: /* @__PURE__ */ jsx42(Path17, { d: direction === "left" ? "m15 6-6 6 6 6" : "m9 6 6 6-6 6" }) });
4153
+ return /* @__PURE__ */ jsx44(Svg20, { width: 18, height: 18, viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: 2.2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: /* @__PURE__ */ jsx44(Path17, { d: direction === "left" ? "m15 6-6 6 6 6" : "m9 6 6 6-6 6" }) });
4102
4154
  }
4103
4155
  function Pagination({ page = 1, pageCount, onPageChange, hasPrevious, hasNext, onPrevious, onNext, status, disabled, labels, style }) {
4104
4156
  const { theme, radius: radius3 } = useTheme();
@@ -4107,7 +4159,7 @@ function Pagination({ page = 1, pageCount, onPageChange, hasPrevious, hasNext, o
4107
4159
  const current = Math.min(Math.max(1, page), count);
4108
4160
  const canPrevious = !disabled && (paged ? current > 1 : Boolean(hasPrevious));
4109
4161
  const canNext = !disabled && (paged ? current < count : Boolean(hasNext));
4110
- const button = (direction, enabled, onPress, label) => /* @__PURE__ */ jsx42(
4162
+ const button = (direction, enabled, onPress, label) => /* @__PURE__ */ jsx44(
4111
4163
  Pressable16,
4112
4164
  {
4113
4165
  role: "button",
@@ -4117,28 +4169,28 @@ function Pagination({ page = 1, pageCount, onPageChange, hasPrevious, hasNext, o
4117
4169
  hitSlop: 6,
4118
4170
  onPress,
4119
4171
  style: ({ pressed }) => [
4120
- styles30.button,
4172
+ styles32.button,
4121
4173
  { borderRadius: radius3.sm, borderColor: theme.borderDefault, backgroundColor: theme.surface1, opacity: enabled ? pressed ? 0.8 : 1 : 0.4 }
4122
4174
  ],
4123
- children: /* @__PURE__ */ jsx42(Chevron3, { direction, color: theme.textPrimary })
4175
+ children: /* @__PURE__ */ jsx44(Chevron3, { direction, color: theme.textPrimary })
4124
4176
  }
4125
4177
  );
4126
4178
  const text = status ?? (paged ? labels.compact(current, count) : null);
4127
- return /* @__PURE__ */ jsxs37(View36, { role: "navigation", style: [styles30.row, style], children: [
4179
+ return /* @__PURE__ */ jsxs39(View38, { role: "navigation", style: [styles32.row, style], children: [
4128
4180
  button("left", canPrevious, paged ? () => onPageChange?.(current - 1) : onPrevious, labels.previous),
4129
- text ? /* @__PURE__ */ jsx42(Text14, { "aria-live": "polite", style: [styles30.status, { color: theme.textSecondary }], children: text }) : null,
4181
+ text ? /* @__PURE__ */ jsx44(Text14, { "aria-live": "polite", style: [styles32.status, { color: theme.textSecondary }], children: text }) : null,
4130
4182
  button("right", canNext, paged ? () => onPageChange?.(current + 1) : onNext, labels.next)
4131
4183
  ] });
4132
4184
  }
4133
- var styles30 = StyleSheet30.create({
4185
+ var styles32 = StyleSheet32.create({
4134
4186
  row: { flexDirection: "row", alignItems: "center", justifyContent: "space-between", gap: 12 },
4135
- button: { width: 44, height: 44, alignItems: "center", justifyContent: "center", borderWidth: StyleSheet30.hairlineWidth },
4187
+ button: { width: 44, height: 44, alignItems: "center", justifyContent: "center", borderWidth: StyleSheet32.hairlineWidth },
4136
4188
  status: { fontSize: 13, fontWeight: "600", fontVariant: ["tabular-nums"] }
4137
4189
  });
4138
4190
 
4139
4191
  // src/native/permission-prompt.tsx
4140
- import { StyleSheet as StyleSheet31, View as View37 } from "react-native";
4141
- import { Fragment as Fragment6, jsx as jsx43, jsxs as jsxs38 } from "react/jsx-runtime";
4192
+ import { StyleSheet as StyleSheet33, View as View39 } from "react-native";
4193
+ import { Fragment as Fragment6, jsx as jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
4142
4194
  function PermissionPrompt({
4143
4195
  status,
4144
4196
  title,
@@ -4155,27 +4207,27 @@ function PermissionPrompt({
4155
4207
  style
4156
4208
  }) {
4157
4209
  const { theme, radius: radius3 } = useTheme();
4158
- if (status === "granted") return /* @__PURE__ */ jsx43(Fragment6, { children: children ?? null });
4210
+ if (status === "granted") return /* @__PURE__ */ jsx45(Fragment6, { children: children ?? null });
4159
4211
  const blocked = status === "blocked" || status === "denied" && Boolean(onOpenSettings);
4160
- return /* @__PURE__ */ jsxs38(View37, { style: [styles31.root, { backgroundColor: theme.surface1, borderColor: theme.borderSubtle, borderRadius: radius3.xl }, style], children: [
4161
- /* @__PURE__ */ jsx43(Mascot, { bird: mascot, mood: blocked ? "error" : "welcome", size: 104 }),
4162
- /* @__PURE__ */ jsx43(Txt, { variant: "title", style: styles31.centred, children: title }),
4163
- /* @__PURE__ */ jsx43(Txt, { tone: "secondary", style: styles31.centred, children: blocked && blockedDescription ? blockedDescription : description }),
4164
- /* @__PURE__ */ jsxs38(View37, { style: styles31.actions, children: [
4165
- blocked && settingsLabel && onOpenSettings ? /* @__PURE__ */ jsx43(Button, { label: settingsLabel, variant: "primary", onPress: onOpenSettings }) : /* @__PURE__ */ jsx43(Button, { label: allowLabel, variant: "primary", onPress: onAllow }),
4166
- dismissLabel && onDismiss ? /* @__PURE__ */ jsx43(Button, { label: dismissLabel, variant: "ghost", onPress: onDismiss }) : null
4212
+ return /* @__PURE__ */ jsxs40(View39, { style: [styles33.root, { backgroundColor: theme.surface1, borderColor: theme.borderSubtle, borderRadius: radius3.xl }, style], children: [
4213
+ /* @__PURE__ */ jsx45(Mascot, { bird: mascot, mood: blocked ? "error" : "welcome", size: 104 }),
4214
+ /* @__PURE__ */ jsx45(Txt, { variant: "title", style: styles33.centred, children: title }),
4215
+ /* @__PURE__ */ jsx45(Txt, { tone: "secondary", style: styles33.centred, children: blocked && blockedDescription ? blockedDescription : description }),
4216
+ /* @__PURE__ */ jsxs40(View39, { style: styles33.actions, children: [
4217
+ blocked && settingsLabel && onOpenSettings ? /* @__PURE__ */ jsx45(Button, { label: settingsLabel, variant: "primary", onPress: onOpenSettings }) : /* @__PURE__ */ jsx45(Button, { label: allowLabel, variant: "primary", onPress: onAllow }),
4218
+ dismissLabel && onDismiss ? /* @__PURE__ */ jsx45(Button, { label: dismissLabel, variant: "ghost", onPress: onDismiss }) : null
4167
4219
  ] })
4168
4220
  ] });
4169
4221
  }
4170
- var styles31 = StyleSheet31.create({
4171
- root: { alignItems: "center", gap: 10, padding: 24, borderWidth: StyleSheet31.hairlineWidth },
4222
+ var styles33 = StyleSheet33.create({
4223
+ root: { alignItems: "center", gap: 10, padding: 24, borderWidth: StyleSheet33.hairlineWidth },
4172
4224
  centred: { textAlign: "center", maxWidth: 340 },
4173
4225
  actions: { marginTop: 8, gap: 8, alignSelf: "stretch" }
4174
4226
  });
4175
4227
 
4176
4228
  // src/native/phoenix.tsx
4177
4229
  import { useEffect as useEffect19, useState as useState28 } from "react";
4178
- import { AccessibilityInfo as AccessibilityInfo12, Animated as Animated16, Easing as Easing10, View as View38 } from "react-native";
4230
+ import { AccessibilityInfo as AccessibilityInfo12, Animated as Animated16, Easing as Easing10, View as View40 } from "react-native";
4179
4231
  import Svg21, { Circle as Circle13, Defs as Defs12, LinearGradient as LinearGradient12, Path as Path18, RadialGradient as RadialGradient9, Stop as Stop12 } from "react-native-svg";
4180
4232
 
4181
4233
  // src/mascots/phoenix-geometry.ts
@@ -4199,7 +4251,7 @@ var PHOENIX_PALETTES = {
4199
4251
  };
4200
4252
 
4201
4253
  // src/native/phoenix.tsx
4202
- import { jsx as jsx44, jsxs as jsxs39 } from "react/jsx-runtime";
4254
+ import { jsx as jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
4203
4255
  function useFloat(animated) {
4204
4256
  const [y] = useState28(() => new Animated16.Value(0));
4205
4257
  useEffect19(() => {
@@ -4224,37 +4276,37 @@ function Phoenix({ tone: tone3 = "own", size = 120, animated = true, title, styl
4224
4276
  const id = useSvgId("kzp");
4225
4277
  const y = useFloat(animated);
4226
4278
  const p = tone3 === "brand" ? { left: [theme.accent2, theme.accent], right: [theme.accent, theme.accent2], core: ["#ffffff", theme.accent], body: theme.surface3, edge: theme.borderStrong, crest: theme.accent } : PHOENIX_PALETTES.own;
4227
- return /* @__PURE__ */ jsx44(View38, { style: [{ width: size, height: size }, style], ...markA11y(title), children: /* @__PURE__ */ jsx44(Animated16.View, { style: { transform: [{ translateY: y }] }, children: /* @__PURE__ */ jsxs39(Svg21, { width: size, height: size, viewBox: "0 0 120 120", children: [
4228
- /* @__PURE__ */ jsxs39(Defs12, { children: [
4229
- /* @__PURE__ */ jsxs39(LinearGradient12, { id: `${id}l`, x1: "1", y1: "0", x2: "0", y2: "1", children: [
4230
- /* @__PURE__ */ jsx44(Stop12, { offset: "0%", stopColor: p.left[0] }),
4231
- /* @__PURE__ */ jsx44(Stop12, { offset: "100%", stopColor: p.left[1] })
4279
+ return /* @__PURE__ */ jsx46(View40, { style: [{ width: size, height: size }, style], ...markA11y(title), children: /* @__PURE__ */ jsx46(Animated16.View, { style: { transform: [{ translateY: y }] }, children: /* @__PURE__ */ jsxs41(Svg21, { width: size, height: size, viewBox: "0 0 120 120", children: [
4280
+ /* @__PURE__ */ jsxs41(Defs12, { children: [
4281
+ /* @__PURE__ */ jsxs41(LinearGradient12, { id: `${id}l`, x1: "1", y1: "0", x2: "0", y2: "1", children: [
4282
+ /* @__PURE__ */ jsx46(Stop12, { offset: "0%", stopColor: p.left[0] }),
4283
+ /* @__PURE__ */ jsx46(Stop12, { offset: "100%", stopColor: p.left[1] })
4232
4284
  ] }),
4233
- /* @__PURE__ */ jsxs39(LinearGradient12, { id: `${id}r`, x1: "0", y1: "0", x2: "1", y2: "1", children: [
4234
- /* @__PURE__ */ jsx44(Stop12, { offset: "0%", stopColor: p.right[0] }),
4235
- /* @__PURE__ */ jsx44(Stop12, { offset: "100%", stopColor: p.right[1] })
4285
+ /* @__PURE__ */ jsxs41(LinearGradient12, { id: `${id}r`, x1: "0", y1: "0", x2: "1", y2: "1", children: [
4286
+ /* @__PURE__ */ jsx46(Stop12, { offset: "0%", stopColor: p.right[0] }),
4287
+ /* @__PURE__ */ jsx46(Stop12, { offset: "100%", stopColor: p.right[1] })
4236
4288
  ] }),
4237
- /* @__PURE__ */ jsxs39(RadialGradient9, { id: `${id}c`, children: [
4238
- /* @__PURE__ */ jsx44(Stop12, { offset: "0%", stopColor: p.core[0] }),
4239
- /* @__PURE__ */ jsx44(Stop12, { offset: "100%", stopColor: p.core[1], stopOpacity: 0 })
4289
+ /* @__PURE__ */ jsxs41(RadialGradient9, { id: `${id}c`, children: [
4290
+ /* @__PURE__ */ jsx46(Stop12, { offset: "0%", stopColor: p.core[0] }),
4291
+ /* @__PURE__ */ jsx46(Stop12, { offset: "100%", stopColor: p.core[1], stopOpacity: 0 })
4240
4292
  ] })
4241
4293
  ] }),
4242
- /* @__PURE__ */ jsx44(Path18, { d: PHOENIX.wingL, fill: `url(#${id}l)` }),
4243
- /* @__PURE__ */ jsx44(Path18, { d: PHOENIX.wingR, fill: `url(#${id}r)` }),
4244
- /* @__PURE__ */ jsx44(Path18, { d: PHOENIX.tailL, fill: `url(#${id}l)`, opacity: 0.7 }),
4245
- /* @__PURE__ */ jsx44(Path18, { d: PHOENIX.tailR, fill: `url(#${id}r)`, opacity: 0.7 }),
4246
- /* @__PURE__ */ jsx44(Path18, { d: PHOENIX.body, fill: p.body, stroke: p.edge, strokeOpacity: 0.5 }),
4247
- /* @__PURE__ */ jsx44(Circle13, { cx: 60, cy: 58, r: 12, fill: `url(#${id}c)` }),
4248
- /* @__PURE__ */ jsx44(Circle13, { cx: 60, cy: 58, r: 3.5, fill: "#ffffff" }),
4249
- /* @__PURE__ */ jsx44(Path18, { d: PHOENIX.crest, stroke: p.crest, strokeWidth: 2, strokeLinecap: "round" })
4294
+ /* @__PURE__ */ jsx46(Path18, { d: PHOENIX.wingL, fill: `url(#${id}l)` }),
4295
+ /* @__PURE__ */ jsx46(Path18, { d: PHOENIX.wingR, fill: `url(#${id}r)` }),
4296
+ /* @__PURE__ */ jsx46(Path18, { d: PHOENIX.tailL, fill: `url(#${id}l)`, opacity: 0.7 }),
4297
+ /* @__PURE__ */ jsx46(Path18, { d: PHOENIX.tailR, fill: `url(#${id}r)`, opacity: 0.7 }),
4298
+ /* @__PURE__ */ jsx46(Path18, { d: PHOENIX.body, fill: p.body, stroke: p.edge, strokeOpacity: 0.5 }),
4299
+ /* @__PURE__ */ jsx46(Circle13, { cx: 60, cy: 58, r: 12, fill: `url(#${id}c)` }),
4300
+ /* @__PURE__ */ jsx46(Circle13, { cx: 60, cy: 58, r: 3.5, fill: "#ffffff" }),
4301
+ /* @__PURE__ */ jsx46(Path18, { d: PHOENIX.crest, stroke: p.crest, strokeWidth: 2, strokeLinecap: "round" })
4250
4302
  ] }) }) });
4251
4303
  }
4252
4304
 
4253
4305
  // src/native/photo-grid.tsx
4254
4306
  import * as React30 from "react";
4255
- import { Image as Image4, Pressable as Pressable17, StyleSheet as StyleSheet32, View as View39 } from "react-native";
4307
+ import { Image as Image4, Pressable as Pressable17, StyleSheet as StyleSheet34, View as View41 } from "react-native";
4256
4308
  import Svg22, { Path as Path19 } from "react-native-svg";
4257
- import { jsx as jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
4309
+ import { jsx as jsx47, jsxs as jsxs42 } from "react/jsx-runtime";
4258
4310
  function PhotoGrid({ value, onValueChange, onAdd, slots = 6, required = 1, columns = 3, labels, style }) {
4259
4311
  const { theme, radius: radius3, haptic } = useTheme();
4260
4312
  const [menu, setMenu] = React30.useState(null);
@@ -4271,11 +4323,11 @@ function PhotoGrid({ value, onValueChange, onAdd, slots = 6, required = 1, colum
4271
4323
  onValueChange(value.filter((_, j) => j !== i));
4272
4324
  };
4273
4325
  const width = `${100 / columns}%`;
4274
- return /* @__PURE__ */ jsxs40(View39, { style: [styles32.grid, style], children: [
4326
+ return /* @__PURE__ */ jsxs42(View41, { style: [styles34.grid, style], children: [
4275
4327
  Array.from({ length: slots }, (_, i) => {
4276
4328
  const photo = value[i];
4277
- const cell = [styles32.slot, { borderRadius: radius3.lg, aspectRatio: 3 / 4 }];
4278
- return /* @__PURE__ */ jsx45(View39, { style: [styles32.cell, { width }], children: photo ? /* @__PURE__ */ jsxs40(
4329
+ const cell = [styles34.slot, { borderRadius: radius3.lg, aspectRatio: 3 / 4 }];
4330
+ return /* @__PURE__ */ jsx47(View41, { style: [styles34.cell, { width }], children: photo ? /* @__PURE__ */ jsxs42(
4279
4331
  Pressable17,
4280
4332
  {
4281
4333
  role: "button",
@@ -4299,11 +4351,11 @@ function PhotoGrid({ value, onValueChange, onAdd, slots = 6, required = 1, colum
4299
4351
  },
4300
4352
  style: [...cell, { backgroundColor: theme.surface3, overflow: "hidden" }],
4301
4353
  children: [
4302
- /* @__PURE__ */ jsx45(Image4, { source: { uri: photo.uri }, style: StyleSheet32.absoluteFill, resizeMode: "cover" }),
4303
- i === 0 ? /* @__PURE__ */ jsx45(View39, { style: [styles32.main, { backgroundColor: theme.accent, borderRadius: radius3.full }], children: /* @__PURE__ */ jsx45(Txt, { variant: "caption", tone: "onAccent", style: styles32.mainText, children: labels.main }) }) : null
4354
+ /* @__PURE__ */ jsx47(Image4, { source: { uri: photo.uri }, style: StyleSheet34.absoluteFill, resizeMode: "cover" }),
4355
+ i === 0 ? /* @__PURE__ */ jsx47(View41, { style: [styles34.main, { backgroundColor: theme.accent, borderRadius: radius3.full }], children: /* @__PURE__ */ jsx47(Txt, { variant: "caption", tone: "onAccent", style: styles34.mainText, children: labels.main }) }) : null
4304
4356
  ]
4305
4357
  }
4306
- ) : /* @__PURE__ */ jsx45(
4358
+ ) : /* @__PURE__ */ jsx47(
4307
4359
  Pressable17,
4308
4360
  {
4309
4361
  role: "button",
@@ -4312,14 +4364,14 @@ function PhotoGrid({ value, onValueChange, onAdd, slots = 6, required = 1, colum
4312
4364
  onPress: onAdd,
4313
4365
  style: ({ pressed }) => [
4314
4366
  ...cell,
4315
- styles32.empty,
4367
+ styles34.empty,
4316
4368
  { borderColor: i < required ? theme.accent : theme.borderStrong, backgroundColor: pressed ? theme.surface2 : theme.surface1, opacity: i > value.length ? 0.5 : 1 }
4317
4369
  ],
4318
- children: /* @__PURE__ */ jsx45(View39, { style: [styles32.plus, { backgroundColor: i === value.length ? theme.accent : theme.surface3, borderRadius: radius3.full }], children: /* @__PURE__ */ jsx45(Svg22, { width: 16, height: 16, viewBox: "0 0 24 24", "aria-hidden": true, children: /* @__PURE__ */ jsx45(Path19, { d: "M12 5v14M5 12h14", stroke: i === value.length ? theme.onAccent : theme.textSecondary, strokeWidth: 2.6, strokeLinecap: "round" }) }) })
4370
+ children: /* @__PURE__ */ jsx47(View41, { style: [styles34.plus, { backgroundColor: i === value.length ? theme.accent : theme.surface3, borderRadius: radius3.full }], children: /* @__PURE__ */ jsx47(Svg22, { width: 16, height: 16, viewBox: "0 0 24 24", "aria-hidden": true, children: /* @__PURE__ */ jsx47(Path19, { d: "M12 5v14M5 12h14", stroke: i === value.length ? theme.onAccent : theme.textSecondary, strokeWidth: 2.6, strokeLinecap: "round" }) }) })
4319
4371
  }
4320
4372
  ) }, photo?.id ?? `empty-${i}`);
4321
4373
  }),
4322
- /* @__PURE__ */ jsx45(
4374
+ /* @__PURE__ */ jsx47(
4323
4375
  ActionSheet,
4324
4376
  {
4325
4377
  open: menu !== null,
@@ -4335,7 +4387,7 @@ function PhotoGrid({ value, onValueChange, onAdd, slots = 6, required = 1, colum
4335
4387
  )
4336
4388
  ] });
4337
4389
  }
4338
- var styles32 = StyleSheet32.create({
4390
+ var styles34 = StyleSheet34.create({
4339
4391
  grid: { flexDirection: "row", flexWrap: "wrap", marginHorizontal: -4 },
4340
4392
  cell: { padding: 4 },
4341
4393
  slot: { width: "100%" },
@@ -4347,16 +4399,16 @@ var styles32 = StyleSheet32.create({
4347
4399
 
4348
4400
  // src/native/profile-card.tsx
4349
4401
  import * as React31 from "react";
4350
- import { Animated as Animated17, StyleSheet as StyleSheet33, View as View40 } from "react-native";
4351
- import { jsx as jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
4402
+ import { Animated as Animated17, StyleSheet as StyleSheet35, View as View42 } from "react-native";
4403
+ import { jsx as jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
4352
4404
  var ratioOf = (value, max = 100) => Math.min(1, Math.max(0, value / (max || 1)));
4353
4405
  function Bar({ label, ratio, words: words2, animated, delay }) {
4354
4406
  const { theme } = useTheme();
4355
4407
  const t = useEntrance(animated, delay, 900);
4356
4408
  const [width, setWidth] = React31.useState(0);
4357
4409
  const translateX = t.interpolate({ inputRange: [0, 1], outputRange: [-width * ratio, 0] });
4358
- return /* @__PURE__ */ jsx46(
4359
- View40,
4410
+ return /* @__PURE__ */ jsx48(
4411
+ View42,
4360
4412
  {
4361
4413
  accessible: true,
4362
4414
  role: "meter",
@@ -4366,42 +4418,42 @@ function Bar({ label, ratio, words: words2, animated, delay }) {
4366
4418
  "aria-valuenow": Math.round(ratio * 100),
4367
4419
  "aria-valuetext": words2,
4368
4420
  onLayout: (e) => setWidth(e.nativeEvent.layout.width),
4369
- style: [styles33.track, { backgroundColor: theme.surface3 }],
4370
- children: /* @__PURE__ */ jsx46(Animated17.View, { style: [styles33.fill, { width: `${ratio * 100}%`, backgroundColor: theme.accent, transform: [{ translateX }] }] })
4421
+ style: [styles35.track, { backgroundColor: theme.surface3 }],
4422
+ children: /* @__PURE__ */ jsx48(Animated17.View, { style: [styles35.fill, { width: `${ratio * 100}%`, backgroundColor: theme.accent, transform: [{ translateX }] }] })
4371
4423
  }
4372
4424
  );
4373
4425
  }
4374
4426
  function ProfileCard({ visual, name, statLabel, value = 100, valueText, stats, caption, children, animated = true, style, ...props }) {
4375
4427
  const { theme, radius: radius3 } = useTheme();
4376
4428
  const ratio = ratioOf(value);
4377
- return /* @__PURE__ */ jsxs41(View40, { ...props, style: [styles33.root, { backgroundColor: theme.surface1, borderColor: theme.borderSubtle, borderRadius: radius3.xl }, style], children: [
4378
- /* @__PURE__ */ jsx46(View40, { "aria-hidden": true, style: [styles33.disc, { backgroundColor: theme.surface2, borderColor: theme.accentSoft }], children: visual }),
4379
- /* @__PURE__ */ jsxs41(View40, { style: styles33.head, children: [
4380
- /* @__PURE__ */ jsx46(Txt, { variant: "title", style: styles33.name, children: name }),
4381
- statLabel ? /* @__PURE__ */ jsxs41(Txt, { variant: "caption", tone: "secondary", children: [
4429
+ return /* @__PURE__ */ jsxs43(View42, { ...props, style: [styles35.root, { backgroundColor: theme.surface1, borderColor: theme.borderSubtle, borderRadius: radius3.xl }, style], children: [
4430
+ /* @__PURE__ */ jsx48(View42, { "aria-hidden": true, style: [styles35.disc, { backgroundColor: theme.surface2, borderColor: theme.accentSoft }], children: visual }),
4431
+ /* @__PURE__ */ jsxs43(View42, { style: styles35.head, children: [
4432
+ /* @__PURE__ */ jsx48(Txt, { variant: "title", style: styles35.name, children: name }),
4433
+ statLabel ? /* @__PURE__ */ jsxs43(Txt, { variant: "caption", tone: "secondary", children: [
4382
4434
  statLabel,
4383
4435
  " ",
4384
- /* @__PURE__ */ jsx46(Txt, { variant: "caption", children: valueText ?? `${Math.round(ratio * 100)} %` })
4436
+ /* @__PURE__ */ jsx48(Txt, { variant: "caption", children: valueText ?? `${Math.round(ratio * 100)} %` })
4385
4437
  ] }) : null
4386
4438
  ] }),
4387
- statLabel ? /* @__PURE__ */ jsx46(Bar, { label: statLabel, ratio, words: valueText ?? `${Math.round(ratio * 100)} %`, animated, delay: 200 }) : null,
4439
+ statLabel ? /* @__PURE__ */ jsx48(Bar, { label: statLabel, ratio, words: valueText ?? `${Math.round(ratio * 100)} %`, animated, delay: 200 }) : null,
4388
4440
  stats?.map((s, i) => {
4389
4441
  const r = ratioOf(s.value, s.max);
4390
4442
  const words2 = s.valueText ?? `${Math.round(r * 100)} %`;
4391
- return /* @__PURE__ */ jsxs41(View40, { style: styles33.stat, children: [
4392
- /* @__PURE__ */ jsxs41(View40, { "aria-hidden": true, style: styles33.statHead, children: [
4393
- /* @__PURE__ */ jsx46(Txt, { variant: "caption", tone: "secondary", children: s.label }),
4394
- /* @__PURE__ */ jsx46(Txt, { variant: "caption", children: words2 })
4443
+ return /* @__PURE__ */ jsxs43(View42, { style: styles35.stat, children: [
4444
+ /* @__PURE__ */ jsxs43(View42, { "aria-hidden": true, style: styles35.statHead, children: [
4445
+ /* @__PURE__ */ jsx48(Txt, { variant: "caption", tone: "secondary", children: s.label }),
4446
+ /* @__PURE__ */ jsx48(Txt, { variant: "caption", children: words2 })
4395
4447
  ] }),
4396
- /* @__PURE__ */ jsx46(Bar, { label: s.label, ratio: r, words: words2, animated, delay: 320 + i * 120 })
4448
+ /* @__PURE__ */ jsx48(Bar, { label: s.label, ratio: r, words: words2, animated, delay: 320 + i * 120 })
4397
4449
  ] }, s.label);
4398
4450
  }),
4399
- caption ? /* @__PURE__ */ jsx46(Txt, { variant: "caption", tone: "secondary", style: styles33.caption, children: caption }) : null,
4400
- children ? /* @__PURE__ */ jsx46(View40, { style: styles33.extra, children }) : null
4451
+ caption ? /* @__PURE__ */ jsx48(Txt, { variant: "caption", tone: "secondary", style: styles35.caption, children: caption }) : null,
4452
+ children ? /* @__PURE__ */ jsx48(View42, { style: styles35.extra, children }) : null
4401
4453
  ] });
4402
4454
  }
4403
- var styles33 = StyleSheet33.create({
4404
- root: { alignItems: "center", gap: 12, padding: 20, borderWidth: StyleSheet33.hairlineWidth },
4455
+ var styles35 = StyleSheet35.create({
4456
+ root: { alignItems: "center", gap: 12, padding: 20, borderWidth: StyleSheet35.hairlineWidth },
4405
4457
  disc: { width: 104, height: 104, borderRadius: 52, borderWidth: 1, alignItems: "center", justifyContent: "center", overflow: "hidden" },
4406
4458
  head: { flexDirection: "row", alignSelf: "stretch", alignItems: "center", justifyContent: "space-between", gap: 8 },
4407
4459
  name: { flexShrink: 1, fontSize: 17 },
@@ -4415,9 +4467,9 @@ var styles33 = StyleSheet33.create({
4415
4467
 
4416
4468
  // src/native/progress.tsx
4417
4469
  import * as React32 from "react";
4418
- import { Animated as Animated18, Easing as Easing11, StyleSheet as StyleSheet34, View as View41 } from "react-native";
4470
+ import { Animated as Animated18, Easing as Easing11, StyleSheet as StyleSheet36, View as View43 } from "react-native";
4419
4471
  import Svg23, { Circle as Circle14, Defs as Defs13, LinearGradient as LinearGradient13, Rect as Rect4, Stop as Stop13 } from "react-native-svg";
4420
- import { jsx as jsx47, jsxs as jsxs42 } from "react/jsx-runtime";
4472
+ import { jsx as jsx49, jsxs as jsxs44 } from "react/jsx-runtime";
4421
4473
  var AnimatedCircle = Animated18.createAnimatedComponent(Circle14);
4422
4474
  var BAR2 = { sm: 4, md: 8, lg: 12 };
4423
4475
  var RING2 = { sm: 40, md: 80, lg: 144 };
@@ -4459,9 +4511,9 @@ function Progress({ variant = "bar", size = "md", value, max = 100, label, value
4459
4511
  "aria-valuenow": known ? Math.min(max, Math.max(0, value)) : void 0,
4460
4512
  "aria-valuetext": known ? valueText ?? `${percent}%` : valueText
4461
4513
  };
4462
- const gradient = /* @__PURE__ */ jsx47(Defs13, { children: /* @__PURE__ */ jsxs42(LinearGradient13, { id, x1: "0", y1: "0", x2: "1", y2: variant === "ring" ? "1" : "0", children: [
4463
- /* @__PURE__ */ jsx47(Stop13, { offset: "0", stopColor: theme.accent }),
4464
- /* @__PURE__ */ jsx47(Stop13, { offset: "1", stopColor: theme.accent2 })
4514
+ const gradient = /* @__PURE__ */ jsx49(Defs13, { children: /* @__PURE__ */ jsxs44(LinearGradient13, { id, x1: "0", y1: "0", x2: "1", y2: variant === "ring" ? "1" : "0", children: [
4515
+ /* @__PURE__ */ jsx49(Stop13, { offset: "0", stopColor: theme.accent }),
4516
+ /* @__PURE__ */ jsx49(Stop13, { offset: "1", stopColor: theme.accent2 })
4465
4517
  ] }) });
4466
4518
  if (variant === "ring") {
4467
4519
  const side = RING2[size];
@@ -4470,11 +4522,11 @@ function Progress({ variant = "bar", size = "md", value, max = 100, label, value
4470
4522
  const circumference = 2 * Math.PI * r;
4471
4523
  const offset = known ? progress.interpolate({ inputRange: [0, 1], outputRange: [circumference, 0] }) : circumference * 0.75;
4472
4524
  const rotate = spin.interpolate({ inputRange: [0, 1], outputRange: ["0deg", "360deg"] });
4473
- return /* @__PURE__ */ jsxs42(View41, { ...a11y, style: [styles34.ring, { width: side, height: side }, style], children: [
4474
- /* @__PURE__ */ jsx47(Animated18.View, { style: [StyleSheet34.absoluteFill, { transform: [{ rotate: known ? "-90deg" : rotate }] }], children: /* @__PURE__ */ jsxs42(Svg23, { width: side, height: side, viewBox: "0 0 100 100", children: [
4525
+ return /* @__PURE__ */ jsxs44(View43, { ...a11y, style: [styles36.ring, { width: side, height: side }, style], children: [
4526
+ /* @__PURE__ */ jsx49(Animated18.View, { style: [StyleSheet36.absoluteFill, { transform: [{ rotate: known ? "-90deg" : rotate }] }], children: /* @__PURE__ */ jsxs44(Svg23, { width: side, height: side, viewBox: "0 0 100 100", children: [
4475
4527
  gradient,
4476
- /* @__PURE__ */ jsx47(Circle14, { cx: 50, cy: 50, r, fill: "none", stroke: theme.borderDefault, strokeWidth: stroke }),
4477
- /* @__PURE__ */ jsx47(
4528
+ /* @__PURE__ */ jsx49(Circle14, { cx: 50, cy: 50, r, fill: "none", stroke: theme.borderDefault, strokeWidth: stroke }),
4529
+ /* @__PURE__ */ jsx49(
4478
4530
  AnimatedCircle,
4479
4531
  {
4480
4532
  cx: 50,
@@ -4494,20 +4546,20 @@ function Progress({ variant = "bar", size = "md", value, max = 100, label, value
4494
4546
  }
4495
4547
  const width = known ? progress.interpolate({ inputRange: [0, 1], outputRange: ["0%", "100%"] }) : "40%";
4496
4548
  const translate = spin.interpolate({ inputRange: [0, 1], outputRange: [-0.4 * track, track] });
4497
- return /* @__PURE__ */ jsx47(
4498
- View41,
4549
+ return /* @__PURE__ */ jsx49(
4550
+ View43,
4499
4551
  {
4500
4552
  ...a11y,
4501
4553
  onLayout: known ? void 0 : (event) => setTrack(event.nativeEvent.layout.width),
4502
- style: [styles34.bar, { height: BAR2[size], backgroundColor: theme.surface3 }, style],
4503
- children: /* @__PURE__ */ jsx47(Animated18.View, { style: [styles34.fill, { width }, known || reduce ? null : { transform: [{ translateX: translate }] }], children: /* @__PURE__ */ jsxs42(Svg23, { width: "100%", height: "100%", preserveAspectRatio: "none", children: [
4554
+ style: [styles36.bar, { height: BAR2[size], backgroundColor: theme.surface3 }, style],
4555
+ children: /* @__PURE__ */ jsx49(Animated18.View, { style: [styles36.fill, { width }, known || reduce ? null : { transform: [{ translateX: translate }] }], children: /* @__PURE__ */ jsxs44(Svg23, { width: "100%", height: "100%", preserveAspectRatio: "none", children: [
4504
4556
  gradient,
4505
- /* @__PURE__ */ jsx47(Rect4, { x: 0, y: 0, width: "100%", height: "100%", fill: `url(#${id})` })
4557
+ /* @__PURE__ */ jsx49(Rect4, { x: 0, y: 0, width: "100%", height: "100%", fill: `url(#${id})` })
4506
4558
  ] }) })
4507
4559
  }
4508
4560
  );
4509
4561
  }
4510
- var styles34 = StyleSheet34.create({
4562
+ var styles36 = StyleSheet36.create({
4511
4563
  ring: { alignItems: "center", justifyContent: "center" },
4512
4564
  bar: { width: "100%", overflow: "hidden", borderRadius: 9999 },
4513
4565
  fill: { height: "100%", overflow: "hidden", borderRadius: 9999 }
@@ -4515,11 +4567,11 @@ var styles34 = StyleSheet34.create({
4515
4567
 
4516
4568
  // src/native/pull-to-refresh.tsx
4517
4569
  import * as React33 from "react";
4518
- import { AccessibilityInfo as AccessibilityInfo13, Animated as Animated19, RefreshControl, StyleSheet as StyleSheet35, View as View42 } from "react-native";
4519
- import { jsx as jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
4570
+ import { AccessibilityInfo as AccessibilityInfo13, Animated as Animated19, RefreshControl, StyleSheet as StyleSheet37, View as View44 } from "react-native";
4571
+ import { jsx as jsx50, jsxs as jsxs45 } from "react/jsx-runtime";
4520
4572
  function PullToRefresh({ label, ...props }) {
4521
4573
  const { theme } = useTheme();
4522
- return /* @__PURE__ */ jsx48(RefreshControl, { ...props, tintColor: theme.accent, colors: [theme.accent], progressBackgroundColor: theme.surface2, title: label, titleColor: theme.textSecondary });
4574
+ return /* @__PURE__ */ jsx50(RefreshControl, { ...props, tintColor: theme.accent, colors: [theme.accent], progressBackgroundColor: theme.surface2, title: label, titleColor: theme.textSecondary });
4523
4575
  }
4524
4576
  var pullProgress = (offset, threshold) => Math.min(1, Math.max(0, -offset / threshold));
4525
4577
  function BrandedRefresh({ product, refreshing, onRefresh, label, children, threshold = 72 }) {
@@ -4536,28 +4588,28 @@ function BrandedRefresh({ product, refreshing, onRefresh, label, children, thres
4536
4588
  const shown = refreshing ? 1 : pull;
4537
4589
  const scale = refreshing || reduce ? 1 : pull.interpolate({ inputRange: [0, 1], outputRange: [0.4, 1] });
4538
4590
  const rotate = refreshing || reduce ? "0deg" : pull.interpolate({ inputRange: [0, 1], outputRange: ["-90deg", "0deg"] });
4539
- return /* @__PURE__ */ jsxs43(View42, { style: styles35.root, children: [
4591
+ return /* @__PURE__ */ jsxs45(View44, { style: styles37.root, children: [
4540
4592
  children({
4541
4593
  // The platform's control does the gesture and the haptics, drawn transparent: the mark is ours.
4542
- refreshControl: /* @__PURE__ */ jsx48(RefreshControl, { refreshing, onRefresh, tintColor: "transparent", colors: ["transparent"], progressBackgroundColor: "transparent" }),
4594
+ refreshControl: /* @__PURE__ */ jsx50(RefreshControl, { refreshing, onRefresh, tintColor: "transparent", colors: ["transparent"], progressBackgroundColor: "transparent" }),
4543
4595
  onScroll,
4544
4596
  scrollEventThrottle: 16
4545
4597
  }),
4546
- /* @__PURE__ */ jsx48(Animated19.View, { pointerEvents: "none", "aria-hidden": true, style: [styles35.mark, { opacity: shown, transform: [{ scale }, { rotate }] }], children: /* @__PURE__ */ jsx48(ProductMark, { id: product, size: 32, animated: refreshing, neutral: theme.textMuted }) })
4598
+ /* @__PURE__ */ jsx50(Animated19.View, { pointerEvents: "none", "aria-hidden": true, style: [styles37.mark, { opacity: shown, transform: [{ scale }, { rotate }] }], children: /* @__PURE__ */ jsx50(ProductMark, { id: product, size: 32, animated: refreshing, neutral: theme.textMuted }) })
4547
4599
  ] });
4548
4600
  }
4549
- var styles35 = StyleSheet35.create({
4601
+ var styles37 = StyleSheet37.create({
4550
4602
  root: { flex: 1 },
4551
4603
  mark: { position: "absolute", top: 12, left: 0, right: 0, alignItems: "center" }
4552
4604
  });
4553
4605
 
4554
4606
  // src/native/radio-group.tsx
4555
4607
  import * as React34 from "react";
4556
- import { Animated as Animated20, Pressable as Pressable18, StyleSheet as StyleSheet36, Text as Text15, View as View43 } from "react-native";
4608
+ import { Animated as Animated20, Pressable as Pressable18, StyleSheet as StyleSheet38, Text as Text15, View as View45 } from "react-native";
4557
4609
  import Svg24, { Path as Path20 } from "react-native-svg";
4558
- import { jsx as jsx49, jsxs as jsxs44 } from "react/jsx-runtime";
4610
+ import { jsx as jsx51, jsxs as jsxs46 } from "react/jsx-runtime";
4559
4611
  function Check({ color }) {
4560
- return /* @__PURE__ */ jsx49(Svg24, { width: 12, height: 12, viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: 3.2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: /* @__PURE__ */ jsx49(Path20, { d: "M20 6 9 17l-5-5" }) });
4612
+ return /* @__PURE__ */ jsx51(Svg24, { width: 12, height: 12, viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: 3.2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: /* @__PURE__ */ jsx51(Path20, { d: "M20 6 9 17l-5-5" }) });
4561
4613
  }
4562
4614
  function Key({ option, checked, disabled, onPress }) {
4563
4615
  const { theme, radius: radius3, motion: motion3 } = useTheme();
@@ -4567,7 +4619,7 @@ function Key({ option, checked, disabled, onPress }) {
4567
4619
  React34.useEffect(() => {
4568
4620
  Animated20.timing(sink, { toValue: down ? 1 : 0, duration: motion3.duration.fast, useNativeDriver: true }).start();
4569
4621
  }, [down, sink, motion3.duration.fast]);
4570
- return /* @__PURE__ */ jsxs44(
4622
+ return /* @__PURE__ */ jsxs46(
4571
4623
  Pressable18,
4572
4624
  {
4573
4625
  role: "radio",
@@ -4578,14 +4630,14 @@ function Key({ option, checked, disabled, onPress }) {
4578
4630
  onPress,
4579
4631
  onPressIn: () => setHeld(true),
4580
4632
  onPressOut: () => setHeld(false),
4581
- style: [styles36.keySlot, disabled ? styles36.disabled : null],
4633
+ style: [styles38.keySlot, disabled ? styles38.disabled : null],
4582
4634
  children: [
4583
- /* @__PURE__ */ jsx49(View43, { style: [styles36.ledge, { borderRadius: radius3.lg, backgroundColor: checked ? theme.accentHover : theme.borderStrong }] }),
4584
- /* @__PURE__ */ jsxs44(
4635
+ /* @__PURE__ */ jsx51(View45, { style: [styles38.ledge, { borderRadius: radius3.lg, backgroundColor: checked ? theme.accentHover : theme.borderStrong }] }),
4636
+ /* @__PURE__ */ jsxs46(
4585
4637
  Animated20.View,
4586
4638
  {
4587
4639
  style: [
4588
- styles36.key,
4640
+ styles38.key,
4589
4641
  {
4590
4642
  borderRadius: radius3.lg,
4591
4643
  backgroundColor: checked ? theme.accent : theme.surface2,
@@ -4594,8 +4646,8 @@ function Key({ option, checked, disabled, onPress }) {
4594
4646
  }
4595
4647
  ],
4596
4648
  children: [
4597
- /* @__PURE__ */ jsx49(Text15, { style: [styles36.keyLabel, { color: checked ? theme.onAccent : theme.textPrimary }], children: option.label }),
4598
- option.hint ? /* @__PURE__ */ jsx49(Text15, { style: [styles36.keyHint, { color: checked ? theme.onAccent : theme.textSecondary }], children: option.hint }) : null
4649
+ /* @__PURE__ */ jsx51(Text15, { style: [styles38.keyLabel, { color: checked ? theme.onAccent : theme.textPrimary }], children: option.label }),
4650
+ option.hint ? /* @__PURE__ */ jsx51(Text15, { style: [styles38.keyHint, { color: checked ? theme.onAccent : theme.textSecondary }], children: option.hint }) : null
4599
4651
  ]
4600
4652
  }
4601
4653
  )
@@ -4616,9 +4668,9 @@ function RadioGroup({ label, options, value: valueProp, defaultValue = null, onV
4616
4668
  const checked = o.value === value;
4617
4669
  const off = Boolean(disabled || o.disabled);
4618
4670
  const name = o.description ? `${o.label}, ${o.description}` : o.label;
4619
- if (variant === "buttons") return /* @__PURE__ */ jsx49(Key, { option: o, checked, disabled: off, onPress: () => pick(o.value) }, o.value);
4671
+ if (variant === "buttons") return /* @__PURE__ */ jsx51(Key, { option: o, checked, disabled: off, onPress: () => pick(o.value) }, o.value);
4620
4672
  if (variant === "segmented")
4621
- return /* @__PURE__ */ jsx49(
4673
+ return /* @__PURE__ */ jsx51(
4622
4674
  Pressable18,
4623
4675
  {
4624
4676
  role: "radio",
@@ -4627,13 +4679,13 @@ function RadioGroup({ label, options, value: valueProp, defaultValue = null, onV
4627
4679
  "aria-disabled": off || void 0,
4628
4680
  disabled: off,
4629
4681
  onPress: () => pick(o.value),
4630
- style: [styles36.segment, { borderRadius: radius3.md }, checked ? { backgroundColor: theme.surface0, borderColor: theme.borderDefault } : null, off ? styles36.disabled : null],
4631
- children: /* @__PURE__ */ jsx49(Text15, { numberOfLines: 1, style: [styles36.segmentLabel, { color: checked ? theme.textPrimary : theme.textSecondary }], children: o.label })
4682
+ style: [styles38.segment, { borderRadius: radius3.md }, checked ? { backgroundColor: theme.surface0, borderColor: theme.borderDefault } : null, off ? styles38.disabled : null],
4683
+ children: /* @__PURE__ */ jsx51(Text15, { numberOfLines: 1, style: [styles38.segmentLabel, { color: checked ? theme.textPrimary : theme.textSecondary }], children: o.label })
4632
4684
  },
4633
4685
  o.value
4634
4686
  );
4635
4687
  if (variant === "cards")
4636
- return /* @__PURE__ */ jsxs44(
4688
+ return /* @__PURE__ */ jsxs46(
4637
4689
  Pressable18,
4638
4690
  {
4639
4691
  role: "radio",
@@ -4643,40 +4695,40 @@ function RadioGroup({ label, options, value: valueProp, defaultValue = null, onV
4643
4695
  disabled: off,
4644
4696
  onPress: () => pick(o.value),
4645
4697
  style: ({ pressed }) => [
4646
- styles36.card,
4698
+ styles38.card,
4647
4699
  { borderRadius: radius3.xl, backgroundColor: checked ? theme.accentSoft : theme.surface1, borderColor: checked ? theme.accent : theme.borderDefault, transform: [{ scale: pressed ? 0.98 : 1 }] },
4648
- off ? styles36.disabled : null
4700
+ off ? styles38.disabled : null
4649
4701
  ],
4650
4702
  children: [
4651
- /* @__PURE__ */ jsx49(View43, { style: [styles36.cardCheck, { borderColor: checked ? theme.accent : theme.borderStrong, backgroundColor: checked ? theme.accent : theme.surface1 }], children: checked ? /* @__PURE__ */ jsx49(Check, { color: theme.onAccent }) : null }),
4652
- /* @__PURE__ */ jsx49(Text15, { style: [styles36.cardLabel, { color: theme.textPrimary }], children: o.label }),
4653
- o.description ? /* @__PURE__ */ jsx49(Text15, { style: [styles36.cardDescription, { color: theme.textSecondary }], children: o.description }) : null
4703
+ /* @__PURE__ */ jsx51(View45, { style: [styles38.cardCheck, { borderColor: checked ? theme.accent : theme.borderStrong, backgroundColor: checked ? theme.accent : theme.surface1 }], children: checked ? /* @__PURE__ */ jsx51(Check, { color: theme.onAccent }) : null }),
4704
+ /* @__PURE__ */ jsx51(Text15, { style: [styles38.cardLabel, { color: theme.textPrimary }], children: o.label }),
4705
+ o.description ? /* @__PURE__ */ jsx51(Text15, { style: [styles38.cardDescription, { color: theme.textSecondary }], children: o.description }) : null
4654
4706
  ]
4655
4707
  },
4656
4708
  o.value
4657
4709
  );
4658
- return /* @__PURE__ */ jsxs44(Pressable18, { role: "radio", "aria-checked": checked, "aria-label": name, "aria-disabled": off || void 0, disabled: off, onPress: () => pick(o.value), style: [styles36.row, off ? styles36.disabled : null], children: [
4659
- /* @__PURE__ */ jsx49(View43, { style: [styles36.dot, { borderColor: checked ? theme.accent : theme.borderStrong, backgroundColor: checked ? theme.accent : theme.surface1 }], children: checked ? /* @__PURE__ */ jsx49(View43, { style: [styles36.dotIn, { backgroundColor: theme.onAccent }] }) : null }),
4660
- /* @__PURE__ */ jsxs44(View43, { style: styles36.rowText, children: [
4661
- /* @__PURE__ */ jsx49(Text15, { style: [styles36.rowLabel, { color: theme.textPrimary }], children: o.label }),
4662
- o.description ? /* @__PURE__ */ jsx49(Text15, { style: [styles36.cardDescription, { color: theme.textSecondary }], children: o.description }) : null
4710
+ return /* @__PURE__ */ jsxs46(Pressable18, { role: "radio", "aria-checked": checked, "aria-label": name, "aria-disabled": off || void 0, disabled: off, onPress: () => pick(o.value), style: [styles38.row, off ? styles38.disabled : null], children: [
4711
+ /* @__PURE__ */ jsx51(View45, { style: [styles38.dot, { borderColor: checked ? theme.accent : theme.borderStrong, backgroundColor: checked ? theme.accent : theme.surface1 }], children: checked ? /* @__PURE__ */ jsx51(View45, { style: [styles38.dotIn, { backgroundColor: theme.onAccent }] }) : null }),
4712
+ /* @__PURE__ */ jsxs46(View45, { style: styles38.rowText, children: [
4713
+ /* @__PURE__ */ jsx51(Text15, { style: [styles38.rowLabel, { color: theme.textPrimary }], children: o.label }),
4714
+ o.description ? /* @__PURE__ */ jsx51(Text15, { style: [styles38.cardDescription, { color: theme.textSecondary }], children: o.description }) : null
4663
4715
  ] })
4664
4716
  ] }, o.value);
4665
4717
  });
4666
- return /* @__PURE__ */ jsxs44(View43, { style: [styles36.root, style], children: [
4667
- /* @__PURE__ */ jsx49(
4668
- View43,
4718
+ return /* @__PURE__ */ jsxs46(View45, { style: [styles38.root, style], children: [
4719
+ /* @__PURE__ */ jsx51(
4720
+ View45,
4669
4721
  {
4670
4722
  role: "radiogroup",
4671
4723
  "aria-label": label,
4672
- style: variant === "segmented" ? [styles36.track, { borderRadius: radius3.lg, backgroundColor: theme.surface2, borderColor: error ? theme.danger : theme.borderDefault }] : variant === "buttons" ? styles36.keys : variant === "cards" ? styles36.cards : styles36.list,
4724
+ style: variant === "segmented" ? [styles38.track, { borderRadius: radius3.lg, backgroundColor: theme.surface2, borderColor: error ? theme.danger : theme.borderDefault }] : variant === "buttons" ? styles38.keys : variant === "cards" ? styles38.cards : styles38.list,
4673
4725
  children: body
4674
4726
  }
4675
4727
  ),
4676
- error ? /* @__PURE__ */ jsx49(Text15, { role: "alert", "aria-live": "polite", style: [styles36.error, { color: theme.dangerText }], children: error }) : null
4728
+ error ? /* @__PURE__ */ jsx51(Text15, { role: "alert", "aria-live": "polite", style: [styles38.error, { color: theme.dangerText }], children: error }) : null
4677
4729
  ] });
4678
4730
  }
4679
- var styles36 = StyleSheet36.create({
4731
+ var styles38 = StyleSheet38.create({
4680
4732
  root: { gap: 6, alignSelf: "stretch" },
4681
4733
  list: { gap: 2 },
4682
4734
  row: { flexDirection: "row", alignItems: "center", gap: 12, minHeight: 44 },
@@ -4695,34 +4747,34 @@ var styles36 = StyleSheet36.create({
4695
4747
  key: { minHeight: 48, paddingHorizontal: 16, paddingVertical: 8, alignItems: "center", justifyContent: "center", gap: 1, borderWidth: 1 },
4696
4748
  keyLabel: { fontSize: 15, fontWeight: "700" },
4697
4749
  keyHint: { fontSize: 11, fontWeight: "500" },
4698
- track: { flexDirection: "row", padding: 3, gap: 3, borderWidth: StyleSheet36.hairlineWidth, height: 42 },
4699
- segment: { flex: 1, alignItems: "center", justifyContent: "center", paddingHorizontal: 8, borderWidth: StyleSheet36.hairlineWidth, borderColor: "transparent" },
4750
+ track: { flexDirection: "row", padding: 3, gap: 3, borderWidth: StyleSheet38.hairlineWidth, height: 42 },
4751
+ segment: { flex: 1, alignItems: "center", justifyContent: "center", paddingHorizontal: 8, borderWidth: StyleSheet38.hairlineWidth, borderColor: "transparent" },
4700
4752
  segmentLabel: { fontSize: 13, fontWeight: "600" },
4701
4753
  error: { fontSize: 12, lineHeight: 16 },
4702
4754
  disabled: { opacity: 0.4 }
4703
4755
  });
4704
4756
 
4705
4757
  // src/native/screen.tsx
4706
- import { KeyboardAvoidingView, Platform as Platform3, ScrollView as ScrollView6, StyleSheet as StyleSheet37, View as View44 } from "react-native";
4707
- import { Fragment as Fragment7, jsx as jsx50, jsxs as jsxs45 } from "react/jsx-runtime";
4758
+ import { KeyboardAvoidingView, Platform as Platform3, ScrollView as ScrollView6, StyleSheet as StyleSheet39, View as View46 } from "react-native";
4759
+ import { Fragment as Fragment7, jsx as jsx52, jsxs as jsxs47 } from "react/jsx-runtime";
4708
4760
  function Screen({ header, footer, children, scroll = true, keyboard = true, padding = 16, surface = "surface0", contentStyle }) {
4709
4761
  const { theme, insets } = useTheme();
4710
- const body = scroll ? /* @__PURE__ */ jsx50(ScrollView6, { style: styles37.flex, contentContainerStyle: [{ padding, paddingTop: header ? padding : padding + insets.top, gap: 16 }, contentStyle], keyboardShouldPersistTaps: "handled", tabIndex: 0, children }) : /* @__PURE__ */ jsx50(View44, { style: [styles37.flex, { paddingTop: header ? 0 : insets.top }, contentStyle], children });
4711
- const inner = /* @__PURE__ */ jsxs45(Fragment7, { children: [
4762
+ const body = scroll ? /* @__PURE__ */ jsx52(ScrollView6, { style: styles39.flex, contentContainerStyle: [{ padding, paddingTop: header ? padding : padding + insets.top, gap: 16 }, contentStyle], keyboardShouldPersistTaps: "handled", tabIndex: 0, children }) : /* @__PURE__ */ jsx52(View46, { style: [styles39.flex, { paddingTop: header ? 0 : insets.top }, contentStyle], children });
4763
+ const inner = /* @__PURE__ */ jsxs47(Fragment7, { children: [
4712
4764
  header,
4713
4765
  body,
4714
4766
  footer
4715
4767
  ] });
4716
- return /* @__PURE__ */ jsx50(View44, { style: [styles37.flex, { backgroundColor: theme[surface] }], children: keyboard ? /* @__PURE__ */ jsx50(KeyboardAvoidingView, { style: styles37.flex, behavior: Platform3.OS === "ios" ? "padding" : void 0, children: inner }) : inner });
4768
+ return /* @__PURE__ */ jsx52(View46, { style: [styles39.flex, { backgroundColor: theme[surface] }], children: keyboard ? /* @__PURE__ */ jsx52(KeyboardAvoidingView, { style: styles39.flex, behavior: Platform3.OS === "ios" ? "padding" : void 0, children: inner }) : inner });
4717
4769
  }
4718
- var styles37 = StyleSheet37.create({ flex: { flex: 1 } });
4770
+ var styles39 = StyleSheet39.create({ flex: { flex: 1 } });
4719
4771
 
4720
4772
  // src/native/search-field.tsx
4721
4773
  import { useDebouncedCallback } from "@krizaka/pacer/react";
4722
4774
  import * as React35 from "react";
4723
- import { Pressable as Pressable19, StyleSheet as StyleSheet38, TextInput as TextInput6, View as View45 } from "react-native";
4775
+ import { Pressable as Pressable19, StyleSheet as StyleSheet40, TextInput as TextInput6, View as View47 } from "react-native";
4724
4776
  import Svg25, { Circle as Circle15, Path as Path21 } from "react-native-svg";
4725
- import { jsx as jsx51, jsxs as jsxs46 } from "react/jsx-runtime";
4777
+ import { jsx as jsx53, jsxs as jsxs48 } from "react/jsx-runtime";
4726
4778
  function SearchField({ label, value, defaultValue = "", onValueChange, onSearch, debounce = 300, onSubmit, clearLabel, cancelLabel, onCancel, style, placeholder, onFocus, onBlur, ...props }) {
4727
4779
  const [focused, setFocused] = React35.useState(false);
4728
4780
  const input = React35.useRef(null);
@@ -4736,12 +4788,12 @@ function SearchField({ label, value, defaultValue = "", onValueChange, onSearch,
4736
4788
  search.cancel();
4737
4789
  if (onSearch) search(next);
4738
4790
  };
4739
- const field = /* @__PURE__ */ jsxs46(View45, { style: [styles38.frame, { borderRadius: radius3.md, borderColor: theme.borderDefault, backgroundColor: theme.surface2 }, style], children: [
4740
- /* @__PURE__ */ jsxs46(Svg25, { width: 18, height: 18, viewBox: "0 0 24 24", fill: "none", stroke: theme.textSecondary, strokeWidth: 2, strokeLinecap: "round", "aria-hidden": true, children: [
4741
- /* @__PURE__ */ jsx51(Circle15, { cx: 11, cy: 11, r: 7 }),
4742
- /* @__PURE__ */ jsx51(Path21, { d: "m20 20-3.5-3.5" })
4791
+ const field = /* @__PURE__ */ jsxs48(View47, { style: [styles40.frame, { borderRadius: radius3.md, borderColor: theme.borderDefault, backgroundColor: theme.surface2 }, style], children: [
4792
+ /* @__PURE__ */ jsxs48(Svg25, { width: 18, height: 18, viewBox: "0 0 24 24", fill: "none", stroke: theme.textSecondary, strokeWidth: 2, strokeLinecap: "round", "aria-hidden": true, children: [
4793
+ /* @__PURE__ */ jsx53(Circle15, { cx: 11, cy: 11, r: 7 }),
4794
+ /* @__PURE__ */ jsx53(Path21, { d: "m20 20-3.5-3.5" })
4743
4795
  ] }),
4744
- /* @__PURE__ */ jsx51(
4796
+ /* @__PURE__ */ jsx53(
4745
4797
  TextInput6,
4746
4798
  {
4747
4799
  ref: input,
@@ -4760,7 +4812,7 @@ function SearchField({ label, value, defaultValue = "", onValueChange, onSearch,
4760
4812
  onSearch?.(query);
4761
4813
  onSubmit?.(query);
4762
4814
  },
4763
- style: [styles38.input, { color: theme.textPrimary }],
4815
+ style: [styles40.input, { color: theme.textPrimary }],
4764
4816
  onFocus: (e) => {
4765
4817
  setFocused(true);
4766
4818
  onFocus?.(e);
@@ -4772,12 +4824,12 @@ function SearchField({ label, value, defaultValue = "", onValueChange, onSearch,
4772
4824
  ...props
4773
4825
  }
4774
4826
  ),
4775
- query ? /* @__PURE__ */ jsx51(Pressable19, { role: "button", "aria-label": clearLabel, hitSlop: 10, onPress: () => change(""), style: styles38.clear, children: /* @__PURE__ */ jsx51(Svg25, { width: 16, height: 16, viewBox: "0 0 24 24", fill: "none", stroke: theme.textSecondary, strokeWidth: 2.4, strokeLinecap: "round", "aria-hidden": true, children: /* @__PURE__ */ jsx51(Path21, { d: "M18 6 6 18M6 6l12 12" }) }) }) : null
4827
+ query ? /* @__PURE__ */ jsx53(Pressable19, { role: "button", "aria-label": clearLabel, hitSlop: 10, onPress: () => change(""), style: styles40.clear, children: /* @__PURE__ */ jsx53(Svg25, { width: 16, height: 16, viewBox: "0 0 24 24", fill: "none", stroke: theme.textSecondary, strokeWidth: 2.4, strokeLinecap: "round", "aria-hidden": true, children: /* @__PURE__ */ jsx53(Path21, { d: "M18 6 6 18M6 6l12 12" }) }) }) : null
4776
4828
  ] });
4777
4829
  if (!cancelLabel || !onCancel) return field;
4778
- return /* @__PURE__ */ jsxs46(View45, { style: styles38.bar, children: [
4779
- /* @__PURE__ */ jsx51(View45, { style: styles38.grow, children: field }),
4780
- focused || query ? /* @__PURE__ */ jsx51(
4830
+ return /* @__PURE__ */ jsxs48(View47, { style: styles40.bar, children: [
4831
+ /* @__PURE__ */ jsx53(View47, { style: styles40.grow, children: field }),
4832
+ focused || query ? /* @__PURE__ */ jsx53(
4781
4833
  Pressable19,
4782
4834
  {
4783
4835
  role: "button",
@@ -4787,14 +4839,14 @@ function SearchField({ label, value, defaultValue = "", onValueChange, onSearch,
4787
4839
  onCancel();
4788
4840
  },
4789
4841
  hitSlop: 8,
4790
- style: styles38.cancel,
4791
- children: /* @__PURE__ */ jsx51(Txt, { variant: "label", tone: "accent", children: cancelLabel })
4842
+ style: styles40.cancel,
4843
+ children: /* @__PURE__ */ jsx53(Txt, { variant: "label", tone: "accent", children: cancelLabel })
4792
4844
  }
4793
4845
  ) : null
4794
4846
  ] });
4795
4847
  }
4796
- var styles38 = StyleSheet38.create({
4797
- frame: { flexDirection: "row", alignItems: "center", gap: 8, height: 44, paddingLeft: 12, paddingRight: 6, borderWidth: StyleSheet38.hairlineWidth },
4848
+ var styles40 = StyleSheet40.create({
4849
+ frame: { flexDirection: "row", alignItems: "center", gap: 8, height: 44, paddingLeft: 12, paddingRight: 6, borderWidth: StyleSheet40.hairlineWidth },
4798
4850
  input: { flex: 1, height: "100%", fontSize: 15, paddingVertical: 0 },
4799
4851
  bar: { flexDirection: "row", alignItems: "center", gap: 10 },
4800
4852
  grow: { flex: 1 },
@@ -4803,19 +4855,19 @@ var styles38 = StyleSheet38.create({
4803
4855
  });
4804
4856
 
4805
4857
  // src/native/segmented.tsx
4806
- import { Pressable as Pressable20, StyleSheet as StyleSheet39, Text as Text16, View as View46 } from "react-native";
4807
- import { jsx as jsx52 } from "react/jsx-runtime";
4858
+ import { Pressable as Pressable20, StyleSheet as StyleSheet41, Text as Text16, View as View48 } from "react-native";
4859
+ import { jsx as jsx54 } from "react/jsx-runtime";
4808
4860
  function Segmented({ options, value, onValueChange, size = "md", "aria-label": label, style }) {
4809
4861
  const { theme, radius: radius3 } = useTheme();
4810
- return /* @__PURE__ */ jsx52(
4811
- View46,
4862
+ return /* @__PURE__ */ jsx54(
4863
+ View48,
4812
4864
  {
4813
4865
  role: "tablist",
4814
4866
  "aria-label": label,
4815
- style: [styles39.track, { backgroundColor: theme.surface2, borderColor: theme.borderSubtle, borderRadius: radius3.md, height: size === "sm" ? 32 : 40 }, style],
4867
+ style: [styles41.track, { backgroundColor: theme.surface2, borderColor: theme.borderSubtle, borderRadius: radius3.md, height: size === "sm" ? 32 : 40 }, style],
4816
4868
  children: options.map((option) => {
4817
4869
  const selected = option.value === value;
4818
- return /* @__PURE__ */ jsx52(
4870
+ return /* @__PURE__ */ jsx54(
4819
4871
  Pressable20,
4820
4872
  {
4821
4873
  role: "tab",
@@ -4826,12 +4878,12 @@ function Segmented({ options, value, onValueChange, size = "md", "aria-label": l
4826
4878
  if (!selected) onValueChange(option.value);
4827
4879
  },
4828
4880
  style: [
4829
- styles39.segment,
4881
+ styles41.segment,
4830
4882
  { borderRadius: radius3.sm },
4831
4883
  selected ? { backgroundColor: theme.surface0, borderColor: theme.borderDefault } : null,
4832
- option.disabled ? styles39.disabled : null
4884
+ option.disabled ? styles41.disabled : null
4833
4885
  ],
4834
- children: /* @__PURE__ */ jsx52(Text16, { numberOfLines: 1, style: [styles39.label, { color: selected ? theme.textPrimary : theme.textSecondary, fontSize: size === "sm" ? 12 : 13 }], children: option.label })
4886
+ children: /* @__PURE__ */ jsx54(Text16, { numberOfLines: 1, style: [styles41.label, { color: selected ? theme.textPrimary : theme.textSecondary, fontSize: size === "sm" ? 12 : 13 }], children: option.label })
4835
4887
  },
4836
4888
  option.value
4837
4889
  );
@@ -4839,18 +4891,18 @@ function Segmented({ options, value, onValueChange, size = "md", "aria-label": l
4839
4891
  }
4840
4892
  );
4841
4893
  }
4842
- var styles39 = StyleSheet39.create({
4843
- track: { flexDirection: "row", padding: 3, gap: 3, borderWidth: StyleSheet39.hairlineWidth },
4844
- segment: { flex: 1, alignItems: "center", justifyContent: "center", paddingHorizontal: 8, borderWidth: StyleSheet39.hairlineWidth, borderColor: "transparent" },
4894
+ var styles41 = StyleSheet41.create({
4895
+ track: { flexDirection: "row", padding: 3, gap: 3, borderWidth: StyleSheet41.hairlineWidth },
4896
+ segment: { flex: 1, alignItems: "center", justifyContent: "center", paddingHorizontal: 8, borderWidth: StyleSheet41.hairlineWidth, borderColor: "transparent" },
4845
4897
  label: { fontWeight: "600" },
4846
4898
  disabled: { opacity: 0.4 }
4847
4899
  });
4848
4900
 
4849
4901
  // src/native/showcase.tsx
4850
4902
  import * as React36 from "react";
4851
- import { Animated as Animated21, AppState, Easing as Easing12, FlatList, Pressable as Pressable21, StyleSheet as StyleSheet40, View as View47 } from "react-native";
4903
+ import { Animated as Animated21, AppState, Easing as Easing12, FlatList, Pressable as Pressable21, StyleSheet as StyleSheet42, View as View49 } from "react-native";
4852
4904
  import Svg26, { Path as Path22 } from "react-native-svg";
4853
- import { jsx as jsx53, jsxs as jsxs47 } from "react/jsx-runtime";
4905
+ import { jsx as jsx55, jsxs as jsxs49 } from "react/jsx-runtime";
4854
4906
  var showcaseLabels = {
4855
4907
  previous: "Previous slide",
4856
4908
  next: "Next slide",
@@ -4908,10 +4960,10 @@ function Showcase({ label, items: items2, getId, renderItem, getTitle, interval
4908
4960
  }, [running, current, interval]);
4909
4961
  const item = items2[current];
4910
4962
  const title = item !== void 0 ? getTitle?.(item) : void 0;
4911
- const control = [styles40.control, { borderColor: theme.borderDefault, backgroundColor: theme.surface1 }];
4912
- const icon = (d) => /* @__PURE__ */ jsx53(Svg26, { width: 16, height: 16, viewBox: "0 0 24 24", "aria-hidden": true, children: /* @__PURE__ */ jsx53(Path22, { d, stroke: theme.textSecondary, strokeWidth: 2.2, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" }) });
4913
- return /* @__PURE__ */ jsxs47(View47, { role: "group", "aria-label": label, style: [styles40.root, style], children: [
4914
- /* @__PURE__ */ jsx53(View47, { "aria-live": announce ? "polite" : "off", onLayout: (e) => setWidth(e.nativeEvent.layout.width), children: /* @__PURE__ */ jsx53(
4963
+ const control = [styles42.control, { borderColor: theme.borderDefault, backgroundColor: theme.surface1 }];
4964
+ const icon = (d) => /* @__PURE__ */ jsx55(Svg26, { width: 16, height: 16, viewBox: "0 0 24 24", "aria-hidden": true, children: /* @__PURE__ */ jsx55(Path22, { d, stroke: theme.textSecondary, strokeWidth: 2.2, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" }) });
4965
+ return /* @__PURE__ */ jsxs49(View49, { role: "group", "aria-label": label, style: [styles42.root, style], children: [
4966
+ /* @__PURE__ */ jsx55(View49, { "aria-live": announce ? "polite" : "off", onLayout: (e) => setWidth(e.nativeEvent.layout.width), children: /* @__PURE__ */ jsx55(
4915
4967
  FlatList,
4916
4968
  {
4917
4969
  ref: list,
@@ -4932,25 +4984,25 @@ function Showcase({ label, items: items2, getId, renderItem, getTitle, interval
4932
4984
  onIndexChange?.(next, true);
4933
4985
  }
4934
4986
  },
4935
- renderItem: ({ item: slide, index }) => /* @__PURE__ */ jsx53(View47, { role: "group", "aria-label": labels.slide(index + 1, total), style: { width }, children: Math.abs(index - current) <= 1 ? renderItem(slide, { index, active: index === current }) : null })
4987
+ renderItem: ({ item: slide, index }) => /* @__PURE__ */ jsx55(View49, { role: "group", "aria-label": labels.slide(index + 1, total), style: { width }, children: Math.abs(index - current) <= 1 ? renderItem(slide, { index, active: index === current }) : null })
4936
4988
  }
4937
4989
  ) }),
4938
- /* @__PURE__ */ jsx53(View47, { style: styles40.segments, children: items2.map((slide, i) => /* @__PURE__ */ jsx53(Pressable21, { role: "button", "aria-label": labels.goTo(i + 1, total), "aria-current": i === current ? true : void 0, onPress: () => go(i, true), style: styles40.segment, children: /* @__PURE__ */ jsxs47(View47, { style: [styles40.track, { backgroundColor: theme.surface3 }], children: [
4939
- i < current || i === current && !playing ? /* @__PURE__ */ jsx53(View47, { style: [StyleSheet40.absoluteFill, { backgroundColor: theme.accent }] }) : null,
4940
- i === current && playing ? /* @__PURE__ */ jsx53(Animated21.View, { style: [styles40.fill, { backgroundColor: theme.accent, width: fill.interpolate({ inputRange: [0, 1], outputRange: ["0%", "100%"] }) }] }) : null
4990
+ /* @__PURE__ */ jsx55(View49, { style: styles42.segments, children: items2.map((slide, i) => /* @__PURE__ */ jsx55(Pressable21, { role: "button", "aria-label": labels.goTo(i + 1, total), "aria-current": i === current ? true : void 0, onPress: () => go(i, true), style: styles42.segment, children: /* @__PURE__ */ jsxs49(View49, { style: [styles42.track, { backgroundColor: theme.surface3 }], children: [
4991
+ i < current || i === current && !playing ? /* @__PURE__ */ jsx55(View49, { style: [StyleSheet42.absoluteFill, { backgroundColor: theme.accent }] }) : null,
4992
+ i === current && playing ? /* @__PURE__ */ jsx55(Animated21.View, { style: [styles42.fill, { backgroundColor: theme.accent, width: fill.interpolate({ inputRange: [0, 1], outputRange: ["0%", "100%"] }) }] }) : null
4941
4993
  ] }) }, getId(slide))) }),
4942
- /* @__PURE__ */ jsxs47(View47, { style: styles40.bar, children: [
4943
- /* @__PURE__ */ jsxs47(Txt, { variant: "caption", tone: "secondary", numberOfLines: 1, style: styles40.counter, children: [
4994
+ /* @__PURE__ */ jsxs49(View49, { style: styles42.bar, children: [
4995
+ /* @__PURE__ */ jsxs49(Txt, { variant: "caption", tone: "secondary", numberOfLines: 1, style: styles42.counter, children: [
4944
4996
  title ? `${title} \xB7 ` : "",
4945
4997
  labels.counter(current + 1, total)
4946
4998
  ] }),
4947
- /* @__PURE__ */ jsx53(Pressable21, { role: "button", "aria-label": labels.previous, disabled: !loop && current === 0, hitSlop: 6, onPress: () => go(current - 1, true), style: control, children: icon("M15 5l-7 7 7 7") }),
4948
- playing ? /* @__PURE__ */ jsx53(Pressable21, { role: "button", "aria-label": paused ? labels.play : labels.pause, hitSlop: 6, onPress: () => setPaused(!paused), style: control, children: icon(paused ? "M8 5.5v13l10-6.5Z" : "M8 5v14M16 5v14") }) : null,
4949
- /* @__PURE__ */ jsx53(Pressable21, { role: "button", "aria-label": labels.next, disabled: !loop && current === total - 1, hitSlop: 6, onPress: () => go(current + 1, true), style: control, children: icon("M9 5l7 7-7 7") })
4999
+ /* @__PURE__ */ jsx55(Pressable21, { role: "button", "aria-label": labels.previous, disabled: !loop && current === 0, hitSlop: 6, onPress: () => go(current - 1, true), style: control, children: icon("M15 5l-7 7 7 7") }),
5000
+ playing ? /* @__PURE__ */ jsx55(Pressable21, { role: "button", "aria-label": paused ? labels.play : labels.pause, hitSlop: 6, onPress: () => setPaused(!paused), style: control, children: icon(paused ? "M8 5.5v13l10-6.5Z" : "M8 5v14M16 5v14") }) : null,
5001
+ /* @__PURE__ */ jsx55(Pressable21, { role: "button", "aria-label": labels.next, disabled: !loop && current === total - 1, hitSlop: 6, onPress: () => go(current + 1, true), style: control, children: icon("M9 5l7 7-7 7") })
4950
5002
  ] })
4951
5003
  ] });
4952
5004
  }
4953
- var styles40 = StyleSheet40.create({
5005
+ var styles42 = StyleSheet42.create({
4954
5006
  root: { gap: 8 },
4955
5007
  segments: { flexDirection: "row", gap: 4 },
4956
5008
  segment: { flex: 1, height: 24, justifyContent: "center" },
@@ -4964,7 +5016,7 @@ var styles40 = StyleSheet40.create({
4964
5016
  // src/native/skeleton.tsx
4965
5017
  import * as React37 from "react";
4966
5018
  import { Animated as Animated22 } from "react-native";
4967
- import { jsx as jsx54 } from "react/jsx-runtime";
5019
+ import { jsx as jsx56 } from "react/jsx-runtime";
4968
5020
  var SHAPE = {
4969
5021
  text: { width: "100%", height: 12, radius: 4 },
4970
5022
  circle: { width: 40, height: 40, radius: 9999 },
@@ -4990,7 +5042,7 @@ function Skeleton({ shape = "text", width, height, style, testID }) {
4990
5042
  }, [reduce, opacity]);
4991
5043
  const s = SHAPE[shape];
4992
5044
  const side = shape === "circle" ? width ?? height ?? s.width : void 0;
4993
- return /* @__PURE__ */ jsx54(
5045
+ return /* @__PURE__ */ jsx56(
4994
5046
  Animated22.View,
4995
5047
  {
4996
5048
  testID,
@@ -5005,9 +5057,9 @@ function Skeleton({ shape = "text", width, height, style, testID }) {
5005
5057
 
5006
5058
  // src/native/slider.tsx
5007
5059
  import * as React38 from "react";
5008
- import { PanResponder as PanResponder2, StyleSheet as StyleSheet41, Text as Text17, View as View48 } from "react-native";
5060
+ import { PanResponder as PanResponder2, StyleSheet as StyleSheet43, Text as Text17, View as View50 } from "react-native";
5009
5061
  import Svg27, { Defs as Defs14, LinearGradient as LinearGradient14, Rect as Rect5, Stop as Stop14 } from "react-native-svg";
5010
- import { jsx as jsx55, jsxs as jsxs48 } from "react/jsx-runtime";
5062
+ import { jsx as jsx57, jsxs as jsxs50 } from "react/jsx-runtime";
5011
5063
  var THUMB = 26;
5012
5064
  var toArray = (v) => v === void 0 ? void 0 : typeof v === "number" ? [v] : [...v];
5013
5065
  function Slider({
@@ -5099,24 +5151,24 @@ function Slider({
5099
5151
  const along = (p) => vertical ? { bottom: p * length } : { left: p * length };
5100
5152
  const onLayout = (e) => setLength(vertical ? e.nativeEvent.layout.height : e.nativeEvent.layout.width);
5101
5153
  const fill = vertical ? { bottom: pct(lo) * length, height: (pct(hi) - pct(lo)) * length, left: 0, right: 0 } : { left: pct(lo) * length, width: (pct(hi) - pct(lo)) * length, top: 0, bottom: 0 };
5102
- return /* @__PURE__ */ jsxs48(View48, { style: [styles41.root, vertical ? styles41.rootVertical : null, disabled ? styles41.disabled : null, style], children: [
5103
- showLabel ? /* @__PURE__ */ jsxs48(View48, { style: styles41.header, children: [
5104
- /* @__PURE__ */ jsx55(Text17, { style: [styles41.label, { color: theme.textSecondary }], children: label }),
5105
- /* @__PURE__ */ jsx55(Text17, { "aria-hidden": true, style: [styles41.value, { color: theme.textSecondary }], children: current.map(formatValue).join(" \u2013 ") })
5154
+ return /* @__PURE__ */ jsxs50(View50, { style: [styles43.root, vertical ? styles43.rootVertical : null, disabled ? styles43.disabled : null, style], children: [
5155
+ showLabel ? /* @__PURE__ */ jsxs50(View50, { style: styles43.header, children: [
5156
+ /* @__PURE__ */ jsx57(Text17, { style: [styles43.label, { color: theme.textSecondary }], children: label }),
5157
+ /* @__PURE__ */ jsx57(Text17, { "aria-hidden": true, style: [styles43.value, { color: theme.textSecondary }], children: current.map(formatValue).join(" \u2013 ") })
5106
5158
  ] }) : null,
5107
- /* @__PURE__ */ jsxs48(View48, { ...responder.panHandlers, style: vertical ? styles41.controlVertical : styles41.control, children: [
5108
- /* @__PURE__ */ jsxs48(View48, { onLayout, pointerEvents: "none", style: [vertical ? styles41.trackVertical : styles41.track, { borderRadius: radius3.full, backgroundColor: theme.surface3 }], children: [
5109
- /* @__PURE__ */ jsx55(View48, { style: [styles41.fill, fill, { borderRadius: radius3.full, overflow: "hidden", backgroundColor: theme.accent }], children: tone3 === "gradient" ? /* @__PURE__ */ jsxs48(Svg27, { width: "100%", height: "100%", "aria-hidden": true, children: [
5110
- /* @__PURE__ */ jsx55(Defs14, { children: /* @__PURE__ */ jsxs48(LinearGradient14, { id: gradientId, x1: "0", y1: vertical ? "1" : "0", x2: vertical ? "0" : "1", y2: "0", children: [
5111
- /* @__PURE__ */ jsx55(Stop14, { offset: "0", stopColor: theme.accent }),
5112
- /* @__PURE__ */ jsx55(Stop14, { offset: "1", stopColor: theme.accent2 })
5159
+ /* @__PURE__ */ jsxs50(View50, { ...responder.panHandlers, style: vertical ? styles43.controlVertical : styles43.control, children: [
5160
+ /* @__PURE__ */ jsxs50(View50, { onLayout, pointerEvents: "none", style: [vertical ? styles43.trackVertical : styles43.track, { borderRadius: radius3.full, backgroundColor: theme.surface3 }], children: [
5161
+ /* @__PURE__ */ jsx57(View50, { style: [styles43.fill, fill, { borderRadius: radius3.full, overflow: "hidden", backgroundColor: theme.accent }], children: tone3 === "gradient" ? /* @__PURE__ */ jsxs50(Svg27, { width: "100%", height: "100%", "aria-hidden": true, children: [
5162
+ /* @__PURE__ */ jsx57(Defs14, { children: /* @__PURE__ */ jsxs50(LinearGradient14, { id: gradientId, x1: "0", y1: vertical ? "1" : "0", x2: vertical ? "0" : "1", y2: "0", children: [
5163
+ /* @__PURE__ */ jsx57(Stop14, { offset: "0", stopColor: theme.accent }),
5164
+ /* @__PURE__ */ jsx57(Stop14, { offset: "1", stopColor: theme.accent2 })
5113
5165
  ] }) }),
5114
- /* @__PURE__ */ jsx55(Rect5, { width: "100%", height: "100%", fill: `url(#${gradientId})` })
5166
+ /* @__PURE__ */ jsx57(Rect5, { width: "100%", height: "100%", fill: `url(#${gradientId})` })
5115
5167
  ] }) : null }),
5116
- tickValues.map((t) => /* @__PURE__ */ jsx55(View48, { style: [vertical ? styles41.tickVertical : styles41.tick, along(pct(t)), { backgroundColor: t > lo && t < hi ? theme.onAccent : theme.borderStrong }] }, t))
5168
+ tickValues.map((t) => /* @__PURE__ */ jsx57(View50, { style: [vertical ? styles43.tickVertical : styles43.tick, along(pct(t)), { backgroundColor: t > lo && t < hi ? theme.onAccent : theme.borderStrong }] }, t))
5117
5169
  ] }),
5118
- current.map((v, i) => /* @__PURE__ */ jsx55(
5119
- View48,
5170
+ current.map((v, i) => /* @__PURE__ */ jsx57(
5171
+ View50,
5120
5172
  {
5121
5173
  accessible: true,
5122
5174
  role: "slider",
@@ -5135,16 +5187,16 @@ function Slider({
5135
5187
  onValueCommit?.(out(values));
5136
5188
  },
5137
5189
  pointerEvents: "none",
5138
- style: [styles41.thumb, vertical ? { bottom: pct(v) * length, left: (44 - THUMB) / 2, marginLeft: 0, marginTop: 0 } : { left: pct(v) * length - THUMB / 2, top: 0 }, { borderColor: theme.accent, backgroundColor: theme.textOnMedia, shadowColor: theme.scrimStrong }],
5139
- children: floatingValue === "always" || floatingValue && dragging === i ? /* @__PURE__ */ jsx55(View48, { "aria-hidden": true, style: [vertical ? styles41.bubbleVertical : styles41.bubble, { backgroundColor: theme.textPrimary, borderRadius: radius3.md }], children: /* @__PURE__ */ jsx55(Text17, { style: [styles41.bubbleText, { color: theme.surface0 }], children: formatValue(v) }) }) : null
5190
+ style: [styles43.thumb, vertical ? { bottom: pct(v) * length, left: (44 - THUMB) / 2, marginLeft: 0, marginTop: 0 } : { left: pct(v) * length - THUMB / 2, top: 0 }, { borderColor: theme.accent, backgroundColor: theme.textOnMedia, shadowColor: theme.scrimStrong }],
5191
+ children: floatingValue === "always" || floatingValue && dragging === i ? /* @__PURE__ */ jsx57(View50, { "aria-hidden": true, style: [vertical ? styles43.bubbleVertical : styles43.bubble, { backgroundColor: theme.textPrimary, borderRadius: radius3.md }], children: /* @__PURE__ */ jsx57(Text17, { style: [styles43.bubbleText, { color: theme.surface0 }], children: formatValue(v) }) }) : null
5140
5192
  },
5141
5193
  i
5142
5194
  ))
5143
5195
  ] }),
5144
- marks2?.length && !vertical ? /* @__PURE__ */ jsx55(View48, { "aria-hidden": true, style: styles41.marks, children: marks2.map((m) => /* @__PURE__ */ jsx55(Text17, { style: [styles41.mark, { left: pct(m.value) * length, color: theme.textSecondary, transform: [{ translateX: m.value === min ? 0 : m.value === max ? -40 : -20 }], textAlign: m.value === min ? "left" : m.value === max ? "right" : "center" }], children: m.label }, m.value)) }) : null
5196
+ marks2?.length && !vertical ? /* @__PURE__ */ jsx57(View50, { "aria-hidden": true, style: styles43.marks, children: marks2.map((m) => /* @__PURE__ */ jsx57(Text17, { style: [styles43.mark, { left: pct(m.value) * length, color: theme.textSecondary, transform: [{ translateX: m.value === min ? 0 : m.value === max ? -40 : -20 }], textAlign: m.value === min ? "left" : m.value === max ? "right" : "center" }], children: m.label }, m.value)) }) : null
5145
5197
  ] });
5146
5198
  }
5147
- var styles41 = StyleSheet41.create({
5199
+ var styles43 = StyleSheet43.create({
5148
5200
  root: { gap: 8, alignSelf: "stretch" },
5149
5201
  rootVertical: { alignSelf: "flex-start", alignItems: "center" },
5150
5202
  header: { flexDirection: "row", justifyContent: "space-between", alignItems: "baseline", gap: 12 },
@@ -5180,10 +5232,10 @@ var styles41 = StyleSheet41.create({
5180
5232
 
5181
5233
  // src/native/spinner.tsx
5182
5234
  import { ActivityIndicator as ActivityIndicator2 } from "react-native";
5183
- import { jsx as jsx56 } from "react/jsx-runtime";
5235
+ import { jsx as jsx58 } from "react/jsx-runtime";
5184
5236
  function Spinner({ label, size = "md", ...props }) {
5185
5237
  const { theme } = useTheme();
5186
- return /* @__PURE__ */ jsx56(
5238
+ return /* @__PURE__ */ jsx58(
5187
5239
  ActivityIndicator2,
5188
5240
  {
5189
5241
  accessible: true,
@@ -5199,8 +5251,8 @@ function Spinner({ label, size = "md", ...props }) {
5199
5251
 
5200
5252
  // src/native/splash-handoff.tsx
5201
5253
  import * as React39 from "react";
5202
- import { Animated as Animated23, Easing as Easing13, StyleSheet as StyleSheet42, View as View49 } from "react-native";
5203
- import { jsx as jsx57 } from "react/jsx-runtime";
5254
+ import { Animated as Animated23, Easing as Easing13, StyleSheet as StyleSheet44, View as View51 } from "react-native";
5255
+ import { jsx as jsx59 } from "react/jsx-runtime";
5204
5256
  function SplashHandoff({ product, ready, onShown, onDone, size = 96, background, label, duration = 320, style }) {
5205
5257
  const { theme } = useTheme();
5206
5258
  const reduce = useReducedMotion();
@@ -5218,7 +5270,7 @@ function SplashHandoff({ product, ready, onShown, onDone, size = 96, background,
5218
5270
  return () => animation.stop();
5219
5271
  }, [ready, reduce, duration, opacity, onDone]);
5220
5272
  if (gone) return null;
5221
- return /* @__PURE__ */ jsx57(
5273
+ return /* @__PURE__ */ jsx59(
5222
5274
  Animated23.View,
5223
5275
  {
5224
5276
  accessible: true,
@@ -5227,30 +5279,30 @@ function SplashHandoff({ product, ready, onShown, onDone, size = 96, background,
5227
5279
  "aria-busy": true,
5228
5280
  pointerEvents: ready ? "none" : "auto",
5229
5281
  onLayout: onShown,
5230
- style: [StyleSheet42.absoluteFill, styles42.root, { backgroundColor: background ?? theme.surface0, opacity }, style],
5231
- children: /* @__PURE__ */ jsx57(View49, { children: /* @__PURE__ */ jsx57(ProductMark, { id: product, size, animated: true }) })
5282
+ style: [StyleSheet44.absoluteFill, styles44.root, { backgroundColor: background ?? theme.surface0, opacity }, style],
5283
+ children: /* @__PURE__ */ jsx59(View51, { children: /* @__PURE__ */ jsx59(ProductMark, { id: product, size, animated: true }) })
5232
5284
  }
5233
5285
  );
5234
5286
  }
5235
- var styles42 = StyleSheet42.create({ root: { alignItems: "center", justifyContent: "center", zIndex: 100 } });
5287
+ var styles44 = StyleSheet44.create({ root: { alignItems: "center", justifyContent: "center", zIndex: 100 } });
5236
5288
 
5237
5289
  // src/native/step-progress.tsx
5238
- import { Pressable as Pressable22, StyleSheet as StyleSheet43, View as View50 } from "react-native";
5290
+ import { Pressable as Pressable22, StyleSheet as StyleSheet45, View as View52 } from "react-native";
5239
5291
  import Svg28, { Path as Path23 } from "react-native-svg";
5240
- import { jsx as jsx58, jsxs as jsxs49 } from "react/jsx-runtime";
5292
+ import { jsx as jsx60, jsxs as jsxs51 } from "react/jsx-runtime";
5241
5293
  function StepProgress({ step, total, label, backLabel, onBack, trailing, style }) {
5242
5294
  const { theme, insets } = useTheme();
5243
5295
  const words2 = label(step, total);
5244
- return /* @__PURE__ */ jsxs49(View50, { style: [styles43.root, { paddingTop: insets.top + 8 }, style], children: [
5245
- /* @__PURE__ */ jsxs49(View50, { style: styles43.row, children: [
5246
- onBack && backLabel ? /* @__PURE__ */ jsx58(Pressable22, { role: "button", "aria-label": backLabel, hitSlop: 10, onPress: onBack, style: styles43.back, children: /* @__PURE__ */ jsx58(Svg28, { width: 22, height: 22, viewBox: "0 0 24 24", "aria-hidden": true, children: /* @__PURE__ */ jsx58(Path23, { d: "M15 5l-7 7 7 7", stroke: theme.textPrimary, strokeWidth: 2.4, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" }) }) }) : /* @__PURE__ */ jsx58(View50, { style: styles43.back }),
5247
- /* @__PURE__ */ jsx58(View50, { accessible: true, role: "progressbar", "aria-label": words2, "aria-valuemin": 1, "aria-valuemax": total, "aria-valuenow": step, "aria-valuetext": words2, style: styles43.bars, children: Array.from({ length: total }, (_, i) => /* @__PURE__ */ jsx58(View50, { style: [styles43.bar, { backgroundColor: i < step ? theme.accent : theme.surface3 }] }, i)) }),
5248
- /* @__PURE__ */ jsx58(View50, { style: styles43.trailing, children: trailing })
5296
+ return /* @__PURE__ */ jsxs51(View52, { style: [styles45.root, { paddingTop: insets.top + 8 }, style], children: [
5297
+ /* @__PURE__ */ jsxs51(View52, { style: styles45.row, children: [
5298
+ onBack && backLabel ? /* @__PURE__ */ jsx60(Pressable22, { role: "button", "aria-label": backLabel, hitSlop: 10, onPress: onBack, style: styles45.back, children: /* @__PURE__ */ jsx60(Svg28, { width: 22, height: 22, viewBox: "0 0 24 24", "aria-hidden": true, children: /* @__PURE__ */ jsx60(Path23, { d: "M15 5l-7 7 7 7", stroke: theme.textPrimary, strokeWidth: 2.4, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" }) }) }) : /* @__PURE__ */ jsx60(View52, { style: styles45.back }),
5299
+ /* @__PURE__ */ jsx60(View52, { accessible: true, role: "progressbar", "aria-label": words2, "aria-valuemin": 1, "aria-valuemax": total, "aria-valuenow": step, "aria-valuetext": words2, style: styles45.bars, children: Array.from({ length: total }, (_, i) => /* @__PURE__ */ jsx60(View52, { style: [styles45.bar, { backgroundColor: i < step ? theme.accent : theme.surface3 }] }, i)) }),
5300
+ /* @__PURE__ */ jsx60(View52, { style: styles45.trailing, children: trailing })
5249
5301
  ] }),
5250
- /* @__PURE__ */ jsx58(Txt, { variant: "caption", tone: "secondary", style: styles43.words, "aria-hidden": true, children: words2 })
5302
+ /* @__PURE__ */ jsx60(Txt, { variant: "caption", tone: "secondary", style: styles45.words, "aria-hidden": true, children: words2 })
5251
5303
  ] });
5252
5304
  }
5253
- var styles43 = StyleSheet43.create({
5305
+ var styles45 = StyleSheet45.create({
5254
5306
  root: { paddingHorizontal: 12, gap: 6 },
5255
5307
  row: { flexDirection: "row", alignItems: "center", gap: 8 },
5256
5308
  back: { width: 40, height: 40, alignItems: "center", justifyContent: "center" },
@@ -5261,36 +5313,36 @@ var styles43 = StyleSheet43.create({
5261
5313
  });
5262
5314
 
5263
5315
  // src/native/stepper.tsx
5264
- import { StyleSheet as StyleSheet44, View as View51 } from "react-native";
5316
+ import { StyleSheet as StyleSheet46, View as View53 } from "react-native";
5265
5317
  import Svg29, { Circle as Circle16, Path as Path24 } from "react-native-svg";
5266
- import { jsx as jsx59, jsxs as jsxs50 } from "react/jsx-runtime";
5318
+ import { jsx as jsx61, jsxs as jsxs52 } from "react/jsx-runtime";
5267
5319
  var WORDS = { done: "done", current: "in progress", upcoming: "to come", error: "failed" };
5268
5320
  function Stepper({ steps, current = 0, orientation = "vertical", statusLabels, "aria-label": label, style }) {
5269
5321
  const { theme } = useTheme();
5270
5322
  const words2 = { ...WORDS, ...statusLabels };
5271
5323
  const vertical = orientation === "vertical";
5272
- return /* @__PURE__ */ jsx59(View51, { role: "list", "aria-label": label, style: [vertical ? styles44.column : styles44.row, style], children: steps.map((step, i) => {
5324
+ return /* @__PURE__ */ jsx61(View53, { role: "list", "aria-label": label, style: [vertical ? styles46.column : styles46.row, style], children: steps.map((step, i) => {
5273
5325
  const status = step.status ?? (i < current ? "done" : i === current ? "current" : "upcoming");
5274
5326
  const last = i === steps.length - 1;
5275
- const node = status === "current" ? /* @__PURE__ */ jsx59(LoaderGlyph, { value: step.value ?? null, size: 24 }) : status === "error" ? /* @__PURE__ */ jsx59(LoaderGlyph, { state: "error", size: 24 }) : /* @__PURE__ */ jsxs50(Svg29, { width: 24, height: 24, viewBox: "0 0 24 24", "aria-hidden": true, children: [
5276
- /* @__PURE__ */ jsx59(Circle16, { cx: 12, cy: 12, r: 10, fill: status === "done" ? theme.accent : "none", stroke: status === "done" ? theme.accent : theme.borderStrong, strokeWidth: 2 }),
5277
- status === "done" ? /* @__PURE__ */ jsx59(Path24, { d: "M7.5 12.3l3 3 6-6.3", stroke: theme.onAccent, strokeWidth: 2.2, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" }) : null
5327
+ const node = status === "current" ? /* @__PURE__ */ jsx61(LoaderGlyph, { value: step.value ?? null, size: 24 }) : status === "error" ? /* @__PURE__ */ jsx61(LoaderGlyph, { state: "error", size: 24 }) : /* @__PURE__ */ jsxs52(Svg29, { width: 24, height: 24, viewBox: "0 0 24 24", "aria-hidden": true, children: [
5328
+ /* @__PURE__ */ jsx61(Circle16, { cx: 12, cy: 12, r: 10, fill: status === "done" ? theme.accent : "none", stroke: status === "done" ? theme.accent : theme.borderStrong, strokeWidth: 2 }),
5329
+ status === "done" ? /* @__PURE__ */ jsx61(Path24, { d: "M7.5 12.3l3 3 6-6.3", stroke: theme.onAccent, strokeWidth: 2.2, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" }) : null
5278
5330
  ] });
5279
- const connector = !last ? /* @__PURE__ */ jsx59(View51, { "aria-hidden": true, style: [vertical ? styles44.vLine : styles44.hLine, { backgroundColor: status === "done" ? theme.accent : theme.borderDefault }] }) : null;
5280
- return /* @__PURE__ */ jsxs50(View51, { role: "listitem", accessible: true, "aria-label": `${step.title}, ${words2[status]}`, style: vertical ? styles44.vStep : styles44.hStep, children: [
5281
- /* @__PURE__ */ jsxs50(View51, { style: vertical ? styles44.vRail : styles44.hRail, children: [
5331
+ const connector = !last ? /* @__PURE__ */ jsx61(View53, { "aria-hidden": true, style: [vertical ? styles46.vLine : styles46.hLine, { backgroundColor: status === "done" ? theme.accent : theme.borderDefault }] }) : null;
5332
+ return /* @__PURE__ */ jsxs52(View53, { role: "listitem", accessible: true, "aria-label": `${step.title}, ${words2[status]}`, style: vertical ? styles46.vStep : styles46.hStep, children: [
5333
+ /* @__PURE__ */ jsxs52(View53, { style: vertical ? styles46.vRail : styles46.hRail, children: [
5282
5334
  node,
5283
5335
  connector
5284
5336
  ] }),
5285
- /* @__PURE__ */ jsxs50(View51, { style: [styles44.body, vertical && !last ? { paddingBottom: 20 } : null], children: [
5286
- /* @__PURE__ */ jsx59(Txt, { variant: "label", tone: status === "upcoming" ? "secondary" : "text", numberOfLines: vertical ? void 0 : 2, children: step.title }),
5287
- step.description ? /* @__PURE__ */ jsx59(Txt, { variant: "caption", tone: "secondary", children: step.description }) : null,
5288
- step.content && (status === "current" || status === "error") ? /* @__PURE__ */ jsx59(View51, { style: styles44.content, children: step.content }) : null
5337
+ /* @__PURE__ */ jsxs52(View53, { style: [styles46.body, vertical && !last ? { paddingBottom: 20 } : null], children: [
5338
+ /* @__PURE__ */ jsx61(Txt, { variant: "label", tone: status === "upcoming" ? "secondary" : "text", numberOfLines: vertical ? void 0 : 2, children: step.title }),
5339
+ step.description ? /* @__PURE__ */ jsx61(Txt, { variant: "caption", tone: "secondary", children: step.description }) : null,
5340
+ step.content && (status === "current" || status === "error") ? /* @__PURE__ */ jsx61(View53, { style: styles46.content, children: step.content }) : null
5289
5341
  ] })
5290
5342
  ] }, i);
5291
5343
  }) });
5292
5344
  }
5293
- var styles44 = StyleSheet44.create({
5345
+ var styles46 = StyleSheet46.create({
5294
5346
  column: { gap: 0 },
5295
5347
  row: { flexDirection: "row" },
5296
5348
  vStep: { flexDirection: "row", gap: 12 },
@@ -5305,58 +5357,58 @@ var styles44 = StyleSheet44.create({
5305
5357
 
5306
5358
  // src/native/swipe-deck.tsx
5307
5359
  import * as React40 from "react";
5308
- import { AccessibilityInfo as AccessibilityInfo14, Animated as Animated24, Image as Image5, PanResponder as PanResponder3, Platform as Platform4, Pressable as Pressable23, StyleSheet as StyleSheet45, useWindowDimensions as useWindowDimensions2, View as View52 } from "react-native";
5360
+ import { AccessibilityInfo as AccessibilityInfo14, Animated as Animated24, Image as Image5, PanResponder as PanResponder3, Platform as Platform4, Pressable as Pressable23, StyleSheet as StyleSheet47, useWindowDimensions as useWindowDimensions2, View as View54 } from "react-native";
5309
5361
  import Svg30, { Defs as Defs15, LinearGradient as LinearGradient15, Path as Path25, Rect as Rect6, Stop as Stop15 } from "react-native-svg";
5310
- import { Fragment as Fragment8, jsx as jsx60, jsxs as jsxs51 } from "react/jsx-runtime";
5362
+ import { Fragment as Fragment8, jsx as jsx62, jsxs as jsxs53 } from "react/jsx-runtime";
5311
5363
  function PersonCard({ photos, name, age, badge, meta, bio, footer, photoLabel = (n, t) => `Photo ${n} of ${t}`, style }) {
5312
5364
  const { theme, radius: radius3 } = useTheme();
5313
5365
  const [index, setIndex] = React40.useState(0);
5314
5366
  const gradient = useSvgId("kz-profile-");
5315
5367
  const [box, setBox] = React40.useState(null);
5316
5368
  const photo = photos[index];
5317
- return /* @__PURE__ */ jsxs51(
5318
- View52,
5369
+ return /* @__PURE__ */ jsxs53(
5370
+ View54,
5319
5371
  {
5320
5372
  accessible: Platform4.OS !== "web",
5321
5373
  accessibilityActions: photos.length > 1 ? [{ name: "increment" }, { name: "decrement" }] : [],
5322
5374
  onAccessibilityAction: (e) => setIndex((i) => Math.max(0, Math.min(photos.length - 1, i + (e.nativeEvent.actionName === "increment" ? 1 : -1)))),
5323
5375
  role: Platform4.OS === "web" ? "group" : "img",
5324
5376
  "aria-label": [`${name}${age !== void 0 ? `, ${age}` : ""}`, bio, photos.length > 1 ? photoLabel(index + 1, photos.length) : null].filter(Boolean).join(". "),
5325
- style: [styles45.card, { borderRadius: radius3.xl, backgroundColor: theme.media }, style],
5377
+ style: [styles47.card, { borderRadius: radius3.xl, backgroundColor: theme.media }, style],
5326
5378
  children: [
5327
- photo ? /* @__PURE__ */ jsx60(Image5, { testID: "person-card-photo", source: { uri: photo.uri }, style: StyleSheet45.absoluteFill, resizeMode: "cover" }) : null,
5328
- photos.length > 1 ? /* @__PURE__ */ jsxs51(Fragment8, { children: [
5329
- /* @__PURE__ */ jsx60(View52, { style: styles45.bars, "aria-hidden": true, children: photos.map((_, i) => /* @__PURE__ */ jsx60(View52, { style: [styles45.bar, { backgroundColor: theme.textOnMedia, opacity: i === index ? 1 : 0.4 }] }, i)) }),
5330
- /* @__PURE__ */ jsx60(Pressable23, { "aria-hidden": true, accessible: false, focusable: false, tabIndex: -1, style: [styles45.half, { left: 0 }], onPress: () => setIndex((i) => Math.max(0, i - 1)) }),
5331
- /* @__PURE__ */ jsx60(Pressable23, { "aria-hidden": true, accessible: false, focusable: false, tabIndex: -1, style: [styles45.half, { right: 0 }], onPress: () => setIndex((i) => Math.min(photos.length - 1, i + 1)) })
5379
+ photo ? /* @__PURE__ */ jsx62(Image5, { testID: "person-card-photo", source: { uri: photo.uri }, style: StyleSheet47.absoluteFill, resizeMode: "cover" }) : null,
5380
+ photos.length > 1 ? /* @__PURE__ */ jsxs53(Fragment8, { children: [
5381
+ /* @__PURE__ */ jsx62(View54, { style: styles47.bars, "aria-hidden": true, children: photos.map((_, i) => /* @__PURE__ */ jsx62(View54, { style: [styles47.bar, { backgroundColor: theme.textOnMedia, opacity: i === index ? 1 : 0.4 }] }, i)) }),
5382
+ /* @__PURE__ */ jsx62(Pressable23, { "aria-hidden": true, accessible: false, focusable: false, tabIndex: -1, style: [styles47.half, { left: 0 }], onPress: () => setIndex((i) => Math.max(0, i - 1)) }),
5383
+ /* @__PURE__ */ jsx62(Pressable23, { "aria-hidden": true, accessible: false, focusable: false, tabIndex: -1, style: [styles47.half, { right: 0 }], onPress: () => setIndex((i) => Math.min(photos.length - 1, i + 1)) })
5332
5384
  ] }) : null,
5333
- /* @__PURE__ */ jsxs51(
5334
- View52,
5385
+ /* @__PURE__ */ jsxs53(
5386
+ View54,
5335
5387
  {
5336
5388
  testID: "person-card-overlay",
5337
5389
  pointerEvents: "box-none",
5338
- style: styles45.bottom,
5390
+ style: styles47.bottom,
5339
5391
  onLayout: (e) => setBox({ width: e.nativeEvent.layout.width, height: e.nativeEvent.layout.height }),
5340
5392
  children: [
5341
- box ? /* @__PURE__ */ jsxs51(Svg30, { testID: "person-card-scrim", style: styles45.scrim, width: box.width, height: box.height, "aria-hidden": true, children: [
5342
- /* @__PURE__ */ jsx60(Defs15, { children: /* @__PURE__ */ jsxs51(LinearGradient15, { id: gradient, x1: "0", y1: "0", x2: "0", y2: "1", children: [
5343
- /* @__PURE__ */ jsx60(Stop15, { offset: "0", stopColor: theme.scrimStrong, stopOpacity: 0 }),
5344
- /* @__PURE__ */ jsx60(Stop15, { offset: "0.5", stopColor: theme.scrimStrong, stopOpacity: 0.8 }),
5345
- /* @__PURE__ */ jsx60(Stop15, { offset: "1", stopColor: theme.scrimStrong, stopOpacity: 1 })
5393
+ box ? /* @__PURE__ */ jsxs53(Svg30, { testID: "person-card-scrim", style: styles47.scrim, width: box.width, height: box.height, "aria-hidden": true, children: [
5394
+ /* @__PURE__ */ jsx62(Defs15, { children: /* @__PURE__ */ jsxs53(LinearGradient15, { id: gradient, x1: "0", y1: "0", x2: "0", y2: "1", children: [
5395
+ /* @__PURE__ */ jsx62(Stop15, { offset: "0", stopColor: theme.scrimStrong, stopOpacity: 0 }),
5396
+ /* @__PURE__ */ jsx62(Stop15, { offset: "0.5", stopColor: theme.scrimStrong, stopOpacity: 0.8 }),
5397
+ /* @__PURE__ */ jsx62(Stop15, { offset: "1", stopColor: theme.scrimStrong, stopOpacity: 1 })
5346
5398
  ] }) }),
5347
- /* @__PURE__ */ jsx60(Rect6, { x: 0, y: 0, width: box.width, height: box.height, fill: `url(#${gradient})` })
5399
+ /* @__PURE__ */ jsx62(Rect6, { x: 0, y: 0, width: box.width, height: box.height, fill: `url(#${gradient})` })
5348
5400
  ] }) : null,
5349
- /* @__PURE__ */ jsxs51(View52, { style: styles45.text, children: [
5350
- /* @__PURE__ */ jsxs51(View52, { style: styles45.nameRow, children: [
5351
- /* @__PURE__ */ jsxs51(Txt, { variant: "display", tone: "onMedia", style: styles45.name, numberOfLines: 1, children: [
5401
+ /* @__PURE__ */ jsxs53(View54, { style: styles47.text, children: [
5402
+ /* @__PURE__ */ jsxs53(View54, { style: styles47.nameRow, children: [
5403
+ /* @__PURE__ */ jsxs53(Txt, { variant: "display", tone: "onMedia", style: styles47.name, numberOfLines: 1, children: [
5352
5404
  name,
5353
- age !== void 0 ? /* @__PURE__ */ jsx60(Txt, { variant: "display", tone: "onMedia", style: styles45.age, children: ` ${age}` }) : null
5405
+ age !== void 0 ? /* @__PURE__ */ jsx62(Txt, { variant: "display", tone: "onMedia", style: styles47.age, children: ` ${age}` }) : null
5354
5406
  ] }),
5355
5407
  badge
5356
5408
  ] }),
5357
5409
  meta,
5358
- bio ? /* @__PURE__ */ jsx60(Txt, { tone: "onMedia", numberOfLines: 2, children: bio }) : null,
5359
- footer ? /* @__PURE__ */ jsx60(View52, { style: styles45.footer, children: footer }) : null
5410
+ bio ? /* @__PURE__ */ jsx62(Txt, { tone: "onMedia", numberOfLines: 2, children: bio }) : null,
5411
+ footer ? /* @__PURE__ */ jsx62(View54, { style: styles47.footer, children: footer }) : null
5360
5412
  ] })
5361
5413
  ]
5362
5414
  }
@@ -5400,7 +5452,7 @@ function SwipeDeck({ items: items2, getId, renderCard, onSwipe, empty: empty2, l
5400
5452
  const rotate = x.interpolate({ inputRange: [-width, 0, width], outputRange: ["-14deg", "0deg", "14deg"] });
5401
5453
  const likeOpacity = x.interpolate({ inputRange: [0, width / 4], outputRange: [0, 1], extrapolate: "clamp" });
5402
5454
  const passOpacity = x.interpolate({ inputRange: [-width / 4, 0], outputRange: [1, 0], extrapolate: "clamp" });
5403
- const button = (direction) => /* @__PURE__ */ jsx60(
5455
+ const button = (direction) => /* @__PURE__ */ jsx62(
5404
5456
  Pressable23,
5405
5457
  {
5406
5458
  role: "button",
@@ -5408,18 +5460,18 @@ function SwipeDeck({ items: items2, getId, renderCard, onSwipe, empty: empty2, l
5408
5460
  disabled: !top,
5409
5461
  onPress: () => decide(direction),
5410
5462
  style: ({ pressed }) => [
5411
- styles45.button,
5463
+ styles47.button,
5412
5464
  { borderColor: direction === "like" ? theme.success : theme.danger, backgroundColor: theme.surface1, transform: [{ scale: pressed ? 0.92 : 1 }], opacity: top ? 1 : 0.4 }
5413
5465
  ],
5414
- children: /* @__PURE__ */ jsx60(Svg30, { width: 28, height: 28, viewBox: "0 0 24 24", "aria-hidden": true, children: direction === "like" ? /* @__PURE__ */ jsx60(Path25, { d: "M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z", fill: theme.success }) : /* @__PURE__ */ jsx60(Path25, { d: "M6 6l12 12M18 6 6 18", stroke: theme.danger, strokeWidth: 3, strokeLinecap: "round" }) })
5466
+ children: /* @__PURE__ */ jsx62(Svg30, { width: 28, height: 28, viewBox: "0 0 24 24", "aria-hidden": true, children: direction === "like" ? /* @__PURE__ */ jsx62(Path25, { d: "M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z", fill: theme.success }) : /* @__PURE__ */ jsx62(Path25, { d: "M6 6l12 12M18 6 6 18", stroke: theme.danger, strokeWidth: 3, strokeLinecap: "round" }) })
5415
5467
  }
5416
5468
  );
5417
- return /* @__PURE__ */ jsxs51(View52, { style: [styles45.deck, style], children: [
5418
- /* @__PURE__ */ jsxs51(View52, { style: styles45.stack, children: [
5469
+ return /* @__PURE__ */ jsxs53(View54, { style: [styles47.deck, style], children: [
5470
+ /* @__PURE__ */ jsxs53(View54, { style: styles47.stack, children: [
5419
5471
  !top ? empty2 ?? null : null,
5420
5472
  items2.slice(0, 2).reverse().map((item) => {
5421
5473
  const isTop = item === top;
5422
- return /* @__PURE__ */ jsxs51(
5474
+ return /* @__PURE__ */ jsxs53(
5423
5475
  Animated24.View,
5424
5476
  {
5425
5477
  ...isTop ? pan.panHandlers : {},
@@ -5428,12 +5480,12 @@ function SwipeDeck({ items: items2, getId, renderCard, onSwipe, empty: empty2, l
5428
5480
  "aria-hidden": !isTop,
5429
5481
  importantForAccessibility: isTop ? "auto" : "no-hide-descendants",
5430
5482
  pointerEvents: isTop ? "auto" : "none",
5431
- style: [StyleSheet45.absoluteFill, isTop ? { transform: [{ translateX: x }, { rotate }] } : { transform: [{ scale: 0.96 }], opacity: 0.9 }],
5483
+ style: [StyleSheet47.absoluteFill, isTop ? { transform: [{ translateX: x }, { rotate }] } : { transform: [{ scale: 0.96 }], opacity: 0.9 }],
5432
5484
  children: [
5433
5485
  renderCard(item),
5434
- isTop ? /* @__PURE__ */ jsxs51(Fragment8, { children: [
5435
- /* @__PURE__ */ jsx60(Animated24.View, { pointerEvents: "none", style: [styles45.stamp, styles45.stampLike, { borderColor: theme.success, opacity: likeOpacity }], "aria-hidden": true, children: /* @__PURE__ */ jsx60(Txt, { variant: "title", style: { color: theme.success }, children: labels.likeStamp ?? labels.like.toUpperCase() }) }),
5436
- /* @__PURE__ */ jsx60(Animated24.View, { pointerEvents: "none", style: [styles45.stamp, styles45.stampPass, { borderColor: theme.danger, opacity: passOpacity }], "aria-hidden": true, children: /* @__PURE__ */ jsx60(Txt, { variant: "title", style: { color: theme.danger }, children: labels.passStamp ?? labels.pass.toUpperCase() }) })
5486
+ isTop ? /* @__PURE__ */ jsxs53(Fragment8, { children: [
5487
+ /* @__PURE__ */ jsx62(Animated24.View, { pointerEvents: "none", style: [styles47.stamp, styles47.stampLike, { borderColor: theme.success, opacity: likeOpacity }], "aria-hidden": true, children: /* @__PURE__ */ jsx62(Txt, { variant: "title", style: { color: theme.success }, children: labels.likeStamp ?? labels.like.toUpperCase() }) }),
5488
+ /* @__PURE__ */ jsx62(Animated24.View, { pointerEvents: "none", style: [styles47.stamp, styles47.stampPass, { borderColor: theme.danger, opacity: passOpacity }], "aria-hidden": true, children: /* @__PURE__ */ jsx62(Txt, { variant: "title", style: { color: theme.danger }, children: labels.passStamp ?? labels.pass.toUpperCase() }) })
5437
5489
  ] }) : null
5438
5490
  ]
5439
5491
  },
@@ -5441,13 +5493,13 @@ function SwipeDeck({ items: items2, getId, renderCard, onSwipe, empty: empty2, l
5441
5493
  );
5442
5494
  })
5443
5495
  ] }),
5444
- hideButtons ? null : /* @__PURE__ */ jsxs51(View52, { style: styles45.buttons, children: [
5496
+ hideButtons ? null : /* @__PURE__ */ jsxs53(View54, { style: styles47.buttons, children: [
5445
5497
  button("pass"),
5446
5498
  button("like")
5447
5499
  ] })
5448
5500
  ] });
5449
5501
  }
5450
- var styles45 = StyleSheet45.create({
5502
+ var styles47 = StyleSheet47.create({
5451
5503
  card: { flex: 1, overflow: "hidden" },
5452
5504
  bars: { position: "absolute", top: 8, left: 8, right: 8, flexDirection: "row", gap: 4 },
5453
5505
  bar: { flex: 1, height: 3, borderRadius: 2 },
@@ -5470,8 +5522,8 @@ var styles45 = StyleSheet45.create({
5470
5522
 
5471
5523
  // src/native/swipeable-row.tsx
5472
5524
  import * as React41 from "react";
5473
- import { Animated as Animated25, PanResponder as PanResponder4, Pressable as Pressable24, StyleSheet as StyleSheet46, View as View53 } from "react-native";
5474
- import { jsx as jsx61, jsxs as jsxs52 } from "react/jsx-runtime";
5525
+ import { Animated as Animated25, PanResponder as PanResponder4, Pressable as Pressable24, StyleSheet as StyleSheet48, View as View55 } from "react-native";
5526
+ import { jsx as jsx63, jsxs as jsxs54 } from "react/jsx-runtime";
5475
5527
  var toneColor = (t, tone3) => ({ neutral: t.surface3, accent: t.accent, success: t.success, warning: t.warning, danger: t.danger })[tone3 ?? "neutral"];
5476
5528
  var toneText = (tone3) => tone3 === "neutral" || tone3 === void 0 ? "text" : "onAccent";
5477
5529
  function SwipeableRow({ children, trailing = [], leading = [], fullSwipe = 0.6, actionWidth = 80, onActivate, testID, style }) {
@@ -5519,18 +5571,18 @@ function SwipeableRow({ children, trailing = [], leading = [], fullSwipe = 0.6,
5519
5571
  [trailing, leading, fullSwipe, width, actionWidth]
5520
5572
  // eslint-disable-line react-hooks/exhaustive-deps -- run/settle are stable in effect
5521
5573
  );
5522
- const side = (actions, edge) => /* @__PURE__ */ jsx61(View53, { "aria-hidden": true, style: [styles46.side, edge === "left" ? { left: 0 } : { right: 0, flexDirection: "row-reverse" }], children: actions.map((action, i) => (
5574
+ const side = (actions, edge) => /* @__PURE__ */ jsx63(View55, { "aria-hidden": true, style: [styles48.side, edge === "left" ? { left: 0 } : { right: 0, flexDirection: "row-reverse" }], children: actions.map((action, i) => (
5523
5575
  // eslint-disable-next-line react-hooks/refs -- runs on a press, never during render
5524
- /* @__PURE__ */ jsxs52(Pressable24, { focusable: false, tabIndex: -1, onPress: () => run(action), style: [styles46.action, { width: actionWidth, backgroundColor: toneColor(theme, action.tone) }], children: [
5576
+ /* @__PURE__ */ jsxs54(Pressable24, { focusable: false, tabIndex: -1, onPress: () => run(action), style: [styles48.action, { width: actionWidth, backgroundColor: toneColor(theme, action.tone) }], children: [
5525
5577
  action.icon,
5526
- /* @__PURE__ */ jsx61(Txt, { variant: "caption", tone: toneText(action.tone), style: styles46.actionText, numberOfLines: 1, children: action.label })
5578
+ /* @__PURE__ */ jsx63(Txt, { variant: "caption", tone: toneText(action.tone), style: styles48.actionText, numberOfLines: 1, children: action.label })
5527
5579
  ] }, i)
5528
5580
  )) });
5529
5581
  const all = [...leading, ...trailing];
5530
- return /* @__PURE__ */ jsxs52(View53, { style: [styles46.root, style], onLayout: (e) => setWidth(e.nativeEvent.layout.width), children: [
5582
+ return /* @__PURE__ */ jsxs54(View55, { style: [styles48.root, style], onLayout: (e) => setWidth(e.nativeEvent.layout.width), children: [
5531
5583
  leading.length > 0 ? side(leading, "left") : null,
5532
5584
  trailing.length > 0 ? side(trailing, "right") : null,
5533
- /* @__PURE__ */ jsx61(
5585
+ /* @__PURE__ */ jsx63(
5534
5586
  Animated25.View,
5535
5587
  {
5536
5588
  ...pan.panHandlers,
@@ -5542,13 +5594,13 @@ function SwipeableRow({ children, trailing = [], leading = [], fullSwipe = 0.6,
5542
5594
  const action = all.find((a) => a.label === e.nativeEvent.actionName);
5543
5595
  if (action) action.onPress();
5544
5596
  },
5545
- style: [styles46.front, { backgroundColor: theme.surface0, transform: [{ translateX: x }] }],
5597
+ style: [styles48.front, { backgroundColor: theme.surface0, transform: [{ translateX: x }] }],
5546
5598
  children
5547
5599
  }
5548
5600
  )
5549
5601
  ] });
5550
5602
  }
5551
- var styles46 = StyleSheet46.create({
5603
+ var styles48 = StyleSheet48.create({
5552
5604
  root: { overflow: "hidden" },
5553
5605
  side: { position: "absolute", top: 0, bottom: 0, flexDirection: "row" },
5554
5606
  action: { alignItems: "center", justifyContent: "center", gap: 4, paddingHorizontal: 6 },
@@ -5558,8 +5610,8 @@ var styles46 = StyleSheet46.create({
5558
5610
 
5559
5611
  // src/native/switch.tsx
5560
5612
  import * as React42 from "react";
5561
- import { Animated as Animated26, Pressable as Pressable25, StyleSheet as StyleSheet47, Text as Text18, View as View54 } from "react-native";
5562
- import { jsx as jsx62, jsxs as jsxs53 } from "react/jsx-runtime";
5613
+ import { Animated as Animated26, Pressable as Pressable25, StyleSheet as StyleSheet49, Text as Text18, View as View56 } from "react-native";
5614
+ import { jsx as jsx64, jsxs as jsxs55 } from "react/jsx-runtime";
5563
5615
  var SIZES = { sm: { w: 40, h: 24, knob: 18 }, md: { w: 52, h: 32, knob: 26 } };
5564
5616
  function Switch({ label, checked, defaultChecked = false, onCheckedChange, description, showLabel, size = "md", error, disabled, style }) {
5565
5617
  const { theme, motion: motion3, haptic } = useTheme();
@@ -5576,11 +5628,11 @@ function Switch({ label, checked, defaultChecked = false, onCheckedChange, descr
5576
5628
  if (checked === void 0) setOwn(!on);
5577
5629
  onCheckedChange?.(!on);
5578
5630
  };
5579
- const track = /* @__PURE__ */ jsx62(View54, { style: [styles47.track, { width: d.w, height: d.h, borderRadius: d.h / 2, backgroundColor: on ? theme.accent : theme.surface3, borderColor: error ? theme.danger : on ? theme.accent : theme.borderDefault }], children: /* @__PURE__ */ jsx62(
5631
+ const track = /* @__PURE__ */ jsx64(View56, { style: [styles49.track, { width: d.w, height: d.h, borderRadius: d.h / 2, backgroundColor: on ? theme.accent : theme.surface3, borderColor: error ? theme.danger : on ? theme.accent : theme.borderDefault }], children: /* @__PURE__ */ jsx64(
5580
5632
  Animated26.View,
5581
5633
  {
5582
5634
  style: [
5583
- styles47.knob,
5635
+ styles49.knob,
5584
5636
  {
5585
5637
  width: d.knob,
5586
5638
  height: d.knob,
@@ -5602,19 +5654,19 @@ function Switch({ label, checked, defaultChecked = false, onCheckedChange, descr
5602
5654
  onPress: toggle
5603
5655
  };
5604
5656
  if (!showLabel)
5605
- return /* @__PURE__ */ jsx62(Pressable25, { ...a11y, hitSlop: { top: (44 - d.h) / 2, bottom: (44 - d.h) / 2, left: Math.max(0, (44 - d.w) / 2), right: Math.max(0, (44 - d.w) / 2) }, style: [disabled ? styles47.disabled : null, style], children: track });
5606
- return /* @__PURE__ */ jsxs53(View54, { style: [styles47.root, style], children: [
5607
- /* @__PURE__ */ jsxs53(Pressable25, { ...a11y, style: [styles47.row, disabled ? styles47.disabled : null], children: [
5608
- /* @__PURE__ */ jsxs53(View54, { style: styles47.text, children: [
5609
- /* @__PURE__ */ jsx62(Text18, { style: [styles47.label, { color: theme.textPrimary }], children: label }),
5610
- description ? /* @__PURE__ */ jsx62(Text18, { style: [styles47.description, { color: theme.textSecondary }], children: description }) : null
5657
+ return /* @__PURE__ */ jsx64(Pressable25, { ...a11y, hitSlop: { top: (44 - d.h) / 2, bottom: (44 - d.h) / 2, left: Math.max(0, (44 - d.w) / 2), right: Math.max(0, (44 - d.w) / 2) }, style: [disabled ? styles49.disabled : null, style], children: track });
5658
+ return /* @__PURE__ */ jsxs55(View56, { style: [styles49.root, style], children: [
5659
+ /* @__PURE__ */ jsxs55(Pressable25, { ...a11y, style: [styles49.row, disabled ? styles49.disabled : null], children: [
5660
+ /* @__PURE__ */ jsxs55(View56, { style: styles49.text, children: [
5661
+ /* @__PURE__ */ jsx64(Text18, { style: [styles49.label, { color: theme.textPrimary }], children: label }),
5662
+ description ? /* @__PURE__ */ jsx64(Text18, { style: [styles49.description, { color: theme.textSecondary }], children: description }) : null
5611
5663
  ] }),
5612
5664
  track
5613
5665
  ] }),
5614
- error ? /* @__PURE__ */ jsx62(Text18, { role: "alert", "aria-live": "polite", style: [styles47.description, { color: theme.dangerText }], children: error }) : null
5666
+ error ? /* @__PURE__ */ jsx64(Text18, { role: "alert", "aria-live": "polite", style: [styles49.description, { color: theme.dangerText }], children: error }) : null
5615
5667
  ] });
5616
5668
  }
5617
- var styles47 = StyleSheet47.create({
5669
+ var styles49 = StyleSheet49.create({
5618
5670
  root: { gap: 2, alignSelf: "stretch" },
5619
5671
  row: { flexDirection: "row", alignItems: "center", gap: 16, minHeight: 48 },
5620
5672
  text: { flex: 1, gap: 2 },
@@ -5626,15 +5678,15 @@ var styles47 = StyleSheet47.create({
5626
5678
  });
5627
5679
 
5628
5680
  // src/native/tab-bar.tsx
5629
- import { Pressable as Pressable26, StyleSheet as StyleSheet48, Text as Text19, View as View55 } from "react-native";
5630
- import { jsx as jsx63, jsxs as jsxs54 } from "react/jsx-runtime";
5681
+ import { Pressable as Pressable26, StyleSheet as StyleSheet50, Text as Text19, View as View57 } from "react-native";
5682
+ import { jsx as jsx65, jsxs as jsxs56 } from "react/jsx-runtime";
5631
5683
  function TabBar({ items: items2, value, onValueChange, onReselect, "aria-label": label, style }) {
5632
5684
  const { theme, insets, haptic } = useTheme();
5633
- return /* @__PURE__ */ jsx63(View55, { role: "tablist", "aria-label": label, style: [styles48.bar, { backgroundColor: theme.glassBg, borderTopColor: theme.glassBorder, paddingBottom: Math.max(6, insets.bottom) }, style], children: items2.map((item) => {
5685
+ return /* @__PURE__ */ jsx65(View57, { role: "tablist", "aria-label": label, style: [styles50.bar, { backgroundColor: theme.glassBg, borderTopColor: theme.glassBorder, paddingBottom: Math.max(6, insets.bottom) }, style], children: items2.map((item) => {
5634
5686
  const selected = item.value === value;
5635
5687
  const color = selected ? theme.accentText : theme.textSecondary;
5636
5688
  const badge = item.badge === true ? "" : typeof item.badge === "number" && item.badge > 0 ? item.badge > 99 ? "99+" : String(item.badge) : null;
5637
- return /* @__PURE__ */ jsxs54(
5689
+ return /* @__PURE__ */ jsxs56(
5638
5690
  Pressable26,
5639
5691
  {
5640
5692
  role: "tab",
@@ -5644,22 +5696,22 @@ function TabBar({ items: items2, value, onValueChange, onReselect, "aria-label":
5644
5696
  if (selected) onReselect?.(item.value);
5645
5697
  else onValueChange(item.value);
5646
5698
  },
5647
- style: ({ pressed }) => [styles48.item, { opacity: pressed ? 0.7 : 1 }],
5699
+ style: ({ pressed }) => [styles50.item, { opacity: pressed ? 0.7 : 1 }],
5648
5700
  children: [
5649
- /* @__PURE__ */ jsxs54(View55, { "aria-hidden": true, style: styles48.icon, children: [
5701
+ /* @__PURE__ */ jsxs56(View57, { "aria-hidden": true, style: styles50.icon, children: [
5650
5702
  item.icon(selected, color),
5651
- badge !== null ? /* @__PURE__ */ jsx63(View55, { style: [badge ? styles48.count : styles48.dot, { backgroundColor: theme.danger, borderColor: theme.surface1 }], children: badge ? /* @__PURE__ */ jsx63(Text19, { style: [styles48.countText, { color: theme.onAccent }], children: badge }) : null }) : null
5703
+ badge !== null ? /* @__PURE__ */ jsx65(View57, { style: [badge ? styles50.count : styles50.dot, { backgroundColor: theme.danger, borderColor: theme.surface1 }], children: badge ? /* @__PURE__ */ jsx65(Text19, { style: [styles50.countText, { color: theme.onAccent }], children: badge }) : null }) : null
5652
5704
  ] }),
5653
- /* @__PURE__ */ jsx63(Text19, { numberOfLines: 1, style: [styles48.label, { color, fontWeight: selected ? "700" : "500" }], children: item.label }),
5654
- badge !== null && item.badgeLabel ? /* @__PURE__ */ jsx63(Text19, { style: styles48.unseen, children: `, ${item.badgeLabel}` }) : null
5705
+ /* @__PURE__ */ jsx65(Text19, { numberOfLines: 1, style: [styles50.label, { color, fontWeight: selected ? "700" : "500" }], children: item.label }),
5706
+ badge !== null && item.badgeLabel ? /* @__PURE__ */ jsx65(Text19, { style: styles50.unseen, children: `, ${item.badgeLabel}` }) : null
5655
5707
  ]
5656
5708
  },
5657
5709
  item.value
5658
5710
  );
5659
5711
  }) });
5660
5712
  }
5661
- var styles48 = StyleSheet48.create({
5662
- bar: { flexDirection: "row", borderTopWidth: StyleSheet48.hairlineWidth, paddingTop: 6 },
5713
+ var styles50 = StyleSheet50.create({
5714
+ bar: { flexDirection: "row", borderTopWidth: StyleSheet50.hairlineWidth, paddingTop: 6 },
5663
5715
  item: { flex: 1, alignItems: "center", gap: 2, minHeight: 48, justifyContent: "center" },
5664
5716
  icon: { width: 28, height: 26, alignItems: "center", justifyContent: "center" },
5665
5717
  label: { fontSize: 11, lineHeight: 14 },
@@ -5671,8 +5723,8 @@ var styles48 = StyleSheet48.create({
5671
5723
 
5672
5724
  // src/native/tabs.tsx
5673
5725
  import * as React43 from "react";
5674
- import { Pressable as Pressable27, ScrollView as ScrollView7, StyleSheet as StyleSheet49, View as View56 } from "react-native";
5675
- import { jsx as jsx64, jsxs as jsxs55 } from "react/jsx-runtime";
5726
+ import { Pressable as Pressable27, ScrollView as ScrollView7, StyleSheet as StyleSheet51, View as View58 } from "react-native";
5727
+ import { jsx as jsx66, jsxs as jsxs57 } from "react/jsx-runtime";
5676
5728
  function Tabs({ items: items2, value, defaultValue, onValueChange, "aria-label": label, variant = "underline", style }) {
5677
5729
  const { theme, radius: radius3, haptic } = useTheme();
5678
5730
  const [own, setOwn] = React43.useState(defaultValue ?? items2[0]?.value);
@@ -5686,7 +5738,7 @@ function Tabs({ items: items2, value, defaultValue, onValueChange, "aria-label":
5686
5738
  const segmented = variant === "segmented";
5687
5739
  const tabs = items2.map((item) => {
5688
5740
  const selected = item.value === current;
5689
- return /* @__PURE__ */ jsx64(
5741
+ return /* @__PURE__ */ jsx66(
5690
5742
  Pressable27,
5691
5743
  {
5692
5744
  role: "tab",
@@ -5695,45 +5747,45 @@ function Tabs({ items: items2, value, defaultValue, onValueChange, "aria-label":
5695
5747
  disabled: item.disabled,
5696
5748
  onPress: () => select(item.value),
5697
5749
  style: [
5698
- segmented ? styles49.segment : styles49.tab,
5750
+ segmented ? styles51.segment : styles51.tab,
5699
5751
  segmented && selected ? { backgroundColor: theme.surface0, borderColor: theme.borderDefault, borderRadius: radius3.sm } : null,
5700
5752
  !segmented ? { borderBottomColor: selected ? theme.accent : "transparent" } : null,
5701
- item.disabled ? styles49.disabled : null
5753
+ item.disabled ? styles51.disabled : null
5702
5754
  ],
5703
- children: /* @__PURE__ */ jsxs55(Txt, { variant: "label", tone: selected ? "text" : "secondary", numberOfLines: 1, children: [
5755
+ children: /* @__PURE__ */ jsxs57(Txt, { variant: "label", tone: selected ? "text" : "secondary", numberOfLines: 1, children: [
5704
5756
  item.label,
5705
- item.count !== void 0 ? /* @__PURE__ */ jsx64(Txt, { variant: "caption", tone: "secondary", children: ` ${item.count}` }) : null
5757
+ item.count !== void 0 ? /* @__PURE__ */ jsx66(Txt, { variant: "caption", tone: "secondary", children: ` ${item.count}` }) : null
5706
5758
  ] })
5707
5759
  },
5708
5760
  item.value
5709
5761
  );
5710
5762
  });
5711
5763
  const panel = items2.find((i) => i.value === current)?.content;
5712
- return /* @__PURE__ */ jsxs55(View56, { style: [styles49.root, style], children: [
5713
- segmented ? /* @__PURE__ */ jsx64(View56, { role: "tablist", "aria-label": label, style: [styles49.track, { backgroundColor: theme.surface2, borderColor: theme.borderSubtle, borderRadius: radius3.md }], children: tabs }) : /* @__PURE__ */ jsx64(View56, { style: [styles49.underline, { borderBottomColor: theme.borderSubtle }], children: /* @__PURE__ */ jsx64(ScrollView7, { horizontal: true, showsHorizontalScrollIndicator: false, role: "tablist", "aria-label": label, contentContainerStyle: styles49.scroll, children: tabs }) }),
5714
- panel !== void 0 ? /* @__PURE__ */ jsx64(View56, { role: "tabpanel", children: panel }) : null
5764
+ return /* @__PURE__ */ jsxs57(View58, { style: [styles51.root, style], children: [
5765
+ segmented ? /* @__PURE__ */ jsx66(View58, { role: "tablist", "aria-label": label, style: [styles51.track, { backgroundColor: theme.surface2, borderColor: theme.borderSubtle, borderRadius: radius3.md }], children: tabs }) : /* @__PURE__ */ jsx66(View58, { style: [styles51.underline, { borderBottomColor: theme.borderSubtle }], children: /* @__PURE__ */ jsx66(ScrollView7, { horizontal: true, showsHorizontalScrollIndicator: false, role: "tablist", "aria-label": label, contentContainerStyle: styles51.scroll, children: tabs }) }),
5766
+ panel !== void 0 ? /* @__PURE__ */ jsx66(View58, { role: "tabpanel", children: panel }) : null
5715
5767
  ] });
5716
5768
  }
5717
- var styles49 = StyleSheet49.create({
5769
+ var styles51 = StyleSheet51.create({
5718
5770
  root: { gap: 12 },
5719
- underline: { borderBottomWidth: StyleSheet49.hairlineWidth },
5771
+ underline: { borderBottomWidth: StyleSheet51.hairlineWidth },
5720
5772
  scroll: { gap: 4, paddingHorizontal: 4 },
5721
5773
  tab: { minHeight: 44, justifyContent: "center", paddingHorizontal: 12, borderBottomWidth: 2 },
5722
- track: { flexDirection: "row", padding: 3, gap: 3, borderWidth: StyleSheet49.hairlineWidth, height: 40 },
5723
- segment: { flex: 1, alignItems: "center", justifyContent: "center", paddingHorizontal: 8, borderWidth: StyleSheet49.hairlineWidth, borderColor: "transparent" },
5774
+ track: { flexDirection: "row", padding: 3, gap: 3, borderWidth: StyleSheet51.hairlineWidth, height: 40 },
5775
+ segment: { flex: 1, alignItems: "center", justifyContent: "center", paddingHorizontal: 8, borderWidth: StyleSheet51.hairlineWidth, borderColor: "transparent" },
5724
5776
  disabled: { opacity: 0.4 }
5725
5777
  });
5726
5778
 
5727
5779
  // src/native/tag-selector.tsx
5728
- import { StyleSheet as StyleSheet50, View as View57 } from "react-native";
5729
- import { jsx as jsx65, jsxs as jsxs56 } from "react/jsx-runtime";
5780
+ import { StyleSheet as StyleSheet52, View as View59 } from "react-native";
5781
+ import { jsx as jsx67, jsxs as jsxs58 } from "react/jsx-runtime";
5730
5782
  function TagSelector({ label, options, value, onValueChange, max, countLabel, style }) {
5731
5783
  const { haptic } = useTheme();
5732
5784
  const full = max !== void 0 && value.length >= max;
5733
- return /* @__PURE__ */ jsxs56(View57, { style: [styles50.root, style], children: [
5734
- /* @__PURE__ */ jsx65(View57, { role: "group", "aria-label": label, style: styles50.wrap, children: options.map((option) => {
5785
+ return /* @__PURE__ */ jsxs58(View59, { style: [styles52.root, style], children: [
5786
+ /* @__PURE__ */ jsx67(View59, { role: "group", "aria-label": label, style: styles52.wrap, children: options.map((option) => {
5735
5787
  const on = value.includes(option.value);
5736
- return /* @__PURE__ */ jsx65(
5788
+ return /* @__PURE__ */ jsx67(
5737
5789
  Chip,
5738
5790
  {
5739
5791
  selected: on,
@@ -5747,15 +5799,15 @@ function TagSelector({ label, options, value, onValueChange, max, countLabel, st
5747
5799
  option.value
5748
5800
  );
5749
5801
  }) }),
5750
- max !== void 0 && countLabel ? /* @__PURE__ */ jsx65(Txt, { variant: "caption", tone: full ? "accent" : "secondary", "aria-live": "polite", children: countLabel(value.length, max) }) : null
5802
+ max !== void 0 && countLabel ? /* @__PURE__ */ jsx67(Txt, { variant: "caption", tone: full ? "accent" : "secondary", "aria-live": "polite", children: countLabel(value.length, max) }) : null
5751
5803
  ] });
5752
5804
  }
5753
- var styles50 = StyleSheet50.create({ root: { gap: 8 }, wrap: { flexDirection: "row", flexWrap: "wrap", gap: 8 } });
5805
+ var styles52 = StyleSheet52.create({ root: { gap: 8 }, wrap: { flexDirection: "row", flexWrap: "wrap", gap: 8 } });
5754
5806
 
5755
5807
  // src/native/toast.tsx
5756
5808
  import * as React44 from "react";
5757
- import { AccessibilityInfo as AccessibilityInfo15, Animated as Animated27, PanResponder as PanResponder5, Pressable as Pressable28, StyleSheet as StyleSheet51, Text as Text20, View as View58 } from "react-native";
5758
- import { Fragment as Fragment9, jsx as jsx66, jsxs as jsxs57 } from "react/jsx-runtime";
5809
+ import { AccessibilityInfo as AccessibilityInfo15, Animated as Animated27, PanResponder as PanResponder5, Pressable as Pressable28, StyleSheet as StyleSheet53, Text as Text20, View as View60 } from "react-native";
5810
+ import { Fragment as Fragment9, jsx as jsx68, jsxs as jsxs59 } from "react/jsx-runtime";
5759
5811
  var items = [];
5760
5812
  var listeners2 = /* @__PURE__ */ new Set();
5761
5813
  var counter = 0;
@@ -5822,15 +5874,15 @@ function ToastView({ item, closeLabel, duration }) {
5822
5874
  return () => clearTimeout(timer2);
5823
5875
  }, [item.id, ms]);
5824
5876
  const edge = { success: theme.success, warning: theme.warning, error: theme.danger, info: theme.info, default: theme.borderDefault }[item.tone ?? "default"];
5825
- const text = /* @__PURE__ */ jsxs57(Fragment9, { children: [
5826
- item.icon ? /* @__PURE__ */ jsx66(View58, { "aria-hidden": true, children: item.icon }) : null,
5827
- /* @__PURE__ */ jsxs57(View58, { style: styles51.content, children: [
5828
- /* @__PURE__ */ jsx66(Txt, { variant: "label", numberOfLines: 2, children: item.title }),
5829
- item.description ? /* @__PURE__ */ jsx66(Txt, { variant: "caption", tone: "secondary", numberOfLines: 3, children: item.description }) : null
5877
+ const text = /* @__PURE__ */ jsxs59(Fragment9, { children: [
5878
+ item.icon ? /* @__PURE__ */ jsx68(View60, { "aria-hidden": true, children: item.icon }) : null,
5879
+ /* @__PURE__ */ jsxs59(View60, { style: styles53.content, children: [
5880
+ /* @__PURE__ */ jsx68(Txt, { variant: "label", numberOfLines: 2, children: item.title }),
5881
+ item.description ? /* @__PURE__ */ jsx68(Txt, { variant: "caption", tone: "secondary", numberOfLines: 3, children: item.description }) : null
5830
5882
  ] })
5831
5883
  ] });
5832
- const body = /* @__PURE__ */ jsxs57(Fragment9, { children: [
5833
- item.onPress ? /* @__PURE__ */ jsx66(
5884
+ const body = /* @__PURE__ */ jsxs59(Fragment9, { children: [
5885
+ item.onPress ? /* @__PURE__ */ jsx68(
5834
5886
  Pressable28,
5835
5887
  {
5836
5888
  role: "button",
@@ -5838,11 +5890,11 @@ function ToastView({ item, closeLabel, duration }) {
5838
5890
  item.onPress?.();
5839
5891
  dismiss(item.id);
5840
5892
  },
5841
- style: ({ pressed }) => [styles51.main, { opacity: pressed ? 0.8 : 1 }],
5893
+ style: ({ pressed }) => [styles53.main, { opacity: pressed ? 0.8 : 1 }],
5842
5894
  children: text
5843
5895
  }
5844
- ) : /* @__PURE__ */ jsx66(View58, { style: styles51.main, children: text }),
5845
- item.action ? /* @__PURE__ */ jsx66(
5896
+ ) : /* @__PURE__ */ jsx68(View60, { style: styles53.main, children: text }),
5897
+ item.action ? /* @__PURE__ */ jsx68(
5846
5898
  Pressable28,
5847
5899
  {
5848
5900
  role: "button",
@@ -5850,33 +5902,33 @@ function ToastView({ item, closeLabel, duration }) {
5850
5902
  item.action?.onPress();
5851
5903
  dismiss(item.id);
5852
5904
  },
5853
- style: [styles51.action, { backgroundColor: theme.accent, borderRadius: radius3.sm }],
5854
- children: /* @__PURE__ */ jsx66(Text20, { style: [styles51.actionLabel, { color: theme.onAccent }], children: item.action.label })
5905
+ style: [styles53.action, { backgroundColor: theme.accent, borderRadius: radius3.sm }],
5906
+ children: /* @__PURE__ */ jsx68(Text20, { style: [styles53.actionLabel, { color: theme.onAccent }], children: item.action.label })
5855
5907
  }
5856
5908
  ) : null,
5857
- /* @__PURE__ */ jsx66(Pressable28, { role: "button", "aria-label": closeLabel, hitSlop: 10, onPress: () => dismiss(item.id), style: styles51.close, children: /* @__PURE__ */ jsx66(Text20, { style: [styles51.cross, { color: theme.textSecondary }], children: "\xD7" }) })
5909
+ /* @__PURE__ */ jsx68(Pressable28, { role: "button", "aria-label": closeLabel, hitSlop: 10, onPress: () => dismiss(item.id), style: styles53.close, children: /* @__PURE__ */ jsx68(Text20, { style: [styles53.cross, { color: theme.textSecondary }], children: "\xD7" }) })
5858
5910
  ] });
5859
5911
  const frame = [
5860
- styles51.toast,
5912
+ styles53.toast,
5861
5913
  { backgroundColor: theme.surface2, borderColor: theme.borderDefault, borderLeftColor: edge, borderRadius: radius3.lg, shadowColor: theme.scrimStrong }
5862
5914
  ];
5863
5915
  const motion3 = { transform: [{ translateY: enter.interpolate({ inputRange: [0, 1], outputRange: [-8, 0] }) }, { translateX: swipe }] };
5864
- return /* @__PURE__ */ jsx66(Animated27.View, { "aria-live": "polite", style: motion3, ...drag.panHandlers, children: /* @__PURE__ */ jsx66(View58, { style: frame, children: body }) });
5916
+ return /* @__PURE__ */ jsx68(Animated27.View, { "aria-live": "polite", style: motion3, ...drag.panHandlers, children: /* @__PURE__ */ jsx68(View60, { style: frame, children: body }) });
5865
5917
  }
5866
5918
  function Toaster({ closeLabel, position = "top", offset = 12, duration = 6e3, max = 3 }) {
5867
5919
  const all = React44.useSyncExternalStore(subscribe2, snapshot, snapshot);
5868
5920
  const shown = all.slice(-max);
5869
5921
  if (shown.length === 0) return null;
5870
- return /* @__PURE__ */ jsx66(View58, { pointerEvents: "box-none", style: [styles51.stack, position === "top" ? { top: offset } : { bottom: offset }], children: (position === "top" ? shown : [...shown].reverse()).map((item) => /* @__PURE__ */ jsx66(ToastView, { item, closeLabel, duration }, item.id)) });
5922
+ return /* @__PURE__ */ jsx68(View60, { pointerEvents: "box-none", style: [styles53.stack, position === "top" ? { top: offset } : { bottom: offset }], children: (position === "top" ? shown : [...shown].reverse()).map((item) => /* @__PURE__ */ jsx68(ToastView, { item, closeLabel, duration }, item.id)) });
5871
5923
  }
5872
- var styles51 = StyleSheet51.create({
5924
+ var styles53 = StyleSheet53.create({
5873
5925
  stack: { position: "absolute", left: 12, right: 12, gap: 8, zIndex: 100 },
5874
5926
  toast: {
5875
5927
  flexDirection: "row",
5876
5928
  alignItems: "center",
5877
5929
  gap: 10,
5878
5930
  padding: 12,
5879
- borderWidth: StyleSheet51.hairlineWidth,
5931
+ borderWidth: StyleSheet53.hairlineWidth,
5880
5932
  borderLeftWidth: 4,
5881
5933
  shadowOpacity: 0.3,
5882
5934
  shadowRadius: 16,
@@ -5891,15 +5943,51 @@ var styles51 = StyleSheet51.create({
5891
5943
  cross: { fontSize: 18, lineHeight: 20, fontWeight: "700" }
5892
5944
  });
5893
5945
 
5946
+ // src/native/update-prompt.tsx
5947
+ import { StyleSheet as StyleSheet54, View as View61 } from "react-native";
5948
+ import { jsx as jsx69, jsxs as jsxs60 } from "react/jsx-runtime";
5949
+ function UpdatePrompt({ title, message, versionLabel, mark, updateLabel, onUpdate, laterLabel, onLater, style }) {
5950
+ const { theme, radius: radius3 } = useTheme();
5951
+ return /* @__PURE__ */ jsxs60(
5952
+ View61,
5953
+ {
5954
+ role: "region",
5955
+ "aria-label": title,
5956
+ style: [styles54.root, { backgroundColor: theme.surface1, borderColor: theme.borderSubtle, borderRadius: radius3.xl }, style],
5957
+ children: [
5958
+ /* @__PURE__ */ jsxs60(View61, { style: styles54.head, children: [
5959
+ mark ? /* @__PURE__ */ jsx69(View61, { accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants", style: styles54.mark, children: mark }) : null,
5960
+ /* @__PURE__ */ jsxs60(View61, { style: styles54.text, children: [
5961
+ /* @__PURE__ */ jsx69(Txt, { variant: "label", children: title }),
5962
+ message ? /* @__PURE__ */ jsx69(Txt, { tone: "secondary", children: message }) : null,
5963
+ versionLabel ? /* @__PURE__ */ jsx69(Txt, { variant: "mono", tone: "secondary", children: versionLabel }) : null
5964
+ ] })
5965
+ ] }),
5966
+ /* @__PURE__ */ jsxs60(View61, { style: styles54.actions, children: [
5967
+ /* @__PURE__ */ jsx69(Button, { label: laterLabel, variant: "ghost", size: "sm", onPress: onLater }),
5968
+ /* @__PURE__ */ jsx69(Button, { label: updateLabel, variant: "primary", size: "sm", onPress: onUpdate })
5969
+ ] })
5970
+ ]
5971
+ }
5972
+ );
5973
+ }
5974
+ var styles54 = StyleSheet54.create({
5975
+ root: { gap: 12, padding: 16, borderWidth: StyleSheet54.hairlineWidth },
5976
+ head: { flexDirection: "row", gap: 12, alignItems: "center" },
5977
+ mark: { width: 40, height: 40, alignItems: "center", justifyContent: "center" },
5978
+ text: { flex: 1, gap: 2 },
5979
+ actions: { flexDirection: "row", justifyContent: "flex-end", gap: 8 }
5980
+ });
5981
+
5894
5982
  // src/native/verified-badge.tsx
5895
- import { StyleSheet as StyleSheet52, View as View59 } from "react-native";
5983
+ import { StyleSheet as StyleSheet55, View as View62 } from "react-native";
5896
5984
  import Svg31, { Path as Path26 } from "react-native-svg";
5897
- import { jsx as jsx67, jsxs as jsxs58 } from "react/jsx-runtime";
5985
+ import { jsx as jsx70, jsxs as jsxs61 } from "react/jsx-runtime";
5898
5986
  function VerifiedBadge({ label, showLabel, size = 16, on = "surface" }) {
5899
5987
  const { theme } = useTheme();
5900
- return /* @__PURE__ */ jsxs58(View59, { accessible: true, role: "img", "aria-label": label, style: styles52.row, children: [
5901
- /* @__PURE__ */ jsxs58(Svg31, { width: size, height: size, viewBox: "0 0 24 24", "aria-hidden": true, children: [
5902
- /* @__PURE__ */ jsx67(
5988
+ return /* @__PURE__ */ jsxs61(View62, { accessible: true, role: "img", "aria-label": label, style: styles55.row, children: [
5989
+ /* @__PURE__ */ jsxs61(Svg31, { width: size, height: size, viewBox: "0 0 24 24", "aria-hidden": true, children: [
5990
+ /* @__PURE__ */ jsx70(
5903
5991
  Path26,
5904
5992
  {
5905
5993
  d: "M12 2.5l2.4 1.7 2.9-.1.9 2.8 2.3 1.8-.9 2.8.9 2.8-2.3 1.8-.9 2.8-2.9-.1L12 21.5l-2.4-1.7-2.9.1-.9-2.8-2.3-1.8.9-2.8-.9-2.8 2.3-1.8.9-2.8 2.9.1z",
@@ -5908,12 +5996,12 @@ function VerifiedBadge({ label, showLabel, size = 16, on = "surface" }) {
5908
5996
  strokeWidth: 1.2
5909
5997
  }
5910
5998
  ),
5911
- /* @__PURE__ */ jsx67(Path26, { d: "M8.3 12.3l2.5 2.5 4.9-5.2", fill: "none", stroke: theme.onAccent, strokeWidth: 2.2, strokeLinecap: "round", strokeLinejoin: "round" })
5999
+ /* @__PURE__ */ jsx70(Path26, { d: "M8.3 12.3l2.5 2.5 4.9-5.2", fill: "none", stroke: theme.onAccent, strokeWidth: 2.2, strokeLinecap: "round", strokeLinejoin: "round" })
5912
6000
  ] }),
5913
- showLabel ? /* @__PURE__ */ jsx67(Txt, { variant: "caption", tone: on === "media" ? "onMedia" : "accent", style: styles52.text, children: label }) : null
6001
+ showLabel ? /* @__PURE__ */ jsx70(Txt, { variant: "caption", tone: on === "media" ? "onMedia" : "accent", style: styles55.text, children: label }) : null
5914
6002
  ] });
5915
6003
  }
5916
- var styles52 = StyleSheet52.create({ row: { flexDirection: "row", alignItems: "center", gap: 4 }, text: { fontWeight: "700" } });
6004
+ var styles55 = StyleSheet55.create({ row: { flexDirection: "row", alignItems: "center", gap: 4 }, text: { fontWeight: "700" } });
5917
6005
  export {
5918
6006
  ActionSheet,
5919
6007
  ActivityFeed,
@@ -5946,6 +6034,7 @@ export {
5946
6034
  EmptyState,
5947
6035
  ErrorState,
5948
6036
  Fab,
6037
+ ForceUpdateScreen,
5949
6038
  GoalGauge,
5950
6039
  Header,
5951
6040
  IconButton,
@@ -5955,6 +6044,7 @@ export {
5955
6044
  Loader,
5956
6045
  LoaderGlyph,
5957
6046
  LoadingState,
6047
+ MaintenanceScreen,
5958
6048
  Mascot,
5959
6049
  MascotState,
5960
6050
  MatchDialog,
@@ -6002,6 +6092,7 @@ export {
6002
6092
  Toaster,
6003
6093
  Txt,
6004
6094
  TypingIndicator,
6095
+ UpdatePrompt,
6005
6096
  VerifiedBadge,
6006
6097
  WelcomeState,
6007
6098
  Wheel,