@krizaka/ui 3.20.0 → 3.22.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 (263) hide show
  1. package/README.md +1 -0
  2. package/dist/action-bar.js +4 -4
  3. package/dist/app-shell.js +1 -1
  4. package/dist/argument-card.js +4 -4
  5. package/dist/blocks.css +1 -1
  6. package/dist/button.js +3 -2
  7. package/dist/card.js +3 -3
  8. package/dist/{chunk-5MH64NIL.js → chunk-2L67YTNV.js} +2 -2
  9. package/dist/{chunk-2NB27LM7.js → chunk-3IN6TOPM.js} +4 -4
  10. package/dist/{chunk-VDR2EP6K.js → chunk-4QN5YJ3D.js} +17 -5
  11. package/dist/chunk-4QN5YJ3D.js.map +1 -0
  12. package/dist/chunk-AQSZJJAJ.js +126 -0
  13. package/dist/chunk-AQSZJJAJ.js.map +1 -0
  14. package/dist/{chunk-3GODX3D6.js → chunk-QDXV544C.js} +2 -2
  15. package/dist/chunk-QDXV544C.js.map +1 -0
  16. package/dist/chunk-R6NK6ZNY.js +1080 -0
  17. package/dist/chunk-R6NK6ZNY.js.map +1 -0
  18. package/dist/chunk-TDG7ED2W.js +1 -0
  19. package/dist/chunk-TDG7ED2W.js.map +1 -0
  20. package/dist/{chunk-LIPK4UCS.js → chunk-YCIBJ6OQ.js} +140 -209
  21. package/dist/chunk-YCIBJ6OQ.js.map +1 -0
  22. package/dist/code-block.js +17 -5
  23. package/dist/code-block.js.map +1 -1
  24. package/dist/comparison-table.d.ts +44 -0
  25. package/dist/comparison-table.js +84 -0
  26. package/dist/comparison-table.js.map +1 -0
  27. package/dist/data-table.js +19 -1066
  28. package/dist/data-table.js.map +1 -1
  29. package/dist/date-picker.js +5 -5
  30. package/dist/date-picker.js.map +1 -1
  31. package/dist/force-update-screen.d.ts +80 -0
  32. package/dist/force-update-screen.js +38 -0
  33. package/dist/force-update-screen.js.map +1 -0
  34. package/dist/genui.d.ts +219 -0
  35. package/dist/genui.js +506 -0
  36. package/dist/genui.js.map +1 -0
  37. package/dist/index.d.ts +17 -24
  38. package/dist/index.js +1 -1
  39. package/dist/maintenance-screen.d.ts +68 -0
  40. package/dist/maintenance-screen.js +35 -0
  41. package/dist/maintenance-screen.js.map +1 -0
  42. package/dist/marketing-layout.js +1 -1
  43. package/dist/marketing-layout.js.map +1 -1
  44. package/dist/media-grid.js +44 -152
  45. package/dist/media-grid.js.map +1 -1
  46. package/dist/meta-row.d.ts +54 -0
  47. package/dist/meta-row.js +35 -0
  48. package/dist/meta-row.js.map +1 -0
  49. package/dist/native.d.ts +92 -16
  50. package/dist/native.js +873 -814
  51. package/dist/native.js.map +1 -1
  52. package/dist/nav-bar.d.ts +30 -7
  53. package/dist/nav-bar.js +71 -17
  54. package/dist/nav-bar.js.map +1 -1
  55. package/dist/page-hero.js +5 -5
  56. package/dist/radio-group.js +1 -1
  57. package/dist/settings-layout.js +1 -1
  58. package/dist/settings-layout.js.map +1 -1
  59. package/dist/site-footer.js +2 -2
  60. package/dist/skip-link.js +1 -1
  61. package/dist/step-showcase.d.ts +62 -0
  62. package/dist/step-showcase.js +227 -0
  63. package/dist/step-showcase.js.map +1 -0
  64. package/dist/tabs.js +2 -2
  65. package/dist/tabs.js.map +1 -1
  66. package/dist/update-prompt.d.ts +86 -0
  67. package/dist/update-prompt.js +41 -0
  68. package/dist/update-prompt.js.map +1 -0
  69. package/dist/video-player.d.ts +1 -1
  70. package/dist/video-player.js +16 -3
  71. package/dist/video-player.js.map +1 -1
  72. package/package.json +108 -9
  73. package/registry/achievement.json +1 -1
  74. package/registry/action-bar.json +1 -1
  75. package/registry/activity-feed.json +1 -1
  76. package/registry/alert.json +1 -1
  77. package/registry/app-shell.json +1 -1
  78. package/registry/argument-card.json +1 -1
  79. package/registry/audio-player.json +1 -1
  80. package/registry/auth-layout.json +1 -1
  81. package/registry/avatar.json +1 -1
  82. package/registry/badge.json +1 -1
  83. package/registry/button.json +1 -1
  84. package/registry/card-grid.json +1 -1
  85. package/registry/card.json +1 -1
  86. package/registry/catalogue-page.json +1 -1
  87. package/registry/changelog-page.json +1 -1
  88. package/registry/chat.json +1 -1
  89. package/registry/checkbox.json +1 -1
  90. package/registry/chip-link.json +1 -1
  91. package/registry/chip.json +1 -1
  92. package/registry/choice-grid.json +1 -1
  93. package/registry/code-block.json +1 -1
  94. package/registry/combobox.json +1 -1
  95. package/registry/command.json +1 -1
  96. package/registry/comparison-table.json +207 -0
  97. package/registry/component-page.json +1 -1
  98. package/registry/confirm-button.json +1 -1
  99. package/registry/contact-page.json +1 -1
  100. package/registry/continue-prompt.json +1 -1
  101. package/registry/countdown.json +1 -1
  102. package/registry/cta-panel.json +1 -1
  103. package/registry/dashboard-layout.json +1 -1
  104. package/registry/data-table.json +1 -1
  105. package/registry/date-picker.json +3 -3
  106. package/registry/decision-list.json +1 -1
  107. package/registry/description-list.json +1 -1
  108. package/registry/detail-layout.json +1 -1
  109. package/registry/dialog.json +1 -1
  110. package/registry/docs-article-page.json +1 -1
  111. package/registry/docs-hub-page.json +1 -1
  112. package/registry/docs-layout.json +1 -1
  113. package/registry/document-viewer.json +1 -1
  114. package/registry/dropdown-menu.json +1 -1
  115. package/registry/empty-state.json +1 -1
  116. package/registry/error-page.json +1 -1
  117. package/registry/examples/comparison-table/versus.d.ts +4 -0
  118. package/registry/examples/comparison-table/versus.js +28 -0
  119. package/registry/examples/comparison-table/versus.tsx +20 -0
  120. package/registry/examples/dialog/native/sheet.dark.png +0 -0
  121. package/registry/examples/dialog/native/sheet.light.png +0 -0
  122. package/registry/examples/force-update-screen/default.d.ts +4 -0
  123. package/registry/examples/force-update-screen/default.js +25 -0
  124. package/registry/examples/force-update-screen/default.tsx +19 -0
  125. package/registry/examples/force-update-screen/native/default.d.ts +4 -0
  126. package/registry/examples/force-update-screen/native/default.dark.png +0 -0
  127. package/registry/examples/force-update-screen/native/default.js +24 -0
  128. package/registry/examples/force-update-screen/native/default.light.png +0 -0
  129. package/registry/examples/force-update-screen/native/default.tsx +18 -0
  130. package/registry/examples/genui/streaming.d.ts +4 -0
  131. package/registry/examples/genui/streaming.js +18 -0
  132. package/registry/examples/genui/streaming.tsx +14 -0
  133. package/registry/examples/genui/table.d.ts +4 -0
  134. package/registry/examples/genui/table.js +19 -0
  135. package/registry/examples/genui/table.tsx +14 -0
  136. package/registry/examples/maintenance-screen/default.d.ts +4 -0
  137. package/registry/examples/maintenance-screen/default.js +22 -0
  138. package/registry/examples/maintenance-screen/default.tsx +16 -0
  139. package/registry/examples/maintenance-screen/native/default.d.ts +4 -0
  140. package/registry/examples/maintenance-screen/native/default.dark.png +0 -0
  141. package/registry/examples/maintenance-screen/native/default.js +21 -0
  142. package/registry/examples/maintenance-screen/native/default.light.png +0 -0
  143. package/registry/examples/maintenance-screen/native/default.tsx +15 -0
  144. package/registry/examples/meta-row/native/video.d.ts +4 -0
  145. package/registry/examples/meta-row/native/video.dark.png +0 -0
  146. package/registry/examples/meta-row/native/video.js +11 -0
  147. package/registry/examples/meta-row/native/video.light.png +0 -0
  148. package/registry/examples/meta-row/native/video.tsx +5 -0
  149. package/registry/examples/meta-row/status.d.ts +4 -0
  150. package/registry/examples/meta-row/status.js +12 -0
  151. package/registry/examples/meta-row/status.tsx +7 -0
  152. package/registry/examples/meta-row/video.d.ts +4 -0
  153. package/registry/examples/meta-row/video.js +12 -0
  154. package/registry/examples/meta-row/video.tsx +7 -0
  155. package/registry/examples/nav-bar/family-product.js +16 -13
  156. package/registry/examples/nav-bar/family-product.tsx +19 -19
  157. package/registry/examples/step-showcase/desktop.d.ts +4 -0
  158. package/registry/examples/step-showcase/desktop.js +24 -0
  159. package/registry/examples/step-showcase/desktop.tsx +19 -0
  160. package/registry/examples/step-showcase/phone.d.ts +4 -0
  161. package/registry/examples/step-showcase/phone.js +24 -0
  162. package/registry/examples/step-showcase/phone.tsx +19 -0
  163. package/registry/examples/update-prompt/default.d.ts +4 -0
  164. package/registry/examples/update-prompt/default.js +24 -0
  165. package/registry/examples/update-prompt/default.tsx +18 -0
  166. package/registry/examples/update-prompt/native/default.d.ts +4 -0
  167. package/registry/examples/update-prompt/native/default.dark.png +0 -0
  168. package/registry/examples/update-prompt/native/default.js +23 -0
  169. package/registry/examples/update-prompt/native/default.light.png +0 -0
  170. package/registry/examples/update-prompt/native/default.tsx +17 -0
  171. package/registry/field.json +1 -1
  172. package/registry/file-upload.json +1 -1
  173. package/registry/filter-bar.json +1 -1
  174. package/registry/force-update-screen.json +323 -0
  175. package/registry/form.json +1 -1
  176. package/registry/gallery-page.json +1 -1
  177. package/registry/genui.json +409 -0
  178. package/registry/glow-card.json +1 -1
  179. package/registry/goal-gauge.json +1 -1
  180. package/registry/how-it-works-page.json +1 -1
  181. package/registry/image-cropper.json +1 -1
  182. package/registry/index.json +223 -4
  183. package/registry/iso.json +1 -1
  184. package/registry/kanban.json +1 -1
  185. package/registry/kbd.json +1 -1
  186. package/registry/landing-page.json +1 -1
  187. package/registry/landscape.json +1 -1
  188. package/registry/legal-page.json +1 -1
  189. package/registry/link-card.json +1 -1
  190. package/registry/list.json +1 -1
  191. package/registry/loader.json +1 -1
  192. package/registry/longform-page.json +1 -1
  193. package/registry/maintenance-screen.json +259 -0
  194. package/registry/map.json +2 -2
  195. package/registry/markdown.json +1 -1
  196. package/registry/marketing-layout.json +1 -1
  197. package/registry/marquee.json +1 -1
  198. package/registry/mascot-quote.json +1 -1
  199. package/registry/mascot-state.json +1 -1
  200. package/registry/mascots.json +1 -1
  201. package/registry/match-dialog.json +1 -1
  202. package/registry/media-capture.json +1 -1
  203. package/registry/media-grid.json +2 -2
  204. package/registry/meta-row.json +215 -0
  205. package/registry/meter.json +1 -1
  206. package/registry/nav-bar.json +58 -25
  207. package/registry/number-ticker.json +1 -1
  208. package/registry/page-header.json +1 -1
  209. package/registry/page-hero.json +1 -1
  210. package/registry/page.json +1 -1
  211. package/registry/pagination.json +1 -1
  212. package/registry/photo-grid.json +1 -1
  213. package/registry/pointer-light.json +1 -1
  214. package/registry/popover.json +1 -1
  215. package/registry/pricing-page.json +1 -1
  216. package/registry/product-page.json +1 -1
  217. package/registry/profile-card.json +1 -1
  218. package/registry/progress.json +1 -1
  219. package/registry/promise-card.json +1 -1
  220. package/registry/radio-group.json +2 -2
  221. package/registry/recipes.json +1 -1
  222. package/registry/scroll-stage.json +1 -1
  223. package/registry/search-field.json +1 -1
  224. package/registry/section-backdrop.json +1 -1
  225. package/registry/separator.json +1 -1
  226. package/registry/settings-layout.json +2 -2
  227. package/registry/showcase.json +1 -1
  228. package/registry/site-footer.json +13 -13
  229. package/registry/sites.json +1 -1
  230. package/registry/skeleton.json +1 -1
  231. package/registry/skip-link.json +2 -2
  232. package/registry/slider.json +1 -1
  233. package/registry/slot.json +1 -1
  234. package/registry/spinner.json +1 -1
  235. package/registry/split-view.json +1 -1
  236. package/registry/stage-banner.json +1 -1
  237. package/registry/stat.json +1 -1
  238. package/registry/status-page.json +1 -1
  239. package/registry/step-progress.json +1 -1
  240. package/registry/step-showcase.json +296 -0
  241. package/registry/stepper.json +1 -1
  242. package/registry/swipe-deck.json +1 -1
  243. package/registry/switch.json +1 -1
  244. package/registry/tabs.json +3 -3
  245. package/registry/tag-input.json +1 -1
  246. package/registry/tag-selector.json +1 -1
  247. package/registry/terminal-replay.json +1 -1
  248. package/registry/theme.json +1 -1
  249. package/registry/toast.json +1 -1
  250. package/registry/toc.json +1 -1
  251. package/registry/tooltip.json +1 -1
  252. package/registry/tree-view.json +1 -1
  253. package/registry/update-prompt.json +316 -0
  254. package/registry/verified-badge.json +1 -1
  255. package/registry/vertical-video.json +1 -1
  256. package/registry/video-player.json +4 -4
  257. package/registry/video-trimmer.json +1 -1
  258. package/registry/virtual.json +1 -1
  259. package/dist/chunk-3GODX3D6.js.map +0 -1
  260. package/dist/chunk-LIPK4UCS.js.map +0 -1
  261. package/dist/chunk-VDR2EP6K.js.map +0 -1
  262. /package/dist/{chunk-5MH64NIL.js.map → chunk-2L67YTNV.js.map} +0 -0
  263. /package/dist/{chunk-2NB27LM7.js.map → chunk-3IN6TOPM.js.map} +0 -0
package/dist/native.js CHANGED
@@ -639,32 +639,30 @@ var styles3 = StyleSheet3.create({
639
639
 
640
640
  // src/native/AkinazaMark.tsx
641
641
  import { View as View3 } from "react-native";
642
- import Svg, { Circle, Defs, LinearGradient, Path, RadialGradient, Rect, Stop } from "react-native-svg";
642
+ import Svg, { Circle, Defs, Path, RadialGradient, Stop } from "react-native-svg";
643
643
 
644
644
  // src/marks/akinaza-geometry.ts
645
+ var forest = marks.akinaza[0][1];
645
646
  var copper = marks.akinaza[marks.akinaza.length - 1][1];
646
647
  var AKINAZA = {
647
648
  viewBox: "0 0 400 400",
648
649
  croppedViewBox: "80 80 240 240",
649
650
  center: 200,
650
- /** The awning: 124 → 276 at y 108, cut 28 at its upper-right corner, four scallops below (y 150, 19 deep). */
651
- awning: "M124 108 H248 L276 136 V150 A19 19 0 0 1 238 150 A19 19 0 0 1 200 150 A19 19 0 0 1 162 150 A19 19 0 0 1 124 150 Z",
652
- /** The awning's stripes, in light. */
653
- stripes: "M162 116 V146 M200 116 V146 M238 116 V140",
654
- stripe: { color: "#fff7ed", opacity: 0.55, width: 8 },
655
- /** The shop front: walls 140 → 260 from y 178 to the ground, the door cut out (178 → 222, from y 222). */
656
- front: "M140 178 H260 V300 H222 V222 H178 V300 H140 Z",
657
- /** The open door: the bright core, a warm light. */
658
- door: { x: 182, y: 226, w: 36, h: 74, rx: 4 },
659
- coreGradient: { stops: [["0%", "#fde7c7"], ["100%", "#fffaf2"]] },
660
- /** A window each side, in light. */
661
- windows: "M154 196 H168 V212 H154 Z M232 196 H246 V212 H232 Z",
662
- gradient: { x1: 140, y1: 300, x2: 276, y2: 108, stops: marks.akinaza },
651
+ forest,
652
+ copper,
653
+ log: "M197 110 L290 203 A96 96 0 1 1 197 110 Z",
654
+ /** The fresh face of the cut: a copper band along the chord. */
655
+ cut: "M197 110 L290 203 A96 96 0 0 1 289.1 219.1 L180.9 110.9 A96 96 0 0 1 197 110 Z",
656
+ /** The year rings, in light, inside the band. */
657
+ rings: { cx: 194, cy: 206, r: [52, 28], width: 7, opacity: 0.42 },
658
+ heart: { cx: 194, cy: 206, r: 16, inner: 5.4 },
659
+ highlight: "#fff7ed",
660
+ gradient: { x1: 110, y1: 300, x2: 290, y2: 100, stops: marks.akinaza },
663
661
  /** A coin: one node on the orbit, that turns with it. */
664
662
  node: { r: 9, at: [200, 40] },
665
663
  glow: { color: copper, opacity: 0.16 },
666
- /** The door's breathing light (web), in the copper. */
667
664
  pulse: { color: copper, low: 0.3, high: 0.65 },
665
+ motion: { spin: 32, breath: 3.8 },
668
666
  orbit: { r: 160, dash: "8 8", width: 1.5 },
669
667
  ring: { r: 134, width: 1 }
670
668
  };
@@ -710,36 +708,29 @@ function useMarkMotion(size, animated, spinMs = 3e4) {
710
708
  import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
711
709
  function AkinazaMark({ size = 48, animated = true, title, neutral }) {
712
710
  const { theme } = useTheme();
713
- const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, 32e3);
711
+ const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, AKINAZA.motion.spin * 1e3);
714
712
  const id = useSvgId("akm");
715
713
  const viewBox = size < 48 ? AKINAZA.croppedViewBox : AKINAZA.viewBox;
716
714
  const stroke = neutral ?? theme.textMuted;
717
- const gradient = /* @__PURE__ */ jsx5(LinearGradient, { id: `${id}a`, gradientUnits: "userSpaceOnUse", x1: AKINAZA.gradient.x1, y1: AKINAZA.gradient.y1, x2: AKINAZA.gradient.x2, y2: AKINAZA.gradient.y2, children: AKINAZA.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx5(Stop, { offset, stopColor: color }, offset)) });
718
- const fill = `url(#${id}a)`;
719
715
  return /* @__PURE__ */ jsxs3(View3, { style: { width: size, height: size }, ...markA11y(title), children: [
720
716
  /* @__PURE__ */ jsxs3(Svg, { viewBox, style: layer, children: [
721
- /* @__PURE__ */ jsxs3(Defs, { children: [
722
- /* @__PURE__ */ jsxs3(RadialGradient, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
723
- /* @__PURE__ */ jsx5(Stop, { offset: "0%", stopColor: AKINAZA.glow.color, stopOpacity: AKINAZA.glow.opacity }),
724
- /* @__PURE__ */ jsx5(Stop, { offset: "100%", stopColor: AKINAZA.glow.color, stopOpacity: 0 })
725
- ] }),
726
- gradient
727
- ] }),
717
+ /* @__PURE__ */ jsx5(Defs, { children: /* @__PURE__ */ jsxs3(RadialGradient, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
718
+ /* @__PURE__ */ jsx5(Stop, { offset: "0%", stopColor: AKINAZA.glow.color, stopOpacity: AKINAZA.glow.opacity }),
719
+ /* @__PURE__ */ jsx5(Stop, { offset: "100%", stopColor: AKINAZA.glow.color, stopOpacity: 0 })
720
+ ] }) }),
728
721
  size >= 48 ? /* @__PURE__ */ jsx5(Circle, { cx: AKINAZA.center, cy: AKINAZA.center, r: 190, fill: `url(#${id}g)` }) : null,
729
722
  /* @__PURE__ */ jsx5(Circle, { cx: AKINAZA.center, cy: AKINAZA.center, r: AKINAZA.ring.r, stroke, strokeWidth: AKINAZA.ring.width, opacity: 0.35, fill: "none" }),
730
- /* @__PURE__ */ jsx5(Path, { d: AKINAZA.awning, fill }),
731
- /* @__PURE__ */ jsx5(Path, { d: AKINAZA.stripes, stroke: AKINAZA.stripe.color, strokeOpacity: AKINAZA.stripe.opacity, strokeWidth: AKINAZA.stripe.width, strokeLinecap: "round", fill: "none" }),
732
- /* @__PURE__ */ jsx5(Path, { d: AKINAZA.front, fill }),
733
- /* @__PURE__ */ jsx5(Path, { d: AKINAZA.windows, fill: AKINAZA.stripe.color, fillOpacity: AKINAZA.stripe.opacity })
723
+ /* @__PURE__ */ jsx5(Path, { d: AKINAZA.log, fill: AKINAZA.forest }),
724
+ /* @__PURE__ */ jsx5(Path, { d: AKINAZA.cut, fill: AKINAZA.copper }),
725
+ AKINAZA.rings.r.map((r) => /* @__PURE__ */ jsx5(Circle, { cx: AKINAZA.rings.cx, cy: AKINAZA.rings.cy, r, stroke: AKINAZA.highlight, strokeOpacity: AKINAZA.rings.opacity, strokeWidth: AKINAZA.rings.width, fill: "none" }, r))
734
726
  ] }),
735
727
  /* @__PURE__ */ jsx5(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs3(Svg, { viewBox, style: layer, children: [
736
- /* @__PURE__ */ jsx5(Defs, { children: gradient }),
737
728
  /* @__PURE__ */ jsx5(Circle, { cx: AKINAZA.center, cy: AKINAZA.center, r: AKINAZA.orbit.r, stroke, strokeWidth: AKINAZA.orbit.width, strokeDasharray: AKINAZA.orbit.dash, opacity: 0.6, fill: "none" }),
738
- /* @__PURE__ */ jsx5(Circle, { cx: AKINAZA.node.at[0], cy: AKINAZA.node.at[1], r: AKINAZA.node.r, fill })
729
+ /* @__PURE__ */ jsx5(Circle, { cx: AKINAZA.node.at[0], cy: AKINAZA.node.at[1], r: AKINAZA.node.r, fill: AKINAZA.copper })
739
730
  ] }) }),
740
731
  /* @__PURE__ */ jsx5(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs3(Svg, { viewBox, style: layer, children: [
741
- /* @__PURE__ */ jsx5(Defs, { children: /* @__PURE__ */ jsx5(LinearGradient, { id: `${id}c`, x1: "50%", y1: "100%", x2: "50%", y2: "0%", children: AKINAZA.coreGradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx5(Stop, { offset, stopColor: color }, offset)) }) }),
742
- /* @__PURE__ */ jsx5(Rect, { x: AKINAZA.door.x, y: AKINAZA.door.y, width: AKINAZA.door.w, height: AKINAZA.door.h, rx: AKINAZA.door.rx, fill: `url(#${id}c)` })
732
+ /* @__PURE__ */ jsx5(Circle, { cx: AKINAZA.heart.cx, cy: AKINAZA.heart.cy, r: AKINAZA.heart.r, fill: AKINAZA.copper }),
733
+ /* @__PURE__ */ jsx5(Circle, { cx: AKINAZA.heart.cx, cy: AKINAZA.heart.cy, r: AKINAZA.heart.inner, fill: AKINAZA.highlight })
743
734
  ] }) })
744
735
  ] });
745
736
  }
@@ -747,7 +738,7 @@ function AkinazaMark({ size = 48, animated = true, title, neutral }) {
747
738
  // src/native/avatar.tsx
748
739
  import * as React4 from "react";
749
740
  import { Image, StyleSheet as StyleSheet4, Text as Text2, View as View4 } from "react-native";
750
- import Svg2, { Circle as Circle2, Defs as Defs2, LinearGradient as LinearGradient2, Stop as Stop2, SvgUri } from "react-native-svg";
741
+ import Svg2, { Circle as Circle2, Defs as Defs2, LinearGradient, Stop as Stop2, SvgUri } from "react-native-svg";
751
742
  import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
752
743
  var SIDE = { xs: 20, sm: 32, md: 40, lg: 56, xl: 80 };
753
744
  function isSvgUri(uri) {
@@ -782,7 +773,7 @@ function AvatarRoot({ src, svg, alt = "", fallback, fallbackSrc, defaultAvatar,
782
773
  const name = [alt, presence ? presenceLabel : null].filter(Boolean).join(", ");
783
774
  return /* @__PURE__ */ jsxs4(View4, { accessible: Boolean(name), role: name ? "img" : void 0, "aria-label": name || void 0, ...props, style: [{ width: outer, height: outer, alignItems: "center", justifyContent: "center" }, style], children: [
784
775
  ring ? /* @__PURE__ */ jsxs4(Svg2, { width: outer, height: outer, style: StyleSheet4.absoluteFill, "aria-hidden": true, children: [
785
- /* @__PURE__ */ jsx6(Defs2, { children: /* @__PURE__ */ jsxs4(LinearGradient2, { id: gradient, x1: "0", y1: "1", x2: "1", y2: "0", children: [
776
+ /* @__PURE__ */ jsx6(Defs2, { children: /* @__PURE__ */ jsxs4(LinearGradient, { id: gradient, x1: "0", y1: "1", x2: "1", y2: "0", children: [
786
777
  /* @__PURE__ */ jsx6(Stop2, { offset: "0", stopColor: theme.accent }),
787
778
  /* @__PURE__ */ jsx6(Stop2, { offset: "1", stopColor: theme.accent2 })
788
779
  ] }) }),
@@ -1081,7 +1072,7 @@ var styles5 = StyleSheet5.create({
1081
1072
  // src/native/button.tsx
1082
1073
  import * as React6 from "react";
1083
1074
  import { ActivityIndicator, Pressable as Pressable2, StyleSheet as StyleSheet6, View as View5 } from "react-native";
1084
- import Svg3, { Defs as Defs3, LinearGradient as LinearGradient3, Rect as Rect2, Stop as Stop3 } from "react-native-svg";
1075
+ import Svg3, { Defs as Defs3, LinearGradient as LinearGradient2, Rect, Stop as Stop3 } from "react-native-svg";
1085
1076
 
1086
1077
  // src/button/recipe.ts
1087
1078
  var buttonRecipe = defineRecipe({
@@ -1140,11 +1131,11 @@ function useButton({ variant = "secondary", size = "md", shape = "rounded", load
1140
1131
  function Fill({ colors, id }) {
1141
1132
  if (!colors.gradient) return null;
1142
1133
  return /* @__PURE__ */ jsxs6(Svg3, { "aria-hidden": true, pointerEvents: "none", style: StyleSheet6.absoluteFill, width: "100%", height: "100%", children: [
1143
- /* @__PURE__ */ jsx8(Defs3, { children: /* @__PURE__ */ jsxs6(LinearGradient3, { id, x1: "0", y1: "0", x2: "1", y2: "0", children: [
1134
+ /* @__PURE__ */ jsx8(Defs3, { children: /* @__PURE__ */ jsxs6(LinearGradient2, { id, x1: "0", y1: "0", x2: "1", y2: "0", children: [
1144
1135
  /* @__PURE__ */ jsx8(Stop3, { offset: "0", stopColor: colors.gradient[0] }),
1145
1136
  /* @__PURE__ */ jsx8(Stop3, { offset: "1", stopColor: colors.gradient[1] })
1146
1137
  ] }) }),
1147
- /* @__PURE__ */ jsx8(Rect2, { width: "100%", height: "100%", fill: `url(#${id})` })
1138
+ /* @__PURE__ */ jsx8(Rect, { width: "100%", height: "100%", fill: `url(#${id})` })
1148
1139
  ] });
1149
1140
  }
1150
1141
  function Button({ label, icon, variant, size = "md", shape, loading = false, disabled, style, ...props }) {
@@ -2592,8 +2583,32 @@ var styles20 = StyleSheet20.create({
2592
2583
  disabled: { opacity: 0.5 }
2593
2584
  });
2594
2585
 
2586
+ // src/native/force-update-screen.tsx
2587
+ import { StyleSheet as StyleSheet21, View as View19 } from "react-native";
2588
+ import { jsx as jsx23, jsxs as jsxs20 } from "react/jsx-runtime";
2589
+ function ForceUpdateScreen({ title, message, versionLabel, mark, updateLabel, onUpdate, retryLabel, onRetry, fill = true, style }) {
2590
+ const { theme } = useTheme();
2591
+ return /* @__PURE__ */ jsxs20(View19, { style: [styles21.root, fill ? styles21.fill : null, { backgroundColor: theme.surface0 }, style], children: [
2592
+ mark ? /* @__PURE__ */ jsx23(View19, { accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants", style: styles21.mark, children: mark }) : null,
2593
+ /* @__PURE__ */ jsx23(Txt, { variant: "title", style: styles21.centred, children: title }),
2594
+ message ? /* @__PURE__ */ jsx23(Txt, { tone: "secondary", style: styles21.centred, children: message }) : null,
2595
+ versionLabel ? /* @__PURE__ */ jsx23(Txt, { variant: "mono", tone: "secondary", style: styles21.centred, children: versionLabel }) : null,
2596
+ /* @__PURE__ */ jsxs20(View19, { style: styles21.actions, children: [
2597
+ /* @__PURE__ */ jsx23(Button, { label: updateLabel, variant: "primary", size: "lg", onPress: onUpdate }),
2598
+ retryLabel && onRetry ? /* @__PURE__ */ jsx23(Button, { label: retryLabel, variant: "ghost", onPress: onRetry }) : null
2599
+ ] })
2600
+ ] });
2601
+ }
2602
+ var styles21 = StyleSheet21.create({
2603
+ root: { alignItems: "center", justifyContent: "center", gap: 12, padding: 24 },
2604
+ fill: { flex: 1 },
2605
+ mark: { width: 96, height: 96, alignItems: "center", justifyContent: "center" },
2606
+ centred: { textAlign: "center", maxWidth: 340 },
2607
+ actions: { marginTop: 8, gap: 8, alignSelf: "stretch", maxWidth: 340, width: "100%" }
2608
+ });
2609
+
2595
2610
  // src/native/goal-gauge.tsx
2596
- import { Animated as Animated7, StyleSheet as StyleSheet21, View as View19 } from "react-native";
2611
+ import { Animated as Animated7, StyleSheet as StyleSheet22, View as View20 } from "react-native";
2597
2612
 
2598
2613
  // src/native/story-motion.ts
2599
2614
  import * as React17 from "react";
@@ -2616,17 +2631,17 @@ function useEntrance(animated, delay = 0, duration = 700) {
2616
2631
  }
2617
2632
 
2618
2633
  // src/native/goal-gauge.tsx
2619
- import { jsx as jsx23, jsxs as jsxs20 } from "react/jsx-runtime";
2634
+ import { jsx as jsx24, jsxs as jsxs21 } from "react/jsx-runtime";
2620
2635
  function Cell({ lit, animate, order, animated, arcade }) {
2621
2636
  const { theme } = useTheme();
2622
2637
  const t = useEntrance(animated && animate, 300 + order * 100, 350);
2623
2638
  const spentOpacity = arcade ? 0.14 : 1;
2624
2639
  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] });
2625
2640
  const color = lit || arcade ? theme.accent : theme.surface3;
2626
- return /* @__PURE__ */ jsx23(
2641
+ return /* @__PURE__ */ jsx24(
2627
2642
  Animated7.View,
2628
2643
  {
2629
- style: [styles21.cell, arcade ? styles21.cellArcade : null, { backgroundColor: color, opacity: lit || animate ? opacity : spentOpacity }]
2644
+ style: [styles22.cell, arcade ? styles22.cellArcade : null, { backgroundColor: color, opacity: lit || animate ? opacity : spentOpacity }]
2630
2645
  }
2631
2646
  );
2632
2647
  }
@@ -2636,8 +2651,8 @@ function GoalGauge({ label, segments, value, valueText, mode = "fill", showLabel
2636
2651
  const lit = Math.min(total, Math.max(0, Math.round(value ?? total)));
2637
2652
  const words2 = valueText ?? `${lit} / ${total}`;
2638
2653
  const arcade = variant === "arcade";
2639
- return /* @__PURE__ */ jsxs20(
2640
- View19,
2654
+ return /* @__PURE__ */ jsxs21(
2655
+ View20,
2641
2656
  {
2642
2657
  accessible: true,
2643
2658
  role: "meter",
@@ -2647,22 +2662,22 @@ function GoalGauge({ label, segments, value, valueText, mode = "fill", showLabel
2647
2662
  "aria-valuenow": lit,
2648
2663
  "aria-valuetext": words2,
2649
2664
  ...props,
2650
- style: [styles21.root, style],
2665
+ style: [styles22.root, style],
2651
2666
  children: [
2652
- showLabel ? /* @__PURE__ */ jsxs20(View19, { "aria-hidden": true, style: [styles21.head, arcade ? styles21.headArcade : null], children: [
2653
- /* @__PURE__ */ jsx23(Txt, { variant: arcade ? "mono" : "caption", tone: "secondary", children: arcade ? label.toUpperCase() : label }),
2654
- arcade ? null : /* @__PURE__ */ jsx23(Txt, { variant: "caption", children: words2 })
2667
+ showLabel ? /* @__PURE__ */ jsxs21(View20, { "aria-hidden": true, style: [styles22.head, arcade ? styles22.headArcade : null], children: [
2668
+ /* @__PURE__ */ jsx24(Txt, { variant: arcade ? "mono" : "caption", tone: "secondary", children: arcade ? label.toUpperCase() : label }),
2669
+ arcade ? null : /* @__PURE__ */ jsx24(Txt, { variant: "caption", children: words2 })
2655
2670
  ] }) : null,
2656
- /* @__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) => {
2671
+ /* @__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) => {
2657
2672
  const on = i < lit;
2658
2673
  const animate = mode === "fill" ? on : !on;
2659
- return /* @__PURE__ */ jsx23(Cell, { lit: on, animate, order: mode === "fill" ? i : i - lit, animated, arcade }, i);
2674
+ return /* @__PURE__ */ jsx24(Cell, { lit: on, animate, order: mode === "fill" ? i : i - lit, animated, arcade }, i);
2660
2675
  }) })
2661
2676
  ]
2662
2677
  }
2663
2678
  );
2664
2679
  }
2665
- var styles21 = StyleSheet21.create({
2680
+ var styles22 = StyleSheet22.create({
2666
2681
  root: { alignSelf: "stretch", gap: 8 },
2667
2682
  head: { flexDirection: "row", justifyContent: "space-between", alignItems: "baseline", gap: 12 },
2668
2683
  headArcade: { justifyContent: "center" },
@@ -2674,9 +2689,9 @@ var styles21 = StyleSheet21.create({
2674
2689
 
2675
2690
  // src/native/header.tsx
2676
2691
  import * as React18 from "react";
2677
- import { Animated as Animated8, Pressable as Pressable12, StyleSheet as StyleSheet22, View as View20 } from "react-native";
2692
+ import { Animated as Animated8, Pressable as Pressable12, StyleSheet as StyleSheet23, View as View21 } from "react-native";
2678
2693
  import Svg8, { Path as Path6 } from "react-native-svg";
2679
- import { jsx as jsx24, jsxs as jsxs21 } from "react/jsx-runtime";
2694
+ import { jsx as jsx25, jsxs as jsxs22 } from "react/jsx-runtime";
2680
2695
  var BAR = 44;
2681
2696
  var LARGE = 52;
2682
2697
  function Header({ title, subtitle, scrollY, size = "large", backLabel, onBack, actions, children, style }) {
@@ -2689,21 +2704,21 @@ function Header({ title, subtitle, scrollY, size = "large", backLabel, onBack, a
2689
2704
  const largeOpacity = progress.interpolate({ inputRange: [0, 0.7], outputRange: [1, 0], extrapolate: "clamp" });
2690
2705
  const largeShift = reduce ? 0 : progress.interpolate({ inputRange: [0, 1], outputRange: [0, -10] });
2691
2706
  const largeHeight = progress.interpolate({ inputRange: [0, 1], outputRange: [LARGE + (subtitle ? 18 : 0), 0] });
2692
- return /* @__PURE__ */ jsxs21(View20, { style: [{ paddingTop: insets.top, backgroundColor: theme.surface0 }, style], children: [
2693
- /* @__PURE__ */ jsxs21(View20, { style: styles22.bar, children: [
2694
- /* @__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: [
2695
- /* @__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" }) }),
2696
- /* @__PURE__ */ jsx24(Txt, { variant: "label", tone: "accent", numberOfLines: 1, children: backLabel })
2707
+ return /* @__PURE__ */ jsxs22(View21, { style: [{ paddingTop: insets.top, backgroundColor: theme.surface0 }, style], children: [
2708
+ /* @__PURE__ */ jsxs22(View21, { style: styles23.bar, children: [
2709
+ /* @__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: [
2710
+ /* @__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" }) }),
2711
+ /* @__PURE__ */ jsx25(Txt, { variant: "label", tone: "accent", numberOfLines: 1, children: backLabel })
2697
2712
  ] }) : null }),
2698
- /* @__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 }) }),
2699
- /* @__PURE__ */ jsx24(View20, { style: [styles22.side, styles22.right], children: actions })
2713
+ /* @__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 }) }),
2714
+ /* @__PURE__ */ jsx25(View21, { style: [styles23.side, styles23.right], children: actions })
2700
2715
  ] }),
2701
- large ? /* @__PURE__ */ jsx24(Animated8.View, { style: { height: largeHeight, overflow: "hidden" }, children: /* @__PURE__ */ jsxs21(Animated8.View, { style: [styles22.large, { opacity: largeOpacity, transform: [{ translateY: largeShift }] }], children: [
2702
- /* @__PURE__ */ jsx24(Txt, { variant: "display", numberOfLines: 1, role: "heading", style: styles22.largeTitle, children: title }),
2703
- subtitle ? /* @__PURE__ */ jsx24(Txt, { variant: "caption", tone: "secondary", children: subtitle }) : null
2716
+ large ? /* @__PURE__ */ jsx25(Animated8.View, { style: { height: largeHeight, overflow: "hidden" }, children: /* @__PURE__ */ jsxs22(Animated8.View, { style: [styles23.large, { opacity: largeOpacity, transform: [{ translateY: largeShift }] }], children: [
2717
+ /* @__PURE__ */ jsx25(Txt, { variant: "display", numberOfLines: 1, role: "heading", style: styles23.largeTitle, children: title }),
2718
+ subtitle ? /* @__PURE__ */ jsx25(Txt, { variant: "caption", tone: "secondary", children: subtitle }) : null
2704
2719
  ] }) }) : null,
2705
- children ? /* @__PURE__ */ jsx24(View20, { style: styles22.children, children }) : null,
2706
- /* @__PURE__ */ jsx24(Animated8.View, { "aria-hidden": true, style: [styles22.rule, { backgroundColor: theme.borderSubtle, opacity: smallOpacity }] })
2720
+ children ? /* @__PURE__ */ jsx25(View21, { style: styles23.children, children }) : null,
2721
+ /* @__PURE__ */ jsx25(Animated8.View, { "aria-hidden": true, style: [styles23.rule, { backgroundColor: theme.borderSubtle, opacity: smallOpacity }] })
2707
2722
  ] });
2708
2723
  }
2709
2724
  function useCollapsingHeader() {
@@ -2711,7 +2726,7 @@ function useCollapsingHeader() {
2711
2726
  const onScroll = React18.useMemo(() => Animated8.event([{ nativeEvent: { contentOffset: { y: scrollY } } }], { useNativeDriver: false }), [scrollY]);
2712
2727
  return { scrollY, onScroll };
2713
2728
  }
2714
- var styles22 = StyleSheet22.create({
2729
+ var styles23 = StyleSheet23.create({
2715
2730
  bar: { height: BAR, flexDirection: "row", alignItems: "center", paddingHorizontal: 8 },
2716
2731
  side: { flex: 1, flexDirection: "row", alignItems: "center" },
2717
2732
  right: { justifyContent: "flex-end", gap: 4 },
@@ -2720,13 +2735,13 @@ var styles22 = StyleSheet22.create({
2720
2735
  large: { paddingHorizontal: 16, paddingBottom: 6 },
2721
2736
  largeTitle: { fontSize: 32, lineHeight: 40 },
2722
2737
  children: { paddingHorizontal: 16, paddingBottom: 8 },
2723
- rule: { height: StyleSheet22.hairlineWidth }
2738
+ rule: { height: StyleSheet23.hairlineWidth }
2724
2739
  });
2725
2740
 
2726
2741
  // src/native/image-viewer.tsx
2727
2742
  import * as React19 from "react";
2728
- 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";
2729
- import { jsx as jsx25, jsxs as jsxs22 } from "react/jsx-runtime";
2743
+ 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";
2744
+ import { jsx as jsx26, jsxs as jsxs23 } from "react/jsx-runtime";
2730
2745
  var MAX_SCALE = 4;
2731
2746
  function ImageViewer({ images, index, onIndexChange, closeLabel, positionLabel = (n, total) => `${n} / ${total}` }) {
2732
2747
  const { theme, insets, haptic } = useTheme();
@@ -2814,12 +2829,12 @@ function ImageViewer({ images, index, onIndexChange, closeLabel, positionLabel =
2814
2829
  if (!open) return null;
2815
2830
  const image = images[index];
2816
2831
  const backdrop = dismiss2.interpolate({ inputRange: [0, height / 2], outputRange: [1, 0.3], extrapolate: "clamp" });
2817
- return /* @__PURE__ */ jsxs22(Modal3, { ...modalName(image.alt), visible: true, transparent: true, animationType: reduce ? "none" : "fade", onRequestClose: () => onIndexChange(null), statusBarTranslucent: true, children: [
2818
- /* @__PURE__ */ jsx25(Animated9.View, { style: [StyleSheet23.absoluteFill, { backgroundColor: theme.media, opacity: backdrop }] }),
2819
- /* @__PURE__ */ jsx25(
2820
- View21,
2832
+ return /* @__PURE__ */ jsxs23(Modal3, { ...modalName(image.alt), visible: true, transparent: true, animationType: reduce ? "none" : "fade", onRequestClose: () => onIndexChange(null), statusBarTranslucent: true, children: [
2833
+ /* @__PURE__ */ jsx26(Animated9.View, { style: [StyleSheet24.absoluteFill, { backgroundColor: theme.media, opacity: backdrop }] }),
2834
+ /* @__PURE__ */ jsx26(
2835
+ View22,
2821
2836
  {
2822
- style: StyleSheet23.absoluteFill,
2837
+ style: StyleSheet24.absoluteFill,
2823
2838
  accessible: true,
2824
2839
  role: "img",
2825
2840
  "aria-label": `${image.alt}, ${positionLabel(index + 1, images.length)}`,
@@ -2831,21 +2846,21 @@ function ImageViewer({ images, index, onIndexChange, closeLabel, positionLabel =
2831
2846
  if (name === "escape") onIndexChange(null);
2832
2847
  },
2833
2848
  ...responder.panHandlers,
2834
- 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 }) })
2849
+ 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 }) })
2835
2850
  }
2836
2851
  ),
2837
- /* @__PURE__ */ jsxs22(View21, { pointerEvents: "box-none", style: [styles23.top, { paddingTop: insets.top + 8 }], children: [
2838
- /* @__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) }) }),
2839
- /* @__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" }) })
2852
+ /* @__PURE__ */ jsxs23(View22, { pointerEvents: "box-none", style: [styles24.top, { paddingTop: insets.top + 8 }], children: [
2853
+ /* @__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) }) }),
2854
+ /* @__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" }) })
2840
2855
  ] }),
2841
- 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
2856
+ 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
2842
2857
  ] });
2843
2858
  }
2844
2859
  function prefetchNeighbours(images, index) {
2845
2860
  if (index === null) return;
2846
2861
  for (const i of [index - 1, index + 1]) if (images[i]) void Image3.prefetch(images[i].uri).catch(() => void 0);
2847
2862
  }
2848
- var styles23 = StyleSheet23.create({
2863
+ var styles24 = StyleSheet24.create({
2849
2864
  top: { position: "absolute", top: 0, left: 0, right: 0, flexDirection: "row", alignItems: "center", justifyContent: "space-between", paddingHorizontal: 16 },
2850
2865
  counter: { paddingHorizontal: 10, paddingVertical: 4, borderRadius: 999 },
2851
2866
  close: { width: 40, height: 40, borderRadius: 20, alignItems: "center", justifyContent: "center" },
@@ -2854,72 +2869,71 @@ var styles23 = StyleSheet23.create({
2854
2869
  });
2855
2870
 
2856
2871
  // src/native/KachizakaMark.tsx
2857
- import { View as View22 } from "react-native";
2858
- import Svg9, { Circle as Circle3, Defs as Defs4, LinearGradient as LinearGradient4, Path as Path7, RadialGradient as RadialGradient2, Stop as Stop4 } from "react-native-svg";
2872
+ import { View as View23 } from "react-native";
2873
+ import Svg9, { Circle as Circle3, Defs as Defs4, Path as Path7, RadialGradient as RadialGradient2, Stop as Stop4 } from "react-native-svg";
2859
2874
 
2860
2875
  // src/marks/kachizaka-geometry.ts
2876
+ var cobalt = marks.kachizaka[0][1];
2861
2877
  var gold = marks.kachizaka[marks.kachizaka.length - 1][1];
2862
2878
  var KACHIZAKA = {
2863
2879
  viewBox: "0 0 400 400",
2864
2880
  croppedViewBox: "80 80 240 240",
2865
2881
  center: 200,
2866
- /** The bowl: a rim 136 → 264 at y 104, cut 32 at its upper-right corner (the Krizaka chamfer), rounding down to the stem. */
2867
- cup: "M136 104 H232 L264 136 V164 C264 214 236 242 200 246 C164 242 136 214 136 164 Z",
2868
- /** The stem and the base, one shape. */
2869
- base: "M190 244 H210 V272 H240 C244 272 248 276 248 280 V300 H152 V280 C152 276 156 272 160 272 H190 Z",
2870
- /** The two handles, stroked in the gradient. */
2871
- handles: "M138 128 C100 124 100 196 150 202 M262 128 C300 124 300 196 250 202",
2872
- handleWidth: 14,
2873
- /** The seal: a five-pointed star in light on the bowl, centred (200, 172), radii 30 / 13. */
2874
- star: "M200 142 L207.6 161.5 L228.5 162.7 L212.4 176 L217.6 196.3 L200 185 L182.4 196.3 L187.6 176 L171.5 162.7 L192.4 161.5 Z",
2875
- starColor: "#fffbea",
2876
- gradient: { x1: 136, y1: 300, x2: 264, y2: 104, stops: marks.kachizaka },
2882
+ cobalt,
2883
+ gold,
2884
+ /** The steps: second (left, cut top-left), first (centre, both top corners cut, in gold), third (right, cut top-right). */
2885
+ steps: {
2886
+ second: "M102 240 L122 220 H162 V296 H102 Z",
2887
+ first: "M170 192 L188 174 H212 L230 192 V296 H170 Z",
2888
+ third: "M238 248 H278 L298 268 V296 H238 Z"
2889
+ },
2890
+ /** The lit node over the winner: a gold diamond (half-diagonal 22, softened by a 6-unit round stroke), its light inside. */
2891
+ node: { d: "M200 102 L222 124 L200 146 L178 124 Z", light: "M200 116.1 L207.9 124 L200 131.9 L192.1 124 Z", soften: 6 },
2892
+ highlight: "#fffbea",
2893
+ gradient: { x1: 110, y1: 300, x2: 290, y2: 100, stops: marks.kachizaka },
2877
2894
  /** The ball: one node on the orbit, that turns with it. */
2878
- node: { r: 9, at: [200, 40] },
2895
+ ball: { r: 9, at: [200, 40] },
2879
2896
  glow: { color: gold, opacity: 0.18 },
2880
- /** The seal's breathing shadow (web), in the gold. */
2881
2897
  pulse: { color: gold, low: 0.35, high: 0.75 },
2898
+ motion: { spin: 28, breath: 3.2 },
2882
2899
  orbit: { r: 160, dash: "8 8", width: 1.5 },
2883
2900
  ring: { r: 134, width: 1 }
2884
2901
  };
2885
2902
 
2886
2903
  // src/native/KachizakaMark.tsx
2887
- import { jsx as jsx26, jsxs as jsxs23 } from "react/jsx-runtime";
2904
+ import { jsx as jsx27, jsxs as jsxs24 } from "react/jsx-runtime";
2888
2905
  function KachizakaMark({ size = 48, animated = true, title, neutral }) {
2889
2906
  const { theme } = useTheme();
2890
- const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, 28e3);
2891
- const id = useSvgId("kzm");
2907
+ const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, KACHIZAKA.motion.spin * 1e3);
2908
+ const id = useSvgId("kcm");
2892
2909
  const viewBox = size < 48 ? KACHIZAKA.croppedViewBox : KACHIZAKA.viewBox;
2893
2910
  const stroke = neutral ?? theme.textMuted;
2894
- 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)) });
2895
- const fill = `url(#${id}a)`;
2896
- return /* @__PURE__ */ jsxs23(View22, { style: { width: size, height: size }, ...markA11y(title), children: [
2897
- /* @__PURE__ */ jsxs23(Svg9, { viewBox, style: layer, children: [
2898
- /* @__PURE__ */ jsxs23(Defs4, { children: [
2899
- /* @__PURE__ */ jsxs23(RadialGradient2, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
2900
- /* @__PURE__ */ jsx26(Stop4, { offset: "0%", stopColor: KACHIZAKA.glow.color, stopOpacity: KACHIZAKA.glow.opacity }),
2901
- /* @__PURE__ */ jsx26(Stop4, { offset: "100%", stopColor: KACHIZAKA.glow.color, stopOpacity: 0 })
2902
- ] }),
2903
- gradient
2904
- ] }),
2905
- size >= 48 ? /* @__PURE__ */ jsx26(Circle3, { cx: KACHIZAKA.center, cy: KACHIZAKA.center, r: 190, fill: `url(#${id}g)` }) : null,
2906
- /* @__PURE__ */ jsx26(Circle3, { cx: KACHIZAKA.center, cy: KACHIZAKA.center, r: KACHIZAKA.ring.r, stroke, strokeWidth: KACHIZAKA.ring.width, opacity: 0.35, fill: "none" }),
2907
- /* @__PURE__ */ jsx26(Path7, { d: KACHIZAKA.handles, stroke: fill, strokeWidth: KACHIZAKA.handleWidth, strokeLinecap: "round", fill: "none" }),
2908
- /* @__PURE__ */ jsx26(Path7, { d: KACHIZAKA.base, fill }),
2909
- /* @__PURE__ */ jsx26(Path7, { d: KACHIZAKA.cup, fill })
2911
+ return /* @__PURE__ */ jsxs24(View23, { style: { width: size, height: size }, ...markA11y(title), children: [
2912
+ /* @__PURE__ */ jsxs24(Svg9, { viewBox, style: layer, children: [
2913
+ /* @__PURE__ */ jsx27(Defs4, { children: /* @__PURE__ */ jsxs24(RadialGradient2, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
2914
+ /* @__PURE__ */ jsx27(Stop4, { offset: "0%", stopColor: KACHIZAKA.glow.color, stopOpacity: KACHIZAKA.glow.opacity }),
2915
+ /* @__PURE__ */ jsx27(Stop4, { offset: "100%", stopColor: KACHIZAKA.glow.color, stopOpacity: 0 })
2916
+ ] }) }),
2917
+ size >= 48 ? /* @__PURE__ */ jsx27(Circle3, { cx: KACHIZAKA.center, cy: KACHIZAKA.center, r: 190, fill: `url(#${id}g)` }) : null,
2918
+ /* @__PURE__ */ jsx27(Circle3, { cx: KACHIZAKA.center, cy: KACHIZAKA.center, r: KACHIZAKA.ring.r, stroke, strokeWidth: KACHIZAKA.ring.width, opacity: 0.35, fill: "none" }),
2919
+ /* @__PURE__ */ jsx27(Path7, { d: KACHIZAKA.steps.second, fill: KACHIZAKA.cobalt }),
2920
+ /* @__PURE__ */ jsx27(Path7, { d: KACHIZAKA.steps.first, fill: KACHIZAKA.gold }),
2921
+ /* @__PURE__ */ jsx27(Path7, { d: KACHIZAKA.steps.third, fill: KACHIZAKA.cobalt })
2910
2922
  ] }),
2911
- /* @__PURE__ */ jsx26(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs23(Svg9, { viewBox, style: layer, children: [
2912
- /* @__PURE__ */ jsx26(Defs4, { children: gradient }),
2913
- /* @__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" }),
2914
- /* @__PURE__ */ jsx26(Circle3, { cx: KACHIZAKA.node.at[0], cy: KACHIZAKA.node.at[1], r: KACHIZAKA.node.r, fill })
2923
+ /* @__PURE__ */ jsx27(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs24(Svg9, { viewBox, style: layer, children: [
2924
+ /* @__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" }),
2925
+ /* @__PURE__ */ jsx27(Circle3, { cx: KACHIZAKA.ball.at[0], cy: KACHIZAKA.ball.at[1], r: KACHIZAKA.ball.r, fill: KACHIZAKA.gold })
2915
2926
  ] }) }),
2916
- /* @__PURE__ */ jsx26(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsx26(Svg9, { viewBox, style: layer, children: /* @__PURE__ */ jsx26(Path7, { d: KACHIZAKA.star, fill: KACHIZAKA.starColor }) }) })
2927
+ /* @__PURE__ */ jsx27(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs24(Svg9, { viewBox, style: layer, children: [
2928
+ /* @__PURE__ */ jsx27(Path7, { d: KACHIZAKA.node.d, fill: KACHIZAKA.gold, stroke: KACHIZAKA.gold, strokeWidth: KACHIZAKA.node.soften, strokeLinejoin: "round" }),
2929
+ /* @__PURE__ */ jsx27(Path7, { d: KACHIZAKA.node.light, fill: KACHIZAKA.highlight })
2930
+ ] }) })
2917
2931
  ] });
2918
2932
  }
2919
2933
 
2920
2934
  // src/native/KrizakaMark.tsx
2921
- import { View as View23 } from "react-native";
2922
- 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";
2935
+ import { View as View24 } from "react-native";
2936
+ import Svg10, { Circle as Circle4, Defs as Defs5, G as Group, LinearGradient as LinearGradient3, Path as Path8, RadialGradient as RadialGradient3, Stop as Stop5 } from "react-native-svg";
2923
2937
 
2924
2938
  // src/marks/krizaka-geometry.ts
2925
2939
  var KRIZAKA = {
@@ -2941,39 +2955,39 @@ var KRIZAKA = {
2941
2955
  };
2942
2956
 
2943
2957
  // src/native/KrizakaMark.tsx
2944
- import { Fragment as Fragment5, jsx as jsx27, jsxs as jsxs24 } from "react/jsx-runtime";
2958
+ import { Fragment as Fragment5, jsx as jsx28, jsxs as jsxs25 } from "react/jsx-runtime";
2945
2959
  function KrizakaMark({ size = 48, animated = true, title, neutral }) {
2946
2960
  const { theme } = useTheme();
2947
2961
  const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated);
2948
2962
  const id = useSvgId("kzm");
2949
2963
  const viewBox = size < 48 ? KRIZAKA.croppedViewBox : KRIZAKA.viewBox;
2950
2964
  const stroke = neutral ?? theme.textMuted;
2951
- 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)) });
2952
- const dot = (c) => /* @__PURE__ */ jsxs24(Fragment5, { children: [
2953
- /* @__PURE__ */ jsx27(Circle4, { cx: c.cx, cy: c.cy, r: c.r, fill: `url(#${id}b)` }),
2954
- /* @__PURE__ */ jsx27(Circle4, { cx: c.cx, cy: c.cy, r: c.inner, fill: KRIZAKA.highlight })
2965
+ const blue = /* @__PURE__ */ jsx28(LinearGradient3, { 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)) });
2966
+ const dot = (c) => /* @__PURE__ */ jsxs25(Fragment5, { children: [
2967
+ /* @__PURE__ */ jsx28(Circle4, { cx: c.cx, cy: c.cy, r: c.r, fill: `url(#${id}b)` }),
2968
+ /* @__PURE__ */ jsx28(Circle4, { cx: c.cx, cy: c.cy, r: c.inner, fill: KRIZAKA.highlight })
2955
2969
  ] });
2956
- return /* @__PURE__ */ jsxs24(View23, { style: { width: size, height: size }, ...markA11y(title), children: [
2957
- /* @__PURE__ */ jsxs24(Svg10, { viewBox, style: layer, children: [
2958
- /* @__PURE__ */ jsxs24(Defs5, { children: [
2959
- /* @__PURE__ */ jsxs24(RadialGradient3, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
2960
- /* @__PURE__ */ jsx27(Stop5, { offset: "0%", stopColor: KRIZAKA.glow.color, stopOpacity: KRIZAKA.glow.opacity }),
2961
- /* @__PURE__ */ jsx27(Stop5, { offset: "100%", stopColor: KRIZAKA.glow.color, stopOpacity: 0 })
2970
+ return /* @__PURE__ */ jsxs25(View24, { style: { width: size, height: size }, ...markA11y(title), children: [
2971
+ /* @__PURE__ */ jsxs25(Svg10, { viewBox, style: layer, children: [
2972
+ /* @__PURE__ */ jsxs25(Defs5, { children: [
2973
+ /* @__PURE__ */ jsxs25(RadialGradient3, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
2974
+ /* @__PURE__ */ jsx28(Stop5, { offset: "0%", stopColor: KRIZAKA.glow.color, stopOpacity: KRIZAKA.glow.opacity }),
2975
+ /* @__PURE__ */ jsx28(Stop5, { offset: "100%", stopColor: KRIZAKA.glow.color, stopOpacity: 0 })
2962
2976
  ] }),
2963
- /* @__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: [
2964
- /* @__PURE__ */ jsx27(Stop5, { offset: "0%", stopColor: theme.textSecondary }),
2965
- /* @__PURE__ */ jsx27(Stop5, { offset: "100%", stopColor: theme.textPrimary })
2977
+ /* @__PURE__ */ jsxs25(LinearGradient3, { 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: [
2978
+ /* @__PURE__ */ jsx28(Stop5, { offset: "0%", stopColor: theme.textSecondary }),
2979
+ /* @__PURE__ */ jsx28(Stop5, { offset: "100%", stopColor: theme.textPrimary })
2966
2980
  ] }),
2967
2981
  blue
2968
2982
  ] }),
2969
- size >= 48 ? /* @__PURE__ */ jsx27(Circle4, { cx: 200, cy: 200, r: 190, fill: `url(#${id}g)` }) : null,
2970
- /* @__PURE__ */ jsx27(Circle4, { cx: 200, cy: 200, r: KRIZAKA.ring.r, stroke, strokeWidth: KRIZAKA.ring.width, opacity: 0.35, fill: "none" }),
2971
- /* @__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" }) })
2983
+ size >= 48 ? /* @__PURE__ */ jsx28(Circle4, { cx: 200, cy: 200, r: 190, fill: `url(#${id}g)` }) : null,
2984
+ /* @__PURE__ */ jsx28(Circle4, { cx: 200, cy: 200, r: KRIZAKA.ring.r, stroke, strokeWidth: KRIZAKA.ring.width, opacity: 0.35, fill: "none" }),
2985
+ /* @__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" }) })
2972
2986
  ] }),
2973
- /* @__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" }) }) }),
2974
- /* @__PURE__ */ jsx27(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs24(Svg10, { viewBox, style: layer, children: [
2975
- /* @__PURE__ */ jsx27(Defs5, { children: blue }),
2976
- /* @__PURE__ */ jsxs24(Group, { transform: `translate(${KRIZAKA.offset} ${KRIZAKA.offset})`, children: [
2987
+ /* @__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" }) }) }),
2988
+ /* @__PURE__ */ jsx28(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs25(Svg10, { viewBox, style: layer, children: [
2989
+ /* @__PURE__ */ jsx28(Defs5, { children: blue }),
2990
+ /* @__PURE__ */ jsxs25(Group, { transform: `translate(${KRIZAKA.offset} ${KRIZAKA.offset})`, children: [
2977
2991
  dot(KRIZAKA.node),
2978
2992
  dot(KRIZAKA.core)
2979
2993
  ] })
@@ -2983,12 +2997,12 @@ function KrizakaMark({ size = 48, animated = true, title, neutral }) {
2983
2997
 
2984
2998
  // src/native/loader.tsx
2985
2999
  import * as React22 from "react";
2986
- import { AccessibilityInfo as AccessibilityInfo7, Animated as Animated11, Easing as Easing5, StyleSheet as StyleSheet24, View as View29 } from "react-native";
3000
+ import { AccessibilityInfo as AccessibilityInfo7, Animated as Animated11, Easing as Easing5, StyleSheet as StyleSheet25, View as View30 } from "react-native";
2987
3001
  import Svg16, { Circle as Circle10, Path as Path14 } from "react-native-svg";
2988
3002
 
2989
3003
  // src/native/OrazakaMark.tsx
2990
- import { View as View24 } from "react-native";
2991
- import Svg11, { Circle as Circle5, Defs as Defs6, LinearGradient as LinearGradient6, Path as Path9, RadialGradient as RadialGradient4, Stop as Stop6 } from "react-native-svg";
3004
+ import { View as View25 } from "react-native";
3005
+ import Svg11, { Circle as Circle5, Defs as Defs6, LinearGradient as LinearGradient4, Path as Path9, RadialGradient as RadialGradient4, Stop as Stop6 } from "react-native-svg";
2992
3006
 
2993
3007
  // src/marks/orazaka-geometry.ts
2994
3008
  var orange = marks.orazaka[marks.orazaka.length - 1][1];
@@ -3017,41 +3031,41 @@ var ORAZAKA = {
3017
3031
  };
3018
3032
 
3019
3033
  // src/native/OrazakaMark.tsx
3020
- import { jsx as jsx28, jsxs as jsxs25 } from "react/jsx-runtime";
3034
+ import { jsx as jsx29, jsxs as jsxs26 } from "react/jsx-runtime";
3021
3035
  function OrazakaMark({ size = 48, animated = true, title, neutral }) {
3022
3036
  const { theme } = useTheme();
3023
3037
  const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated);
3024
3038
  const id = useSvgId("ozm");
3025
3039
  const viewBox = size < 48 ? ORAZAKA.croppedViewBox : ORAZAKA.viewBox;
3026
3040
  const stroke = neutral ?? theme.textMuted;
3027
- 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)) });
3041
+ const gradient = /* @__PURE__ */ jsx29(LinearGradient4, { 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)) });
3028
3042
  const fill = `url(#${id}a)`;
3029
- return /* @__PURE__ */ jsxs25(View24, { style: { width: size, height: size }, ...markA11y(title), children: [
3030
- /* @__PURE__ */ jsxs25(Svg11, { viewBox, style: layer, children: [
3031
- /* @__PURE__ */ jsx28(Defs6, { children: /* @__PURE__ */ jsxs25(RadialGradient4, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
3032
- /* @__PURE__ */ jsx28(Stop6, { offset: "0%", stopColor: ORAZAKA.glow.color, stopOpacity: ORAZAKA.glow.opacity }),
3033
- /* @__PURE__ */ jsx28(Stop6, { offset: "100%", stopColor: ORAZAKA.glow.color, stopOpacity: 0 })
3043
+ return /* @__PURE__ */ jsxs26(View25, { style: { width: size, height: size }, ...markA11y(title), children: [
3044
+ /* @__PURE__ */ jsxs26(Svg11, { viewBox, style: layer, children: [
3045
+ /* @__PURE__ */ jsx29(Defs6, { children: /* @__PURE__ */ jsxs26(RadialGradient4, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
3046
+ /* @__PURE__ */ jsx29(Stop6, { offset: "0%", stopColor: ORAZAKA.glow.color, stopOpacity: ORAZAKA.glow.opacity }),
3047
+ /* @__PURE__ */ jsx29(Stop6, { offset: "100%", stopColor: ORAZAKA.glow.color, stopOpacity: 0 })
3034
3048
  ] }) }),
3035
- size >= 48 ? /* @__PURE__ */ jsx28(Circle5, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: 190, fill: `url(#${id}g)` }) : null,
3036
- /* @__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" }),
3037
- /* @__PURE__ */ jsx28(Circle5, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.ring.r, stroke, strokeWidth: ORAZAKA.ring.width, opacity: 0.35, fill: "none" })
3049
+ size >= 48 ? /* @__PURE__ */ jsx29(Circle5, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: 190, fill: `url(#${id}g)` }) : null,
3050
+ /* @__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" }),
3051
+ /* @__PURE__ */ jsx29(Circle5, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.ring.r, stroke, strokeWidth: ORAZAKA.ring.width, opacity: 0.35, fill: "none" })
3038
3052
  ] }),
3039
- /* @__PURE__ */ jsx28(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs25(Svg11, { viewBox, style: layer, children: [
3040
- /* @__PURE__ */ jsx28(Defs6, { children: gradient }),
3041
- ORAZAKA.shards.map((d) => /* @__PURE__ */ jsx28(Path9, { d, fill, stroke: fill, strokeWidth: ORAZAKA.shardStroke, strokeLinejoin: "round" }, d))
3053
+ /* @__PURE__ */ jsx29(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs26(Svg11, { viewBox, style: layer, children: [
3054
+ /* @__PURE__ */ jsx29(Defs6, { children: gradient }),
3055
+ ORAZAKA.shards.map((d) => /* @__PURE__ */ jsx29(Path9, { d, fill, stroke: fill, strokeWidth: ORAZAKA.shardStroke, strokeLinejoin: "round" }, d))
3042
3056
  ] }) }),
3043
- /* @__PURE__ */ jsx28(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs25(Svg11, { viewBox, style: layer, children: [
3044
- /* @__PURE__ */ jsx28(Defs6, { children: gradient }),
3045
- /* @__PURE__ */ jsx28(Circle5, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.core.r, fill }),
3046
- /* @__PURE__ */ jsx28(Circle5, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.core.inner, fill: ORAZAKA.highlight })
3057
+ /* @__PURE__ */ jsx29(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs26(Svg11, { viewBox, style: layer, children: [
3058
+ /* @__PURE__ */ jsx29(Defs6, { children: gradient }),
3059
+ /* @__PURE__ */ jsx29(Circle5, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.core.r, fill }),
3060
+ /* @__PURE__ */ jsx29(Circle5, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.core.inner, fill: ORAZAKA.highlight })
3047
3061
  ] }) })
3048
3062
  ] });
3049
3063
  }
3050
3064
 
3051
3065
  // src/native/OrochiaMark.tsx
3052
3066
  import { useEffect as useEffect12, useState as useState20 } from "react";
3053
- import { AccessibilityInfo as AccessibilityInfo6, Animated as Animated10, Easing as Easing4, View as View25 } from "react-native";
3054
- 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";
3067
+ import { AccessibilityInfo as AccessibilityInfo6, Animated as Animated10, Easing as Easing4, View as View26 } from "react-native";
3068
+ import Svg12, { Circle as Circle6, Defs as Defs7, Ellipse, G as Group2, LinearGradient as LinearGradient5, Path as Path10, RadialGradient as RadialGradient5, Stop as Stop7 } from "react-native-svg";
3055
3069
 
3056
3070
  // src/marks/orochia-geometry.ts
3057
3071
  var OROCHIA = {
@@ -3078,7 +3092,7 @@ var OROCHIA = {
3078
3092
  };
3079
3093
 
3080
3094
  // src/native/OrochiaMark.tsx
3081
- import { jsx as jsx29, jsxs as jsxs26 } from "react/jsx-runtime";
3095
+ import { jsx as jsx30, jsxs as jsxs27 } from "react/jsx-runtime";
3082
3096
  var CENTER = OROCHIA.offset + 180;
3083
3097
  function OrochiaMark({ size = 48, animated = true, title, neutral: neutralProp }) {
3084
3098
  const { theme } = useTheme();
@@ -3110,42 +3124,41 @@ function OrochiaMark({ size = 48, animated = true, title, neutral: neutralProp }
3110
3124
  const viewBox = size < 48 ? OROCHIA.croppedViewBox : OROCHIA.viewBox;
3111
3125
  const layer = { position: "absolute", width: size, height: size };
3112
3126
  const a11y = title ? { accessible: true, accessibilityRole: "image", accessibilityLabel: title } : { accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants" };
3113
- 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)) });
3114
- return /* @__PURE__ */ jsxs26(View25, { style: { width: size, height: size }, ...a11y, children: [
3115
- /* @__PURE__ */ jsxs26(Svg12, { viewBox, style: layer, children: [
3116
- /* @__PURE__ */ jsx29(Defs7, { children: /* @__PURE__ */ jsxs26(RadialGradient5, { id: "glow", cx: "50%", cy: "50%", r: "50%", children: [
3117
- /* @__PURE__ */ jsx29(Stop7, { offset: "0%", stopColor: OROCHIA.glow.color, stopOpacity: OROCHIA.glow.opacity }),
3118
- /* @__PURE__ */ jsx29(Stop7, { offset: "100%", stopColor: OROCHIA.glow.color, stopOpacity: 0 })
3127
+ const bodyGradient = /* @__PURE__ */ jsx30(LinearGradient5, { 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)) });
3128
+ return /* @__PURE__ */ jsxs27(View26, { style: { width: size, height: size }, ...a11y, children: [
3129
+ /* @__PURE__ */ jsxs27(Svg12, { viewBox, style: layer, children: [
3130
+ /* @__PURE__ */ jsx30(Defs7, { children: /* @__PURE__ */ jsxs27(RadialGradient5, { id: "glow", cx: "50%", cy: "50%", r: "50%", children: [
3131
+ /* @__PURE__ */ jsx30(Stop7, { offset: "0%", stopColor: OROCHIA.glow.color, stopOpacity: OROCHIA.glow.opacity }),
3132
+ /* @__PURE__ */ jsx30(Stop7, { offset: "100%", stopColor: OROCHIA.glow.color, stopOpacity: 0 })
3119
3133
  ] }) }),
3120
- /* @__PURE__ */ jsx29(Circle6, { cx: CENTER, cy: CENTER, r: 170, fill: "url(#glow)" }),
3121
- /* @__PURE__ */ jsx29(Circle6, { cx: CENTER, cy: CENTER, r: OROCHIA.ring.r, stroke: neutral, strokeWidth: OROCHIA.ring.width, opacity: 0.35, fill: "none" })
3134
+ /* @__PURE__ */ jsx30(Circle6, { cx: CENTER, cy: CENTER, r: 170, fill: "url(#glow)" }),
3135
+ /* @__PURE__ */ jsx30(Circle6, { cx: CENTER, cy: CENTER, r: OROCHIA.ring.r, stroke: neutral, strokeWidth: OROCHIA.ring.width, opacity: 0.35, fill: "none" })
3122
3136
  ] }),
3123
- /* @__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" }) }) }),
3124
- /* @__PURE__ */ jsxs26(Svg12, { viewBox, style: layer, children: [
3125
- /* @__PURE__ */ jsx29(Defs7, { children: bodyGradient }),
3126
- /* @__PURE__ */ jsxs26(Group2, { transform: `translate(${OROCHIA.offset} ${OROCHIA.offset})`, children: [
3127
- /* @__PURE__ */ jsx29(Path10, { d: OROCHIA.arc, stroke: "url(#body)", strokeWidth: 22, strokeLinecap: "round", fill: "none" }),
3128
- /* @__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" }),
3129
- /* @__PURE__ */ jsx29(Path10, { d: OROCHIA.neck, stroke: "url(#body)", strokeWidth: 14, strokeLinecap: "round", fill: "none" }),
3130
- /* @__PURE__ */ jsx29(Path10, { d: OROCHIA.tail, stroke: "url(#body)", strokeWidth: 6, strokeLinecap: "round", fill: "none" }),
3131
- /* @__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)" }),
3132
- /* @__PURE__ */ jsx29(Path10, { d: OROCHIA.tongue.d, stroke: OROCHIA.tongue.color, strokeWidth: 3, strokeLinecap: "round", fill: "none" })
3137
+ /* @__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" }) }) }),
3138
+ /* @__PURE__ */ jsxs27(Svg12, { viewBox, style: layer, children: [
3139
+ /* @__PURE__ */ jsx30(Defs7, { children: bodyGradient }),
3140
+ /* @__PURE__ */ jsxs27(Group2, { transform: `translate(${OROCHIA.offset} ${OROCHIA.offset})`, children: [
3141
+ /* @__PURE__ */ jsx30(Path10, { d: OROCHIA.arc, stroke: "url(#body)", strokeWidth: 22, strokeLinecap: "round", fill: "none" }),
3142
+ /* @__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" }),
3143
+ /* @__PURE__ */ jsx30(Path10, { d: OROCHIA.neck, stroke: "url(#body)", strokeWidth: 14, strokeLinecap: "round", fill: "none" }),
3144
+ /* @__PURE__ */ jsx30(Path10, { d: OROCHIA.tail, stroke: "url(#body)", strokeWidth: 6, strokeLinecap: "round", fill: "none" }),
3145
+ /* @__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)" }),
3146
+ /* @__PURE__ */ jsx30(Path10, { d: OROCHIA.tongue.d, stroke: OROCHIA.tongue.color, strokeWidth: 3, strokeLinecap: "round", fill: "none" })
3133
3147
  ] })
3134
3148
  ] }),
3135
- /* @__PURE__ */ jsx29(Animated10.View, { style: [layer, { opacity: pulse.interpolate({ inputRange: [0, 1], outputRange: [0.85, 1] }) }], children: /* @__PURE__ */ jsxs26(Svg12, { viewBox, style: layer, children: [
3136
- /* @__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)) }) }),
3137
- /* @__PURE__ */ jsxs26(Group2, { transform: `translate(${OROCHIA.offset} ${OROCHIA.offset})`, children: [
3138
- /* @__PURE__ */ jsx29(Circle6, { cx: OROCHIA.eye.cx, cy: OROCHIA.eye.cy, r: OROCHIA.eye.r, fill: OROCHIA.eye.color }),
3139
- /* @__PURE__ */ jsx29(Path10, { d: OROCHIA.flame.d, transform: `translate(${OROCHIA.flame.translate[0]} ${OROCHIA.flame.translate[1]}) scale(${OROCHIA.flame.scale})`, fill: "url(#flame)" })
3149
+ /* @__PURE__ */ jsx30(Animated10.View, { style: [layer, { opacity: pulse.interpolate({ inputRange: [0, 1], outputRange: [0.85, 1] }) }], children: /* @__PURE__ */ jsxs27(Svg12, { viewBox, style: layer, children: [
3150
+ /* @__PURE__ */ jsx30(Defs7, { children: /* @__PURE__ */ jsx30(LinearGradient5, { id: "flame", x1: "50%", y1: "100%", x2: "50%", y2: "0%", children: OROCHIA.flameGradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx30(Stop7, { offset, stopColor: color }, offset)) }) }),
3151
+ /* @__PURE__ */ jsxs27(Group2, { transform: `translate(${OROCHIA.offset} ${OROCHIA.offset})`, children: [
3152
+ /* @__PURE__ */ jsx30(Circle6, { cx: OROCHIA.eye.cx, cy: OROCHIA.eye.cy, r: OROCHIA.eye.r, fill: OROCHIA.eye.color }),
3153
+ /* @__PURE__ */ jsx30(Path10, { d: OROCHIA.flame.d, transform: `translate(${OROCHIA.flame.translate[0]} ${OROCHIA.flame.translate[1]}) scale(${OROCHIA.flame.scale})`, fill: "url(#flame)" })
3140
3154
  ] })
3141
3155
  ] }) })
3142
3156
  ] });
3143
3157
  }
3144
3158
 
3145
3159
  // src/native/YasakiaMark.tsx
3146
- import React21 from "react";
3147
- import { View as View26 } from "react-native";
3148
- import Svg13, { Circle as Circle7, Defs as Defs8, LinearGradient as LinearGradient8, Path as Path11, RadialGradient as RadialGradient6, Stop as Stop8 } from "react-native-svg";
3160
+ import { View as View27 } from "react-native";
3161
+ import Svg13, { Circle as Circle7, Defs as Defs8, LinearGradient as LinearGradient6, Path as Path11, RadialGradient as RadialGradient6, Stop as Stop8 } from "react-native-svg";
3149
3162
 
3150
3163
  // src/marks/yasakia-geometry.ts
3151
3164
  var turquoise = marks.yasakia[marks.yasakia.length - 1][1];
@@ -3153,77 +3166,63 @@ var YASAKIA = {
3153
3166
  viewBox: "0 0 400 400",
3154
3167
  croppedViewBox: "80 80 240 240",
3155
3168
  center: 200,
3156
- /** The two voices, left then right: each a bubble (cut around the lens) and its tail. */
3157
- voices: [
3158
- { body: "M191.9 109 A80 80 0 1 0 191.9 259 A87 87 0 0 1 191.9 109 Z", tail: "M98 230 Q104 268 88 294 Q122 288 144 262 L130 200 Z" },
3159
- { body: "M208.1 109 A80 80 0 1 1 208.1 259 A87 87 0 0 0 208.1 109 Z", tail: "M302 230 Q296 268 312 294 Q278 288 256 262 L270 200 Z" }
3169
+ bubble: { cx: 200, cy: 200, r: 86 },
3170
+ /** The two tails, out of the bubble at 115°–160° and, turned 180° about the centre, at 295°–340°. */
3171
+ tails: [
3172
+ "M163.7 277.9 Q138 294 106 304 Q124 270 119.2 229.4 Z",
3173
+ "M236.3 122.1 Q262 106 294 96 Q276 130 280.8 170.6 Z"
3160
3174
  ],
3161
- /** The left voice, a shade deeper: the depth between the two. */
3162
- shade: { color: "#000", opacity: 0.22 },
3163
- /** Where the bubbles overlap: the core, lit from above. */
3164
- lens: { d: "M200 112.6 A80 80 0 0 1 200 255.4 A80 80 0 0 1 200 112.6 Z", y1: 112.6, y2: 255.4 },
3175
+ /** The spark: a diamond of light (half-diagonal 24, softened by a 6-unit round stroke). */
3176
+ spark: { d: "M200 176 L224 200 L200 224 L176 200 Z", soften: 6 },
3177
+ highlight: "#f0fdfa",
3165
3178
  gradient: { x1: 110, y1: 300, x2: 290, y2: 100, stops: marks.yasakia },
3166
- /** The light on the lens: bright at the top, fading down. */
3167
- highlight: { color: "#f0fdfa", from: 0.75, to: 0.2 },
3168
- /** The pair: two nodes on the orbit, opposite each other, that turn with it. */
3169
- pair: { r: 8, at: [[40, 200], [360, 200]] },
3179
+ /** The two people: one node on the orbit, that turns with it. */
3180
+ node: { r: 9, at: [200, 40] },
3170
3181
  glow: { color: turquoise, opacity: 0.16 },
3171
- /** The core's breathing shadow (web), in the mark's turquoise. */
3172
3182
  pulse: { color: turquoise, low: 0.3, high: 0.6 },
3183
+ motion: { spin: 30, breath: 3.2 },
3173
3184
  orbit: { r: 160, dash: "8 8", width: 1.5 },
3174
3185
  ring: { r: 134, width: 1 }
3175
3186
  };
3176
3187
 
3177
3188
  // src/native/YasakiaMark.tsx
3178
- import { jsx as jsx30, jsxs as jsxs27 } from "react/jsx-runtime";
3189
+ import { jsx as jsx31, jsxs as jsxs28 } from "react/jsx-runtime";
3179
3190
  function YasakiaMark({ size = 48, animated = true, title, neutral }) {
3180
3191
  const { theme } = useTheme();
3181
- const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated);
3192
+ const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, YASAKIA.motion.spin * 1e3);
3182
3193
  const id = useSvgId("yzm");
3183
3194
  const viewBox = size < 48 ? YASAKIA.croppedViewBox : YASAKIA.viewBox;
3184
3195
  const stroke = neutral ?? theme.textMuted;
3185
- 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)) });
3196
+ const gradient = /* @__PURE__ */ jsx31(LinearGradient6, { 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)) });
3186
3197
  const fill = `url(#${id}a)`;
3187
- return /* @__PURE__ */ jsxs27(View26, { style: { width: size, height: size }, ...markA11y(title), children: [
3188
- /* @__PURE__ */ jsxs27(Svg13, { viewBox, style: layer, children: [
3189
- /* @__PURE__ */ jsxs27(Defs8, { children: [
3190
- /* @__PURE__ */ jsxs27(RadialGradient6, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
3191
- /* @__PURE__ */ jsx30(Stop8, { offset: "0%", stopColor: YASAKIA.glow.color, stopOpacity: YASAKIA.glow.opacity }),
3192
- /* @__PURE__ */ jsx30(Stop8, { offset: "100%", stopColor: YASAKIA.glow.color, stopOpacity: 0 })
3198
+ return /* @__PURE__ */ jsxs28(View27, { style: { width: size, height: size }, ...markA11y(title), children: [
3199
+ /* @__PURE__ */ jsxs28(Svg13, { viewBox, style: layer, children: [
3200
+ /* @__PURE__ */ jsxs28(Defs8, { children: [
3201
+ /* @__PURE__ */ jsxs28(RadialGradient6, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
3202
+ /* @__PURE__ */ jsx31(Stop8, { offset: "0%", stopColor: YASAKIA.glow.color, stopOpacity: YASAKIA.glow.opacity }),
3203
+ /* @__PURE__ */ jsx31(Stop8, { offset: "100%", stopColor: YASAKIA.glow.color, stopOpacity: 0 })
3193
3204
  ] }),
3194
3205
  gradient
3195
3206
  ] }),
3196
- size >= 48 ? /* @__PURE__ */ jsx30(Circle7, { cx: YASAKIA.center, cy: YASAKIA.center, r: 190, fill: `url(#${id}g)` }) : null,
3197
- /* @__PURE__ */ jsx30(Circle7, { cx: YASAKIA.center, cy: YASAKIA.center, r: YASAKIA.ring.r, stroke, strokeWidth: YASAKIA.ring.width, opacity: 0.35, fill: "none" }),
3198
- YASAKIA.voices.map((v, i) => /* @__PURE__ */ jsxs27(React21.Fragment, { children: [
3199
- /* @__PURE__ */ jsx30(Path11, { d: v.body, fill }),
3200
- /* @__PURE__ */ jsx30(Path11, { d: v.tail, fill }),
3201
- i === 0 ? /* @__PURE__ */ jsx30(Path11, { d: `${v.body} ${v.tail}`, fill: YASAKIA.shade.color, opacity: YASAKIA.shade.opacity }) : null
3202
- ] }, v.body))
3207
+ size >= 48 ? /* @__PURE__ */ jsx31(Circle7, { cx: YASAKIA.center, cy: YASAKIA.center, r: 190, fill: `url(#${id}g)` }) : null,
3208
+ /* @__PURE__ */ jsx31(Circle7, { cx: YASAKIA.center, cy: YASAKIA.center, r: YASAKIA.ring.r, stroke, strokeWidth: YASAKIA.ring.width, opacity: 0.35, fill: "none" }),
3209
+ /* @__PURE__ */ jsx31(Circle7, { cx: YASAKIA.bubble.cx, cy: YASAKIA.bubble.cy, r: YASAKIA.bubble.r, fill }),
3210
+ /* @__PURE__ */ jsx31(Path11, { d: YASAKIA.tails.join(" "), fill })
3203
3211
  ] }),
3204
- /* @__PURE__ */ jsx30(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs27(Svg13, { viewBox, style: layer, children: [
3205
- /* @__PURE__ */ jsx30(Defs8, { children: gradient }),
3206
- /* @__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" }),
3207
- YASAKIA.pair.at.map(([cx, cy]) => /* @__PURE__ */ jsx30(Circle7, { cx, cy, r: YASAKIA.pair.r, fill }, cx))
3212
+ /* @__PURE__ */ jsx31(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs28(Svg13, { viewBox, style: layer, children: [
3213
+ /* @__PURE__ */ jsx31(Defs8, { children: gradient }),
3214
+ /* @__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" }),
3215
+ /* @__PURE__ */ jsx31(Circle7, { cx: YASAKIA.node.at[0], cy: YASAKIA.node.at[1], r: YASAKIA.node.r, fill })
3208
3216
  ] }) }),
3209
- /* @__PURE__ */ jsx30(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs27(Svg13, { viewBox, style: layer, children: [
3210
- /* @__PURE__ */ jsxs27(Defs8, { children: [
3211
- gradient,
3212
- /* @__PURE__ */ jsxs27(LinearGradient8, { id: `${id}l`, gradientUnits: "userSpaceOnUse", x1: 0, y1: YASAKIA.lens.y1, x2: 0, y2: YASAKIA.lens.y2, children: [
3213
- /* @__PURE__ */ jsx30(Stop8, { offset: "0%", stopColor: YASAKIA.highlight.color, stopOpacity: YASAKIA.highlight.from }),
3214
- /* @__PURE__ */ jsx30(Stop8, { offset: "100%", stopColor: YASAKIA.highlight.color, stopOpacity: YASAKIA.highlight.to })
3215
- ] })
3216
- ] }),
3217
- /* @__PURE__ */ jsx30(Path11, { d: YASAKIA.lens.d, fill }),
3218
- /* @__PURE__ */ jsx30(Path11, { d: YASAKIA.lens.d, fill: `url(#${id}l)` })
3219
- ] }) })
3217
+ /* @__PURE__ */ jsx31(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsx31(Svg13, { viewBox, style: layer, children: /* @__PURE__ */ jsx31(Path11, { d: YASAKIA.spark.d, fill: YASAKIA.highlight, stroke: YASAKIA.highlight, strokeWidth: YASAKIA.spark.soften, strokeLinejoin: "round" }) }) })
3220
3218
  ] });
3221
3219
  }
3222
3220
  var YazakiaMark = YasakiaMark;
3223
3221
 
3224
3222
  // src/native/YomizakaMark.tsx
3225
- import { View as View27 } from "react-native";
3226
- import Svg14, { Circle as Circle8, Defs as Defs9, LinearGradient as LinearGradient9, Path as Path12, RadialGradient as RadialGradient7, Stop as Stop9 } from "react-native-svg";
3223
+ import React21 from "react";
3224
+ import { View as View28 } from "react-native";
3225
+ import Svg14, { Circle as Circle8, Defs as Defs9, LinearGradient as LinearGradient7, Path as Path12, RadialGradient as RadialGradient7, Stop as Stop9 } from "react-native-svg";
3227
3226
 
3228
3227
  // src/marks/yomizaka-geometry.ts
3229
3228
  var indigo = marks.yomizaka[marks.yomizaka.length - 1][1];
@@ -3231,74 +3230,72 @@ var YOMIZAKA = {
3231
3230
  viewBox: "0 0 400 400",
3232
3231
  croppedViewBox: "80 80 240 240",
3233
3232
  center: 200,
3234
- /** The page, cut at its corner (the Krizaka chamfer) and around the lens. */
3235
- page: "M128 92 H228 L264 128 V185.87 A52 52 0 1 0 264 278.13 V300 H128 Z",
3236
- /** Three lines of text and the start of a fourth, in light: they wrap around the lens. */
3237
- lines: "M156 140 H226 M156 170 H236 M156 200 H184 M156 230 H176",
3238
- line: { color: "#f4f5ff", opacity: 0.6, width: 10 },
3239
- /** The lens: a ring in the brand gradient, its pale core lit from above, a glint; the handle leaves the page. */
3240
- lens: { cx: 240, cy: 232, r: 40, width: 12, core: 28, glint: { cx: 230, cy: 222, r: 8 } },
3241
- handle: "M276 268 L304 296",
3242
- handleWidth: 20,
3243
- gradient: { x1: 128, y1: 300, x2: 304, y2: 92, stops: marks.yomizaka },
3244
- /** The lens' core: a pale indigo light, brighter at the top. */
3245
- coreGradient: { stops: [["0%", "#c9ceff"], ["100%", "#f4f5ff"]] },
3246
- highlight: "#ffffff",
3247
- /** The reading (web): a line of light that scans the page from top to bottom, clipped to the page. */
3248
- scan: { d: "M136 100 H236", travel: 192, color: "#f4f5ff", opacity: 0.7, width: 3 },
3249
- /** A page: one node on the orbit, that turns with it. */
3233
+ stroke: 22,
3234
+ /** The brow: two soft arcs that meet over the beak — calm, never a sharp V. */
3235
+ brow: "M106 153 C130 125 176 129 200 159 C224 129 270 125 294 153",
3236
+ /** The two lenses (rings at the family stroke). */
3237
+ lenses: [
3238
+ { cx: 146, cy: 223, r: 40 },
3239
+ { cx: 254, cy: 223, r: 40 }
3240
+ ],
3241
+ /** The pupils, glancing down-right (reading): the lit cores. */
3242
+ pupils: [
3243
+ { cx: 154, cy: 229, r: 15, inner: 5.1 },
3244
+ { cx: 262, cy: 229, r: 15, inner: 5.1 }
3245
+ ],
3246
+ highlight: "#f4f5ff",
3247
+ gradient: { x1: 110, y1: 300, x2: 290, y2: 100, stops: marks.yomizaka },
3248
+ /** One node, a page, rides the orbit. */
3250
3249
  node: { r: 9, at: [200, 40] },
3251
3250
  glow: { color: indigo, opacity: 0.18 },
3252
- /** The lens' breathing shadow (web), in the indigo. */
3253
3251
  pulse: { color: indigo, low: 0.3, high: 0.6 },
3252
+ motion: { spin: 32, breath: 3.6 },
3254
3253
  orbit: { r: 160, dash: "8 8", width: 1.5 },
3255
3254
  ring: { r: 134, width: 1 }
3256
3255
  };
3257
3256
 
3258
3257
  // src/native/YomizakaMark.tsx
3259
- import { jsx as jsx31, jsxs as jsxs28 } from "react/jsx-runtime";
3258
+ import { jsx as jsx32, jsxs as jsxs29 } from "react/jsx-runtime";
3260
3259
  function YomizakaMark({ size = 48, animated = true, title, neutral }) {
3261
3260
  const { theme } = useTheme();
3262
- const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, 32e3);
3261
+ const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, YOMIZAKA.motion.spin * 1e3);
3263
3262
  const id = useSvgId("ymm");
3264
3263
  const viewBox = size < 48 ? YOMIZAKA.croppedViewBox : YOMIZAKA.viewBox;
3265
3264
  const stroke = neutral ?? theme.textMuted;
3266
- 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)) });
3265
+ const gradient = /* @__PURE__ */ jsx32(LinearGradient7, { 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)) });
3267
3266
  const fill = `url(#${id}a)`;
3268
- return /* @__PURE__ */ jsxs28(View27, { style: { width: size, height: size }, ...markA11y(title), children: [
3269
- /* @__PURE__ */ jsxs28(Svg14, { viewBox, style: layer, children: [
3270
- /* @__PURE__ */ jsxs28(Defs9, { children: [
3271
- /* @__PURE__ */ jsxs28(RadialGradient7, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
3272
- /* @__PURE__ */ jsx31(Stop9, { offset: "0%", stopColor: YOMIZAKA.glow.color, stopOpacity: YOMIZAKA.glow.opacity }),
3273
- /* @__PURE__ */ jsx31(Stop9, { offset: "100%", stopColor: YOMIZAKA.glow.color, stopOpacity: 0 })
3267
+ return /* @__PURE__ */ jsxs29(View28, { style: { width: size, height: size }, ...markA11y(title), children: [
3268
+ /* @__PURE__ */ jsxs29(Svg14, { viewBox, style: layer, children: [
3269
+ /* @__PURE__ */ jsxs29(Defs9, { children: [
3270
+ /* @__PURE__ */ jsxs29(RadialGradient7, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
3271
+ /* @__PURE__ */ jsx32(Stop9, { offset: "0%", stopColor: YOMIZAKA.glow.color, stopOpacity: YOMIZAKA.glow.opacity }),
3272
+ /* @__PURE__ */ jsx32(Stop9, { offset: "100%", stopColor: YOMIZAKA.glow.color, stopOpacity: 0 })
3274
3273
  ] }),
3275
3274
  gradient
3276
3275
  ] }),
3277
- size >= 48 ? /* @__PURE__ */ jsx31(Circle8, { cx: YOMIZAKA.center, cy: YOMIZAKA.center, r: 190, fill: `url(#${id}g)` }) : null,
3278
- /* @__PURE__ */ jsx31(Circle8, { cx: YOMIZAKA.center, cy: YOMIZAKA.center, r: YOMIZAKA.ring.r, stroke, strokeWidth: YOMIZAKA.ring.width, opacity: 0.35, fill: "none" }),
3279
- /* @__PURE__ */ jsx31(Path12, { d: YOMIZAKA.page, fill }),
3280
- /* @__PURE__ */ jsx31(Path12, { d: YOMIZAKA.lines, stroke: YOMIZAKA.line.color, strokeOpacity: YOMIZAKA.line.opacity, strokeWidth: YOMIZAKA.line.width, strokeLinecap: "round", fill: "none" }),
3281
- /* @__PURE__ */ jsx31(Path12, { d: YOMIZAKA.handle, stroke: fill, strokeWidth: YOMIZAKA.handleWidth, strokeLinecap: "round", fill: "none" })
3276
+ size >= 48 ? /* @__PURE__ */ jsx32(Circle8, { cx: YOMIZAKA.center, cy: YOMIZAKA.center, r: 190, fill: `url(#${id}g)` }) : null,
3277
+ /* @__PURE__ */ jsx32(Circle8, { cx: YOMIZAKA.center, cy: YOMIZAKA.center, r: YOMIZAKA.ring.r, stroke, strokeWidth: YOMIZAKA.ring.width, opacity: 0.35, fill: "none" }),
3278
+ /* @__PURE__ */ jsx32(Path12, { d: YOMIZAKA.brow, stroke: fill, strokeWidth: YOMIZAKA.stroke, strokeLinecap: "round", strokeLinejoin: "round", fill: "none" }),
3279
+ YOMIZAKA.lenses.map((l) => /* @__PURE__ */ jsx32(Circle8, { cx: l.cx, cy: l.cy, r: l.r, stroke: fill, strokeWidth: YOMIZAKA.stroke, fill: "none" }, l.cx))
3282
3280
  ] }),
3283
- /* @__PURE__ */ jsx31(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs28(Svg14, { viewBox, style: layer, children: [
3284
- /* @__PURE__ */ jsx31(Defs9, { children: gradient }),
3285
- /* @__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" }),
3286
- /* @__PURE__ */ jsx31(Circle8, { cx: YOMIZAKA.node.at[0], cy: YOMIZAKA.node.at[1], r: YOMIZAKA.node.r, fill })
3281
+ /* @__PURE__ */ jsx32(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs29(Svg14, { viewBox, style: layer, children: [
3282
+ /* @__PURE__ */ jsx32(Defs9, { children: gradient }),
3283
+ /* @__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" }),
3284
+ /* @__PURE__ */ jsx32(Circle8, { cx: YOMIZAKA.node.at[0], cy: YOMIZAKA.node.at[1], r: YOMIZAKA.node.r, fill })
3287
3285
  ] }) }),
3288
- /* @__PURE__ */ jsx31(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs28(Svg14, { viewBox, style: layer, children: [
3289
- /* @__PURE__ */ jsxs28(Defs9, { children: [
3290
- gradient,
3291
- /* @__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)) })
3292
- ] }),
3293
- /* @__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)` }),
3294
- /* @__PURE__ */ jsx31(Circle8, { cx: YOMIZAKA.lens.glint.cx, cy: YOMIZAKA.lens.glint.cy, r: YOMIZAKA.lens.glint.r, fill: YOMIZAKA.highlight })
3286
+ /* @__PURE__ */ jsx32(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs29(Svg14, { viewBox, style: layer, children: [
3287
+ /* @__PURE__ */ jsx32(Defs9, { children: gradient }),
3288
+ YOMIZAKA.pupils.map((p) => /* @__PURE__ */ jsxs29(React21.Fragment, { children: [
3289
+ /* @__PURE__ */ jsx32(Circle8, { cx: p.cx, cy: p.cy, r: p.r, fill }),
3290
+ /* @__PURE__ */ jsx32(Circle8, { cx: p.cx, cy: p.cy, r: p.inner, fill: YOMIZAKA.highlight })
3291
+ ] }, p.cx))
3295
3292
  ] }) })
3296
3293
  ] });
3297
3294
  }
3298
3295
 
3299
3296
  // src/native/YororisMark.tsx
3300
- import { View as View28 } from "react-native";
3301
- 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
+ import { View as View29 } from "react-native";
3298
+ import Svg15, { Circle as Circle9, Defs as Defs10, Path as Path13, RadialGradient as RadialGradient8, Stop as Stop10 } from "react-native-svg";
3302
3299
 
3303
3300
  // src/marks/yororis-geometry.ts
3304
3301
  var sand = marks.yororis[0][1];
@@ -3307,85 +3304,68 @@ var YORORIS = {
3307
3304
  viewBox: "0 0 400 400",
3308
3305
  croppedViewBox: "80 80 240 240",
3309
3306
  center: 200,
3310
- /** The two leaves — open hands, mirrored around x = 200 — filled, rising from the stem. */
3311
- leaves: [
3312
- "M200 262 C142 256 104 206 110 122 C138 130 154 152 160 180 C168 218 182 238 204 246 Z",
3313
- "M200 262 C258 256 296 206 290 122 C262 130 246 152 240 180 C232 218 218 238 196 246 Z"
3314
- ],
3315
- /** A vein of light along each leaf (dashed, it drifts slowly when animated). */
3316
- veins: "M122 142 C128 196 156 232 192 248 M278 142 C272 196 244 232 208 248",
3317
- vein: { color: "#fbf6ea", opacity: 0.45, width: 3, dash: "2 14" },
3318
- /** The stem, from the junction down. */
3319
- stem: "M200 244 L200 312",
3320
- stroke: 30,
3321
- gradient: { x1: 110, y1: 300, x2: 290, y2: 100, stops: marks.yororis },
3322
- /** The core's warm light: from the mark's sand (below) to a light sand (above). */
3323
- coreGradient: { stops: [["0%", sand], ["100%", "#e6c993"]] },
3324
- /** The core, held in the hollow of the leaves (not on the junction): the one who is listened to. It breathes. */
3325
- core: { cx: 200, cy: 184, r: 32, inner: 11 },
3307
+ stroke: 22,
3308
+ sand,
3309
+ sage,
3310
+ /** The two hands: arcs of a circle r 92 centred (200, 162), from 196° to 104° and from 76° to −16°; open at the bottom and the top. */
3311
+ hands: "M111.6 136.6 A92 92 0 0 0 177.7 251.3 M222.3 251.3 A92 92 0 0 0 288.4 136.6",
3312
+ /** The warm core, held inside the hands. */
3313
+ core: { cx: 200, cy: 176, r: 30, inner: 10.2 },
3326
3314
  highlight: "#fbf6ea",
3327
- /** The moment: one node on the orbit, that turns with it. */
3328
- moment: { r: 9, at: [200, 40] },
3315
+ gradient: { x1: 110, y1: 300, x2: 290, y2: 100, stops: marks.yororis },
3316
+ /** The moment: one node on the orbit — it comes round, then it goes. */
3317
+ node: { r: 9, at: [200, 40] },
3329
3318
  glow: { color: sage, opacity: 0.18 },
3330
- /** The core's breathing shadow (web), in the core's warm sand. */
3331
3319
  pulse: { color: sand, low: 0.3, high: 0.6 },
3320
+ motion: { spin: 36, breath: 4.2 },
3332
3321
  orbit: { r: 160, dash: "8 8", width: 1.5 },
3333
3322
  ring: { r: 134, width: 1 }
3334
3323
  };
3335
3324
 
3336
3325
  // src/native/YororisMark.tsx
3337
- import { jsx as jsx32, jsxs as jsxs29 } from "react/jsx-runtime";
3326
+ import { jsx as jsx33, jsxs as jsxs30 } from "react/jsx-runtime";
3338
3327
  function YororisMark({ size = 48, animated = true, title, neutral }) {
3339
3328
  const { theme } = useTheme();
3340
- const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, 36e3);
3329
+ const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, YORORIS.motion.spin * 1e3);
3341
3330
  const id = useSvgId("yrm");
3342
3331
  const viewBox = size < 48 ? YORORIS.croppedViewBox : YORORIS.viewBox;
3343
3332
  const stroke = neutral ?? theme.textMuted;
3344
- 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)) });
3345
- const fill = `url(#${id}a)`;
3346
- return /* @__PURE__ */ jsxs29(View28, { style: { width: size, height: size }, ...markA11y(title), children: [
3347
- /* @__PURE__ */ jsxs29(Svg15, { viewBox, style: layer, children: [
3348
- /* @__PURE__ */ jsxs29(Defs10, { children: [
3349
- /* @__PURE__ */ jsxs29(RadialGradient8, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
3350
- /* @__PURE__ */ jsx32(Stop10, { offset: "0%", stopColor: YORORIS.glow.color, stopOpacity: YORORIS.glow.opacity }),
3351
- /* @__PURE__ */ jsx32(Stop10, { offset: "100%", stopColor: YORORIS.glow.color, stopOpacity: 0 })
3352
- ] }),
3353
- gradient
3354
- ] }),
3355
- size >= 48 ? /* @__PURE__ */ jsx32(Circle9, { cx: YORORIS.center, cy: YORORIS.center, r: 190, fill: `url(#${id}g)` }) : null,
3356
- /* @__PURE__ */ jsx32(Circle9, { cx: YORORIS.center, cy: YORORIS.center, r: YORORIS.ring.r, stroke, strokeWidth: YORORIS.ring.width, opacity: 0.35, fill: "none" }),
3357
- /* @__PURE__ */ jsx32(Path13, { d: YORORIS.stem, stroke: fill, strokeWidth: YORORIS.stroke, strokeLinecap: "round", fill: "none" }),
3358
- YORORIS.leaves.map((d) => /* @__PURE__ */ jsx32(Path13, { d, fill }, d)),
3359
- /* @__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" })
3333
+ return /* @__PURE__ */ jsxs30(View29, { style: { width: size, height: size }, ...markA11y(title), children: [
3334
+ /* @__PURE__ */ jsxs30(Svg15, { viewBox, style: layer, children: [
3335
+ /* @__PURE__ */ jsx33(Defs10, { children: /* @__PURE__ */ jsxs30(RadialGradient8, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
3336
+ /* @__PURE__ */ jsx33(Stop10, { offset: "0%", stopColor: YORORIS.glow.color, stopOpacity: YORORIS.glow.opacity }),
3337
+ /* @__PURE__ */ jsx33(Stop10, { offset: "100%", stopColor: YORORIS.glow.color, stopOpacity: 0 })
3338
+ ] }) }),
3339
+ size >= 48 ? /* @__PURE__ */ jsx33(Circle9, { cx: YORORIS.center, cy: YORORIS.center, r: 190, fill: `url(#${id}g)` }) : null,
3340
+ /* @__PURE__ */ jsx33(Circle9, { cx: YORORIS.center, cy: YORORIS.center, r: YORORIS.ring.r, stroke, strokeWidth: YORORIS.ring.width, opacity: 0.35, fill: "none" }),
3341
+ /* @__PURE__ */ jsx33(Path13, { d: YORORIS.hands, stroke: YORORIS.sage, strokeWidth: YORORIS.stroke, strokeLinecap: "round", fill: "none" })
3360
3342
  ] }),
3361
- /* @__PURE__ */ jsx32(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs29(Svg15, { viewBox, style: layer, children: [
3362
- /* @__PURE__ */ jsx32(Defs10, { children: gradient }),
3363
- /* @__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" }),
3364
- /* @__PURE__ */ jsx32(Circle9, { cx: YORORIS.moment.at[0], cy: YORORIS.moment.at[1], r: YORORIS.moment.r, fill })
3343
+ /* @__PURE__ */ jsx33(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs30(Svg15, { viewBox, style: layer, children: [
3344
+ /* @__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" }),
3345
+ /* @__PURE__ */ jsx33(Circle9, { cx: YORORIS.node.at[0], cy: YORORIS.node.at[1], r: YORORIS.node.r, fill: YORORIS.sage })
3365
3346
  ] }) }),
3366
- /* @__PURE__ */ jsx32(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs29(Svg15, { viewBox, style: layer, children: [
3367
- /* @__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)) }) }),
3368
- /* @__PURE__ */ jsx32(Circle9, { cx: YORORIS.core.cx, cy: YORORIS.core.cy, r: YORORIS.core.r, fill: `url(#${id}c)` }),
3369
- /* @__PURE__ */ jsx32(Circle9, { cx: YORORIS.core.cx, cy: YORORIS.core.cy, r: YORORIS.core.inner, fill: YORORIS.highlight })
3347
+ /* @__PURE__ */ jsx33(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs30(Svg15, { viewBox, style: layer, children: [
3348
+ /* @__PURE__ */ jsx33(Circle9, { cx: YORORIS.core.cx, cy: YORORIS.core.cy, r: YORORIS.core.r, fill: YORORIS.sand }),
3349
+ /* @__PURE__ */ jsx33(Circle9, { cx: YORORIS.core.cx, cy: YORORIS.core.cy, r: YORORIS.core.inner, fill: YORORIS.highlight })
3370
3350
  ] }) })
3371
3351
  ] });
3372
3352
  }
3373
3353
 
3374
3354
  // src/native/ProductMark.tsx
3375
- import { jsx as jsx33 } from "react/jsx-runtime";
3355
+ import { jsx as jsx34 } from "react/jsx-runtime";
3376
3356
  function ProductMark({ id, ...props }) {
3377
- if (id === "krizaka") return /* @__PURE__ */ jsx33(KrizakaMark, { ...props });
3378
- if (id === "orazaka") return /* @__PURE__ */ jsx33(OrazakaMark, { ...props });
3379
- if (id === "yasakia" || id === "yazakia") return /* @__PURE__ */ jsx33(YasakiaMark, { ...props });
3380
- if (id === "yororis") return /* @__PURE__ */ jsx33(YororisMark, { ...props });
3381
- if (id === "yomizaka") return /* @__PURE__ */ jsx33(YomizakaMark, { ...props });
3382
- if (id === "kachizaka") return /* @__PURE__ */ jsx33(KachizakaMark, { ...props });
3383
- if (id === "akinaza") return /* @__PURE__ */ jsx33(AkinazaMark, { ...props });
3384
- return /* @__PURE__ */ jsx33(OrochiaMark, { ...props });
3357
+ if (id === "krizaka") return /* @__PURE__ */ jsx34(KrizakaMark, { ...props });
3358
+ if (id === "orazaka") return /* @__PURE__ */ jsx34(OrazakaMark, { ...props });
3359
+ if (id === "yasakia" || id === "yazakia") return /* @__PURE__ */ jsx34(YasakiaMark, { ...props });
3360
+ if (id === "yororis") return /* @__PURE__ */ jsx34(YororisMark, { ...props });
3361
+ if (id === "yomizaka") return /* @__PURE__ */ jsx34(YomizakaMark, { ...props });
3362
+ if (id === "kachizaka") return /* @__PURE__ */ jsx34(KachizakaMark, { ...props });
3363
+ if (id === "akinaza") return /* @__PURE__ */ jsx34(AkinazaMark, { ...props });
3364
+ return /* @__PURE__ */ jsx34(OrochiaMark, { ...props });
3385
3365
  }
3386
3366
 
3387
3367
  // src/native/loader.tsx
3388
- import { jsx as jsx34, jsxs as jsxs30 } from "react/jsx-runtime";
3368
+ import { jsx as jsx35, jsxs as jsxs31 } from "react/jsx-runtime";
3389
3369
  var HEX = "M12 3 19.79 7.5 19.79 16.5 12 21 4.21 16.5 4.21 7.5Z";
3390
3370
  var PERIMETER = 54;
3391
3371
  function LoaderGlyph({ state = "loading", value, size = 20, color }) {
@@ -3402,12 +3382,12 @@ function LoaderGlyph({ state = "loading", value, size = 20, color }) {
3402
3382
  const stroke = color ?? (state === "success" ? theme.success : state === "error" ? theme.danger : theme.accent);
3403
3383
  const fill = state !== "loading" ? 1 : known ? Math.min(1, Math.max(0, value)) : 0.3;
3404
3384
  const rotate = spin.interpolate({ inputRange: [0, 1], outputRange: ["0deg", "360deg"] });
3405
- 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: [
3406
- /* @__PURE__ */ jsx34(Path14, { d: HEX, stroke, strokeOpacity: 0.22, strokeWidth: 2.2, strokeLinejoin: "round" }),
3407
- /* @__PURE__ */ jsx34(Path14, { d: HEX, stroke, strokeWidth: 2.2, strokeLinejoin: "round", strokeLinecap: "round", strokeDasharray: `${fill * PERIMETER} ${PERIMETER}` }),
3408
- state === "loading" ? /* @__PURE__ */ jsx34(Circle10, { cx: 12, cy: 12, r: 2.6, fill: stroke }) : null,
3409
- 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,
3410
- 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
3385
+ 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: [
3386
+ /* @__PURE__ */ jsx35(Path14, { d: HEX, stroke, strokeOpacity: 0.22, strokeWidth: 2.2, strokeLinejoin: "round" }),
3387
+ /* @__PURE__ */ jsx35(Path14, { d: HEX, stroke, strokeWidth: 2.2, strokeLinejoin: "round", strokeLinecap: "round", strokeDasharray: `${fill * PERIMETER} ${PERIMETER}` }),
3388
+ state === "loading" ? /* @__PURE__ */ jsx35(Circle10, { cx: 12, cy: 12, r: 2.6, fill: stroke }) : null,
3389
+ 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,
3390
+ 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
3411
3391
  ] }) });
3412
3392
  }
3413
3393
  function useDelayedWait(active, delay = 250, minDuration = 600) {
@@ -3459,22 +3439,22 @@ function Loader({ label, status = "loading", successLabel, errorLabel, value, et
3459
3439
  const known = phase === "loading" && typeof value === "number" && Number.isFinite(value);
3460
3440
  const detail = phase === "loading" ? [known ? `${Math.round(Math.min(1, Math.max(0, value)) * 100)} %` : null, eta].filter(Boolean).join(" \xB7 ") : "";
3461
3441
  const stacked = variant !== "inline";
3462
- 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: [
3463
- 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] }),
3464
- /* @__PURE__ */ jsxs30(View29, { style: stacked ? styles24.center : styles24.text, children: [
3465
- /* @__PURE__ */ jsx34(Txt, { variant: variant === "page" ? "title" : "label", style: stacked ? styles24.centered : null, children: words2 }),
3466
- detail ? /* @__PURE__ */ jsx34(Txt, { variant: "caption", tone: "secondary", style: stacked ? styles24.centered : null, children: detail }) : null
3442
+ 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: [
3443
+ 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] }),
3444
+ /* @__PURE__ */ jsxs31(View30, { style: stacked ? styles25.center : styles25.text, children: [
3445
+ /* @__PURE__ */ jsx35(Txt, { variant: variant === "page" ? "title" : "label", style: stacked ? styles25.centered : null, children: words2 }),
3446
+ detail ? /* @__PURE__ */ jsx35(Txt, { variant: "caption", tone: "secondary", style: stacked ? styles25.centered : null, children: detail }) : null
3467
3447
  ] })
3468
3448
  ] });
3469
3449
  const a11y = { accessible: true, role: "progressbar", "aria-label": words2, "aria-busy": phase === "loading", accessibilityLiveRegion: "polite" };
3470
3450
  if (variant === "overlay" || variant === "page")
3471
- return /* @__PURE__ */ jsx34(View29, { ...a11y, style: [StyleSheet24.absoluteFill, styles24.cover, variant === "page" ? { backgroundColor: alpha(theme.surface0, 0.86) } : null, style], children: box });
3472
- return /* @__PURE__ */ jsx34(View29, { ...a11y, style: [variant === "block" ? styles24.block : null, style], children: box });
3451
+ return /* @__PURE__ */ jsx35(View30, { ...a11y, style: [StyleSheet25.absoluteFill, styles25.cover, variant === "page" ? { backgroundColor: alpha(theme.surface0, 0.86) } : null, style], children: box });
3452
+ return /* @__PURE__ */ jsx35(View30, { ...a11y, style: [variant === "block" ? styles25.block : null, style], children: box });
3473
3453
  }
3474
- var styles24 = StyleSheet24.create({
3454
+ var styles25 = StyleSheet25.create({
3475
3455
  inline: { flexDirection: "row", alignItems: "center", gap: 10 },
3476
3456
  stacked: { alignItems: "center", gap: 10 },
3477
- card: { paddingHorizontal: 24, paddingVertical: 20, borderWidth: StyleSheet24.hairlineWidth },
3457
+ card: { paddingHorizontal: 24, paddingVertical: 20, borderWidth: StyleSheet25.hairlineWidth },
3478
3458
  text: { flexShrink: 1, gap: 2 },
3479
3459
  center: { alignItems: "center", gap: 2 },
3480
3460
  centered: { textAlign: "center" },
@@ -3482,14 +3462,37 @@ var styles24 = StyleSheet24.create({
3482
3462
  cover: { alignItems: "center", justifyContent: "center", zIndex: 10 }
3483
3463
  });
3484
3464
 
3465
+ // src/native/maintenance-screen.tsx
3466
+ import { StyleSheet as StyleSheet26, View as View31 } from "react-native";
3467
+ import { jsx as jsx36, jsxs as jsxs32 } from "react/jsx-runtime";
3468
+ function MaintenanceScreen({ title, message, mark, retryLabel, onRetry, fill = true, style }) {
3469
+ const { theme } = useTheme();
3470
+ return /* @__PURE__ */ jsxs32(View31, { style: [styles26.root, fill ? styles26.fill : null, { backgroundColor: theme.surface0 }, style], children: [
3471
+ mark ? /* @__PURE__ */ jsx36(View31, { accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants", style: styles26.mark, children: mark }) : null,
3472
+ /* @__PURE__ */ jsxs32(View31, { role: "status", style: styles26.text, children: [
3473
+ /* @__PURE__ */ jsx36(Txt, { variant: "title", style: styles26.centred, children: title }),
3474
+ message ? /* @__PURE__ */ jsx36(Txt, { tone: "secondary", style: styles26.centred, children: message }) : null
3475
+ ] }),
3476
+ retryLabel && onRetry ? /* @__PURE__ */ jsx36(View31, { style: styles26.actions, children: /* @__PURE__ */ jsx36(Button, { label: retryLabel, variant: "secondary", onPress: onRetry }) }) : null
3477
+ ] });
3478
+ }
3479
+ var styles26 = StyleSheet26.create({
3480
+ root: { alignItems: "center", justifyContent: "center", gap: 12, padding: 24 },
3481
+ fill: { flex: 1 },
3482
+ mark: { width: 96, height: 96, alignItems: "center", justifyContent: "center" },
3483
+ text: { gap: 8, alignItems: "center" },
3484
+ centred: { textAlign: "center", maxWidth: 340 },
3485
+ actions: { marginTop: 8, alignSelf: "stretch", maxWidth: 340, width: "100%" }
3486
+ });
3487
+
3485
3488
  // src/native/mascot-state.tsx
3486
3489
  import * as React24 from "react";
3487
- import { AccessibilityInfo as AccessibilityInfo9, Animated as Animated13, Easing as Easing7, StyleSheet as StyleSheet25, View as View31 } from "react-native";
3490
+ import { AccessibilityInfo as AccessibilityInfo9, Animated as Animated13, Easing as Easing7, StyleSheet as StyleSheet27, View as View33 } from "react-native";
3488
3491
 
3489
3492
  // src/native/mascots.tsx
3490
3493
  import { useEffect as useEffect14, useState as useState22 } from "react";
3491
- import { AccessibilityInfo as AccessibilityInfo8, Animated as Animated12, Easing as Easing6, View as View30 } from "react-native";
3492
- 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";
3494
+ import { AccessibilityInfo as AccessibilityInfo8, Animated as Animated12, Easing as Easing6, View as View32 } from "react-native";
3495
+ import Svg17, { Circle as Circle11, Defs as Defs11, Ellipse as Ellipse2, G, LinearGradient as LinearGradient8, Path as Path15, Rect as Rect2, Stop as Stop11 } from "react-native-svg";
3493
3496
 
3494
3497
  // src/mascots/geometry.ts
3495
3498
  var mirror = (d) => d.replace(/(-?\d+(?:\.\d+)?) (-?\d+(?:\.\d+)?)/g, (_, x, y) => `${120 - Number(x)} ${y}`);
@@ -3691,7 +3694,7 @@ var SHADE = "#000000";
3691
3694
  var PARCEL = ["#f59e0b", "#d97706", "#b45309"];
3692
3695
 
3693
3696
  // src/native/mascots.tsx
3694
- import { jsx as jsx35, jsxs as jsxs31 } from "react/jsx-runtime";
3697
+ import { jsx as jsx37, jsxs as jsxs33 } from "react/jsx-runtime";
3695
3698
  function useBob(animated) {
3696
3699
  const [y] = useState22(() => new Animated12.Value(0));
3697
3700
  useEffect14(() => {
@@ -3725,52 +3728,52 @@ function Mascot({ bird = "owl", mood = "welcome", tone: tone3 = "brand", size =
3725
3728
  const look3 = mood === "thinking" ? 1.4 : 0;
3726
3729
  const rot = (deg, [x, y]) => `rotate(${deg} ${x} ${y})`;
3727
3730
  const [wl, wr] = g.wings;
3728
- 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: [
3729
- /* @__PURE__ */ jsx35(Defs11, { children: /* @__PURE__ */ jsxs31(LinearGradient11, { id, x1: "0", y1: "0", x2: "0", y2: "1", children: [
3730
- /* @__PURE__ */ jsx35(Stop11, { offset: "0%", stopColor: p.from }),
3731
- /* @__PURE__ */ jsx35(Stop11, { offset: "100%", stopColor: p.to })
3731
+ 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: [
3732
+ /* @__PURE__ */ jsx37(Defs11, { children: /* @__PURE__ */ jsxs33(LinearGradient8, { id, x1: "0", y1: "0", x2: "0", y2: "1", children: [
3733
+ /* @__PURE__ */ jsx37(Stop11, { offset: "0%", stopColor: p.from }),
3734
+ /* @__PURE__ */ jsx37(Stop11, { offset: "100%", stopColor: p.to })
3732
3735
  ] }) }),
3733
- /* @__PURE__ */ jsx35(Ellipse2, { cx: g.shadow[0], cy: g.shadow[1], rx: g.shadow[2], ry: g.shadow[3], fill: SHADE, opacity: 0.14 }),
3734
- mood === "empty" && /* @__PURE__ */ jsx35(Path15, { d: MOOD_PARTS.tray, stroke: outline, strokeWidth: 1.6, strokeDasharray: "3 3", fill: "none" }),
3735
- g.legs.map((d) => /* @__PURE__ */ jsx35(Path15, { d, stroke: p.beak, strokeWidth: 2.6, strokeLinecap: "round", fill: "none" }, d)),
3736
- 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)),
3737
- g.parcel?.map((d, i) => /* @__PURE__ */ jsx35(Path15, { d, fill: PARCEL[i], ...line }, d)),
3738
- /* @__PURE__ */ jsx35(Path15, { d: g.body, fill: body, ...line }),
3739
- /* @__PURE__ */ jsx35(Path15, { d: g.belly, fill: LIGHT, opacity: 0.28 }),
3736
+ /* @__PURE__ */ jsx37(Ellipse2, { cx: g.shadow[0], cy: g.shadow[1], rx: g.shadow[2], ry: g.shadow[3], fill: SHADE, opacity: 0.14 }),
3737
+ mood === "empty" && /* @__PURE__ */ jsx37(Path15, { d: MOOD_PARTS.tray, stroke: outline, strokeWidth: 1.6, strokeDasharray: "3 3", fill: "none" }),
3738
+ g.legs.map((d) => /* @__PURE__ */ jsx37(Path15, { d, stroke: p.beak, strokeWidth: 2.6, strokeLinecap: "round", fill: "none" }, d)),
3739
+ 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)),
3740
+ g.parcel?.map((d, i) => /* @__PURE__ */ jsx37(Path15, { d, fill: PARCEL[i], ...line }, d)),
3741
+ /* @__PURE__ */ jsx37(Path15, { d: g.body, fill: body, ...line }),
3742
+ /* @__PURE__ */ jsx37(Path15, { d: g.belly, fill: LIGHT, opacity: 0.28 }),
3740
3743
  [wl, wr].map((w, i) => {
3741
3744
  const turn = mood === "success" ? i === 0 ? 28 : -28 : mood === "welcome" && i === 1 ? -20 : 0;
3742
- return /* @__PURE__ */ jsxs31(G, { transform: turn ? rot(turn, w.pivot) : void 0, children: [
3743
- /* @__PURE__ */ jsx35(Path15, { d: w.d, fill: p.wing, ...line }),
3744
- /* @__PURE__ */ jsx35(Path15, { d: w.d, fill: SHADE, opacity: 0.16 })
3745
+ return /* @__PURE__ */ jsxs33(G, { transform: turn ? rot(turn, w.pivot) : void 0, children: [
3746
+ /* @__PURE__ */ jsx37(Path15, { d: w.d, fill: p.wing, ...line }),
3747
+ /* @__PURE__ */ jsx37(Path15, { d: w.d, fill: SHADE, opacity: 0.16 })
3745
3748
  ] }, i);
3746
3749
  }),
3747
- g.neck && /* @__PURE__ */ jsx35(Path15, { d: g.neck.d, stroke: body, strokeWidth: g.neck.width, strokeLinecap: "round", fill: "none" }),
3748
- g.head.r > 0 && /* @__PURE__ */ jsx35(Circle11, { cx: g.head.cx, cy: g.head.cy, r: g.head.r, fill: body, ...line }),
3749
- g.details.map((d) => /* @__PURE__ */ jsx35(Path15, { d, fill: p.detail, ...line }, d)),
3750
- 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 }),
3750
+ g.neck && /* @__PURE__ */ jsx37(Path15, { d: g.neck.d, stroke: body, strokeWidth: g.neck.width, strokeLinecap: "round", fill: "none" }),
3751
+ g.head.r > 0 && /* @__PURE__ */ jsx37(Circle11, { cx: g.head.cx, cy: g.head.cy, r: g.head.r, fill: body, ...line }),
3752
+ g.details.map((d) => /* @__PURE__ */ jsx37(Path15, { d, fill: p.detail, ...line }, d)),
3753
+ g.visor && /* @__PURE__ */ jsx37(Rect2, { x: g.visor.x, y: g.visor.y, width: g.visor.w, height: g.visor.h, rx: 4, fill: theme.surface0, ...line }),
3751
3754
  g.eyes.at.map(
3752
- (at, i) => mood === "empty" && g.eyes.white > 0 ? /* @__PURE__ */ jsxs31(G, { children: [
3753
- /* @__PURE__ */ jsx35(Circle11, { cx: at[0], cy: at[1], r: g.eyes.white, fill: LIGHT, ...line }),
3754
- /* @__PURE__ */ jsx35(Circle11, { cx: at[0], cy: at[1] + g.eyes.pupil * 0.7, r: g.eyes.pupil, fill: SHADE }),
3755
- /* @__PURE__ */ jsx35(Path15, { d: upperLid(at, g.eyes.white), fill: p.detail, ...line })
3756
- ] }, 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: [
3757
- g.eyes.white > 0 && /* @__PURE__ */ jsx35(Circle11, { cx: at[0], cy: at[1], r: g.eyes.white, fill: LIGHT, ...line }),
3758
- /* @__PURE__ */ jsx35(Circle11, { cx: at[0] + look3, cy: at[1] - look3, r: g.eyes.pupil, fill: g.visor ? p.eye : SHADE })
3755
+ (at, i) => mood === "empty" && g.eyes.white > 0 ? /* @__PURE__ */ jsxs33(G, { children: [
3756
+ /* @__PURE__ */ jsx37(Circle11, { cx: at[0], cy: at[1], r: g.eyes.white, fill: LIGHT, ...line }),
3757
+ /* @__PURE__ */ jsx37(Circle11, { cx: at[0], cy: at[1] + g.eyes.pupil * 0.7, r: g.eyes.pupil, fill: SHADE }),
3758
+ /* @__PURE__ */ jsx37(Path15, { d: upperLid(at, g.eyes.white), fill: p.detail, ...line })
3759
+ ] }, 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: [
3760
+ g.eyes.white > 0 && /* @__PURE__ */ jsx37(Circle11, { cx: at[0], cy: at[1], r: g.eyes.white, fill: LIGHT, ...line }),
3761
+ /* @__PURE__ */ jsx37(Circle11, { cx: at[0] + look3, cy: at[1] - look3, r: g.eyes.pupil, fill: g.visor ? p.eye : SHADE })
3759
3762
  ] }, i)
3760
3763
  ),
3761
- 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)),
3762
- 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)),
3763
- /* @__PURE__ */ jsx35(Path15, { d: g.beak, fill: p.beak, ...line }),
3764
- 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)),
3765
- (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 }),
3766
- mood === "success" && /* @__PURE__ */ jsx35(Path15, { d: MOOD_PARTS.check, stroke: theme.surface0, strokeWidth: 2.6, strokeLinecap: "round", strokeLinejoin: "round", fill: "none" }),
3767
- mood === "error" && /* @__PURE__ */ jsx35(Path15, { d: MOOD_PARTS.bang.line, stroke: theme.surface0, strokeWidth: 2.8, strokeLinecap: "round" }),
3768
- mood === "error" && /* @__PURE__ */ jsx35(Circle11, { cx: MOOD_PARTS.bang.dot[0], cy: MOOD_PARTS.bang.dot[1], r: 1.6, fill: theme.surface0 })
3764
+ 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)),
3765
+ 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)),
3766
+ /* @__PURE__ */ jsx37(Path15, { d: g.beak, fill: p.beak, ...line }),
3767
+ 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)),
3768
+ (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 }),
3769
+ mood === "success" && /* @__PURE__ */ jsx37(Path15, { d: MOOD_PARTS.check, stroke: theme.surface0, strokeWidth: 2.6, strokeLinecap: "round", strokeLinejoin: "round", fill: "none" }),
3770
+ mood === "error" && /* @__PURE__ */ jsx37(Path15, { d: MOOD_PARTS.bang.line, stroke: theme.surface0, strokeWidth: 2.8, strokeLinecap: "round" }),
3771
+ mood === "error" && /* @__PURE__ */ jsx37(Circle11, { cx: MOOD_PARTS.bang.dot[0], cy: MOOD_PARTS.bang.dot[1], r: 1.6, fill: theme.surface0 })
3769
3772
  ] }) }) });
3770
3773
  }
3771
3774
 
3772
3775
  // src/native/mascot-state.tsx
3773
- import { jsx as jsx36, jsxs as jsxs32 } from "react/jsx-runtime";
3776
+ import { jsx as jsx38, jsxs as jsxs34 } from "react/jsx-runtime";
3774
3777
  var SIZE = { sm: 64, md: 96, lg: 128 };
3775
3778
  function useArrival(animated) {
3776
3779
  const [value] = React24.useState(() => new Animated13.Value(animated ? 0 : 1));
@@ -3791,30 +3794,30 @@ function useArrival(animated) {
3791
3794
  function MascotState({ bird = "owl", mood = "empty", title, description, action, size = "md", layout = "stacked", tone: tone3, animated = true, style, ...props }) {
3792
3795
  const opacity = useArrival(animated);
3793
3796
  const inline = layout === "inline";
3794
- return /* @__PURE__ */ jsxs32(
3797
+ return /* @__PURE__ */ jsxs34(
3795
3798
  Animated13.View,
3796
3799
  {
3797
3800
  role: mood === "error" ? "alert" : "status",
3798
3801
  accessibilityLiveRegion: mood === "error" ? "assertive" : "polite",
3799
3802
  "aria-busy": mood === "thinking" ? true : void 0,
3800
3803
  ...props,
3801
- style: [inline ? styles25.inline : styles25.stacked, { opacity, transform: [{ translateY: opacity.interpolate({ inputRange: [0, 1], outputRange: [6, 0] }) }] }, style],
3804
+ style: [inline ? styles27.inline : styles27.stacked, { opacity, transform: [{ translateY: opacity.interpolate({ inputRange: [0, 1], outputRange: [6, 0] }) }] }, style],
3802
3805
  children: [
3803
- /* @__PURE__ */ jsx36(Mascot, { bird, mood, tone: tone3, size: SIZE[size], animated }),
3804
- /* @__PURE__ */ jsxs32(View31, { style: inline ? styles25.wordsInline : styles25.words, children: [
3805
- /* @__PURE__ */ jsx36(Txt, { variant: "label", role: "heading", style: inline ? null : styles25.center, children: title }),
3806
- description ? /* @__PURE__ */ jsx36(Txt, { tone: "secondary", style: inline ? null : styles25.center, children: description }) : null,
3807
- action ? /* @__PURE__ */ jsx36(View31, { style: [styles25.action, inline ? null : styles25.actionCentred], children: action }) : null
3806
+ /* @__PURE__ */ jsx38(Mascot, { bird, mood, tone: tone3, size: SIZE[size], animated }),
3807
+ /* @__PURE__ */ jsxs34(View33, { style: inline ? styles27.wordsInline : styles27.words, children: [
3808
+ /* @__PURE__ */ jsx38(Txt, { variant: "label", role: "heading", style: inline ? null : styles27.center, children: title }),
3809
+ description ? /* @__PURE__ */ jsx38(Txt, { tone: "secondary", style: inline ? null : styles27.center, children: description }) : null,
3810
+ action ? /* @__PURE__ */ jsx38(View33, { style: [styles27.action, inline ? null : styles27.actionCentred], children: action }) : null
3808
3811
  ] })
3809
3812
  ]
3810
3813
  }
3811
3814
  );
3812
3815
  }
3813
- var ErrorState = (props) => /* @__PURE__ */ jsx36(MascotState, { mood: "error", ...props });
3814
- var SuccessState = (props) => /* @__PURE__ */ jsx36(MascotState, { mood: "success", ...props });
3815
- var LoadingState = (props) => /* @__PURE__ */ jsx36(MascotState, { mood: "thinking", ...props });
3816
- var WelcomeState = (props) => /* @__PURE__ */ jsx36(MascotState, { mood: "welcome", ...props });
3817
- var styles25 = StyleSheet25.create({
3816
+ var ErrorState = (props) => /* @__PURE__ */ jsx38(MascotState, { mood: "error", ...props });
3817
+ var SuccessState = (props) => /* @__PURE__ */ jsx38(MascotState, { mood: "success", ...props });
3818
+ var LoadingState = (props) => /* @__PURE__ */ jsx38(MascotState, { mood: "thinking", ...props });
3819
+ var WelcomeState = (props) => /* @__PURE__ */ jsx38(MascotState, { mood: "welcome", ...props });
3820
+ var styles27 = StyleSheet27.create({
3818
3821
  stacked: { alignItems: "center", justifyContent: "center", gap: 12, paddingVertical: 40, paddingHorizontal: 24 },
3819
3822
  inline: { flexDirection: "row", alignItems: "center", gap: 16 },
3820
3823
  words: { alignItems: "center", gap: 6 },
@@ -3826,9 +3829,9 @@ var styles25 = StyleSheet25.create({
3826
3829
 
3827
3830
  // src/native/match-dialog.tsx
3828
3831
  import * as React25 from "react";
3829
- 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";
3832
+ 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";
3830
3833
  import Svg18, { Path as Path16 } from "react-native-svg";
3831
- import { jsx as jsx37, jsxs as jsxs33 } from "react/jsx-runtime";
3834
+ import { jsx as jsx39, jsxs as jsxs35 } from "react/jsx-runtime";
3832
3835
  function MatchDialog({ open, onOpenChange, title, description, people, primaryLabel, onPrimary, secondaryLabel }) {
3833
3836
  const { theme, haptic } = useTheme();
3834
3837
  const reduce = useReducedMotion();
@@ -3848,17 +3851,17 @@ function MatchDialog({ open, onOpenChange, title, description, people, primaryLa
3848
3851
  }
3849
3852
  }, [open, reduce, t]);
3850
3853
  const side = (dir) => ({ transform: [{ translateX: t.interpolate({ inputRange: [0, 1], outputRange: [dir * 110, dir * 50] }) }, { rotate: dir === -1 ? "-8deg" : "8deg" }] });
3851
- 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: [
3852
- /* @__PURE__ */ jsx37(View32, { style: [StyleSheet26.absoluteFill, { backgroundColor: theme.accent2, opacity: 0.55 }] }),
3853
- /* @__PURE__ */ jsx37(Txt, { variant: "display", tone: "onAccent", style: styles26.title, children: title }),
3854
- description ? /* @__PURE__ */ jsx37(Txt, { tone: "onAccent", style: styles26.center, children: description }) : null,
3855
- /* @__PURE__ */ jsxs33(View32, { style: styles26.pair, "aria-hidden": true, children: [
3856
- /* @__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 }) }),
3857
- /* @__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 }) }),
3858
- /* @__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 }) }) })
3854
+ 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: [
3855
+ /* @__PURE__ */ jsx39(View34, { style: [StyleSheet28.absoluteFill, { backgroundColor: theme.accent2, opacity: 0.55 }] }),
3856
+ /* @__PURE__ */ jsx39(Txt, { variant: "display", tone: "onAccent", style: styles28.title, children: title }),
3857
+ description ? /* @__PURE__ */ jsx39(Txt, { tone: "onAccent", style: styles28.center, children: description }) : null,
3858
+ /* @__PURE__ */ jsxs35(View34, { style: styles28.pair, "aria-hidden": true, children: [
3859
+ /* @__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 }) }),
3860
+ /* @__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 }) }),
3861
+ /* @__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 }) }) })
3859
3862
  ] }),
3860
- /* @__PURE__ */ jsxs33(View32, { style: styles26.actions, children: [
3861
- /* @__PURE__ */ jsx37(
3863
+ /* @__PURE__ */ jsxs35(View34, { style: styles28.actions, children: [
3864
+ /* @__PURE__ */ jsx39(
3862
3865
  Button,
3863
3866
  {
3864
3867
  label: primaryLabel,
@@ -3869,11 +3872,11 @@ function MatchDialog({ open, onOpenChange, title, description, people, primaryLa
3869
3872
  }
3870
3873
  }
3871
3874
  ),
3872
- /* @__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 }) })
3875
+ /* @__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 }) })
3873
3876
  ] })
3874
3877
  ] }) });
3875
3878
  }
3876
- var styles26 = StyleSheet26.create({
3879
+ var styles28 = StyleSheet28.create({
3877
3880
  screen: { flex: 1, alignItems: "center", justifyContent: "center", gap: 12, padding: 32 },
3878
3881
  title: { textAlign: "center", fontSize: 40, lineHeight: 46 },
3879
3882
  center: { textAlign: "center", maxWidth: 300 },
@@ -3884,10 +3887,26 @@ var styles26 = StyleSheet26.create({
3884
3887
  secondary: { minHeight: 48, borderRadius: 999, borderWidth: 1.5, alignItems: "center", justifyContent: "center" }
3885
3888
  });
3886
3889
 
3890
+ // src/native/meta-row.tsx
3891
+ import { View as View35 } from "react-native";
3892
+ import { jsx as jsx40, jsxs as jsxs36 } from "react/jsx-runtime";
3893
+ var present = (n) => n !== null && n !== void 0 && n !== false && n !== "";
3894
+ function MetaRow({ items: items2, chips = [], label, style, ...props }) {
3895
+ const facts = items2.filter(present);
3896
+ const tail = chips.filter(present);
3897
+ return /* @__PURE__ */ jsxs36(View35, { role: "list", "aria-label": label, ...props, style: [{ flexDirection: "row", flexWrap: "wrap", alignItems: "center", columnGap: 8, rowGap: 6 }, style], children: [
3898
+ facts.map((fact, i) => /* @__PURE__ */ jsxs36(View35, { role: "listitem", accessible: true, style: { flexDirection: "row", alignItems: "center", columnGap: 8 }, children: [
3899
+ i > 0 ? /* @__PURE__ */ jsx40(Txt, { variant: "caption", tone: "muted", "aria-hidden": true, importantForAccessibility: "no", children: "\xB7" }) : null,
3900
+ typeof fact === "string" || typeof fact === "number" ? /* @__PURE__ */ jsx40(Txt, { variant: "caption", tone: "secondary", children: fact }) : fact
3901
+ ] }, i)),
3902
+ tail.map((chip, i) => /* @__PURE__ */ jsx40(View35, { role: "listitem", accessible: true, children: chip }, `chip-${i}`))
3903
+ ] });
3904
+ }
3905
+
3887
3906
  // src/native/meter.tsx
3888
- import { StyleSheet as StyleSheet27, View as View33 } from "react-native";
3907
+ import { StyleSheet as StyleSheet29, View as View36 } from "react-native";
3889
3908
  import Svg19, { Circle as Circle12 } from "react-native-svg";
3890
- import { jsx as jsx38, jsxs as jsxs34 } from "react/jsx-runtime";
3909
+ import { jsx as jsx41, jsxs as jsxs37 } from "react/jsx-runtime";
3891
3910
  var THICK = { sm: 6, md: 8, lg: 12 };
3892
3911
  var RING = { sm: 56, md: 96, lg: 144 };
3893
3912
  var partColor = (t, i) => [t.accent, t.warning, t.success, t.textSecondary, t.danger][i % 5];
@@ -3900,10 +3919,10 @@ function Meter({ label, value = 0, min = 0, max = 100, valueText, thresholds, op
3900
3919
  const words2 = valueText ?? `${Math.round(ratio * 100)} %`;
3901
3920
  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)} %` }));
3902
3921
  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 };
3903
- const legend = parts ? /* @__PURE__ */ jsx38(View33, { style: styles27.legend, "aria-hidden": true, children: shares.map((p, i) => /* @__PURE__ */ jsxs34(View33, { style: styles27.legendItem, children: [
3904
- /* @__PURE__ */ jsx38(View33, { style: [styles27.swatch, { backgroundColor: p.color }] }),
3905
- /* @__PURE__ */ jsx38(Txt, { variant: "caption", children: p.label }),
3906
- /* @__PURE__ */ jsx38(Txt, { variant: "caption", tone: "secondary", children: p.words })
3922
+ const legend = parts ? /* @__PURE__ */ jsx41(View36, { style: styles29.legend, "aria-hidden": true, children: shares.map((p, i) => /* @__PURE__ */ jsxs37(View36, { style: styles29.legendItem, children: [
3923
+ /* @__PURE__ */ jsx41(View36, { style: [styles29.swatch, { backgroundColor: p.color }] }),
3924
+ /* @__PURE__ */ jsx41(Txt, { variant: "caption", children: p.label }),
3925
+ /* @__PURE__ */ jsx41(Txt, { variant: "caption", tone: "secondary", children: p.words })
3907
3926
  ] }, i)) }) : null;
3908
3927
  if (variant === "ring") {
3909
3928
  const side = RING[size];
@@ -3915,27 +3934,27 @@ function Meter({ label, value = 0, min = 0, max = 100, valueText, thresholds, op
3915
3934
  offset += p.ratio;
3916
3935
  return arc;
3917
3936
  }) : [{ color: tone3, len: ratio, start: 0 }];
3918
- return /* @__PURE__ */ jsxs34(View33, { accessible: true, ...a11y, style: [styles27.ringRoot, style], children: [
3919
- /* @__PURE__ */ jsxs34(View33, { style: { width: side, height: side }, children: [
3920
- /* @__PURE__ */ jsxs34(Svg19, { width: side, height: side, viewBox: "0 0 100 100", style: { transform: [{ rotate: "-90deg" }] }, children: [
3921
- /* @__PURE__ */ jsx38(Circle12, { cx: 50, cy: 50, r, fill: "none", stroke: theme.borderDefault, strokeWidth: 9 }),
3922
- 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))
3937
+ return /* @__PURE__ */ jsxs37(View36, { accessible: true, ...a11y, style: [styles29.ringRoot, style], children: [
3938
+ /* @__PURE__ */ jsxs37(View36, { style: { width: side, height: side }, children: [
3939
+ /* @__PURE__ */ jsxs37(Svg19, { width: side, height: side, viewBox: "0 0 100 100", style: { transform: [{ rotate: "-90deg" }] }, children: [
3940
+ /* @__PURE__ */ jsx41(Circle12, { cx: 50, cy: 50, r, fill: "none", stroke: theme.borderDefault, strokeWidth: 9 }),
3941
+ arcs.map((a, i) => /* @__PURE__ */ jsx41(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))
3923
3942
  ] }),
3924
- children !== void 0 ? /* @__PURE__ */ jsx38(View33, { style: [StyleSheet27.absoluteFill, styles27.center], children }) : null
3943
+ children !== void 0 ? /* @__PURE__ */ jsx41(View36, { style: [StyleSheet29.absoluteFill, styles29.center], children }) : null
3925
3944
  ] }),
3926
3945
  legend
3927
3946
  ] });
3928
3947
  }
3929
- return /* @__PURE__ */ jsxs34(View33, { accessible: true, ...a11y, style: [styles27.root, style], children: [
3930
- showLabel ? /* @__PURE__ */ jsxs34(View33, { style: styles27.header, "aria-hidden": true, children: [
3931
- /* @__PURE__ */ jsx38(Txt, { variant: "caption", numberOfLines: 1, style: styles27.caption, children: label }),
3932
- !parts ? /* @__PURE__ */ jsx38(Txt, { variant: "caption", tone: "secondary", children: words2 }) : null
3948
+ return /* @__PURE__ */ jsxs37(View36, { accessible: true, ...a11y, style: [styles29.root, style], children: [
3949
+ showLabel ? /* @__PURE__ */ jsxs37(View36, { style: styles29.header, "aria-hidden": true, children: [
3950
+ /* @__PURE__ */ jsx41(Txt, { variant: "caption", numberOfLines: 1, style: styles29.caption, children: label }),
3951
+ !parts ? /* @__PURE__ */ jsx41(Txt, { variant: "caption", tone: "secondary", children: words2 }) : null
3933
3952
  ] }) : null,
3934
- /* @__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 }] }) }),
3953
+ /* @__PURE__ */ jsx41(View36, { style: [styles29.track, { height: THICK[size], backgroundColor: theme.surface3 }], children: parts ? shares.map((p, i) => /* @__PURE__ */ jsx41(View36, { style: { width: `${p.ratio * 100}%`, backgroundColor: p.color } }, i)) : /* @__PURE__ */ jsx41(View36, { style: [styles29.fill, { width: `${ratio * 100}%`, backgroundColor: tone3 }] }) }),
3935
3954
  legend
3936
3955
  ] });
3937
3956
  }
3938
- var styles27 = StyleSheet27.create({
3957
+ var styles29 = StyleSheet29.create({
3939
3958
  root: { width: "100%", gap: 6 },
3940
3959
  header: { flexDirection: "row", alignItems: "baseline", gap: 8 },
3941
3960
  caption: { flex: 1, fontWeight: "600" },
@@ -3951,7 +3970,7 @@ var styles27 = StyleSheet27.create({
3951
3970
  // src/native/number-ticker.tsx
3952
3971
  import * as React26 from "react";
3953
3972
  import { AccessibilityInfo as AccessibilityInfo11, Animated as Animated15, Easing as Easing9, Text as Text13 } from "react-native";
3954
- import { jsx as jsx39 } from "react/jsx-runtime";
3973
+ import { jsx as jsx42 } from "react/jsx-runtime";
3955
3974
  function NumberTicker({ value, locale, format, trigger = "mount", duration = 1100, announce, variant = "display", tone: tone3 = "text", style }) {
3956
3975
  const reduce = useReducedMotion();
3957
3976
  const writer = React26.useMemo(() => new Intl.NumberFormat(locale, format), [locale, format]);
@@ -3979,13 +3998,13 @@ function NumberTicker({ value, locale, format, trigger = "mount", duration = 110
3979
3998
  };
3980
3999
  }, [value, reduce, trigger, duration, announce, anim, writer]);
3981
4000
  const digits = Number.isInteger(value) ? Math.round(shown) : shown;
3982
- 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) }) });
4001
+ return /* @__PURE__ */ jsx42(Txt, { variant, tone: tone3, "aria-label": writer.format(value), style: [{ fontVariant: ["tabular-nums"] }, style], children: /* @__PURE__ */ jsx42(Text13, { "aria-hidden": true, children: writer.format(digits) }) });
3983
4002
  }
3984
4003
 
3985
4004
  // src/native/onboarding.tsx
3986
4005
  import * as React27 from "react";
3987
- import { ScrollView as ScrollView5, StyleSheet as StyleSheet28, View as View34 } from "react-native";
3988
- import { jsx as jsx40, jsxs as jsxs35 } from "react/jsx-runtime";
4006
+ import { ScrollView as ScrollView5, StyleSheet as StyleSheet30, View as View37 } from "react-native";
4007
+ import { jsx as jsx43, jsxs as jsxs38 } from "react/jsx-runtime";
3989
4008
  function Onboarding({ slides, labels, onDone, style }) {
3990
4009
  const { theme, insets, haptic } = useTheme();
3991
4010
  const [width, setWidth] = React27.useState(0);
@@ -4000,18 +4019,18 @@ function Onboarding({ slides, labels, onDone, style }) {
4000
4019
  const onScroll = (e) => {
4001
4020
  if (width > 0) setPage(Math.round(e.nativeEvent.contentOffset.x / width));
4002
4021
  };
4003
- 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: [
4004
- /* @__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 }) }),
4005
- /* @__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: [
4006
- slide.visual ? /* @__PURE__ */ jsx40(View34, { style: styles28.visual, children: slide.visual }) : null,
4007
- /* @__PURE__ */ jsx40(Txt, { variant: "display", style: styles28.centred, children: slide.title }),
4008
- /* @__PURE__ */ jsx40(Txt, { tone: "secondary", style: [styles28.centred, styles28.description], children: slide.description })
4022
+ return /* @__PURE__ */ jsxs38(View37, { style: [styles30.root, { backgroundColor: theme.surface0, paddingTop: insets.top + 8, paddingBottom: insets.bottom + 16 }, style], onLayout: (e) => setWidth(e.nativeEvent.layout.width), children: [
4023
+ /* @__PURE__ */ jsx43(View37, { style: styles30.top, children: !last ? /* @__PURE__ */ jsx43(Button, { label: labels.skip, variant: "ghost", size: "sm", onPress: onDone }) : /* @__PURE__ */ jsx43(View37, { style: styles30.spacer }) }),
4024
+ /* @__PURE__ */ jsx43(ScrollView5, { ref: scroller, tabIndex: 0, horizontal: true, pagingEnabled: true, showsHorizontalScrollIndicator: false, onMomentumScrollEnd: onScroll, style: styles30.flex, children: slides.map((slide, i) => /* @__PURE__ */ jsxs38(View37, { 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: [
4025
+ slide.visual ? /* @__PURE__ */ jsx43(View37, { style: styles30.visual, children: slide.visual }) : null,
4026
+ /* @__PURE__ */ jsx43(Txt, { variant: "display", style: styles30.centred, children: slide.title }),
4027
+ /* @__PURE__ */ jsx43(Txt, { tone: "secondary", style: [styles30.centred, styles30.description], children: slide.description })
4009
4028
  ] }, i)) }),
4010
- /* @__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)) }),
4011
- /* @__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) }) })
4029
+ /* @__PURE__ */ jsx43(View37, { style: styles30.dots, "aria-hidden": true, children: slides.map((_, i) => /* @__PURE__ */ jsx43(View37, { style: [styles30.dot, { width: i === page ? 22 : 8, backgroundColor: i === page ? theme.accent : theme.borderStrong }] }, i)) }),
4030
+ /* @__PURE__ */ jsx43(View37, { style: styles30.bottom, children: /* @__PURE__ */ jsx43(Button, { label: last ? labels.done : labels.next, variant: last ? "gradient" : "primary", size: "lg", onPress: () => last ? onDone() : go(page + 1) }) })
4012
4031
  ] });
4013
4032
  }
4014
- var styles28 = StyleSheet28.create({
4033
+ var styles30 = StyleSheet30.create({
4015
4034
  root: { flex: 1 },
4016
4035
  top: { flexDirection: "row", justifyContent: "flex-end", paddingHorizontal: 16, minHeight: 32 },
4017
4036
  spacer: { height: 32 },
@@ -4027,8 +4046,8 @@ var styles28 = StyleSheet28.create({
4027
4046
 
4028
4047
  // src/native/otp-input.tsx
4029
4048
  import * as React28 from "react";
4030
- import { Platform as Platform2, Pressable as Pressable15, StyleSheet as StyleSheet29, TextInput as TextInput5, View as View35 } from "react-native";
4031
- import { jsx as jsx41, jsxs as jsxs36 } from "react/jsx-runtime";
4049
+ import { Platform as Platform2, Pressable as Pressable15, StyleSheet as StyleSheet31, TextInput as TextInput5, View as View38 } from "react-native";
4050
+ import { jsx as jsx44, jsxs as jsxs39 } from "react/jsx-runtime";
4032
4051
  function OtpInput({ label, length = 6, value, onValueChange, onComplete, mode = "numeric", invalid, disabled, autoFocus, style }) {
4033
4052
  const { theme, radius: radius3, haptic } = useTheme();
4034
4053
  const [own, setOwn] = React28.useState("");
@@ -4047,14 +4066,14 @@ function OtpInput({ label, length = 6, value, onValueChange, onComplete, mode =
4047
4066
  onComplete?.(next);
4048
4067
  }
4049
4068
  };
4050
- return /* @__PURE__ */ jsxs36(Pressable15, { onPress: () => input.current?.focus(), disabled, accessible: false, style: [styles29.root, style], children: [
4051
- /* @__PURE__ */ jsx41(View35, { style: styles29.boxes, "aria-hidden": true, children: Array.from({ length }, (_, i) => {
4069
+ return /* @__PURE__ */ jsxs39(Pressable15, { onPress: () => input.current?.focus(), disabled, accessible: false, style: [styles31.root, style], children: [
4070
+ /* @__PURE__ */ jsx44(View38, { style: styles31.boxes, "aria-hidden": true, children: Array.from({ length }, (_, i) => {
4052
4071
  const active = focused && i === Math.min(code.length, length - 1);
4053
- return /* @__PURE__ */ jsx41(
4054
- View35,
4072
+ return /* @__PURE__ */ jsx44(
4073
+ View38,
4055
4074
  {
4056
4075
  style: [
4057
- styles29.box,
4076
+ styles31.box,
4058
4077
  {
4059
4078
  borderRadius: radius3.md,
4060
4079
  backgroundColor: theme.surface2,
@@ -4062,12 +4081,12 @@ function OtpInput({ label, length = 6, value, onValueChange, onComplete, mode =
4062
4081
  borderWidth: invalid || active ? 2 : 1
4063
4082
  }
4064
4083
  ],
4065
- children: /* @__PURE__ */ jsx41(Txt, { variant: "title", children: code[i] ?? "" })
4084
+ children: /* @__PURE__ */ jsx44(Txt, { variant: "title", children: code[i] ?? "" })
4066
4085
  },
4067
4086
  i
4068
4087
  );
4069
4088
  }) }),
4070
- /* @__PURE__ */ jsx41(
4089
+ /* @__PURE__ */ jsx44(
4071
4090
  TextInput5,
4072
4091
  {
4073
4092
  ref: input,
@@ -4086,12 +4105,12 @@ function OtpInput({ label, length = 6, value, onValueChange, onComplete, mode =
4086
4105
  caretHidden: true,
4087
4106
  onFocus: () => setFocused(true),
4088
4107
  onBlur: () => setFocused(false),
4089
- style: styles29.hidden
4108
+ style: styles31.hidden
4090
4109
  }
4091
4110
  )
4092
4111
  ] });
4093
4112
  }
4094
- var styles29 = StyleSheet29.create({
4113
+ var styles31 = StyleSheet31.create({
4095
4114
  root: { alignSelf: "flex-start" },
4096
4115
  boxes: { flexDirection: "row", gap: 8 },
4097
4116
  box: { width: 46, height: 56, alignItems: "center", justifyContent: "center" },
@@ -4099,11 +4118,11 @@ var styles29 = StyleSheet29.create({
4099
4118
  });
4100
4119
 
4101
4120
  // src/native/pagination.tsx
4102
- import { Pressable as Pressable16, StyleSheet as StyleSheet30, Text as Text14, View as View36 } from "react-native";
4121
+ import { Pressable as Pressable16, StyleSheet as StyleSheet32, Text as Text14, View as View39 } from "react-native";
4103
4122
  import Svg20, { Path as Path17 } from "react-native-svg";
4104
- import { jsx as jsx42, jsxs as jsxs37 } from "react/jsx-runtime";
4123
+ import { jsx as jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
4105
4124
  function Chevron3({ direction, color }) {
4106
- 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" }) });
4125
+ return /* @__PURE__ */ jsx45(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__ */ jsx45(Path17, { d: direction === "left" ? "m15 6-6 6 6 6" : "m9 6 6 6-6 6" }) });
4107
4126
  }
4108
4127
  function Pagination({ page = 1, pageCount, onPageChange, hasPrevious, hasNext, onPrevious, onNext, status, disabled, labels, style }) {
4109
4128
  const { theme, radius: radius3 } = useTheme();
@@ -4112,7 +4131,7 @@ function Pagination({ page = 1, pageCount, onPageChange, hasPrevious, hasNext, o
4112
4131
  const current = Math.min(Math.max(1, page), count);
4113
4132
  const canPrevious = !disabled && (paged ? current > 1 : Boolean(hasPrevious));
4114
4133
  const canNext = !disabled && (paged ? current < count : Boolean(hasNext));
4115
- const button = (direction, enabled, onPress, label) => /* @__PURE__ */ jsx42(
4134
+ const button = (direction, enabled, onPress, label) => /* @__PURE__ */ jsx45(
4116
4135
  Pressable16,
4117
4136
  {
4118
4137
  role: "button",
@@ -4122,28 +4141,28 @@ function Pagination({ page = 1, pageCount, onPageChange, hasPrevious, hasNext, o
4122
4141
  hitSlop: 6,
4123
4142
  onPress,
4124
4143
  style: ({ pressed }) => [
4125
- styles30.button,
4144
+ styles32.button,
4126
4145
  { borderRadius: radius3.sm, borderColor: theme.borderDefault, backgroundColor: theme.surface1, opacity: enabled ? pressed ? 0.8 : 1 : 0.4 }
4127
4146
  ],
4128
- children: /* @__PURE__ */ jsx42(Chevron3, { direction, color: theme.textPrimary })
4147
+ children: /* @__PURE__ */ jsx45(Chevron3, { direction, color: theme.textPrimary })
4129
4148
  }
4130
4149
  );
4131
4150
  const text = status ?? (paged ? labels.compact(current, count) : null);
4132
- return /* @__PURE__ */ jsxs37(View36, { role: "navigation", style: [styles30.row, style], children: [
4151
+ return /* @__PURE__ */ jsxs40(View39, { role: "navigation", style: [styles32.row, style], children: [
4133
4152
  button("left", canPrevious, paged ? () => onPageChange?.(current - 1) : onPrevious, labels.previous),
4134
- text ? /* @__PURE__ */ jsx42(Text14, { "aria-live": "polite", style: [styles30.status, { color: theme.textSecondary }], children: text }) : null,
4153
+ text ? /* @__PURE__ */ jsx45(Text14, { "aria-live": "polite", style: [styles32.status, { color: theme.textSecondary }], children: text }) : null,
4135
4154
  button("right", canNext, paged ? () => onPageChange?.(current + 1) : onNext, labels.next)
4136
4155
  ] });
4137
4156
  }
4138
- var styles30 = StyleSheet30.create({
4157
+ var styles32 = StyleSheet32.create({
4139
4158
  row: { flexDirection: "row", alignItems: "center", justifyContent: "space-between", gap: 12 },
4140
- button: { width: 44, height: 44, alignItems: "center", justifyContent: "center", borderWidth: StyleSheet30.hairlineWidth },
4159
+ button: { width: 44, height: 44, alignItems: "center", justifyContent: "center", borderWidth: StyleSheet32.hairlineWidth },
4141
4160
  status: { fontSize: 13, fontWeight: "600", fontVariant: ["tabular-nums"] }
4142
4161
  });
4143
4162
 
4144
4163
  // src/native/permission-prompt.tsx
4145
- import { StyleSheet as StyleSheet31, View as View37 } from "react-native";
4146
- import { Fragment as Fragment6, jsx as jsx43, jsxs as jsxs38 } from "react/jsx-runtime";
4164
+ import { StyleSheet as StyleSheet33, View as View40 } from "react-native";
4165
+ import { Fragment as Fragment6, jsx as jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
4147
4166
  function PermissionPrompt({
4148
4167
  status,
4149
4168
  title,
@@ -4160,28 +4179,28 @@ function PermissionPrompt({
4160
4179
  style
4161
4180
  }) {
4162
4181
  const { theme, radius: radius3 } = useTheme();
4163
- if (status === "granted") return /* @__PURE__ */ jsx43(Fragment6, { children: children ?? null });
4182
+ if (status === "granted") return /* @__PURE__ */ jsx46(Fragment6, { children: children ?? null });
4164
4183
  const blocked = status === "blocked" || status === "denied" && Boolean(onOpenSettings);
4165
- return /* @__PURE__ */ jsxs38(View37, { style: [styles31.root, { backgroundColor: theme.surface1, borderColor: theme.borderSubtle, borderRadius: radius3.xl }, style], children: [
4166
- /* @__PURE__ */ jsx43(Mascot, { bird: mascot, mood: blocked ? "error" : "welcome", size: 104 }),
4167
- /* @__PURE__ */ jsx43(Txt, { variant: "title", style: styles31.centred, children: title }),
4168
- /* @__PURE__ */ jsx43(Txt, { tone: "secondary", style: styles31.centred, children: blocked && blockedDescription ? blockedDescription : description }),
4169
- /* @__PURE__ */ jsxs38(View37, { style: styles31.actions, children: [
4170
- blocked && settingsLabel && onOpenSettings ? /* @__PURE__ */ jsx43(Button, { label: settingsLabel, variant: "primary", onPress: onOpenSettings }) : /* @__PURE__ */ jsx43(Button, { label: allowLabel, variant: "primary", onPress: onAllow }),
4171
- dismissLabel && onDismiss ? /* @__PURE__ */ jsx43(Button, { label: dismissLabel, variant: "ghost", onPress: onDismiss }) : null
4184
+ return /* @__PURE__ */ jsxs41(View40, { style: [styles33.root, { backgroundColor: theme.surface1, borderColor: theme.borderSubtle, borderRadius: radius3.xl }, style], children: [
4185
+ /* @__PURE__ */ jsx46(Mascot, { bird: mascot, mood: blocked ? "error" : "welcome", size: 104 }),
4186
+ /* @__PURE__ */ jsx46(Txt, { variant: "title", style: styles33.centred, children: title }),
4187
+ /* @__PURE__ */ jsx46(Txt, { tone: "secondary", style: styles33.centred, children: blocked && blockedDescription ? blockedDescription : description }),
4188
+ /* @__PURE__ */ jsxs41(View40, { style: styles33.actions, children: [
4189
+ blocked && settingsLabel && onOpenSettings ? /* @__PURE__ */ jsx46(Button, { label: settingsLabel, variant: "primary", onPress: onOpenSettings }) : /* @__PURE__ */ jsx46(Button, { label: allowLabel, variant: "primary", onPress: onAllow }),
4190
+ dismissLabel && onDismiss ? /* @__PURE__ */ jsx46(Button, { label: dismissLabel, variant: "ghost", onPress: onDismiss }) : null
4172
4191
  ] })
4173
4192
  ] });
4174
4193
  }
4175
- var styles31 = StyleSheet31.create({
4176
- root: { alignItems: "center", gap: 10, padding: 24, borderWidth: StyleSheet31.hairlineWidth },
4194
+ var styles33 = StyleSheet33.create({
4195
+ root: { alignItems: "center", gap: 10, padding: 24, borderWidth: StyleSheet33.hairlineWidth },
4177
4196
  centred: { textAlign: "center", maxWidth: 340 },
4178
4197
  actions: { marginTop: 8, gap: 8, alignSelf: "stretch" }
4179
4198
  });
4180
4199
 
4181
4200
  // src/native/phoenix.tsx
4182
4201
  import { useEffect as useEffect19, useState as useState28 } from "react";
4183
- import { AccessibilityInfo as AccessibilityInfo12, Animated as Animated16, Easing as Easing10, View as View38 } from "react-native";
4184
- import Svg21, { Circle as Circle13, Defs as Defs12, LinearGradient as LinearGradient12, Path as Path18, RadialGradient as RadialGradient9, Stop as Stop12 } from "react-native-svg";
4202
+ import { AccessibilityInfo as AccessibilityInfo12, Animated as Animated16, Easing as Easing10, View as View41 } from "react-native";
4203
+ import Svg21, { Circle as Circle13, Defs as Defs12, LinearGradient as LinearGradient9, Path as Path18, RadialGradient as RadialGradient9, Stop as Stop12 } from "react-native-svg";
4185
4204
 
4186
4205
  // src/mascots/phoenix-geometry.ts
4187
4206
  var PHOENIX = {
@@ -4204,7 +4223,7 @@ var PHOENIX_PALETTES = {
4204
4223
  };
4205
4224
 
4206
4225
  // src/native/phoenix.tsx
4207
- import { jsx as jsx44, jsxs as jsxs39 } from "react/jsx-runtime";
4226
+ import { jsx as jsx47, jsxs as jsxs42 } from "react/jsx-runtime";
4208
4227
  function useFloat(animated) {
4209
4228
  const [y] = useState28(() => new Animated16.Value(0));
4210
4229
  useEffect19(() => {
@@ -4229,37 +4248,37 @@ function Phoenix({ tone: tone3 = "own", size = 120, animated = true, title, styl
4229
4248
  const id = useSvgId("kzp");
4230
4249
  const y = useFloat(animated);
4231
4250
  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;
4232
- 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: [
4233
- /* @__PURE__ */ jsxs39(Defs12, { children: [
4234
- /* @__PURE__ */ jsxs39(LinearGradient12, { id: `${id}l`, x1: "1", y1: "0", x2: "0", y2: "1", children: [
4235
- /* @__PURE__ */ jsx44(Stop12, { offset: "0%", stopColor: p.left[0] }),
4236
- /* @__PURE__ */ jsx44(Stop12, { offset: "100%", stopColor: p.left[1] })
4251
+ return /* @__PURE__ */ jsx47(View41, { style: [{ width: size, height: size }, style], ...markA11y(title), children: /* @__PURE__ */ jsx47(Animated16.View, { style: { transform: [{ translateY: y }] }, children: /* @__PURE__ */ jsxs42(Svg21, { width: size, height: size, viewBox: "0 0 120 120", children: [
4252
+ /* @__PURE__ */ jsxs42(Defs12, { children: [
4253
+ /* @__PURE__ */ jsxs42(LinearGradient9, { id: `${id}l`, x1: "1", y1: "0", x2: "0", y2: "1", children: [
4254
+ /* @__PURE__ */ jsx47(Stop12, { offset: "0%", stopColor: p.left[0] }),
4255
+ /* @__PURE__ */ jsx47(Stop12, { offset: "100%", stopColor: p.left[1] })
4237
4256
  ] }),
4238
- /* @__PURE__ */ jsxs39(LinearGradient12, { id: `${id}r`, x1: "0", y1: "0", x2: "1", y2: "1", children: [
4239
- /* @__PURE__ */ jsx44(Stop12, { offset: "0%", stopColor: p.right[0] }),
4240
- /* @__PURE__ */ jsx44(Stop12, { offset: "100%", stopColor: p.right[1] })
4257
+ /* @__PURE__ */ jsxs42(LinearGradient9, { id: `${id}r`, x1: "0", y1: "0", x2: "1", y2: "1", children: [
4258
+ /* @__PURE__ */ jsx47(Stop12, { offset: "0%", stopColor: p.right[0] }),
4259
+ /* @__PURE__ */ jsx47(Stop12, { offset: "100%", stopColor: p.right[1] })
4241
4260
  ] }),
4242
- /* @__PURE__ */ jsxs39(RadialGradient9, { id: `${id}c`, children: [
4243
- /* @__PURE__ */ jsx44(Stop12, { offset: "0%", stopColor: p.core[0] }),
4244
- /* @__PURE__ */ jsx44(Stop12, { offset: "100%", stopColor: p.core[1], stopOpacity: 0 })
4261
+ /* @__PURE__ */ jsxs42(RadialGradient9, { id: `${id}c`, children: [
4262
+ /* @__PURE__ */ jsx47(Stop12, { offset: "0%", stopColor: p.core[0] }),
4263
+ /* @__PURE__ */ jsx47(Stop12, { offset: "100%", stopColor: p.core[1], stopOpacity: 0 })
4245
4264
  ] })
4246
4265
  ] }),
4247
- /* @__PURE__ */ jsx44(Path18, { d: PHOENIX.wingL, fill: `url(#${id}l)` }),
4248
- /* @__PURE__ */ jsx44(Path18, { d: PHOENIX.wingR, fill: `url(#${id}r)` }),
4249
- /* @__PURE__ */ jsx44(Path18, { d: PHOENIX.tailL, fill: `url(#${id}l)`, opacity: 0.7 }),
4250
- /* @__PURE__ */ jsx44(Path18, { d: PHOENIX.tailR, fill: `url(#${id}r)`, opacity: 0.7 }),
4251
- /* @__PURE__ */ jsx44(Path18, { d: PHOENIX.body, fill: p.body, stroke: p.edge, strokeOpacity: 0.5 }),
4252
- /* @__PURE__ */ jsx44(Circle13, { cx: 60, cy: 58, r: 12, fill: `url(#${id}c)` }),
4253
- /* @__PURE__ */ jsx44(Circle13, { cx: 60, cy: 58, r: 3.5, fill: "#ffffff" }),
4254
- /* @__PURE__ */ jsx44(Path18, { d: PHOENIX.crest, stroke: p.crest, strokeWidth: 2, strokeLinecap: "round" })
4266
+ /* @__PURE__ */ jsx47(Path18, { d: PHOENIX.wingL, fill: `url(#${id}l)` }),
4267
+ /* @__PURE__ */ jsx47(Path18, { d: PHOENIX.wingR, fill: `url(#${id}r)` }),
4268
+ /* @__PURE__ */ jsx47(Path18, { d: PHOENIX.tailL, fill: `url(#${id}l)`, opacity: 0.7 }),
4269
+ /* @__PURE__ */ jsx47(Path18, { d: PHOENIX.tailR, fill: `url(#${id}r)`, opacity: 0.7 }),
4270
+ /* @__PURE__ */ jsx47(Path18, { d: PHOENIX.body, fill: p.body, stroke: p.edge, strokeOpacity: 0.5 }),
4271
+ /* @__PURE__ */ jsx47(Circle13, { cx: 60, cy: 58, r: 12, fill: `url(#${id}c)` }),
4272
+ /* @__PURE__ */ jsx47(Circle13, { cx: 60, cy: 58, r: 3.5, fill: "#ffffff" }),
4273
+ /* @__PURE__ */ jsx47(Path18, { d: PHOENIX.crest, stroke: p.crest, strokeWidth: 2, strokeLinecap: "round" })
4255
4274
  ] }) }) });
4256
4275
  }
4257
4276
 
4258
4277
  // src/native/photo-grid.tsx
4259
4278
  import * as React30 from "react";
4260
- import { Image as Image4, Pressable as Pressable17, StyleSheet as StyleSheet32, View as View39 } from "react-native";
4279
+ import { Image as Image4, Pressable as Pressable17, StyleSheet as StyleSheet34, View as View42 } from "react-native";
4261
4280
  import Svg22, { Path as Path19 } from "react-native-svg";
4262
- import { jsx as jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
4281
+ import { jsx as jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
4263
4282
  function PhotoGrid({ value, onValueChange, onAdd, slots = 6, required = 1, columns = 3, labels, style }) {
4264
4283
  const { theme, radius: radius3, haptic } = useTheme();
4265
4284
  const [menu, setMenu] = React30.useState(null);
@@ -4276,11 +4295,11 @@ function PhotoGrid({ value, onValueChange, onAdd, slots = 6, required = 1, colum
4276
4295
  onValueChange(value.filter((_, j) => j !== i));
4277
4296
  };
4278
4297
  const width = `${100 / columns}%`;
4279
- return /* @__PURE__ */ jsxs40(View39, { style: [styles32.grid, style], children: [
4298
+ return /* @__PURE__ */ jsxs43(View42, { style: [styles34.grid, style], children: [
4280
4299
  Array.from({ length: slots }, (_, i) => {
4281
4300
  const photo = value[i];
4282
- const cell = [styles32.slot, { borderRadius: radius3.lg, aspectRatio: 3 / 4 }];
4283
- return /* @__PURE__ */ jsx45(View39, { style: [styles32.cell, { width }], children: photo ? /* @__PURE__ */ jsxs40(
4301
+ const cell = [styles34.slot, { borderRadius: radius3.lg, aspectRatio: 3 / 4 }];
4302
+ return /* @__PURE__ */ jsx48(View42, { style: [styles34.cell, { width }], children: photo ? /* @__PURE__ */ jsxs43(
4284
4303
  Pressable17,
4285
4304
  {
4286
4305
  role: "button",
@@ -4304,11 +4323,11 @@ function PhotoGrid({ value, onValueChange, onAdd, slots = 6, required = 1, colum
4304
4323
  },
4305
4324
  style: [...cell, { backgroundColor: theme.surface3, overflow: "hidden" }],
4306
4325
  children: [
4307
- /* @__PURE__ */ jsx45(Image4, { source: { uri: photo.uri }, style: StyleSheet32.absoluteFill, resizeMode: "cover" }),
4308
- 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
4326
+ /* @__PURE__ */ jsx48(Image4, { source: { uri: photo.uri }, style: StyleSheet34.absoluteFill, resizeMode: "cover" }),
4327
+ i === 0 ? /* @__PURE__ */ jsx48(View42, { style: [styles34.main, { backgroundColor: theme.accent, borderRadius: radius3.full }], children: /* @__PURE__ */ jsx48(Txt, { variant: "caption", tone: "onAccent", style: styles34.mainText, children: labels.main }) }) : null
4309
4328
  ]
4310
4329
  }
4311
- ) : /* @__PURE__ */ jsx45(
4330
+ ) : /* @__PURE__ */ jsx48(
4312
4331
  Pressable17,
4313
4332
  {
4314
4333
  role: "button",
@@ -4317,14 +4336,14 @@ function PhotoGrid({ value, onValueChange, onAdd, slots = 6, required = 1, colum
4317
4336
  onPress: onAdd,
4318
4337
  style: ({ pressed }) => [
4319
4338
  ...cell,
4320
- styles32.empty,
4339
+ styles34.empty,
4321
4340
  { borderColor: i < required ? theme.accent : theme.borderStrong, backgroundColor: pressed ? theme.surface2 : theme.surface1, opacity: i > value.length ? 0.5 : 1 }
4322
4341
  ],
4323
- 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" }) }) })
4342
+ children: /* @__PURE__ */ jsx48(View42, { style: [styles34.plus, { backgroundColor: i === value.length ? theme.accent : theme.surface3, borderRadius: radius3.full }], children: /* @__PURE__ */ jsx48(Svg22, { width: 16, height: 16, viewBox: "0 0 24 24", "aria-hidden": true, children: /* @__PURE__ */ jsx48(Path19, { d: "M12 5v14M5 12h14", stroke: i === value.length ? theme.onAccent : theme.textSecondary, strokeWidth: 2.6, strokeLinecap: "round" }) }) })
4324
4343
  }
4325
4344
  ) }, photo?.id ?? `empty-${i}`);
4326
4345
  }),
4327
- /* @__PURE__ */ jsx45(
4346
+ /* @__PURE__ */ jsx48(
4328
4347
  ActionSheet,
4329
4348
  {
4330
4349
  open: menu !== null,
@@ -4340,7 +4359,7 @@ function PhotoGrid({ value, onValueChange, onAdd, slots = 6, required = 1, colum
4340
4359
  )
4341
4360
  ] });
4342
4361
  }
4343
- var styles32 = StyleSheet32.create({
4362
+ var styles34 = StyleSheet34.create({
4344
4363
  grid: { flexDirection: "row", flexWrap: "wrap", marginHorizontal: -4 },
4345
4364
  cell: { padding: 4 },
4346
4365
  slot: { width: "100%" },
@@ -4352,16 +4371,16 @@ var styles32 = StyleSheet32.create({
4352
4371
 
4353
4372
  // src/native/profile-card.tsx
4354
4373
  import * as React31 from "react";
4355
- import { Animated as Animated17, StyleSheet as StyleSheet33, View as View40 } from "react-native";
4356
- import { jsx as jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
4374
+ import { Animated as Animated17, StyleSheet as StyleSheet35, View as View43 } from "react-native";
4375
+ import { jsx as jsx49, jsxs as jsxs44 } from "react/jsx-runtime";
4357
4376
  var ratioOf = (value, max = 100) => Math.min(1, Math.max(0, value / (max || 1)));
4358
4377
  function Bar({ label, ratio, words: words2, animated, delay }) {
4359
4378
  const { theme } = useTheme();
4360
4379
  const t = useEntrance(animated, delay, 900);
4361
4380
  const [width, setWidth] = React31.useState(0);
4362
4381
  const translateX = t.interpolate({ inputRange: [0, 1], outputRange: [-width * ratio, 0] });
4363
- return /* @__PURE__ */ jsx46(
4364
- View40,
4382
+ return /* @__PURE__ */ jsx49(
4383
+ View43,
4365
4384
  {
4366
4385
  accessible: true,
4367
4386
  role: "meter",
@@ -4371,42 +4390,42 @@ function Bar({ label, ratio, words: words2, animated, delay }) {
4371
4390
  "aria-valuenow": Math.round(ratio * 100),
4372
4391
  "aria-valuetext": words2,
4373
4392
  onLayout: (e) => setWidth(e.nativeEvent.layout.width),
4374
- style: [styles33.track, { backgroundColor: theme.surface3 }],
4375
- children: /* @__PURE__ */ jsx46(Animated17.View, { style: [styles33.fill, { width: `${ratio * 100}%`, backgroundColor: theme.accent, transform: [{ translateX }] }] })
4393
+ style: [styles35.track, { backgroundColor: theme.surface3 }],
4394
+ children: /* @__PURE__ */ jsx49(Animated17.View, { style: [styles35.fill, { width: `${ratio * 100}%`, backgroundColor: theme.accent, transform: [{ translateX }] }] })
4376
4395
  }
4377
4396
  );
4378
4397
  }
4379
4398
  function ProfileCard({ visual, name, statLabel, value = 100, valueText, stats, caption, children, animated = true, style, ...props }) {
4380
4399
  const { theme, radius: radius3 } = useTheme();
4381
4400
  const ratio = ratioOf(value);
4382
- return /* @__PURE__ */ jsxs41(View40, { ...props, style: [styles33.root, { backgroundColor: theme.surface1, borderColor: theme.borderSubtle, borderRadius: radius3.xl }, style], children: [
4383
- /* @__PURE__ */ jsx46(View40, { "aria-hidden": true, style: [styles33.disc, { backgroundColor: theme.surface2, borderColor: theme.accentSoft }], children: visual }),
4384
- /* @__PURE__ */ jsxs41(View40, { style: styles33.head, children: [
4385
- /* @__PURE__ */ jsx46(Txt, { variant: "title", style: styles33.name, children: name }),
4386
- statLabel ? /* @__PURE__ */ jsxs41(Txt, { variant: "caption", tone: "secondary", children: [
4401
+ return /* @__PURE__ */ jsxs44(View43, { ...props, style: [styles35.root, { backgroundColor: theme.surface1, borderColor: theme.borderSubtle, borderRadius: radius3.xl }, style], children: [
4402
+ /* @__PURE__ */ jsx49(View43, { "aria-hidden": true, style: [styles35.disc, { backgroundColor: theme.surface2, borderColor: theme.accentSoft }], children: visual }),
4403
+ /* @__PURE__ */ jsxs44(View43, { style: styles35.head, children: [
4404
+ /* @__PURE__ */ jsx49(Txt, { variant: "title", style: styles35.name, children: name }),
4405
+ statLabel ? /* @__PURE__ */ jsxs44(Txt, { variant: "caption", tone: "secondary", children: [
4387
4406
  statLabel,
4388
4407
  " ",
4389
- /* @__PURE__ */ jsx46(Txt, { variant: "caption", children: valueText ?? `${Math.round(ratio * 100)} %` })
4408
+ /* @__PURE__ */ jsx49(Txt, { variant: "caption", children: valueText ?? `${Math.round(ratio * 100)} %` })
4390
4409
  ] }) : null
4391
4410
  ] }),
4392
- statLabel ? /* @__PURE__ */ jsx46(Bar, { label: statLabel, ratio, words: valueText ?? `${Math.round(ratio * 100)} %`, animated, delay: 200 }) : null,
4411
+ statLabel ? /* @__PURE__ */ jsx49(Bar, { label: statLabel, ratio, words: valueText ?? `${Math.round(ratio * 100)} %`, animated, delay: 200 }) : null,
4393
4412
  stats?.map((s, i) => {
4394
4413
  const r = ratioOf(s.value, s.max);
4395
4414
  const words2 = s.valueText ?? `${Math.round(r * 100)} %`;
4396
- return /* @__PURE__ */ jsxs41(View40, { style: styles33.stat, children: [
4397
- /* @__PURE__ */ jsxs41(View40, { "aria-hidden": true, style: styles33.statHead, children: [
4398
- /* @__PURE__ */ jsx46(Txt, { variant: "caption", tone: "secondary", children: s.label }),
4399
- /* @__PURE__ */ jsx46(Txt, { variant: "caption", children: words2 })
4415
+ return /* @__PURE__ */ jsxs44(View43, { style: styles35.stat, children: [
4416
+ /* @__PURE__ */ jsxs44(View43, { "aria-hidden": true, style: styles35.statHead, children: [
4417
+ /* @__PURE__ */ jsx49(Txt, { variant: "caption", tone: "secondary", children: s.label }),
4418
+ /* @__PURE__ */ jsx49(Txt, { variant: "caption", children: words2 })
4400
4419
  ] }),
4401
- /* @__PURE__ */ jsx46(Bar, { label: s.label, ratio: r, words: words2, animated, delay: 320 + i * 120 })
4420
+ /* @__PURE__ */ jsx49(Bar, { label: s.label, ratio: r, words: words2, animated, delay: 320 + i * 120 })
4402
4421
  ] }, s.label);
4403
4422
  }),
4404
- caption ? /* @__PURE__ */ jsx46(Txt, { variant: "caption", tone: "secondary", style: styles33.caption, children: caption }) : null,
4405
- children ? /* @__PURE__ */ jsx46(View40, { style: styles33.extra, children }) : null
4423
+ caption ? /* @__PURE__ */ jsx49(Txt, { variant: "caption", tone: "secondary", style: styles35.caption, children: caption }) : null,
4424
+ children ? /* @__PURE__ */ jsx49(View43, { style: styles35.extra, children }) : null
4406
4425
  ] });
4407
4426
  }
4408
- var styles33 = StyleSheet33.create({
4409
- root: { alignItems: "center", gap: 12, padding: 20, borderWidth: StyleSheet33.hairlineWidth },
4427
+ var styles35 = StyleSheet35.create({
4428
+ root: { alignItems: "center", gap: 12, padding: 20, borderWidth: StyleSheet35.hairlineWidth },
4410
4429
  disc: { width: 104, height: 104, borderRadius: 52, borderWidth: 1, alignItems: "center", justifyContent: "center", overflow: "hidden" },
4411
4430
  head: { flexDirection: "row", alignSelf: "stretch", alignItems: "center", justifyContent: "space-between", gap: 8 },
4412
4431
  name: { flexShrink: 1, fontSize: 17 },
@@ -4420,9 +4439,9 @@ var styles33 = StyleSheet33.create({
4420
4439
 
4421
4440
  // src/native/progress.tsx
4422
4441
  import * as React32 from "react";
4423
- import { Animated as Animated18, Easing as Easing11, StyleSheet as StyleSheet34, View as View41 } from "react-native";
4424
- import Svg23, { Circle as Circle14, Defs as Defs13, LinearGradient as LinearGradient13, Rect as Rect4, Stop as Stop13 } from "react-native-svg";
4425
- import { jsx as jsx47, jsxs as jsxs42 } from "react/jsx-runtime";
4442
+ import { Animated as Animated18, Easing as Easing11, StyleSheet as StyleSheet36, View as View44 } from "react-native";
4443
+ import Svg23, { Circle as Circle14, Defs as Defs13, LinearGradient as LinearGradient10, Rect as Rect3, Stop as Stop13 } from "react-native-svg";
4444
+ import { jsx as jsx50, jsxs as jsxs45 } from "react/jsx-runtime";
4426
4445
  var AnimatedCircle = Animated18.createAnimatedComponent(Circle14);
4427
4446
  var BAR2 = { sm: 4, md: 8, lg: 12 };
4428
4447
  var RING2 = { sm: 40, md: 80, lg: 144 };
@@ -4464,9 +4483,9 @@ function Progress({ variant = "bar", size = "md", value, max = 100, label, value
4464
4483
  "aria-valuenow": known ? Math.min(max, Math.max(0, value)) : void 0,
4465
4484
  "aria-valuetext": known ? valueText ?? `${percent}%` : valueText
4466
4485
  };
4467
- const gradient = /* @__PURE__ */ jsx47(Defs13, { children: /* @__PURE__ */ jsxs42(LinearGradient13, { id, x1: "0", y1: "0", x2: "1", y2: variant === "ring" ? "1" : "0", children: [
4468
- /* @__PURE__ */ jsx47(Stop13, { offset: "0", stopColor: theme.accent }),
4469
- /* @__PURE__ */ jsx47(Stop13, { offset: "1", stopColor: theme.accent2 })
4486
+ const gradient = /* @__PURE__ */ jsx50(Defs13, { children: /* @__PURE__ */ jsxs45(LinearGradient10, { id, x1: "0", y1: "0", x2: "1", y2: variant === "ring" ? "1" : "0", children: [
4487
+ /* @__PURE__ */ jsx50(Stop13, { offset: "0", stopColor: theme.accent }),
4488
+ /* @__PURE__ */ jsx50(Stop13, { offset: "1", stopColor: theme.accent2 })
4470
4489
  ] }) });
4471
4490
  if (variant === "ring") {
4472
4491
  const side = RING2[size];
@@ -4475,11 +4494,11 @@ function Progress({ variant = "bar", size = "md", value, max = 100, label, value
4475
4494
  const circumference = 2 * Math.PI * r;
4476
4495
  const offset = known ? progress.interpolate({ inputRange: [0, 1], outputRange: [circumference, 0] }) : circumference * 0.75;
4477
4496
  const rotate = spin.interpolate({ inputRange: [0, 1], outputRange: ["0deg", "360deg"] });
4478
- return /* @__PURE__ */ jsxs42(View41, { ...a11y, style: [styles34.ring, { width: side, height: side }, style], children: [
4479
- /* @__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: [
4497
+ return /* @__PURE__ */ jsxs45(View44, { ...a11y, style: [styles36.ring, { width: side, height: side }, style], children: [
4498
+ /* @__PURE__ */ jsx50(Animated18.View, { style: [StyleSheet36.absoluteFill, { transform: [{ rotate: known ? "-90deg" : rotate }] }], children: /* @__PURE__ */ jsxs45(Svg23, { width: side, height: side, viewBox: "0 0 100 100", children: [
4480
4499
  gradient,
4481
- /* @__PURE__ */ jsx47(Circle14, { cx: 50, cy: 50, r, fill: "none", stroke: theme.borderDefault, strokeWidth: stroke }),
4482
- /* @__PURE__ */ jsx47(
4500
+ /* @__PURE__ */ jsx50(Circle14, { cx: 50, cy: 50, r, fill: "none", stroke: theme.borderDefault, strokeWidth: stroke }),
4501
+ /* @__PURE__ */ jsx50(
4483
4502
  AnimatedCircle,
4484
4503
  {
4485
4504
  cx: 50,
@@ -4499,20 +4518,20 @@ function Progress({ variant = "bar", size = "md", value, max = 100, label, value
4499
4518
  }
4500
4519
  const width = known ? progress.interpolate({ inputRange: [0, 1], outputRange: ["0%", "100%"] }) : "40%";
4501
4520
  const translate = spin.interpolate({ inputRange: [0, 1], outputRange: [-0.4 * track, track] });
4502
- return /* @__PURE__ */ jsx47(
4503
- View41,
4521
+ return /* @__PURE__ */ jsx50(
4522
+ View44,
4504
4523
  {
4505
4524
  ...a11y,
4506
4525
  onLayout: known ? void 0 : (event) => setTrack(event.nativeEvent.layout.width),
4507
- style: [styles34.bar, { height: BAR2[size], backgroundColor: theme.surface3 }, style],
4508
- 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: [
4526
+ style: [styles36.bar, { height: BAR2[size], backgroundColor: theme.surface3 }, style],
4527
+ children: /* @__PURE__ */ jsx50(Animated18.View, { style: [styles36.fill, { width }, known || reduce ? null : { transform: [{ translateX: translate }] }], children: /* @__PURE__ */ jsxs45(Svg23, { width: "100%", height: "100%", preserveAspectRatio: "none", children: [
4509
4528
  gradient,
4510
- /* @__PURE__ */ jsx47(Rect4, { x: 0, y: 0, width: "100%", height: "100%", fill: `url(#${id})` })
4529
+ /* @__PURE__ */ jsx50(Rect3, { x: 0, y: 0, width: "100%", height: "100%", fill: `url(#${id})` })
4511
4530
  ] }) })
4512
4531
  }
4513
4532
  );
4514
4533
  }
4515
- var styles34 = StyleSheet34.create({
4534
+ var styles36 = StyleSheet36.create({
4516
4535
  ring: { alignItems: "center", justifyContent: "center" },
4517
4536
  bar: { width: "100%", overflow: "hidden", borderRadius: 9999 },
4518
4537
  fill: { height: "100%", overflow: "hidden", borderRadius: 9999 }
@@ -4520,11 +4539,11 @@ var styles34 = StyleSheet34.create({
4520
4539
 
4521
4540
  // src/native/pull-to-refresh.tsx
4522
4541
  import * as React33 from "react";
4523
- import { AccessibilityInfo as AccessibilityInfo13, Animated as Animated19, RefreshControl, StyleSheet as StyleSheet35, View as View42 } from "react-native";
4524
- import { jsx as jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
4542
+ import { AccessibilityInfo as AccessibilityInfo13, Animated as Animated19, RefreshControl, StyleSheet as StyleSheet37, View as View45 } from "react-native";
4543
+ import { jsx as jsx51, jsxs as jsxs46 } from "react/jsx-runtime";
4525
4544
  function PullToRefresh({ label, ...props }) {
4526
4545
  const { theme } = useTheme();
4527
- return /* @__PURE__ */ jsx48(RefreshControl, { ...props, tintColor: theme.accent, colors: [theme.accent], progressBackgroundColor: theme.surface2, title: label, titleColor: theme.textSecondary });
4546
+ return /* @__PURE__ */ jsx51(RefreshControl, { ...props, tintColor: theme.accent, colors: [theme.accent], progressBackgroundColor: theme.surface2, title: label, titleColor: theme.textSecondary });
4528
4547
  }
4529
4548
  var pullProgress = (offset, threshold) => Math.min(1, Math.max(0, -offset / threshold));
4530
4549
  function BrandedRefresh({ product, refreshing, onRefresh, label, children, threshold = 72 }) {
@@ -4541,28 +4560,28 @@ function BrandedRefresh({ product, refreshing, onRefresh, label, children, thres
4541
4560
  const shown = refreshing ? 1 : pull;
4542
4561
  const scale = refreshing || reduce ? 1 : pull.interpolate({ inputRange: [0, 1], outputRange: [0.4, 1] });
4543
4562
  const rotate = refreshing || reduce ? "0deg" : pull.interpolate({ inputRange: [0, 1], outputRange: ["-90deg", "0deg"] });
4544
- return /* @__PURE__ */ jsxs43(View42, { style: styles35.root, children: [
4563
+ return /* @__PURE__ */ jsxs46(View45, { style: styles37.root, children: [
4545
4564
  children({
4546
4565
  // The platform's control does the gesture and the haptics, drawn transparent: the mark is ours.
4547
- refreshControl: /* @__PURE__ */ jsx48(RefreshControl, { refreshing, onRefresh, tintColor: "transparent", colors: ["transparent"], progressBackgroundColor: "transparent" }),
4566
+ refreshControl: /* @__PURE__ */ jsx51(RefreshControl, { refreshing, onRefresh, tintColor: "transparent", colors: ["transparent"], progressBackgroundColor: "transparent" }),
4548
4567
  onScroll,
4549
4568
  scrollEventThrottle: 16
4550
4569
  }),
4551
- /* @__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 }) })
4570
+ /* @__PURE__ */ jsx51(Animated19.View, { pointerEvents: "none", "aria-hidden": true, style: [styles37.mark, { opacity: shown, transform: [{ scale }, { rotate }] }], children: /* @__PURE__ */ jsx51(ProductMark, { id: product, size: 32, animated: refreshing, neutral: theme.textMuted }) })
4552
4571
  ] });
4553
4572
  }
4554
- var styles35 = StyleSheet35.create({
4573
+ var styles37 = StyleSheet37.create({
4555
4574
  root: { flex: 1 },
4556
4575
  mark: { position: "absolute", top: 12, left: 0, right: 0, alignItems: "center" }
4557
4576
  });
4558
4577
 
4559
4578
  // src/native/radio-group.tsx
4560
4579
  import * as React34 from "react";
4561
- import { Animated as Animated20, Pressable as Pressable18, StyleSheet as StyleSheet36, Text as Text15, View as View43 } from "react-native";
4580
+ import { Animated as Animated20, Pressable as Pressable18, StyleSheet as StyleSheet38, Text as Text15, View as View46 } from "react-native";
4562
4581
  import Svg24, { Path as Path20 } from "react-native-svg";
4563
- import { jsx as jsx49, jsxs as jsxs44 } from "react/jsx-runtime";
4582
+ import { jsx as jsx52, jsxs as jsxs47 } from "react/jsx-runtime";
4564
4583
  function Check({ color }) {
4565
- 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" }) });
4584
+ return /* @__PURE__ */ jsx52(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__ */ jsx52(Path20, { d: "M20 6 9 17l-5-5" }) });
4566
4585
  }
4567
4586
  function Key({ option, checked, disabled, onPress }) {
4568
4587
  const { theme, radius: radius3, motion: motion3 } = useTheme();
@@ -4572,7 +4591,7 @@ function Key({ option, checked, disabled, onPress }) {
4572
4591
  React34.useEffect(() => {
4573
4592
  Animated20.timing(sink, { toValue: down ? 1 : 0, duration: motion3.duration.fast, useNativeDriver: true }).start();
4574
4593
  }, [down, sink, motion3.duration.fast]);
4575
- return /* @__PURE__ */ jsxs44(
4594
+ return /* @__PURE__ */ jsxs47(
4576
4595
  Pressable18,
4577
4596
  {
4578
4597
  role: "radio",
@@ -4583,14 +4602,14 @@ function Key({ option, checked, disabled, onPress }) {
4583
4602
  onPress,
4584
4603
  onPressIn: () => setHeld(true),
4585
4604
  onPressOut: () => setHeld(false),
4586
- style: [styles36.keySlot, disabled ? styles36.disabled : null],
4605
+ style: [styles38.keySlot, disabled ? styles38.disabled : null],
4587
4606
  children: [
4588
- /* @__PURE__ */ jsx49(View43, { style: [styles36.ledge, { borderRadius: radius3.lg, backgroundColor: checked ? theme.accentHover : theme.borderStrong }] }),
4589
- /* @__PURE__ */ jsxs44(
4607
+ /* @__PURE__ */ jsx52(View46, { style: [styles38.ledge, { borderRadius: radius3.lg, backgroundColor: checked ? theme.accentHover : theme.borderStrong }] }),
4608
+ /* @__PURE__ */ jsxs47(
4590
4609
  Animated20.View,
4591
4610
  {
4592
4611
  style: [
4593
- styles36.key,
4612
+ styles38.key,
4594
4613
  {
4595
4614
  borderRadius: radius3.lg,
4596
4615
  backgroundColor: checked ? theme.accent : theme.surface2,
@@ -4599,8 +4618,8 @@ function Key({ option, checked, disabled, onPress }) {
4599
4618
  }
4600
4619
  ],
4601
4620
  children: [
4602
- /* @__PURE__ */ jsx49(Text15, { style: [styles36.keyLabel, { color: checked ? theme.onAccent : theme.textPrimary }], children: option.label }),
4603
- option.hint ? /* @__PURE__ */ jsx49(Text15, { style: [styles36.keyHint, { color: checked ? theme.onAccent : theme.textSecondary }], children: option.hint }) : null
4621
+ /* @__PURE__ */ jsx52(Text15, { style: [styles38.keyLabel, { color: checked ? theme.onAccent : theme.textPrimary }], children: option.label }),
4622
+ option.hint ? /* @__PURE__ */ jsx52(Text15, { style: [styles38.keyHint, { color: checked ? theme.onAccent : theme.textSecondary }], children: option.hint }) : null
4604
4623
  ]
4605
4624
  }
4606
4625
  )
@@ -4621,9 +4640,9 @@ function RadioGroup({ label, options, value: valueProp, defaultValue = null, onV
4621
4640
  const checked = o.value === value;
4622
4641
  const off = Boolean(disabled || o.disabled);
4623
4642
  const name = o.description ? `${o.label}, ${o.description}` : o.label;
4624
- if (variant === "buttons") return /* @__PURE__ */ jsx49(Key, { option: o, checked, disabled: off, onPress: () => pick(o.value) }, o.value);
4643
+ if (variant === "buttons") return /* @__PURE__ */ jsx52(Key, { option: o, checked, disabled: off, onPress: () => pick(o.value) }, o.value);
4625
4644
  if (variant === "segmented")
4626
- return /* @__PURE__ */ jsx49(
4645
+ return /* @__PURE__ */ jsx52(
4627
4646
  Pressable18,
4628
4647
  {
4629
4648
  role: "radio",
@@ -4632,13 +4651,13 @@ function RadioGroup({ label, options, value: valueProp, defaultValue = null, onV
4632
4651
  "aria-disabled": off || void 0,
4633
4652
  disabled: off,
4634
4653
  onPress: () => pick(o.value),
4635
- style: [styles36.segment, { borderRadius: radius3.md }, checked ? { backgroundColor: theme.surface0, borderColor: theme.borderDefault } : null, off ? styles36.disabled : null],
4636
- children: /* @__PURE__ */ jsx49(Text15, { numberOfLines: 1, style: [styles36.segmentLabel, { color: checked ? theme.textPrimary : theme.textSecondary }], children: o.label })
4654
+ style: [styles38.segment, { borderRadius: radius3.md }, checked ? { backgroundColor: theme.surface0, borderColor: theme.borderDefault } : null, off ? styles38.disabled : null],
4655
+ children: /* @__PURE__ */ jsx52(Text15, { numberOfLines: 1, style: [styles38.segmentLabel, { color: checked ? theme.textPrimary : theme.textSecondary }], children: o.label })
4637
4656
  },
4638
4657
  o.value
4639
4658
  );
4640
4659
  if (variant === "cards")
4641
- return /* @__PURE__ */ jsxs44(
4660
+ return /* @__PURE__ */ jsxs47(
4642
4661
  Pressable18,
4643
4662
  {
4644
4663
  role: "radio",
@@ -4648,40 +4667,40 @@ function RadioGroup({ label, options, value: valueProp, defaultValue = null, onV
4648
4667
  disabled: off,
4649
4668
  onPress: () => pick(o.value),
4650
4669
  style: ({ pressed }) => [
4651
- styles36.card,
4670
+ styles38.card,
4652
4671
  { borderRadius: radius3.xl, backgroundColor: checked ? theme.accentSoft : theme.surface1, borderColor: checked ? theme.accent : theme.borderDefault, transform: [{ scale: pressed ? 0.98 : 1 }] },
4653
- off ? styles36.disabled : null
4672
+ off ? styles38.disabled : null
4654
4673
  ],
4655
4674
  children: [
4656
- /* @__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 }),
4657
- /* @__PURE__ */ jsx49(Text15, { style: [styles36.cardLabel, { color: theme.textPrimary }], children: o.label }),
4658
- o.description ? /* @__PURE__ */ jsx49(Text15, { style: [styles36.cardDescription, { color: theme.textSecondary }], children: o.description }) : null
4675
+ /* @__PURE__ */ jsx52(View46, { style: [styles38.cardCheck, { borderColor: checked ? theme.accent : theme.borderStrong, backgroundColor: checked ? theme.accent : theme.surface1 }], children: checked ? /* @__PURE__ */ jsx52(Check, { color: theme.onAccent }) : null }),
4676
+ /* @__PURE__ */ jsx52(Text15, { style: [styles38.cardLabel, { color: theme.textPrimary }], children: o.label }),
4677
+ o.description ? /* @__PURE__ */ jsx52(Text15, { style: [styles38.cardDescription, { color: theme.textSecondary }], children: o.description }) : null
4659
4678
  ]
4660
4679
  },
4661
4680
  o.value
4662
4681
  );
4663
- 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: [
4664
- /* @__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 }),
4665
- /* @__PURE__ */ jsxs44(View43, { style: styles36.rowText, children: [
4666
- /* @__PURE__ */ jsx49(Text15, { style: [styles36.rowLabel, { color: theme.textPrimary }], children: o.label }),
4667
- o.description ? /* @__PURE__ */ jsx49(Text15, { style: [styles36.cardDescription, { color: theme.textSecondary }], children: o.description }) : null
4682
+ return /* @__PURE__ */ jsxs47(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: [
4683
+ /* @__PURE__ */ jsx52(View46, { style: [styles38.dot, { borderColor: checked ? theme.accent : theme.borderStrong, backgroundColor: checked ? theme.accent : theme.surface1 }], children: checked ? /* @__PURE__ */ jsx52(View46, { style: [styles38.dotIn, { backgroundColor: theme.onAccent }] }) : null }),
4684
+ /* @__PURE__ */ jsxs47(View46, { style: styles38.rowText, children: [
4685
+ /* @__PURE__ */ jsx52(Text15, { style: [styles38.rowLabel, { color: theme.textPrimary }], children: o.label }),
4686
+ o.description ? /* @__PURE__ */ jsx52(Text15, { style: [styles38.cardDescription, { color: theme.textSecondary }], children: o.description }) : null
4668
4687
  ] })
4669
4688
  ] }, o.value);
4670
4689
  });
4671
- return /* @__PURE__ */ jsxs44(View43, { style: [styles36.root, style], children: [
4672
- /* @__PURE__ */ jsx49(
4673
- View43,
4690
+ return /* @__PURE__ */ jsxs47(View46, { style: [styles38.root, style], children: [
4691
+ /* @__PURE__ */ jsx52(
4692
+ View46,
4674
4693
  {
4675
4694
  role: "radiogroup",
4676
4695
  "aria-label": label,
4677
- 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,
4696
+ 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,
4678
4697
  children: body
4679
4698
  }
4680
4699
  ),
4681
- error ? /* @__PURE__ */ jsx49(Text15, { role: "alert", "aria-live": "polite", style: [styles36.error, { color: theme.dangerText }], children: error }) : null
4700
+ error ? /* @__PURE__ */ jsx52(Text15, { role: "alert", "aria-live": "polite", style: [styles38.error, { color: theme.dangerText }], children: error }) : null
4682
4701
  ] });
4683
4702
  }
4684
- var styles36 = StyleSheet36.create({
4703
+ var styles38 = StyleSheet38.create({
4685
4704
  root: { gap: 6, alignSelf: "stretch" },
4686
4705
  list: { gap: 2 },
4687
4706
  row: { flexDirection: "row", alignItems: "center", gap: 12, minHeight: 44 },
@@ -4700,34 +4719,34 @@ var styles36 = StyleSheet36.create({
4700
4719
  key: { minHeight: 48, paddingHorizontal: 16, paddingVertical: 8, alignItems: "center", justifyContent: "center", gap: 1, borderWidth: 1 },
4701
4720
  keyLabel: { fontSize: 15, fontWeight: "700" },
4702
4721
  keyHint: { fontSize: 11, fontWeight: "500" },
4703
- track: { flexDirection: "row", padding: 3, gap: 3, borderWidth: StyleSheet36.hairlineWidth, height: 42 },
4704
- segment: { flex: 1, alignItems: "center", justifyContent: "center", paddingHorizontal: 8, borderWidth: StyleSheet36.hairlineWidth, borderColor: "transparent" },
4722
+ track: { flexDirection: "row", padding: 3, gap: 3, borderWidth: StyleSheet38.hairlineWidth, height: 42 },
4723
+ segment: { flex: 1, alignItems: "center", justifyContent: "center", paddingHorizontal: 8, borderWidth: StyleSheet38.hairlineWidth, borderColor: "transparent" },
4705
4724
  segmentLabel: { fontSize: 13, fontWeight: "600" },
4706
4725
  error: { fontSize: 12, lineHeight: 16 },
4707
4726
  disabled: { opacity: 0.4 }
4708
4727
  });
4709
4728
 
4710
4729
  // src/native/screen.tsx
4711
- import { KeyboardAvoidingView, Platform as Platform3, ScrollView as ScrollView6, StyleSheet as StyleSheet37, View as View44 } from "react-native";
4712
- import { Fragment as Fragment7, jsx as jsx50, jsxs as jsxs45 } from "react/jsx-runtime";
4730
+ import { KeyboardAvoidingView, Platform as Platform3, ScrollView as ScrollView6, StyleSheet as StyleSheet39, View as View47 } from "react-native";
4731
+ import { Fragment as Fragment7, jsx as jsx53, jsxs as jsxs48 } from "react/jsx-runtime";
4713
4732
  function Screen({ header, footer, children, scroll = true, keyboard = true, padding = 16, surface = "surface0", contentStyle }) {
4714
4733
  const { theme, insets } = useTheme();
4715
- 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 });
4716
- const inner = /* @__PURE__ */ jsxs45(Fragment7, { children: [
4734
+ const body = scroll ? /* @__PURE__ */ jsx53(ScrollView6, { style: styles39.flex, contentContainerStyle: [{ padding, paddingTop: header ? padding : padding + insets.top, gap: 16 }, contentStyle], keyboardShouldPersistTaps: "handled", tabIndex: 0, children }) : /* @__PURE__ */ jsx53(View47, { style: [styles39.flex, { paddingTop: header ? 0 : insets.top }, contentStyle], children });
4735
+ const inner = /* @__PURE__ */ jsxs48(Fragment7, { children: [
4717
4736
  header,
4718
4737
  body,
4719
4738
  footer
4720
4739
  ] });
4721
- 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 });
4740
+ return /* @__PURE__ */ jsx53(View47, { style: [styles39.flex, { backgroundColor: theme[surface] }], children: keyboard ? /* @__PURE__ */ jsx53(KeyboardAvoidingView, { style: styles39.flex, behavior: Platform3.OS === "ios" ? "padding" : void 0, children: inner }) : inner });
4722
4741
  }
4723
- var styles37 = StyleSheet37.create({ flex: { flex: 1 } });
4742
+ var styles39 = StyleSheet39.create({ flex: { flex: 1 } });
4724
4743
 
4725
4744
  // src/native/search-field.tsx
4726
4745
  import { useDebouncedCallback } from "@krizaka/pacer/react";
4727
4746
  import * as React35 from "react";
4728
- import { Pressable as Pressable19, StyleSheet as StyleSheet38, TextInput as TextInput6, View as View45 } from "react-native";
4747
+ import { Pressable as Pressable19, StyleSheet as StyleSheet40, TextInput as TextInput6, View as View48 } from "react-native";
4729
4748
  import Svg25, { Circle as Circle15, Path as Path21 } from "react-native-svg";
4730
- import { jsx as jsx51, jsxs as jsxs46 } from "react/jsx-runtime";
4749
+ import { jsx as jsx54, jsxs as jsxs49 } from "react/jsx-runtime";
4731
4750
  function SearchField({ label, value, defaultValue = "", onValueChange, onSearch, debounce = 300, onSubmit, clearLabel, cancelLabel, onCancel, style, placeholder, onFocus, onBlur, ...props }) {
4732
4751
  const [focused, setFocused] = React35.useState(false);
4733
4752
  const input = React35.useRef(null);
@@ -4741,12 +4760,12 @@ function SearchField({ label, value, defaultValue = "", onValueChange, onSearch,
4741
4760
  search.cancel();
4742
4761
  if (onSearch) search(next);
4743
4762
  };
4744
- const field = /* @__PURE__ */ jsxs46(View45, { style: [styles38.frame, { borderRadius: radius3.md, borderColor: theme.borderDefault, backgroundColor: theme.surface2 }, style], children: [
4745
- /* @__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: [
4746
- /* @__PURE__ */ jsx51(Circle15, { cx: 11, cy: 11, r: 7 }),
4747
- /* @__PURE__ */ jsx51(Path21, { d: "m20 20-3.5-3.5" })
4763
+ const field = /* @__PURE__ */ jsxs49(View48, { style: [styles40.frame, { borderRadius: radius3.md, borderColor: theme.borderDefault, backgroundColor: theme.surface2 }, style], children: [
4764
+ /* @__PURE__ */ jsxs49(Svg25, { width: 18, height: 18, viewBox: "0 0 24 24", fill: "none", stroke: theme.textSecondary, strokeWidth: 2, strokeLinecap: "round", "aria-hidden": true, children: [
4765
+ /* @__PURE__ */ jsx54(Circle15, { cx: 11, cy: 11, r: 7 }),
4766
+ /* @__PURE__ */ jsx54(Path21, { d: "m20 20-3.5-3.5" })
4748
4767
  ] }),
4749
- /* @__PURE__ */ jsx51(
4768
+ /* @__PURE__ */ jsx54(
4750
4769
  TextInput6,
4751
4770
  {
4752
4771
  ref: input,
@@ -4765,7 +4784,7 @@ function SearchField({ label, value, defaultValue = "", onValueChange, onSearch,
4765
4784
  onSearch?.(query);
4766
4785
  onSubmit?.(query);
4767
4786
  },
4768
- style: [styles38.input, { color: theme.textPrimary }],
4787
+ style: [styles40.input, { color: theme.textPrimary }],
4769
4788
  onFocus: (e) => {
4770
4789
  setFocused(true);
4771
4790
  onFocus?.(e);
@@ -4777,12 +4796,12 @@ function SearchField({ label, value, defaultValue = "", onValueChange, onSearch,
4777
4796
  ...props
4778
4797
  }
4779
4798
  ),
4780
- 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
4799
+ query ? /* @__PURE__ */ jsx54(Pressable19, { role: "button", "aria-label": clearLabel, hitSlop: 10, onPress: () => change(""), style: styles40.clear, children: /* @__PURE__ */ jsx54(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__ */ jsx54(Path21, { d: "M18 6 6 18M6 6l12 12" }) }) }) : null
4781
4800
  ] });
4782
4801
  if (!cancelLabel || !onCancel) return field;
4783
- return /* @__PURE__ */ jsxs46(View45, { style: styles38.bar, children: [
4784
- /* @__PURE__ */ jsx51(View45, { style: styles38.grow, children: field }),
4785
- focused || query ? /* @__PURE__ */ jsx51(
4802
+ return /* @__PURE__ */ jsxs49(View48, { style: styles40.bar, children: [
4803
+ /* @__PURE__ */ jsx54(View48, { style: styles40.grow, children: field }),
4804
+ focused || query ? /* @__PURE__ */ jsx54(
4786
4805
  Pressable19,
4787
4806
  {
4788
4807
  role: "button",
@@ -4792,14 +4811,14 @@ function SearchField({ label, value, defaultValue = "", onValueChange, onSearch,
4792
4811
  onCancel();
4793
4812
  },
4794
4813
  hitSlop: 8,
4795
- style: styles38.cancel,
4796
- children: /* @__PURE__ */ jsx51(Txt, { variant: "label", tone: "accent", children: cancelLabel })
4814
+ style: styles40.cancel,
4815
+ children: /* @__PURE__ */ jsx54(Txt, { variant: "label", tone: "accent", children: cancelLabel })
4797
4816
  }
4798
4817
  ) : null
4799
4818
  ] });
4800
4819
  }
4801
- var styles38 = StyleSheet38.create({
4802
- frame: { flexDirection: "row", alignItems: "center", gap: 8, height: 44, paddingLeft: 12, paddingRight: 6, borderWidth: StyleSheet38.hairlineWidth },
4820
+ var styles40 = StyleSheet40.create({
4821
+ frame: { flexDirection: "row", alignItems: "center", gap: 8, height: 44, paddingLeft: 12, paddingRight: 6, borderWidth: StyleSheet40.hairlineWidth },
4803
4822
  input: { flex: 1, height: "100%", fontSize: 15, paddingVertical: 0 },
4804
4823
  bar: { flexDirection: "row", alignItems: "center", gap: 10 },
4805
4824
  grow: { flex: 1 },
@@ -4808,19 +4827,19 @@ var styles38 = StyleSheet38.create({
4808
4827
  });
4809
4828
 
4810
4829
  // src/native/segmented.tsx
4811
- import { Pressable as Pressable20, StyleSheet as StyleSheet39, Text as Text16, View as View46 } from "react-native";
4812
- import { jsx as jsx52 } from "react/jsx-runtime";
4830
+ import { Pressable as Pressable20, StyleSheet as StyleSheet41, Text as Text16, View as View49 } from "react-native";
4831
+ import { jsx as jsx55 } from "react/jsx-runtime";
4813
4832
  function Segmented({ options, value, onValueChange, size = "md", "aria-label": label, style }) {
4814
4833
  const { theme, radius: radius3 } = useTheme();
4815
- return /* @__PURE__ */ jsx52(
4816
- View46,
4834
+ return /* @__PURE__ */ jsx55(
4835
+ View49,
4817
4836
  {
4818
4837
  role: "tablist",
4819
4838
  "aria-label": label,
4820
- style: [styles39.track, { backgroundColor: theme.surface2, borderColor: theme.borderSubtle, borderRadius: radius3.md, height: size === "sm" ? 32 : 40 }, style],
4839
+ style: [styles41.track, { backgroundColor: theme.surface2, borderColor: theme.borderSubtle, borderRadius: radius3.md, height: size === "sm" ? 32 : 40 }, style],
4821
4840
  children: options.map((option) => {
4822
4841
  const selected = option.value === value;
4823
- return /* @__PURE__ */ jsx52(
4842
+ return /* @__PURE__ */ jsx55(
4824
4843
  Pressable20,
4825
4844
  {
4826
4845
  role: "tab",
@@ -4831,12 +4850,12 @@ function Segmented({ options, value, onValueChange, size = "md", "aria-label": l
4831
4850
  if (!selected) onValueChange(option.value);
4832
4851
  },
4833
4852
  style: [
4834
- styles39.segment,
4853
+ styles41.segment,
4835
4854
  { borderRadius: radius3.sm },
4836
4855
  selected ? { backgroundColor: theme.surface0, borderColor: theme.borderDefault } : null,
4837
- option.disabled ? styles39.disabled : null
4856
+ option.disabled ? styles41.disabled : null
4838
4857
  ],
4839
- children: /* @__PURE__ */ jsx52(Text16, { numberOfLines: 1, style: [styles39.label, { color: selected ? theme.textPrimary : theme.textSecondary, fontSize: size === "sm" ? 12 : 13 }], children: option.label })
4858
+ children: /* @__PURE__ */ jsx55(Text16, { numberOfLines: 1, style: [styles41.label, { color: selected ? theme.textPrimary : theme.textSecondary, fontSize: size === "sm" ? 12 : 13 }], children: option.label })
4840
4859
  },
4841
4860
  option.value
4842
4861
  );
@@ -4844,18 +4863,18 @@ function Segmented({ options, value, onValueChange, size = "md", "aria-label": l
4844
4863
  }
4845
4864
  );
4846
4865
  }
4847
- var styles39 = StyleSheet39.create({
4848
- track: { flexDirection: "row", padding: 3, gap: 3, borderWidth: StyleSheet39.hairlineWidth },
4849
- segment: { flex: 1, alignItems: "center", justifyContent: "center", paddingHorizontal: 8, borderWidth: StyleSheet39.hairlineWidth, borderColor: "transparent" },
4866
+ var styles41 = StyleSheet41.create({
4867
+ track: { flexDirection: "row", padding: 3, gap: 3, borderWidth: StyleSheet41.hairlineWidth },
4868
+ segment: { flex: 1, alignItems: "center", justifyContent: "center", paddingHorizontal: 8, borderWidth: StyleSheet41.hairlineWidth, borderColor: "transparent" },
4850
4869
  label: { fontWeight: "600" },
4851
4870
  disabled: { opacity: 0.4 }
4852
4871
  });
4853
4872
 
4854
4873
  // src/native/showcase.tsx
4855
4874
  import * as React36 from "react";
4856
- import { Animated as Animated21, AppState, Easing as Easing12, FlatList, Pressable as Pressable21, StyleSheet as StyleSheet40, View as View47 } from "react-native";
4875
+ import { Animated as Animated21, AppState, Easing as Easing12, FlatList, Pressable as Pressable21, StyleSheet as StyleSheet42, View as View50 } from "react-native";
4857
4876
  import Svg26, { Path as Path22 } from "react-native-svg";
4858
- import { jsx as jsx53, jsxs as jsxs47 } from "react/jsx-runtime";
4877
+ import { jsx as jsx56, jsxs as jsxs50 } from "react/jsx-runtime";
4859
4878
  var showcaseLabels = {
4860
4879
  previous: "Previous slide",
4861
4880
  next: "Next slide",
@@ -4913,10 +4932,10 @@ function Showcase({ label, items: items2, getId, renderItem, getTitle, interval
4913
4932
  }, [running, current, interval]);
4914
4933
  const item = items2[current];
4915
4934
  const title = item !== void 0 ? getTitle?.(item) : void 0;
4916
- const control = [styles40.control, { borderColor: theme.borderDefault, backgroundColor: theme.surface1 }];
4917
- 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" }) });
4918
- return /* @__PURE__ */ jsxs47(View47, { role: "group", "aria-label": label, style: [styles40.root, style], children: [
4919
- /* @__PURE__ */ jsx53(View47, { "aria-live": announce ? "polite" : "off", onLayout: (e) => setWidth(e.nativeEvent.layout.width), children: /* @__PURE__ */ jsx53(
4935
+ const control = [styles42.control, { borderColor: theme.borderDefault, backgroundColor: theme.surface1 }];
4936
+ const icon = (d) => /* @__PURE__ */ jsx56(Svg26, { width: 16, height: 16, viewBox: "0 0 24 24", "aria-hidden": true, children: /* @__PURE__ */ jsx56(Path22, { d, stroke: theme.textSecondary, strokeWidth: 2.2, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" }) });
4937
+ return /* @__PURE__ */ jsxs50(View50, { role: "group", "aria-label": label, style: [styles42.root, style], children: [
4938
+ /* @__PURE__ */ jsx56(View50, { "aria-live": announce ? "polite" : "off", onLayout: (e) => setWidth(e.nativeEvent.layout.width), children: /* @__PURE__ */ jsx56(
4920
4939
  FlatList,
4921
4940
  {
4922
4941
  ref: list,
@@ -4937,25 +4956,25 @@ function Showcase({ label, items: items2, getId, renderItem, getTitle, interval
4937
4956
  onIndexChange?.(next, true);
4938
4957
  }
4939
4958
  },
4940
- 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 })
4959
+ renderItem: ({ item: slide, index }) => /* @__PURE__ */ jsx56(View50, { role: "group", "aria-label": labels.slide(index + 1, total), style: { width }, children: Math.abs(index - current) <= 1 ? renderItem(slide, { index, active: index === current }) : null })
4941
4960
  }
4942
4961
  ) }),
4943
- /* @__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: [
4944
- i < current || i === current && !playing ? /* @__PURE__ */ jsx53(View47, { style: [StyleSheet40.absoluteFill, { backgroundColor: theme.accent }] }) : null,
4945
- i === current && playing ? /* @__PURE__ */ jsx53(Animated21.View, { style: [styles40.fill, { backgroundColor: theme.accent, width: fill.interpolate({ inputRange: [0, 1], outputRange: ["0%", "100%"] }) }] }) : null
4962
+ /* @__PURE__ */ jsx56(View50, { style: styles42.segments, children: items2.map((slide, i) => /* @__PURE__ */ jsx56(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__ */ jsxs50(View50, { style: [styles42.track, { backgroundColor: theme.surface3 }], children: [
4963
+ i < current || i === current && !playing ? /* @__PURE__ */ jsx56(View50, { style: [StyleSheet42.absoluteFill, { backgroundColor: theme.accent }] }) : null,
4964
+ i === current && playing ? /* @__PURE__ */ jsx56(Animated21.View, { style: [styles42.fill, { backgroundColor: theme.accent, width: fill.interpolate({ inputRange: [0, 1], outputRange: ["0%", "100%"] }) }] }) : null
4946
4965
  ] }) }, getId(slide))) }),
4947
- /* @__PURE__ */ jsxs47(View47, { style: styles40.bar, children: [
4948
- /* @__PURE__ */ jsxs47(Txt, { variant: "caption", tone: "secondary", numberOfLines: 1, style: styles40.counter, children: [
4966
+ /* @__PURE__ */ jsxs50(View50, { style: styles42.bar, children: [
4967
+ /* @__PURE__ */ jsxs50(Txt, { variant: "caption", tone: "secondary", numberOfLines: 1, style: styles42.counter, children: [
4949
4968
  title ? `${title} \xB7 ` : "",
4950
4969
  labels.counter(current + 1, total)
4951
4970
  ] }),
4952
- /* @__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") }),
4953
- 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,
4954
- /* @__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") })
4971
+ /* @__PURE__ */ jsx56(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") }),
4972
+ playing ? /* @__PURE__ */ jsx56(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,
4973
+ /* @__PURE__ */ jsx56(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") })
4955
4974
  ] })
4956
4975
  ] });
4957
4976
  }
4958
- var styles40 = StyleSheet40.create({
4977
+ var styles42 = StyleSheet42.create({
4959
4978
  root: { gap: 8 },
4960
4979
  segments: { flexDirection: "row", gap: 4 },
4961
4980
  segment: { flex: 1, height: 24, justifyContent: "center" },
@@ -4969,7 +4988,7 @@ var styles40 = StyleSheet40.create({
4969
4988
  // src/native/skeleton.tsx
4970
4989
  import * as React37 from "react";
4971
4990
  import { Animated as Animated22 } from "react-native";
4972
- import { jsx as jsx54 } from "react/jsx-runtime";
4991
+ import { jsx as jsx57 } from "react/jsx-runtime";
4973
4992
  var SHAPE = {
4974
4993
  text: { width: "100%", height: 12, radius: 4 },
4975
4994
  circle: { width: 40, height: 40, radius: 9999 },
@@ -4995,7 +5014,7 @@ function Skeleton({ shape = "text", width, height, style, testID }) {
4995
5014
  }, [reduce, opacity]);
4996
5015
  const s = SHAPE[shape];
4997
5016
  const side = shape === "circle" ? width ?? height ?? s.width : void 0;
4998
- return /* @__PURE__ */ jsx54(
5017
+ return /* @__PURE__ */ jsx57(
4999
5018
  Animated22.View,
5000
5019
  {
5001
5020
  testID,
@@ -5010,9 +5029,9 @@ function Skeleton({ shape = "text", width, height, style, testID }) {
5010
5029
 
5011
5030
  // src/native/slider.tsx
5012
5031
  import * as React38 from "react";
5013
- import { PanResponder as PanResponder2, StyleSheet as StyleSheet41, Text as Text17, View as View48 } from "react-native";
5014
- import Svg27, { Defs as Defs14, LinearGradient as LinearGradient14, Rect as Rect5, Stop as Stop14 } from "react-native-svg";
5015
- import { jsx as jsx55, jsxs as jsxs48 } from "react/jsx-runtime";
5032
+ import { PanResponder as PanResponder2, StyleSheet as StyleSheet43, Text as Text17, View as View51 } from "react-native";
5033
+ import Svg27, { Defs as Defs14, LinearGradient as LinearGradient11, Rect as Rect4, Stop as Stop14 } from "react-native-svg";
5034
+ import { jsx as jsx58, jsxs as jsxs51 } from "react/jsx-runtime";
5016
5035
  var THUMB = 26;
5017
5036
  var toArray = (v) => v === void 0 ? void 0 : typeof v === "number" ? [v] : [...v];
5018
5037
  function Slider({
@@ -5104,24 +5123,24 @@ function Slider({
5104
5123
  const along = (p) => vertical ? { bottom: p * length } : { left: p * length };
5105
5124
  const onLayout = (e) => setLength(vertical ? e.nativeEvent.layout.height : e.nativeEvent.layout.width);
5106
5125
  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 };
5107
- return /* @__PURE__ */ jsxs48(View48, { style: [styles41.root, vertical ? styles41.rootVertical : null, disabled ? styles41.disabled : null, style], children: [
5108
- showLabel ? /* @__PURE__ */ jsxs48(View48, { style: styles41.header, children: [
5109
- /* @__PURE__ */ jsx55(Text17, { style: [styles41.label, { color: theme.textSecondary }], children: label }),
5110
- /* @__PURE__ */ jsx55(Text17, { "aria-hidden": true, style: [styles41.value, { color: theme.textSecondary }], children: current.map(formatValue).join(" \u2013 ") })
5126
+ return /* @__PURE__ */ jsxs51(View51, { style: [styles43.root, vertical ? styles43.rootVertical : null, disabled ? styles43.disabled : null, style], children: [
5127
+ showLabel ? /* @__PURE__ */ jsxs51(View51, { style: styles43.header, children: [
5128
+ /* @__PURE__ */ jsx58(Text17, { style: [styles43.label, { color: theme.textSecondary }], children: label }),
5129
+ /* @__PURE__ */ jsx58(Text17, { "aria-hidden": true, style: [styles43.value, { color: theme.textSecondary }], children: current.map(formatValue).join(" \u2013 ") })
5111
5130
  ] }) : null,
5112
- /* @__PURE__ */ jsxs48(View48, { ...responder.panHandlers, style: vertical ? styles41.controlVertical : styles41.control, children: [
5113
- /* @__PURE__ */ jsxs48(View48, { onLayout, pointerEvents: "none", style: [vertical ? styles41.trackVertical : styles41.track, { borderRadius: radius3.full, backgroundColor: theme.surface3 }], children: [
5114
- /* @__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: [
5115
- /* @__PURE__ */ jsx55(Defs14, { children: /* @__PURE__ */ jsxs48(LinearGradient14, { id: gradientId, x1: "0", y1: vertical ? "1" : "0", x2: vertical ? "0" : "1", y2: "0", children: [
5116
- /* @__PURE__ */ jsx55(Stop14, { offset: "0", stopColor: theme.accent }),
5117
- /* @__PURE__ */ jsx55(Stop14, { offset: "1", stopColor: theme.accent2 })
5131
+ /* @__PURE__ */ jsxs51(View51, { ...responder.panHandlers, style: vertical ? styles43.controlVertical : styles43.control, children: [
5132
+ /* @__PURE__ */ jsxs51(View51, { onLayout, pointerEvents: "none", style: [vertical ? styles43.trackVertical : styles43.track, { borderRadius: radius3.full, backgroundColor: theme.surface3 }], children: [
5133
+ /* @__PURE__ */ jsx58(View51, { style: [styles43.fill, fill, { borderRadius: radius3.full, overflow: "hidden", backgroundColor: theme.accent }], children: tone3 === "gradient" ? /* @__PURE__ */ jsxs51(Svg27, { width: "100%", height: "100%", "aria-hidden": true, children: [
5134
+ /* @__PURE__ */ jsx58(Defs14, { children: /* @__PURE__ */ jsxs51(LinearGradient11, { id: gradientId, x1: "0", y1: vertical ? "1" : "0", x2: vertical ? "0" : "1", y2: "0", children: [
5135
+ /* @__PURE__ */ jsx58(Stop14, { offset: "0", stopColor: theme.accent }),
5136
+ /* @__PURE__ */ jsx58(Stop14, { offset: "1", stopColor: theme.accent2 })
5118
5137
  ] }) }),
5119
- /* @__PURE__ */ jsx55(Rect5, { width: "100%", height: "100%", fill: `url(#${gradientId})` })
5138
+ /* @__PURE__ */ jsx58(Rect4, { width: "100%", height: "100%", fill: `url(#${gradientId})` })
5120
5139
  ] }) : null }),
5121
- 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))
5140
+ tickValues.map((t) => /* @__PURE__ */ jsx58(View51, { style: [vertical ? styles43.tickVertical : styles43.tick, along(pct(t)), { backgroundColor: t > lo && t < hi ? theme.onAccent : theme.borderStrong }] }, t))
5122
5141
  ] }),
5123
- current.map((v, i) => /* @__PURE__ */ jsx55(
5124
- View48,
5142
+ current.map((v, i) => /* @__PURE__ */ jsx58(
5143
+ View51,
5125
5144
  {
5126
5145
  accessible: true,
5127
5146
  role: "slider",
@@ -5140,16 +5159,16 @@ function Slider({
5140
5159
  onValueCommit?.(out(values));
5141
5160
  },
5142
5161
  pointerEvents: "none",
5143
- 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 }],
5144
- 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
5162
+ 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 }],
5163
+ children: floatingValue === "always" || floatingValue && dragging === i ? /* @__PURE__ */ jsx58(View51, { "aria-hidden": true, style: [vertical ? styles43.bubbleVertical : styles43.bubble, { backgroundColor: theme.textPrimary, borderRadius: radius3.md }], children: /* @__PURE__ */ jsx58(Text17, { style: [styles43.bubbleText, { color: theme.surface0 }], children: formatValue(v) }) }) : null
5145
5164
  },
5146
5165
  i
5147
5166
  ))
5148
5167
  ] }),
5149
- 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
5168
+ marks2?.length && !vertical ? /* @__PURE__ */ jsx58(View51, { "aria-hidden": true, style: styles43.marks, children: marks2.map((m) => /* @__PURE__ */ jsx58(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
5150
5169
  ] });
5151
5170
  }
5152
- var styles41 = StyleSheet41.create({
5171
+ var styles43 = StyleSheet43.create({
5153
5172
  root: { gap: 8, alignSelf: "stretch" },
5154
5173
  rootVertical: { alignSelf: "flex-start", alignItems: "center" },
5155
5174
  header: { flexDirection: "row", justifyContent: "space-between", alignItems: "baseline", gap: 12 },
@@ -5185,10 +5204,10 @@ var styles41 = StyleSheet41.create({
5185
5204
 
5186
5205
  // src/native/spinner.tsx
5187
5206
  import { ActivityIndicator as ActivityIndicator2 } from "react-native";
5188
- import { jsx as jsx56 } from "react/jsx-runtime";
5207
+ import { jsx as jsx59 } from "react/jsx-runtime";
5189
5208
  function Spinner({ label, size = "md", ...props }) {
5190
5209
  const { theme } = useTheme();
5191
- return /* @__PURE__ */ jsx56(
5210
+ return /* @__PURE__ */ jsx59(
5192
5211
  ActivityIndicator2,
5193
5212
  {
5194
5213
  accessible: true,
@@ -5204,8 +5223,8 @@ function Spinner({ label, size = "md", ...props }) {
5204
5223
 
5205
5224
  // src/native/splash-handoff.tsx
5206
5225
  import * as React39 from "react";
5207
- import { Animated as Animated23, Easing as Easing13, StyleSheet as StyleSheet42, View as View49 } from "react-native";
5208
- import { jsx as jsx57 } from "react/jsx-runtime";
5226
+ import { Animated as Animated23, Easing as Easing13, StyleSheet as StyleSheet44, View as View52 } from "react-native";
5227
+ import { jsx as jsx60 } from "react/jsx-runtime";
5209
5228
  function SplashHandoff({ product, ready, onShown, onDone, size = 96, background, label, duration = 320, style }) {
5210
5229
  const { theme } = useTheme();
5211
5230
  const reduce = useReducedMotion();
@@ -5223,7 +5242,7 @@ function SplashHandoff({ product, ready, onShown, onDone, size = 96, background,
5223
5242
  return () => animation.stop();
5224
5243
  }, [ready, reduce, duration, opacity, onDone]);
5225
5244
  if (gone) return null;
5226
- return /* @__PURE__ */ jsx57(
5245
+ return /* @__PURE__ */ jsx60(
5227
5246
  Animated23.View,
5228
5247
  {
5229
5248
  accessible: true,
@@ -5232,30 +5251,30 @@ function SplashHandoff({ product, ready, onShown, onDone, size = 96, background,
5232
5251
  "aria-busy": true,
5233
5252
  pointerEvents: ready ? "none" : "auto",
5234
5253
  onLayout: onShown,
5235
- style: [StyleSheet42.absoluteFill, styles42.root, { backgroundColor: background ?? theme.surface0, opacity }, style],
5236
- children: /* @__PURE__ */ jsx57(View49, { children: /* @__PURE__ */ jsx57(ProductMark, { id: product, size, animated: true }) })
5254
+ style: [StyleSheet44.absoluteFill, styles44.root, { backgroundColor: background ?? theme.surface0, opacity }, style],
5255
+ children: /* @__PURE__ */ jsx60(View52, { children: /* @__PURE__ */ jsx60(ProductMark, { id: product, size, animated: true }) })
5237
5256
  }
5238
5257
  );
5239
5258
  }
5240
- var styles42 = StyleSheet42.create({ root: { alignItems: "center", justifyContent: "center", zIndex: 100 } });
5259
+ var styles44 = StyleSheet44.create({ root: { alignItems: "center", justifyContent: "center", zIndex: 100 } });
5241
5260
 
5242
5261
  // src/native/step-progress.tsx
5243
- import { Pressable as Pressable22, StyleSheet as StyleSheet43, View as View50 } from "react-native";
5262
+ import { Pressable as Pressable22, StyleSheet as StyleSheet45, View as View53 } from "react-native";
5244
5263
  import Svg28, { Path as Path23 } from "react-native-svg";
5245
- import { jsx as jsx58, jsxs as jsxs49 } from "react/jsx-runtime";
5264
+ import { jsx as jsx61, jsxs as jsxs52 } from "react/jsx-runtime";
5246
5265
  function StepProgress({ step, total, label, backLabel, onBack, trailing, style }) {
5247
5266
  const { theme, insets } = useTheme();
5248
5267
  const words2 = label(step, total);
5249
- return /* @__PURE__ */ jsxs49(View50, { style: [styles43.root, { paddingTop: insets.top + 8 }, style], children: [
5250
- /* @__PURE__ */ jsxs49(View50, { style: styles43.row, children: [
5251
- 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 }),
5252
- /* @__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)) }),
5253
- /* @__PURE__ */ jsx58(View50, { style: styles43.trailing, children: trailing })
5268
+ return /* @__PURE__ */ jsxs52(View53, { style: [styles45.root, { paddingTop: insets.top + 8 }, style], children: [
5269
+ /* @__PURE__ */ jsxs52(View53, { style: styles45.row, children: [
5270
+ onBack && backLabel ? /* @__PURE__ */ jsx61(Pressable22, { role: "button", "aria-label": backLabel, hitSlop: 10, onPress: onBack, style: styles45.back, children: /* @__PURE__ */ jsx61(Svg28, { width: 22, height: 22, viewBox: "0 0 24 24", "aria-hidden": true, children: /* @__PURE__ */ jsx61(Path23, { d: "M15 5l-7 7 7 7", stroke: theme.textPrimary, strokeWidth: 2.4, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" }) }) }) : /* @__PURE__ */ jsx61(View53, { style: styles45.back }),
5271
+ /* @__PURE__ */ jsx61(View53, { 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__ */ jsx61(View53, { style: [styles45.bar, { backgroundColor: i < step ? theme.accent : theme.surface3 }] }, i)) }),
5272
+ /* @__PURE__ */ jsx61(View53, { style: styles45.trailing, children: trailing })
5254
5273
  ] }),
5255
- /* @__PURE__ */ jsx58(Txt, { variant: "caption", tone: "secondary", style: styles43.words, "aria-hidden": true, children: words2 })
5274
+ /* @__PURE__ */ jsx61(Txt, { variant: "caption", tone: "secondary", style: styles45.words, "aria-hidden": true, children: words2 })
5256
5275
  ] });
5257
5276
  }
5258
- var styles43 = StyleSheet43.create({
5277
+ var styles45 = StyleSheet45.create({
5259
5278
  root: { paddingHorizontal: 12, gap: 6 },
5260
5279
  row: { flexDirection: "row", alignItems: "center", gap: 8 },
5261
5280
  back: { width: 40, height: 40, alignItems: "center", justifyContent: "center" },
@@ -5266,36 +5285,36 @@ var styles43 = StyleSheet43.create({
5266
5285
  });
5267
5286
 
5268
5287
  // src/native/stepper.tsx
5269
- import { StyleSheet as StyleSheet44, View as View51 } from "react-native";
5288
+ import { StyleSheet as StyleSheet46, View as View54 } from "react-native";
5270
5289
  import Svg29, { Circle as Circle16, Path as Path24 } from "react-native-svg";
5271
- import { jsx as jsx59, jsxs as jsxs50 } from "react/jsx-runtime";
5290
+ import { jsx as jsx62, jsxs as jsxs53 } from "react/jsx-runtime";
5272
5291
  var WORDS = { done: "done", current: "in progress", upcoming: "to come", error: "failed" };
5273
5292
  function Stepper({ steps, current = 0, orientation = "vertical", statusLabels, "aria-label": label, style }) {
5274
5293
  const { theme } = useTheme();
5275
5294
  const words2 = { ...WORDS, ...statusLabels };
5276
5295
  const vertical = orientation === "vertical";
5277
- return /* @__PURE__ */ jsx59(View51, { role: "list", "aria-label": label, style: [vertical ? styles44.column : styles44.row, style], children: steps.map((step, i) => {
5296
+ return /* @__PURE__ */ jsx62(View54, { role: "list", "aria-label": label, style: [vertical ? styles46.column : styles46.row, style], children: steps.map((step, i) => {
5278
5297
  const status = step.status ?? (i < current ? "done" : i === current ? "current" : "upcoming");
5279
5298
  const last = i === steps.length - 1;
5280
- 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: [
5281
- /* @__PURE__ */ jsx59(Circle16, { cx: 12, cy: 12, r: 10, fill: status === "done" ? theme.accent : "none", stroke: status === "done" ? theme.accent : theme.borderStrong, strokeWidth: 2 }),
5282
- 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
5299
+ const node = status === "current" ? /* @__PURE__ */ jsx62(LoaderGlyph, { value: step.value ?? null, size: 24 }) : status === "error" ? /* @__PURE__ */ jsx62(LoaderGlyph, { state: "error", size: 24 }) : /* @__PURE__ */ jsxs53(Svg29, { width: 24, height: 24, viewBox: "0 0 24 24", "aria-hidden": true, children: [
5300
+ /* @__PURE__ */ jsx62(Circle16, { cx: 12, cy: 12, r: 10, fill: status === "done" ? theme.accent : "none", stroke: status === "done" ? theme.accent : theme.borderStrong, strokeWidth: 2 }),
5301
+ status === "done" ? /* @__PURE__ */ jsx62(Path24, { d: "M7.5 12.3l3 3 6-6.3", stroke: theme.onAccent, strokeWidth: 2.2, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" }) : null
5283
5302
  ] });
5284
- const connector = !last ? /* @__PURE__ */ jsx59(View51, { "aria-hidden": true, style: [vertical ? styles44.vLine : styles44.hLine, { backgroundColor: status === "done" ? theme.accent : theme.borderDefault }] }) : null;
5285
- return /* @__PURE__ */ jsxs50(View51, { role: "listitem", accessible: true, "aria-label": `${step.title}, ${words2[status]}`, style: vertical ? styles44.vStep : styles44.hStep, children: [
5286
- /* @__PURE__ */ jsxs50(View51, { style: vertical ? styles44.vRail : styles44.hRail, children: [
5303
+ const connector = !last ? /* @__PURE__ */ jsx62(View54, { "aria-hidden": true, style: [vertical ? styles46.vLine : styles46.hLine, { backgroundColor: status === "done" ? theme.accent : theme.borderDefault }] }) : null;
5304
+ return /* @__PURE__ */ jsxs53(View54, { role: "listitem", accessible: true, "aria-label": `${step.title}, ${words2[status]}`, style: vertical ? styles46.vStep : styles46.hStep, children: [
5305
+ /* @__PURE__ */ jsxs53(View54, { style: vertical ? styles46.vRail : styles46.hRail, children: [
5287
5306
  node,
5288
5307
  connector
5289
5308
  ] }),
5290
- /* @__PURE__ */ jsxs50(View51, { style: [styles44.body, vertical && !last ? { paddingBottom: 20 } : null], children: [
5291
- /* @__PURE__ */ jsx59(Txt, { variant: "label", tone: status === "upcoming" ? "secondary" : "text", numberOfLines: vertical ? void 0 : 2, children: step.title }),
5292
- step.description ? /* @__PURE__ */ jsx59(Txt, { variant: "caption", tone: "secondary", children: step.description }) : null,
5293
- step.content && (status === "current" || status === "error") ? /* @__PURE__ */ jsx59(View51, { style: styles44.content, children: step.content }) : null
5309
+ /* @__PURE__ */ jsxs53(View54, { style: [styles46.body, vertical && !last ? { paddingBottom: 20 } : null], children: [
5310
+ /* @__PURE__ */ jsx62(Txt, { variant: "label", tone: status === "upcoming" ? "secondary" : "text", numberOfLines: vertical ? void 0 : 2, children: step.title }),
5311
+ step.description ? /* @__PURE__ */ jsx62(Txt, { variant: "caption", tone: "secondary", children: step.description }) : null,
5312
+ step.content && (status === "current" || status === "error") ? /* @__PURE__ */ jsx62(View54, { style: styles46.content, children: step.content }) : null
5294
5313
  ] })
5295
5314
  ] }, i);
5296
5315
  }) });
5297
5316
  }
5298
- var styles44 = StyleSheet44.create({
5317
+ var styles46 = StyleSheet46.create({
5299
5318
  column: { gap: 0 },
5300
5319
  row: { flexDirection: "row" },
5301
5320
  vStep: { flexDirection: "row", gap: 12 },
@@ -5310,58 +5329,58 @@ var styles44 = StyleSheet44.create({
5310
5329
 
5311
5330
  // src/native/swipe-deck.tsx
5312
5331
  import * as React40 from "react";
5313
- 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";
5314
- import Svg30, { Defs as Defs15, LinearGradient as LinearGradient15, Path as Path25, Rect as Rect6, Stop as Stop15 } from "react-native-svg";
5315
- import { Fragment as Fragment8, jsx as jsx60, jsxs as jsxs51 } from "react/jsx-runtime";
5332
+ 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 View55 } from "react-native";
5333
+ import Svg30, { Defs as Defs15, LinearGradient as LinearGradient12, Path as Path25, Rect as Rect5, Stop as Stop15 } from "react-native-svg";
5334
+ import { Fragment as Fragment8, jsx as jsx63, jsxs as jsxs54 } from "react/jsx-runtime";
5316
5335
  function PersonCard({ photos, name, age, badge, meta, bio, footer, photoLabel = (n, t) => `Photo ${n} of ${t}`, style }) {
5317
5336
  const { theme, radius: radius3 } = useTheme();
5318
5337
  const [index, setIndex] = React40.useState(0);
5319
5338
  const gradient = useSvgId("kz-profile-");
5320
5339
  const [box, setBox] = React40.useState(null);
5321
5340
  const photo = photos[index];
5322
- return /* @__PURE__ */ jsxs51(
5323
- View52,
5341
+ return /* @__PURE__ */ jsxs54(
5342
+ View55,
5324
5343
  {
5325
5344
  accessible: Platform4.OS !== "web",
5326
5345
  accessibilityActions: photos.length > 1 ? [{ name: "increment" }, { name: "decrement" }] : [],
5327
5346
  onAccessibilityAction: (e) => setIndex((i) => Math.max(0, Math.min(photos.length - 1, i + (e.nativeEvent.actionName === "increment" ? 1 : -1)))),
5328
5347
  role: Platform4.OS === "web" ? "group" : "img",
5329
5348
  "aria-label": [`${name}${age !== void 0 ? `, ${age}` : ""}`, bio, photos.length > 1 ? photoLabel(index + 1, photos.length) : null].filter(Boolean).join(". "),
5330
- style: [styles45.card, { borderRadius: radius3.xl, backgroundColor: theme.media }, style],
5349
+ style: [styles47.card, { borderRadius: radius3.xl, backgroundColor: theme.media }, style],
5331
5350
  children: [
5332
- photo ? /* @__PURE__ */ jsx60(Image5, { testID: "person-card-photo", source: { uri: photo.uri }, style: StyleSheet45.absoluteFill, resizeMode: "cover" }) : null,
5333
- photos.length > 1 ? /* @__PURE__ */ jsxs51(Fragment8, { children: [
5334
- /* @__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)) }),
5335
- /* @__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)) }),
5336
- /* @__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)) })
5351
+ photo ? /* @__PURE__ */ jsx63(Image5, { testID: "person-card-photo", source: { uri: photo.uri }, style: StyleSheet47.absoluteFill, resizeMode: "cover" }) : null,
5352
+ photos.length > 1 ? /* @__PURE__ */ jsxs54(Fragment8, { children: [
5353
+ /* @__PURE__ */ jsx63(View55, { style: styles47.bars, "aria-hidden": true, children: photos.map((_, i) => /* @__PURE__ */ jsx63(View55, { style: [styles47.bar, { backgroundColor: theme.textOnMedia, opacity: i === index ? 1 : 0.4 }] }, i)) }),
5354
+ /* @__PURE__ */ jsx63(Pressable23, { "aria-hidden": true, accessible: false, focusable: false, tabIndex: -1, style: [styles47.half, { left: 0 }], onPress: () => setIndex((i) => Math.max(0, i - 1)) }),
5355
+ /* @__PURE__ */ jsx63(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)) })
5337
5356
  ] }) : null,
5338
- /* @__PURE__ */ jsxs51(
5339
- View52,
5357
+ /* @__PURE__ */ jsxs54(
5358
+ View55,
5340
5359
  {
5341
5360
  testID: "person-card-overlay",
5342
5361
  pointerEvents: "box-none",
5343
- style: styles45.bottom,
5362
+ style: styles47.bottom,
5344
5363
  onLayout: (e) => setBox({ width: e.nativeEvent.layout.width, height: e.nativeEvent.layout.height }),
5345
5364
  children: [
5346
- box ? /* @__PURE__ */ jsxs51(Svg30, { testID: "person-card-scrim", style: styles45.scrim, width: box.width, height: box.height, "aria-hidden": true, children: [
5347
- /* @__PURE__ */ jsx60(Defs15, { children: /* @__PURE__ */ jsxs51(LinearGradient15, { id: gradient, x1: "0", y1: "0", x2: "0", y2: "1", children: [
5348
- /* @__PURE__ */ jsx60(Stop15, { offset: "0", stopColor: theme.scrimStrong, stopOpacity: 0 }),
5349
- /* @__PURE__ */ jsx60(Stop15, { offset: "0.5", stopColor: theme.scrimStrong, stopOpacity: 0.8 }),
5350
- /* @__PURE__ */ jsx60(Stop15, { offset: "1", stopColor: theme.scrimStrong, stopOpacity: 1 })
5365
+ box ? /* @__PURE__ */ jsxs54(Svg30, { testID: "person-card-scrim", style: styles47.scrim, width: box.width, height: box.height, "aria-hidden": true, children: [
5366
+ /* @__PURE__ */ jsx63(Defs15, { children: /* @__PURE__ */ jsxs54(LinearGradient12, { id: gradient, x1: "0", y1: "0", x2: "0", y2: "1", children: [
5367
+ /* @__PURE__ */ jsx63(Stop15, { offset: "0", stopColor: theme.scrimStrong, stopOpacity: 0 }),
5368
+ /* @__PURE__ */ jsx63(Stop15, { offset: "0.5", stopColor: theme.scrimStrong, stopOpacity: 0.8 }),
5369
+ /* @__PURE__ */ jsx63(Stop15, { offset: "1", stopColor: theme.scrimStrong, stopOpacity: 1 })
5351
5370
  ] }) }),
5352
- /* @__PURE__ */ jsx60(Rect6, { x: 0, y: 0, width: box.width, height: box.height, fill: `url(#${gradient})` })
5371
+ /* @__PURE__ */ jsx63(Rect5, { x: 0, y: 0, width: box.width, height: box.height, fill: `url(#${gradient})` })
5353
5372
  ] }) : null,
5354
- /* @__PURE__ */ jsxs51(View52, { style: styles45.text, children: [
5355
- /* @__PURE__ */ jsxs51(View52, { style: styles45.nameRow, children: [
5356
- /* @__PURE__ */ jsxs51(Txt, { variant: "display", tone: "onMedia", style: styles45.name, numberOfLines: 1, children: [
5373
+ /* @__PURE__ */ jsxs54(View55, { style: styles47.text, children: [
5374
+ /* @__PURE__ */ jsxs54(View55, { style: styles47.nameRow, children: [
5375
+ /* @__PURE__ */ jsxs54(Txt, { variant: "display", tone: "onMedia", style: styles47.name, numberOfLines: 1, children: [
5357
5376
  name,
5358
- age !== void 0 ? /* @__PURE__ */ jsx60(Txt, { variant: "display", tone: "onMedia", style: styles45.age, children: ` ${age}` }) : null
5377
+ age !== void 0 ? /* @__PURE__ */ jsx63(Txt, { variant: "display", tone: "onMedia", style: styles47.age, children: ` ${age}` }) : null
5359
5378
  ] }),
5360
5379
  badge
5361
5380
  ] }),
5362
5381
  meta,
5363
- bio ? /* @__PURE__ */ jsx60(Txt, { tone: "onMedia", numberOfLines: 2, children: bio }) : null,
5364
- footer ? /* @__PURE__ */ jsx60(View52, { style: styles45.footer, children: footer }) : null
5382
+ bio ? /* @__PURE__ */ jsx63(Txt, { tone: "onMedia", numberOfLines: 2, children: bio }) : null,
5383
+ footer ? /* @__PURE__ */ jsx63(View55, { style: styles47.footer, children: footer }) : null
5365
5384
  ] })
5366
5385
  ]
5367
5386
  }
@@ -5405,7 +5424,7 @@ function SwipeDeck({ items: items2, getId, renderCard, onSwipe, empty: empty2, l
5405
5424
  const rotate = x.interpolate({ inputRange: [-width, 0, width], outputRange: ["-14deg", "0deg", "14deg"] });
5406
5425
  const likeOpacity = x.interpolate({ inputRange: [0, width / 4], outputRange: [0, 1], extrapolate: "clamp" });
5407
5426
  const passOpacity = x.interpolate({ inputRange: [-width / 4, 0], outputRange: [1, 0], extrapolate: "clamp" });
5408
- const button = (direction) => /* @__PURE__ */ jsx60(
5427
+ const button = (direction) => /* @__PURE__ */ jsx63(
5409
5428
  Pressable23,
5410
5429
  {
5411
5430
  role: "button",
@@ -5413,18 +5432,18 @@ function SwipeDeck({ items: items2, getId, renderCard, onSwipe, empty: empty2, l
5413
5432
  disabled: !top,
5414
5433
  onPress: () => decide(direction),
5415
5434
  style: ({ pressed }) => [
5416
- styles45.button,
5435
+ styles47.button,
5417
5436
  { borderColor: direction === "like" ? theme.success : theme.danger, backgroundColor: theme.surface1, transform: [{ scale: pressed ? 0.92 : 1 }], opacity: top ? 1 : 0.4 }
5418
5437
  ],
5419
- 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" }) })
5438
+ children: /* @__PURE__ */ jsx63(Svg30, { width: 28, height: 28, viewBox: "0 0 24 24", "aria-hidden": true, children: direction === "like" ? /* @__PURE__ */ jsx63(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__ */ jsx63(Path25, { d: "M6 6l12 12M18 6 6 18", stroke: theme.danger, strokeWidth: 3, strokeLinecap: "round" }) })
5420
5439
  }
5421
5440
  );
5422
- return /* @__PURE__ */ jsxs51(View52, { style: [styles45.deck, style], children: [
5423
- /* @__PURE__ */ jsxs51(View52, { style: styles45.stack, children: [
5441
+ return /* @__PURE__ */ jsxs54(View55, { style: [styles47.deck, style], children: [
5442
+ /* @__PURE__ */ jsxs54(View55, { style: styles47.stack, children: [
5424
5443
  !top ? empty2 ?? null : null,
5425
5444
  items2.slice(0, 2).reverse().map((item) => {
5426
5445
  const isTop = item === top;
5427
- return /* @__PURE__ */ jsxs51(
5446
+ return /* @__PURE__ */ jsxs54(
5428
5447
  Animated24.View,
5429
5448
  {
5430
5449
  ...isTop ? pan.panHandlers : {},
@@ -5433,12 +5452,12 @@ function SwipeDeck({ items: items2, getId, renderCard, onSwipe, empty: empty2, l
5433
5452
  "aria-hidden": !isTop,
5434
5453
  importantForAccessibility: isTop ? "auto" : "no-hide-descendants",
5435
5454
  pointerEvents: isTop ? "auto" : "none",
5436
- style: [StyleSheet45.absoluteFill, isTop ? { transform: [{ translateX: x }, { rotate }] } : { transform: [{ scale: 0.96 }], opacity: 0.9 }],
5455
+ style: [StyleSheet47.absoluteFill, isTop ? { transform: [{ translateX: x }, { rotate }] } : { transform: [{ scale: 0.96 }], opacity: 0.9 }],
5437
5456
  children: [
5438
5457
  renderCard(item),
5439
- isTop ? /* @__PURE__ */ jsxs51(Fragment8, { children: [
5440
- /* @__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() }) }),
5441
- /* @__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() }) })
5458
+ isTop ? /* @__PURE__ */ jsxs54(Fragment8, { children: [
5459
+ /* @__PURE__ */ jsx63(Animated24.View, { pointerEvents: "none", style: [styles47.stamp, styles47.stampLike, { borderColor: theme.success, opacity: likeOpacity }], "aria-hidden": true, children: /* @__PURE__ */ jsx63(Txt, { variant: "title", style: { color: theme.success }, children: labels.likeStamp ?? labels.like.toUpperCase() }) }),
5460
+ /* @__PURE__ */ jsx63(Animated24.View, { pointerEvents: "none", style: [styles47.stamp, styles47.stampPass, { borderColor: theme.danger, opacity: passOpacity }], "aria-hidden": true, children: /* @__PURE__ */ jsx63(Txt, { variant: "title", style: { color: theme.danger }, children: labels.passStamp ?? labels.pass.toUpperCase() }) })
5442
5461
  ] }) : null
5443
5462
  ]
5444
5463
  },
@@ -5446,13 +5465,13 @@ function SwipeDeck({ items: items2, getId, renderCard, onSwipe, empty: empty2, l
5446
5465
  );
5447
5466
  })
5448
5467
  ] }),
5449
- hideButtons ? null : /* @__PURE__ */ jsxs51(View52, { style: styles45.buttons, children: [
5468
+ hideButtons ? null : /* @__PURE__ */ jsxs54(View55, { style: styles47.buttons, children: [
5450
5469
  button("pass"),
5451
5470
  button("like")
5452
5471
  ] })
5453
5472
  ] });
5454
5473
  }
5455
- var styles45 = StyleSheet45.create({
5474
+ var styles47 = StyleSheet47.create({
5456
5475
  card: { flex: 1, overflow: "hidden" },
5457
5476
  bars: { position: "absolute", top: 8, left: 8, right: 8, flexDirection: "row", gap: 4 },
5458
5477
  bar: { flex: 1, height: 3, borderRadius: 2 },
@@ -5475,8 +5494,8 @@ var styles45 = StyleSheet45.create({
5475
5494
 
5476
5495
  // src/native/swipeable-row.tsx
5477
5496
  import * as React41 from "react";
5478
- import { Animated as Animated25, PanResponder as PanResponder4, Pressable as Pressable24, StyleSheet as StyleSheet46, View as View53 } from "react-native";
5479
- import { jsx as jsx61, jsxs as jsxs52 } from "react/jsx-runtime";
5497
+ import { Animated as Animated25, PanResponder as PanResponder4, Pressable as Pressable24, StyleSheet as StyleSheet48, View as View56 } from "react-native";
5498
+ import { jsx as jsx64, jsxs as jsxs55 } from "react/jsx-runtime";
5480
5499
  var toneColor = (t, tone3) => ({ neutral: t.surface3, accent: t.accent, success: t.success, warning: t.warning, danger: t.danger })[tone3 ?? "neutral"];
5481
5500
  var toneText = (tone3) => tone3 === "neutral" || tone3 === void 0 ? "text" : "onAccent";
5482
5501
  function SwipeableRow({ children, trailing = [], leading = [], fullSwipe = 0.6, actionWidth = 80, onActivate, testID, style }) {
@@ -5524,18 +5543,18 @@ function SwipeableRow({ children, trailing = [], leading = [], fullSwipe = 0.6,
5524
5543
  [trailing, leading, fullSwipe, width, actionWidth]
5525
5544
  // eslint-disable-line react-hooks/exhaustive-deps -- run/settle are stable in effect
5526
5545
  );
5527
- 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) => (
5546
+ const side = (actions, edge) => /* @__PURE__ */ jsx64(View56, { "aria-hidden": true, style: [styles48.side, edge === "left" ? { left: 0 } : { right: 0, flexDirection: "row-reverse" }], children: actions.map((action, i) => (
5528
5547
  // eslint-disable-next-line react-hooks/refs -- runs on a press, never during render
5529
- /* @__PURE__ */ jsxs52(Pressable24, { focusable: false, tabIndex: -1, onPress: () => run(action), style: [styles46.action, { width: actionWidth, backgroundColor: toneColor(theme, action.tone) }], children: [
5548
+ /* @__PURE__ */ jsxs55(Pressable24, { focusable: false, tabIndex: -1, onPress: () => run(action), style: [styles48.action, { width: actionWidth, backgroundColor: toneColor(theme, action.tone) }], children: [
5530
5549
  action.icon,
5531
- /* @__PURE__ */ jsx61(Txt, { variant: "caption", tone: toneText(action.tone), style: styles46.actionText, numberOfLines: 1, children: action.label })
5550
+ /* @__PURE__ */ jsx64(Txt, { variant: "caption", tone: toneText(action.tone), style: styles48.actionText, numberOfLines: 1, children: action.label })
5532
5551
  ] }, i)
5533
5552
  )) });
5534
5553
  const all = [...leading, ...trailing];
5535
- return /* @__PURE__ */ jsxs52(View53, { style: [styles46.root, style], onLayout: (e) => setWidth(e.nativeEvent.layout.width), children: [
5554
+ return /* @__PURE__ */ jsxs55(View56, { style: [styles48.root, style], onLayout: (e) => setWidth(e.nativeEvent.layout.width), children: [
5536
5555
  leading.length > 0 ? side(leading, "left") : null,
5537
5556
  trailing.length > 0 ? side(trailing, "right") : null,
5538
- /* @__PURE__ */ jsx61(
5557
+ /* @__PURE__ */ jsx64(
5539
5558
  Animated25.View,
5540
5559
  {
5541
5560
  ...pan.panHandlers,
@@ -5547,13 +5566,13 @@ function SwipeableRow({ children, trailing = [], leading = [], fullSwipe = 0.6,
5547
5566
  const action = all.find((a) => a.label === e.nativeEvent.actionName);
5548
5567
  if (action) action.onPress();
5549
5568
  },
5550
- style: [styles46.front, { backgroundColor: theme.surface0, transform: [{ translateX: x }] }],
5569
+ style: [styles48.front, { backgroundColor: theme.surface0, transform: [{ translateX: x }] }],
5551
5570
  children
5552
5571
  }
5553
5572
  )
5554
5573
  ] });
5555
5574
  }
5556
- var styles46 = StyleSheet46.create({
5575
+ var styles48 = StyleSheet48.create({
5557
5576
  root: { overflow: "hidden" },
5558
5577
  side: { position: "absolute", top: 0, bottom: 0, flexDirection: "row" },
5559
5578
  action: { alignItems: "center", justifyContent: "center", gap: 4, paddingHorizontal: 6 },
@@ -5563,8 +5582,8 @@ var styles46 = StyleSheet46.create({
5563
5582
 
5564
5583
  // src/native/switch.tsx
5565
5584
  import * as React42 from "react";
5566
- import { Animated as Animated26, Pressable as Pressable25, StyleSheet as StyleSheet47, Text as Text18, View as View54 } from "react-native";
5567
- import { jsx as jsx62, jsxs as jsxs53 } from "react/jsx-runtime";
5585
+ import { Animated as Animated26, Pressable as Pressable25, StyleSheet as StyleSheet49, Text as Text18, View as View57 } from "react-native";
5586
+ import { jsx as jsx65, jsxs as jsxs56 } from "react/jsx-runtime";
5568
5587
  var SIZES = { sm: { w: 40, h: 24, knob: 18 }, md: { w: 52, h: 32, knob: 26 } };
5569
5588
  function Switch({ label, checked, defaultChecked = false, onCheckedChange, description, showLabel, size = "md", error, disabled, style }) {
5570
5589
  const { theme, motion: motion3, haptic } = useTheme();
@@ -5581,11 +5600,11 @@ function Switch({ label, checked, defaultChecked = false, onCheckedChange, descr
5581
5600
  if (checked === void 0) setOwn(!on);
5582
5601
  onCheckedChange?.(!on);
5583
5602
  };
5584
- 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(
5603
+ const track = /* @__PURE__ */ jsx65(View57, { 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__ */ jsx65(
5585
5604
  Animated26.View,
5586
5605
  {
5587
5606
  style: [
5588
- styles47.knob,
5607
+ styles49.knob,
5589
5608
  {
5590
5609
  width: d.knob,
5591
5610
  height: d.knob,
@@ -5607,19 +5626,19 @@ function Switch({ label, checked, defaultChecked = false, onCheckedChange, descr
5607
5626
  onPress: toggle
5608
5627
  };
5609
5628
  if (!showLabel)
5610
- 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 });
5611
- return /* @__PURE__ */ jsxs53(View54, { style: [styles47.root, style], children: [
5612
- /* @__PURE__ */ jsxs53(Pressable25, { ...a11y, style: [styles47.row, disabled ? styles47.disabled : null], children: [
5613
- /* @__PURE__ */ jsxs53(View54, { style: styles47.text, children: [
5614
- /* @__PURE__ */ jsx62(Text18, { style: [styles47.label, { color: theme.textPrimary }], children: label }),
5615
- description ? /* @__PURE__ */ jsx62(Text18, { style: [styles47.description, { color: theme.textSecondary }], children: description }) : null
5629
+ return /* @__PURE__ */ jsx65(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 });
5630
+ return /* @__PURE__ */ jsxs56(View57, { style: [styles49.root, style], children: [
5631
+ /* @__PURE__ */ jsxs56(Pressable25, { ...a11y, style: [styles49.row, disabled ? styles49.disabled : null], children: [
5632
+ /* @__PURE__ */ jsxs56(View57, { style: styles49.text, children: [
5633
+ /* @__PURE__ */ jsx65(Text18, { style: [styles49.label, { color: theme.textPrimary }], children: label }),
5634
+ description ? /* @__PURE__ */ jsx65(Text18, { style: [styles49.description, { color: theme.textSecondary }], children: description }) : null
5616
5635
  ] }),
5617
5636
  track
5618
5637
  ] }),
5619
- error ? /* @__PURE__ */ jsx62(Text18, { role: "alert", "aria-live": "polite", style: [styles47.description, { color: theme.dangerText }], children: error }) : null
5638
+ error ? /* @__PURE__ */ jsx65(Text18, { role: "alert", "aria-live": "polite", style: [styles49.description, { color: theme.dangerText }], children: error }) : null
5620
5639
  ] });
5621
5640
  }
5622
- var styles47 = StyleSheet47.create({
5641
+ var styles49 = StyleSheet49.create({
5623
5642
  root: { gap: 2, alignSelf: "stretch" },
5624
5643
  row: { flexDirection: "row", alignItems: "center", gap: 16, minHeight: 48 },
5625
5644
  text: { flex: 1, gap: 2 },
@@ -5631,15 +5650,15 @@ var styles47 = StyleSheet47.create({
5631
5650
  });
5632
5651
 
5633
5652
  // src/native/tab-bar.tsx
5634
- import { Pressable as Pressable26, StyleSheet as StyleSheet48, Text as Text19, View as View55 } from "react-native";
5635
- import { jsx as jsx63, jsxs as jsxs54 } from "react/jsx-runtime";
5653
+ import { Pressable as Pressable26, StyleSheet as StyleSheet50, Text as Text19, View as View58 } from "react-native";
5654
+ import { jsx as jsx66, jsxs as jsxs57 } from "react/jsx-runtime";
5636
5655
  function TabBar({ items: items2, value, onValueChange, onReselect, "aria-label": label, style }) {
5637
5656
  const { theme, insets, haptic } = useTheme();
5638
- 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) => {
5657
+ return /* @__PURE__ */ jsx66(View58, { 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) => {
5639
5658
  const selected = item.value === value;
5640
5659
  const color = selected ? theme.accentText : theme.textSecondary;
5641
5660
  const badge = item.badge === true ? "" : typeof item.badge === "number" && item.badge > 0 ? item.badge > 99 ? "99+" : String(item.badge) : null;
5642
- return /* @__PURE__ */ jsxs54(
5661
+ return /* @__PURE__ */ jsxs57(
5643
5662
  Pressable26,
5644
5663
  {
5645
5664
  role: "tab",
@@ -5649,22 +5668,22 @@ function TabBar({ items: items2, value, onValueChange, onReselect, "aria-label":
5649
5668
  if (selected) onReselect?.(item.value);
5650
5669
  else onValueChange(item.value);
5651
5670
  },
5652
- style: ({ pressed }) => [styles48.item, { opacity: pressed ? 0.7 : 1 }],
5671
+ style: ({ pressed }) => [styles50.item, { opacity: pressed ? 0.7 : 1 }],
5653
5672
  children: [
5654
- /* @__PURE__ */ jsxs54(View55, { "aria-hidden": true, style: styles48.icon, children: [
5673
+ /* @__PURE__ */ jsxs57(View58, { "aria-hidden": true, style: styles50.icon, children: [
5655
5674
  item.icon(selected, color),
5656
- 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
5675
+ badge !== null ? /* @__PURE__ */ jsx66(View58, { style: [badge ? styles50.count : styles50.dot, { backgroundColor: theme.danger, borderColor: theme.surface1 }], children: badge ? /* @__PURE__ */ jsx66(Text19, { style: [styles50.countText, { color: theme.onAccent }], children: badge }) : null }) : null
5657
5676
  ] }),
5658
- /* @__PURE__ */ jsx63(Text19, { numberOfLines: 1, style: [styles48.label, { color, fontWeight: selected ? "700" : "500" }], children: item.label }),
5659
- badge !== null && item.badgeLabel ? /* @__PURE__ */ jsx63(Text19, { style: styles48.unseen, children: `, ${item.badgeLabel}` }) : null
5677
+ /* @__PURE__ */ jsx66(Text19, { numberOfLines: 1, style: [styles50.label, { color, fontWeight: selected ? "700" : "500" }], children: item.label }),
5678
+ badge !== null && item.badgeLabel ? /* @__PURE__ */ jsx66(Text19, { style: styles50.unseen, children: `, ${item.badgeLabel}` }) : null
5660
5679
  ]
5661
5680
  },
5662
5681
  item.value
5663
5682
  );
5664
5683
  }) });
5665
5684
  }
5666
- var styles48 = StyleSheet48.create({
5667
- bar: { flexDirection: "row", borderTopWidth: StyleSheet48.hairlineWidth, paddingTop: 6 },
5685
+ var styles50 = StyleSheet50.create({
5686
+ bar: { flexDirection: "row", borderTopWidth: StyleSheet50.hairlineWidth, paddingTop: 6 },
5668
5687
  item: { flex: 1, alignItems: "center", gap: 2, minHeight: 48, justifyContent: "center" },
5669
5688
  icon: { width: 28, height: 26, alignItems: "center", justifyContent: "center" },
5670
5689
  label: { fontSize: 11, lineHeight: 14 },
@@ -5676,8 +5695,8 @@ var styles48 = StyleSheet48.create({
5676
5695
 
5677
5696
  // src/native/tabs.tsx
5678
5697
  import * as React43 from "react";
5679
- import { Pressable as Pressable27, ScrollView as ScrollView7, StyleSheet as StyleSheet49, View as View56 } from "react-native";
5680
- import { jsx as jsx64, jsxs as jsxs55 } from "react/jsx-runtime";
5698
+ import { Pressable as Pressable27, ScrollView as ScrollView7, StyleSheet as StyleSheet51, View as View59 } from "react-native";
5699
+ import { jsx as jsx67, jsxs as jsxs58 } from "react/jsx-runtime";
5681
5700
  function Tabs({ items: items2, value, defaultValue, onValueChange, "aria-label": label, variant = "underline", style }) {
5682
5701
  const { theme, radius: radius3, haptic } = useTheme();
5683
5702
  const [own, setOwn] = React43.useState(defaultValue ?? items2[0]?.value);
@@ -5691,7 +5710,7 @@ function Tabs({ items: items2, value, defaultValue, onValueChange, "aria-label":
5691
5710
  const segmented = variant === "segmented";
5692
5711
  const tabs = items2.map((item) => {
5693
5712
  const selected = item.value === current;
5694
- return /* @__PURE__ */ jsx64(
5713
+ return /* @__PURE__ */ jsx67(
5695
5714
  Pressable27,
5696
5715
  {
5697
5716
  role: "tab",
@@ -5700,45 +5719,45 @@ function Tabs({ items: items2, value, defaultValue, onValueChange, "aria-label":
5700
5719
  disabled: item.disabled,
5701
5720
  onPress: () => select(item.value),
5702
5721
  style: [
5703
- segmented ? styles49.segment : styles49.tab,
5722
+ segmented ? styles51.segment : styles51.tab,
5704
5723
  segmented && selected ? { backgroundColor: theme.surface0, borderColor: theme.borderDefault, borderRadius: radius3.sm } : null,
5705
5724
  !segmented ? { borderBottomColor: selected ? theme.accent : "transparent" } : null,
5706
- item.disabled ? styles49.disabled : null
5725
+ item.disabled ? styles51.disabled : null
5707
5726
  ],
5708
- children: /* @__PURE__ */ jsxs55(Txt, { variant: "label", tone: selected ? "text" : "secondary", numberOfLines: 1, children: [
5727
+ children: /* @__PURE__ */ jsxs58(Txt, { variant: "label", tone: selected ? "text" : "secondary", numberOfLines: 1, children: [
5709
5728
  item.label,
5710
- item.count !== void 0 ? /* @__PURE__ */ jsx64(Txt, { variant: "caption", tone: "secondary", children: ` ${item.count}` }) : null
5729
+ item.count !== void 0 ? /* @__PURE__ */ jsx67(Txt, { variant: "caption", tone: "secondary", children: ` ${item.count}` }) : null
5711
5730
  ] })
5712
5731
  },
5713
5732
  item.value
5714
5733
  );
5715
5734
  });
5716
5735
  const panel = items2.find((i) => i.value === current)?.content;
5717
- return /* @__PURE__ */ jsxs55(View56, { style: [styles49.root, style], children: [
5718
- 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 }) }),
5719
- panel !== void 0 ? /* @__PURE__ */ jsx64(View56, { role: "tabpanel", children: panel }) : null
5736
+ return /* @__PURE__ */ jsxs58(View59, { style: [styles51.root, style], children: [
5737
+ segmented ? /* @__PURE__ */ jsx67(View59, { role: "tablist", "aria-label": label, style: [styles51.track, { backgroundColor: theme.surface2, borderColor: theme.borderSubtle, borderRadius: radius3.md }], children: tabs }) : /* @__PURE__ */ jsx67(View59, { style: [styles51.underline, { borderBottomColor: theme.borderSubtle }], children: /* @__PURE__ */ jsx67(ScrollView7, { horizontal: true, showsHorizontalScrollIndicator: false, role: "tablist", "aria-label": label, contentContainerStyle: styles51.scroll, children: tabs }) }),
5738
+ panel !== void 0 ? /* @__PURE__ */ jsx67(View59, { role: "tabpanel", children: panel }) : null
5720
5739
  ] });
5721
5740
  }
5722
- var styles49 = StyleSheet49.create({
5741
+ var styles51 = StyleSheet51.create({
5723
5742
  root: { gap: 12 },
5724
- underline: { borderBottomWidth: StyleSheet49.hairlineWidth },
5743
+ underline: { borderBottomWidth: StyleSheet51.hairlineWidth },
5725
5744
  scroll: { gap: 4, paddingHorizontal: 4 },
5726
5745
  tab: { minHeight: 44, justifyContent: "center", paddingHorizontal: 12, borderBottomWidth: 2 },
5727
- track: { flexDirection: "row", padding: 3, gap: 3, borderWidth: StyleSheet49.hairlineWidth, height: 40 },
5728
- segment: { flex: 1, alignItems: "center", justifyContent: "center", paddingHorizontal: 8, borderWidth: StyleSheet49.hairlineWidth, borderColor: "transparent" },
5746
+ track: { flexDirection: "row", padding: 3, gap: 3, borderWidth: StyleSheet51.hairlineWidth, height: 40 },
5747
+ segment: { flex: 1, alignItems: "center", justifyContent: "center", paddingHorizontal: 8, borderWidth: StyleSheet51.hairlineWidth, borderColor: "transparent" },
5729
5748
  disabled: { opacity: 0.4 }
5730
5749
  });
5731
5750
 
5732
5751
  // src/native/tag-selector.tsx
5733
- import { StyleSheet as StyleSheet50, View as View57 } from "react-native";
5734
- import { jsx as jsx65, jsxs as jsxs56 } from "react/jsx-runtime";
5752
+ import { StyleSheet as StyleSheet52, View as View60 } from "react-native";
5753
+ import { jsx as jsx68, jsxs as jsxs59 } from "react/jsx-runtime";
5735
5754
  function TagSelector({ label, options, value, onValueChange, max, countLabel, style }) {
5736
5755
  const { haptic } = useTheme();
5737
5756
  const full = max !== void 0 && value.length >= max;
5738
- return /* @__PURE__ */ jsxs56(View57, { style: [styles50.root, style], children: [
5739
- /* @__PURE__ */ jsx65(View57, { role: "group", "aria-label": label, style: styles50.wrap, children: options.map((option) => {
5757
+ return /* @__PURE__ */ jsxs59(View60, { style: [styles52.root, style], children: [
5758
+ /* @__PURE__ */ jsx68(View60, { role: "group", "aria-label": label, style: styles52.wrap, children: options.map((option) => {
5740
5759
  const on = value.includes(option.value);
5741
- return /* @__PURE__ */ jsx65(
5760
+ return /* @__PURE__ */ jsx68(
5742
5761
  Chip,
5743
5762
  {
5744
5763
  selected: on,
@@ -5752,15 +5771,15 @@ function TagSelector({ label, options, value, onValueChange, max, countLabel, st
5752
5771
  option.value
5753
5772
  );
5754
5773
  }) }),
5755
- max !== void 0 && countLabel ? /* @__PURE__ */ jsx65(Txt, { variant: "caption", tone: full ? "accent" : "secondary", "aria-live": "polite", children: countLabel(value.length, max) }) : null
5774
+ max !== void 0 && countLabel ? /* @__PURE__ */ jsx68(Txt, { variant: "caption", tone: full ? "accent" : "secondary", "aria-live": "polite", children: countLabel(value.length, max) }) : null
5756
5775
  ] });
5757
5776
  }
5758
- var styles50 = StyleSheet50.create({ root: { gap: 8 }, wrap: { flexDirection: "row", flexWrap: "wrap", gap: 8 } });
5777
+ var styles52 = StyleSheet52.create({ root: { gap: 8 }, wrap: { flexDirection: "row", flexWrap: "wrap", gap: 8 } });
5759
5778
 
5760
5779
  // src/native/toast.tsx
5761
5780
  import * as React44 from "react";
5762
- 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";
5763
- import { Fragment as Fragment9, jsx as jsx66, jsxs as jsxs57 } from "react/jsx-runtime";
5781
+ import { AccessibilityInfo as AccessibilityInfo15, Animated as Animated27, PanResponder as PanResponder5, Pressable as Pressable28, StyleSheet as StyleSheet53, Text as Text20, View as View61 } from "react-native";
5782
+ import { Fragment as Fragment9, jsx as jsx69, jsxs as jsxs60 } from "react/jsx-runtime";
5764
5783
  var items = [];
5765
5784
  var listeners2 = /* @__PURE__ */ new Set();
5766
5785
  var counter = 0;
@@ -5827,15 +5846,15 @@ function ToastView({ item, closeLabel, duration }) {
5827
5846
  return () => clearTimeout(timer2);
5828
5847
  }, [item.id, ms]);
5829
5848
  const edge = { success: theme.success, warning: theme.warning, error: theme.danger, info: theme.info, default: theme.borderDefault }[item.tone ?? "default"];
5830
- const text = /* @__PURE__ */ jsxs57(Fragment9, { children: [
5831
- item.icon ? /* @__PURE__ */ jsx66(View58, { "aria-hidden": true, children: item.icon }) : null,
5832
- /* @__PURE__ */ jsxs57(View58, { style: styles51.content, children: [
5833
- /* @__PURE__ */ jsx66(Txt, { variant: "label", numberOfLines: 2, children: item.title }),
5834
- item.description ? /* @__PURE__ */ jsx66(Txt, { variant: "caption", tone: "secondary", numberOfLines: 3, children: item.description }) : null
5849
+ const text = /* @__PURE__ */ jsxs60(Fragment9, { children: [
5850
+ item.icon ? /* @__PURE__ */ jsx69(View61, { "aria-hidden": true, children: item.icon }) : null,
5851
+ /* @__PURE__ */ jsxs60(View61, { style: styles53.content, children: [
5852
+ /* @__PURE__ */ jsx69(Txt, { variant: "label", numberOfLines: 2, children: item.title }),
5853
+ item.description ? /* @__PURE__ */ jsx69(Txt, { variant: "caption", tone: "secondary", numberOfLines: 3, children: item.description }) : null
5835
5854
  ] })
5836
5855
  ] });
5837
- const body = /* @__PURE__ */ jsxs57(Fragment9, { children: [
5838
- item.onPress ? /* @__PURE__ */ jsx66(
5856
+ const body = /* @__PURE__ */ jsxs60(Fragment9, { children: [
5857
+ item.onPress ? /* @__PURE__ */ jsx69(
5839
5858
  Pressable28,
5840
5859
  {
5841
5860
  role: "button",
@@ -5843,11 +5862,11 @@ function ToastView({ item, closeLabel, duration }) {
5843
5862
  item.onPress?.();
5844
5863
  dismiss(item.id);
5845
5864
  },
5846
- style: ({ pressed }) => [styles51.main, { opacity: pressed ? 0.8 : 1 }],
5865
+ style: ({ pressed }) => [styles53.main, { opacity: pressed ? 0.8 : 1 }],
5847
5866
  children: text
5848
5867
  }
5849
- ) : /* @__PURE__ */ jsx66(View58, { style: styles51.main, children: text }),
5850
- item.action ? /* @__PURE__ */ jsx66(
5868
+ ) : /* @__PURE__ */ jsx69(View61, { style: styles53.main, children: text }),
5869
+ item.action ? /* @__PURE__ */ jsx69(
5851
5870
  Pressable28,
5852
5871
  {
5853
5872
  role: "button",
@@ -5855,33 +5874,33 @@ function ToastView({ item, closeLabel, duration }) {
5855
5874
  item.action?.onPress();
5856
5875
  dismiss(item.id);
5857
5876
  },
5858
- style: [styles51.action, { backgroundColor: theme.accent, borderRadius: radius3.sm }],
5859
- children: /* @__PURE__ */ jsx66(Text20, { style: [styles51.actionLabel, { color: theme.onAccent }], children: item.action.label })
5877
+ style: [styles53.action, { backgroundColor: theme.accent, borderRadius: radius3.sm }],
5878
+ children: /* @__PURE__ */ jsx69(Text20, { style: [styles53.actionLabel, { color: theme.onAccent }], children: item.action.label })
5860
5879
  }
5861
5880
  ) : null,
5862
- /* @__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" }) })
5881
+ /* @__PURE__ */ jsx69(Pressable28, { role: "button", "aria-label": closeLabel, hitSlop: 10, onPress: () => dismiss(item.id), style: styles53.close, children: /* @__PURE__ */ jsx69(Text20, { style: [styles53.cross, { color: theme.textSecondary }], children: "\xD7" }) })
5863
5882
  ] });
5864
5883
  const frame = [
5865
- styles51.toast,
5884
+ styles53.toast,
5866
5885
  { backgroundColor: theme.surface2, borderColor: theme.borderDefault, borderLeftColor: edge, borderRadius: radius3.lg, shadowColor: theme.scrimStrong }
5867
5886
  ];
5868
5887
  const motion3 = { transform: [{ translateY: enter.interpolate({ inputRange: [0, 1], outputRange: [-8, 0] }) }, { translateX: swipe }] };
5869
- return /* @__PURE__ */ jsx66(Animated27.View, { "aria-live": "polite", style: motion3, ...drag.panHandlers, children: /* @__PURE__ */ jsx66(View58, { style: frame, children: body }) });
5888
+ return /* @__PURE__ */ jsx69(Animated27.View, { "aria-live": "polite", style: motion3, ...drag.panHandlers, children: /* @__PURE__ */ jsx69(View61, { style: frame, children: body }) });
5870
5889
  }
5871
5890
  function Toaster({ closeLabel, position = "top", offset = 12, duration = 6e3, max = 3 }) {
5872
5891
  const all = React44.useSyncExternalStore(subscribe2, snapshot, snapshot);
5873
5892
  const shown = all.slice(-max);
5874
5893
  if (shown.length === 0) return null;
5875
- 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)) });
5894
+ return /* @__PURE__ */ jsx69(View61, { pointerEvents: "box-none", style: [styles53.stack, position === "top" ? { top: offset } : { bottom: offset }], children: (position === "top" ? shown : [...shown].reverse()).map((item) => /* @__PURE__ */ jsx69(ToastView, { item, closeLabel, duration }, item.id)) });
5876
5895
  }
5877
- var styles51 = StyleSheet51.create({
5896
+ var styles53 = StyleSheet53.create({
5878
5897
  stack: { position: "absolute", left: 12, right: 12, gap: 8, zIndex: 100 },
5879
5898
  toast: {
5880
5899
  flexDirection: "row",
5881
5900
  alignItems: "center",
5882
5901
  gap: 10,
5883
5902
  padding: 12,
5884
- borderWidth: StyleSheet51.hairlineWidth,
5903
+ borderWidth: StyleSheet53.hairlineWidth,
5885
5904
  borderLeftWidth: 4,
5886
5905
  shadowOpacity: 0.3,
5887
5906
  shadowRadius: 16,
@@ -5896,15 +5915,51 @@ var styles51 = StyleSheet51.create({
5896
5915
  cross: { fontSize: 18, lineHeight: 20, fontWeight: "700" }
5897
5916
  });
5898
5917
 
5918
+ // src/native/update-prompt.tsx
5919
+ import { StyleSheet as StyleSheet54, View as View62 } from "react-native";
5920
+ import { jsx as jsx70, jsxs as jsxs61 } from "react/jsx-runtime";
5921
+ function UpdatePrompt({ title, message, versionLabel, mark, updateLabel, onUpdate, laterLabel, onLater, style }) {
5922
+ const { theme, radius: radius3 } = useTheme();
5923
+ return /* @__PURE__ */ jsxs61(
5924
+ View62,
5925
+ {
5926
+ role: "region",
5927
+ "aria-label": title,
5928
+ style: [styles54.root, { backgroundColor: theme.surface1, borderColor: theme.borderSubtle, borderRadius: radius3.xl }, style],
5929
+ children: [
5930
+ /* @__PURE__ */ jsxs61(View62, { style: styles54.head, children: [
5931
+ mark ? /* @__PURE__ */ jsx70(View62, { accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants", style: styles54.mark, children: mark }) : null,
5932
+ /* @__PURE__ */ jsxs61(View62, { style: styles54.text, children: [
5933
+ /* @__PURE__ */ jsx70(Txt, { variant: "label", children: title }),
5934
+ message ? /* @__PURE__ */ jsx70(Txt, { tone: "secondary", children: message }) : null,
5935
+ versionLabel ? /* @__PURE__ */ jsx70(Txt, { variant: "mono", tone: "secondary", children: versionLabel }) : null
5936
+ ] })
5937
+ ] }),
5938
+ /* @__PURE__ */ jsxs61(View62, { style: styles54.actions, children: [
5939
+ /* @__PURE__ */ jsx70(Button, { label: laterLabel, variant: "ghost", size: "sm", onPress: onLater }),
5940
+ /* @__PURE__ */ jsx70(Button, { label: updateLabel, variant: "primary", size: "sm", onPress: onUpdate })
5941
+ ] })
5942
+ ]
5943
+ }
5944
+ );
5945
+ }
5946
+ var styles54 = StyleSheet54.create({
5947
+ root: { gap: 12, padding: 16, borderWidth: StyleSheet54.hairlineWidth },
5948
+ head: { flexDirection: "row", gap: 12, alignItems: "center" },
5949
+ mark: { width: 40, height: 40, alignItems: "center", justifyContent: "center" },
5950
+ text: { flex: 1, gap: 2 },
5951
+ actions: { flexDirection: "row", justifyContent: "flex-end", gap: 8 }
5952
+ });
5953
+
5899
5954
  // src/native/verified-badge.tsx
5900
- import { StyleSheet as StyleSheet52, View as View59 } from "react-native";
5955
+ import { StyleSheet as StyleSheet55, View as View63 } from "react-native";
5901
5956
  import Svg31, { Path as Path26 } from "react-native-svg";
5902
- import { jsx as jsx67, jsxs as jsxs58 } from "react/jsx-runtime";
5957
+ import { jsx as jsx71, jsxs as jsxs62 } from "react/jsx-runtime";
5903
5958
  function VerifiedBadge({ label, showLabel, size = 16, on = "surface" }) {
5904
5959
  const { theme } = useTheme();
5905
- return /* @__PURE__ */ jsxs58(View59, { accessible: true, role: "img", "aria-label": label, style: styles52.row, children: [
5906
- /* @__PURE__ */ jsxs58(Svg31, { width: size, height: size, viewBox: "0 0 24 24", "aria-hidden": true, children: [
5907
- /* @__PURE__ */ jsx67(
5960
+ return /* @__PURE__ */ jsxs62(View63, { accessible: true, role: "img", "aria-label": label, style: styles55.row, children: [
5961
+ /* @__PURE__ */ jsxs62(Svg31, { width: size, height: size, viewBox: "0 0 24 24", "aria-hidden": true, children: [
5962
+ /* @__PURE__ */ jsx71(
5908
5963
  Path26,
5909
5964
  {
5910
5965
  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",
@@ -5913,12 +5968,12 @@ function VerifiedBadge({ label, showLabel, size = 16, on = "surface" }) {
5913
5968
  strokeWidth: 1.2
5914
5969
  }
5915
5970
  ),
5916
- /* @__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" })
5971
+ /* @__PURE__ */ jsx71(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" })
5917
5972
  ] }),
5918
- showLabel ? /* @__PURE__ */ jsx67(Txt, { variant: "caption", tone: on === "media" ? "onMedia" : "accent", style: styles52.text, children: label }) : null
5973
+ showLabel ? /* @__PURE__ */ jsx71(Txt, { variant: "caption", tone: on === "media" ? "onMedia" : "accent", style: styles55.text, children: label }) : null
5919
5974
  ] });
5920
5975
  }
5921
- var styles52 = StyleSheet52.create({ row: { flexDirection: "row", alignItems: "center", gap: 4 }, text: { fontWeight: "700" } });
5976
+ var styles55 = StyleSheet55.create({ row: { flexDirection: "row", alignItems: "center", gap: 4 }, text: { fontWeight: "700" } });
5922
5977
  export {
5923
5978
  ActionSheet,
5924
5979
  ActivityFeed,
@@ -5951,6 +6006,7 @@ export {
5951
6006
  EmptyState,
5952
6007
  ErrorState,
5953
6008
  Fab,
6009
+ ForceUpdateScreen,
5954
6010
  GoalGauge,
5955
6011
  Header,
5956
6012
  IconButton,
@@ -5960,11 +6016,13 @@ export {
5960
6016
  Loader,
5961
6017
  LoaderGlyph,
5962
6018
  LoadingState,
6019
+ MaintenanceScreen,
5963
6020
  Mascot,
5964
6021
  MascotState,
5965
6022
  MatchDialog,
5966
6023
  MessageBubble,
5967
6024
  MessageComposer,
6025
+ MetaRow,
5968
6026
  Meter,
5969
6027
  MonthPicker,
5970
6028
  NumberTicker,
@@ -6007,6 +6065,7 @@ export {
6007
6065
  Toaster,
6008
6066
  Txt,
6009
6067
  TypingIndicator,
6068
+ UpdatePrompt,
6010
6069
  VerifiedBadge,
6011
6070
  WelcomeState,
6012
6071
  Wheel,