@krizaka/ui 3.21.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 (204) hide show
  1. package/README.md +1 -0
  2. package/dist/app-shell.js +1 -1
  3. package/dist/argument-card.js +3 -3
  4. package/dist/{chunk-5MH64NIL.js → chunk-2L67YTNV.js} +2 -2
  5. package/dist/chunk-AQSZJJAJ.js +126 -0
  6. package/dist/chunk-AQSZJJAJ.js.map +1 -0
  7. package/dist/{chunk-3GODX3D6.js → chunk-QDXV544C.js} +2 -2
  8. package/dist/chunk-QDXV544C.js.map +1 -0
  9. package/dist/chunk-R6NK6ZNY.js +1080 -0
  10. package/dist/chunk-R6NK6ZNY.js.map +1 -0
  11. package/dist/{chunk-LIPK4UCS.js → chunk-YCIBJ6OQ.js} +140 -209
  12. package/dist/chunk-YCIBJ6OQ.js.map +1 -0
  13. package/dist/comparison-table.d.ts +44 -0
  14. package/dist/comparison-table.js +84 -0
  15. package/dist/comparison-table.js.map +1 -0
  16. package/dist/data-table.js +19 -1066
  17. package/dist/data-table.js.map +1 -1
  18. package/dist/date-picker.js +3 -3
  19. package/dist/genui.d.ts +219 -0
  20. package/dist/genui.js +506 -0
  21. package/dist/genui.js.map +1 -0
  22. package/dist/index.d.ts +17 -24
  23. package/dist/index.js +1 -1
  24. package/dist/marketing-layout.js +1 -1
  25. package/dist/marketing-layout.js.map +1 -1
  26. package/dist/media-grid.js +43 -151
  27. package/dist/media-grid.js.map +1 -1
  28. package/dist/meta-row.d.ts +54 -0
  29. package/dist/meta-row.js +35 -0
  30. package/dist/meta-row.js.map +1 -0
  31. package/dist/native.d.ts +25 -16
  32. package/dist/native.js +493 -520
  33. package/dist/native.js.map +1 -1
  34. package/dist/nav-bar.js +2 -2
  35. package/dist/page-hero.js +3 -3
  36. package/dist/site-footer.js +2 -2
  37. package/dist/skip-link.js +1 -1
  38. package/dist/step-showcase.d.ts +62 -0
  39. package/dist/step-showcase.js +227 -0
  40. package/dist/step-showcase.js.map +1 -0
  41. package/package.json +61 -4
  42. package/registry/achievement.json +1 -1
  43. package/registry/action-bar.json +1 -1
  44. package/registry/activity-feed.json +1 -1
  45. package/registry/alert.json +1 -1
  46. package/registry/app-shell.json +1 -1
  47. package/registry/argument-card.json +1 -1
  48. package/registry/audio-player.json +1 -1
  49. package/registry/auth-layout.json +1 -1
  50. package/registry/avatar.json +1 -1
  51. package/registry/badge.json +1 -1
  52. package/registry/button.json +1 -1
  53. package/registry/card-grid.json +1 -1
  54. package/registry/card.json +1 -1
  55. package/registry/catalogue-page.json +1 -1
  56. package/registry/changelog-page.json +1 -1
  57. package/registry/chat.json +1 -1
  58. package/registry/checkbox.json +1 -1
  59. package/registry/chip-link.json +1 -1
  60. package/registry/chip.json +1 -1
  61. package/registry/choice-grid.json +1 -1
  62. package/registry/code-block.json +1 -1
  63. package/registry/combobox.json +1 -1
  64. package/registry/command.json +1 -1
  65. package/registry/comparison-table.json +207 -0
  66. package/registry/component-page.json +1 -1
  67. package/registry/confirm-button.json +1 -1
  68. package/registry/contact-page.json +1 -1
  69. package/registry/continue-prompt.json +1 -1
  70. package/registry/countdown.json +1 -1
  71. package/registry/cta-panel.json +1 -1
  72. package/registry/dashboard-layout.json +1 -1
  73. package/registry/data-table.json +1 -1
  74. package/registry/date-picker.json +1 -1
  75. package/registry/decision-list.json +1 -1
  76. package/registry/description-list.json +1 -1
  77. package/registry/detail-layout.json +1 -1
  78. package/registry/dialog.json +1 -1
  79. package/registry/docs-article-page.json +1 -1
  80. package/registry/docs-hub-page.json +1 -1
  81. package/registry/docs-layout.json +1 -1
  82. package/registry/document-viewer.json +1 -1
  83. package/registry/dropdown-menu.json +1 -1
  84. package/registry/empty-state.json +1 -1
  85. package/registry/error-page.json +1 -1
  86. package/registry/examples/comparison-table/versus.d.ts +4 -0
  87. package/registry/examples/comparison-table/versus.js +28 -0
  88. package/registry/examples/comparison-table/versus.tsx +20 -0
  89. package/registry/examples/dialog/native/sheet.dark.png +0 -0
  90. package/registry/examples/dialog/native/sheet.light.png +0 -0
  91. package/registry/examples/genui/streaming.d.ts +4 -0
  92. package/registry/examples/genui/streaming.js +18 -0
  93. package/registry/examples/genui/streaming.tsx +14 -0
  94. package/registry/examples/genui/table.d.ts +4 -0
  95. package/registry/examples/genui/table.js +19 -0
  96. package/registry/examples/genui/table.tsx +14 -0
  97. package/registry/examples/meta-row/native/video.d.ts +4 -0
  98. package/registry/examples/meta-row/native/video.dark.png +0 -0
  99. package/registry/examples/meta-row/native/video.js +11 -0
  100. package/registry/examples/meta-row/native/video.light.png +0 -0
  101. package/registry/examples/meta-row/native/video.tsx +5 -0
  102. package/registry/examples/meta-row/status.d.ts +4 -0
  103. package/registry/examples/meta-row/status.js +12 -0
  104. package/registry/examples/meta-row/status.tsx +7 -0
  105. package/registry/examples/meta-row/video.d.ts +4 -0
  106. package/registry/examples/meta-row/video.js +12 -0
  107. package/registry/examples/meta-row/video.tsx +7 -0
  108. package/registry/examples/step-showcase/desktop.d.ts +4 -0
  109. package/registry/examples/step-showcase/desktop.js +24 -0
  110. package/registry/examples/step-showcase/desktop.tsx +19 -0
  111. package/registry/examples/step-showcase/phone.d.ts +4 -0
  112. package/registry/examples/step-showcase/phone.js +24 -0
  113. package/registry/examples/step-showcase/phone.tsx +19 -0
  114. package/registry/field.json +1 -1
  115. package/registry/file-upload.json +1 -1
  116. package/registry/filter-bar.json +1 -1
  117. package/registry/force-update-screen.json +1 -1
  118. package/registry/form.json +1 -1
  119. package/registry/gallery-page.json +1 -1
  120. package/registry/genui.json +409 -0
  121. package/registry/glow-card.json +1 -1
  122. package/registry/goal-gauge.json +1 -1
  123. package/registry/how-it-works-page.json +1 -1
  124. package/registry/image-cropper.json +1 -1
  125. package/registry/index.json +130 -4
  126. package/registry/iso.json +1 -1
  127. package/registry/kanban.json +1 -1
  128. package/registry/kbd.json +1 -1
  129. package/registry/landing-page.json +1 -1
  130. package/registry/landscape.json +1 -1
  131. package/registry/legal-page.json +1 -1
  132. package/registry/link-card.json +1 -1
  133. package/registry/list.json +1 -1
  134. package/registry/loader.json +1 -1
  135. package/registry/longform-page.json +1 -1
  136. package/registry/maintenance-screen.json +1 -1
  137. package/registry/map.json +2 -2
  138. package/registry/markdown.json +1 -1
  139. package/registry/marketing-layout.json +1 -1
  140. package/registry/marquee.json +1 -1
  141. package/registry/mascot-quote.json +1 -1
  142. package/registry/mascot-state.json +1 -1
  143. package/registry/mascots.json +1 -1
  144. package/registry/match-dialog.json +1 -1
  145. package/registry/media-capture.json +1 -1
  146. package/registry/media-grid.json +1 -1
  147. package/registry/meta-row.json +215 -0
  148. package/registry/meter.json +1 -1
  149. package/registry/nav-bar.json +13 -13
  150. package/registry/number-ticker.json +1 -1
  151. package/registry/page-header.json +1 -1
  152. package/registry/page-hero.json +1 -1
  153. package/registry/page.json +1 -1
  154. package/registry/pagination.json +1 -1
  155. package/registry/photo-grid.json +1 -1
  156. package/registry/pointer-light.json +1 -1
  157. package/registry/popover.json +1 -1
  158. package/registry/pricing-page.json +1 -1
  159. package/registry/product-page.json +1 -1
  160. package/registry/profile-card.json +1 -1
  161. package/registry/progress.json +1 -1
  162. package/registry/promise-card.json +1 -1
  163. package/registry/radio-group.json +1 -1
  164. package/registry/recipes.json +1 -1
  165. package/registry/scroll-stage.json +1 -1
  166. package/registry/search-field.json +1 -1
  167. package/registry/section-backdrop.json +1 -1
  168. package/registry/separator.json +1 -1
  169. package/registry/settings-layout.json +1 -1
  170. package/registry/showcase.json +1 -1
  171. package/registry/site-footer.json +13 -13
  172. package/registry/sites.json +1 -1
  173. package/registry/skeleton.json +1 -1
  174. package/registry/skip-link.json +2 -2
  175. package/registry/slider.json +1 -1
  176. package/registry/slot.json +1 -1
  177. package/registry/spinner.json +1 -1
  178. package/registry/split-view.json +1 -1
  179. package/registry/stage-banner.json +1 -1
  180. package/registry/stat.json +1 -1
  181. package/registry/status-page.json +1 -1
  182. package/registry/step-progress.json +1 -1
  183. package/registry/step-showcase.json +296 -0
  184. package/registry/stepper.json +1 -1
  185. package/registry/swipe-deck.json +1 -1
  186. package/registry/switch.json +1 -1
  187. package/registry/tabs.json +1 -1
  188. package/registry/tag-input.json +1 -1
  189. package/registry/tag-selector.json +1 -1
  190. package/registry/terminal-replay.json +1 -1
  191. package/registry/theme.json +1 -1
  192. package/registry/toast.json +1 -1
  193. package/registry/toc.json +1 -1
  194. package/registry/tooltip.json +1 -1
  195. package/registry/tree-view.json +1 -1
  196. package/registry/update-prompt.json +1 -1
  197. package/registry/verified-badge.json +1 -1
  198. package/registry/vertical-video.json +1 -1
  199. package/registry/video-player.json +1 -1
  200. package/registry/video-trimmer.json +1 -1
  201. package/registry/virtual.json +1 -1
  202. package/dist/chunk-3GODX3D6.js.map +0 -1
  203. package/dist/chunk-LIPK4UCS.js.map +0 -1
  204. /package/dist/{chunk-5MH64NIL.js.map → chunk-2L67YTNV.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 }) {
@@ -2879,30 +2870,32 @@ var styles24 = StyleSheet24.create({
2879
2870
 
2880
2871
  // src/native/KachizakaMark.tsx
2881
2872
  import { View as View23 } from "react-native";
2882
- import Svg9, { Circle as Circle3, Defs as Defs4, LinearGradient as LinearGradient4, Path as Path7, RadialGradient as RadialGradient2, Stop as Stop4 } from "react-native-svg";
2873
+ import Svg9, { Circle as Circle3, Defs as Defs4, Path as Path7, RadialGradient as RadialGradient2, Stop as Stop4 } from "react-native-svg";
2883
2874
 
2884
2875
  // src/marks/kachizaka-geometry.ts
2876
+ var cobalt = marks.kachizaka[0][1];
2885
2877
  var gold = marks.kachizaka[marks.kachizaka.length - 1][1];
2886
2878
  var KACHIZAKA = {
2887
2879
  viewBox: "0 0 400 400",
2888
2880
  croppedViewBox: "80 80 240 240",
2889
2881
  center: 200,
2890
- /** The bowl: a rim 136 → 264 at y 104, cut 32 at its upper-right corner (the Krizaka chamfer), rounding down to the stem. */
2891
- cup: "M136 104 H232 L264 136 V164 C264 214 236 242 200 246 C164 242 136 214 136 164 Z",
2892
- /** The stem and the base, one shape. */
2893
- base: "M190 244 H210 V272 H240 C244 272 248 276 248 280 V300 H152 V280 C152 276 156 272 160 272 H190 Z",
2894
- /** The two handles, stroked in the gradient. */
2895
- handles: "M138 128 C100 124 100 196 150 202 M262 128 C300 124 300 196 250 202",
2896
- handleWidth: 14,
2897
- /** The seal: a five-pointed star in light on the bowl, centred (200, 172), radii 30 / 13. */
2898
- 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",
2899
- starColor: "#fffbea",
2900
- 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 },
2901
2894
  /** The ball: one node on the orbit, that turns with it. */
2902
- node: { r: 9, at: [200, 40] },
2895
+ ball: { r: 9, at: [200, 40] },
2903
2896
  glow: { color: gold, opacity: 0.18 },
2904
- /** The seal's breathing shadow (web), in the gold. */
2905
2897
  pulse: { color: gold, low: 0.35, high: 0.75 },
2898
+ motion: { spin: 28, breath: 3.2 },
2906
2899
  orbit: { r: 160, dash: "8 8", width: 1.5 },
2907
2900
  ring: { r: 134, width: 1 }
2908
2901
  };
@@ -2911,39 +2904,36 @@ var KACHIZAKA = {
2911
2904
  import { jsx as jsx27, jsxs as jsxs24 } from "react/jsx-runtime";
2912
2905
  function KachizakaMark({ size = 48, animated = true, title, neutral }) {
2913
2906
  const { theme } = useTheme();
2914
- const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, 28e3);
2915
- const id = useSvgId("kzm");
2907
+ const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, KACHIZAKA.motion.spin * 1e3);
2908
+ const id = useSvgId("kcm");
2916
2909
  const viewBox = size < 48 ? KACHIZAKA.croppedViewBox : KACHIZAKA.viewBox;
2917
2910
  const stroke = neutral ?? theme.textMuted;
2918
- const gradient = /* @__PURE__ */ jsx27(LinearGradient4, { id: `${id}a`, gradientUnits: "userSpaceOnUse", x1: KACHIZAKA.gradient.x1, y1: KACHIZAKA.gradient.y1, x2: KACHIZAKA.gradient.x2, y2: KACHIZAKA.gradient.y2, children: KACHIZAKA.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx27(Stop4, { offset, stopColor: color }, offset)) });
2919
- const fill = `url(#${id}a)`;
2920
2911
  return /* @__PURE__ */ jsxs24(View23, { style: { width: size, height: size }, ...markA11y(title), children: [
2921
2912
  /* @__PURE__ */ jsxs24(Svg9, { viewBox, style: layer, children: [
2922
- /* @__PURE__ */ jsxs24(Defs4, { children: [
2923
- /* @__PURE__ */ jsxs24(RadialGradient2, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
2924
- /* @__PURE__ */ jsx27(Stop4, { offset: "0%", stopColor: KACHIZAKA.glow.color, stopOpacity: KACHIZAKA.glow.opacity }),
2925
- /* @__PURE__ */ jsx27(Stop4, { offset: "100%", stopColor: KACHIZAKA.glow.color, stopOpacity: 0 })
2926
- ] }),
2927
- gradient
2928
- ] }),
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
+ ] }) }),
2929
2917
  size >= 48 ? /* @__PURE__ */ jsx27(Circle3, { cx: KACHIZAKA.center, cy: KACHIZAKA.center, r: 190, fill: `url(#${id}g)` }) : null,
2930
2918
  /* @__PURE__ */ jsx27(Circle3, { cx: KACHIZAKA.center, cy: KACHIZAKA.center, r: KACHIZAKA.ring.r, stroke, strokeWidth: KACHIZAKA.ring.width, opacity: 0.35, fill: "none" }),
2931
- /* @__PURE__ */ jsx27(Path7, { d: KACHIZAKA.handles, stroke: fill, strokeWidth: KACHIZAKA.handleWidth, strokeLinecap: "round", fill: "none" }),
2932
- /* @__PURE__ */ jsx27(Path7, { d: KACHIZAKA.base, fill }),
2933
- /* @__PURE__ */ jsx27(Path7, { d: KACHIZAKA.cup, fill })
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 })
2934
2922
  ] }),
2935
2923
  /* @__PURE__ */ jsx27(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs24(Svg9, { viewBox, style: layer, children: [
2936
- /* @__PURE__ */ jsx27(Defs4, { children: gradient }),
2937
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" }),
2938
- /* @__PURE__ */ jsx27(Circle3, { cx: KACHIZAKA.node.at[0], cy: KACHIZAKA.node.at[1], r: KACHIZAKA.node.r, fill })
2925
+ /* @__PURE__ */ jsx27(Circle3, { cx: KACHIZAKA.ball.at[0], cy: KACHIZAKA.ball.at[1], r: KACHIZAKA.ball.r, fill: KACHIZAKA.gold })
2939
2926
  ] }) }),
2940
- /* @__PURE__ */ jsx27(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsx27(Svg9, { viewBox, style: layer, children: /* @__PURE__ */ jsx27(Path7, { d: KACHIZAKA.star, fill: KACHIZAKA.starColor }) }) })
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
+ ] }) })
2941
2931
  ] });
2942
2932
  }
2943
2933
 
2944
2934
  // src/native/KrizakaMark.tsx
2945
2935
  import { View as View24 } from "react-native";
2946
- import Svg10, { Circle as Circle4, Defs as Defs5, G as Group, LinearGradient as LinearGradient5, Path as Path8, RadialGradient as RadialGradient3, Stop as Stop5 } from "react-native-svg";
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";
2947
2937
 
2948
2938
  // src/marks/krizaka-geometry.ts
2949
2939
  var KRIZAKA = {
@@ -2972,7 +2962,7 @@ function KrizakaMark({ size = 48, animated = true, title, neutral }) {
2972
2962
  const id = useSvgId("kzm");
2973
2963
  const viewBox = size < 48 ? KRIZAKA.croppedViewBox : KRIZAKA.viewBox;
2974
2964
  const stroke = neutral ?? theme.textMuted;
2975
- const blue = /* @__PURE__ */ jsx28(LinearGradient5, { id: `${id}b`, gradientUnits: "userSpaceOnUse", x1: KRIZAKA.blue.x1 + KRIZAKA.offset, y1: KRIZAKA.blue.y1 + KRIZAKA.offset, x2: KRIZAKA.blue.x2 + KRIZAKA.offset, y2: KRIZAKA.blue.y2 + KRIZAKA.offset, children: KRIZAKA.blue.stops.map(([offset, color]) => /* @__PURE__ */ jsx28(Stop5, { offset, stopColor: color }, offset)) });
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)) });
2976
2966
  const dot = (c) => /* @__PURE__ */ jsxs25(Fragment5, { children: [
2977
2967
  /* @__PURE__ */ jsx28(Circle4, { cx: c.cx, cy: c.cy, r: c.r, fill: `url(#${id}b)` }),
2978
2968
  /* @__PURE__ */ jsx28(Circle4, { cx: c.cx, cy: c.cy, r: c.inner, fill: KRIZAKA.highlight })
@@ -2984,7 +2974,7 @@ function KrizakaMark({ size = 48, animated = true, title, neutral }) {
2984
2974
  /* @__PURE__ */ jsx28(Stop5, { offset: "0%", stopColor: KRIZAKA.glow.color, stopOpacity: KRIZAKA.glow.opacity }),
2985
2975
  /* @__PURE__ */ jsx28(Stop5, { offset: "100%", stopColor: KRIZAKA.glow.color, stopOpacity: 0 })
2986
2976
  ] }),
2987
- /* @__PURE__ */ jsxs25(LinearGradient5, { id: `${id}i`, gradientUnits: "userSpaceOnUse", x1: KRIZAKA.ink.x1 + KRIZAKA.offset, y1: KRIZAKA.ink.y1 + KRIZAKA.offset, x2: KRIZAKA.ink.x2 + KRIZAKA.offset, y2: KRIZAKA.ink.y2 + KRIZAKA.offset, children: [
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: [
2988
2978
  /* @__PURE__ */ jsx28(Stop5, { offset: "0%", stopColor: theme.textSecondary }),
2989
2979
  /* @__PURE__ */ jsx28(Stop5, { offset: "100%", stopColor: theme.textPrimary })
2990
2980
  ] }),
@@ -3012,7 +3002,7 @@ import Svg16, { Circle as Circle10, Path as Path14 } from "react-native-svg";
3012
3002
 
3013
3003
  // src/native/OrazakaMark.tsx
3014
3004
  import { View as View25 } from "react-native";
3015
- import Svg11, { Circle as Circle5, Defs as Defs6, LinearGradient as LinearGradient6, Path as Path9, RadialGradient as RadialGradient4, Stop as Stop6 } from "react-native-svg";
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";
3016
3006
 
3017
3007
  // src/marks/orazaka-geometry.ts
3018
3008
  var orange = marks.orazaka[marks.orazaka.length - 1][1];
@@ -3048,7 +3038,7 @@ function OrazakaMark({ size = 48, animated = true, title, neutral }) {
3048
3038
  const id = useSvgId("ozm");
3049
3039
  const viewBox = size < 48 ? ORAZAKA.croppedViewBox : ORAZAKA.viewBox;
3050
3040
  const stroke = neutral ?? theme.textMuted;
3051
- const gradient = /* @__PURE__ */ jsx29(LinearGradient6, { id: `${id}a`, gradientUnits: "userSpaceOnUse", x1: ORAZAKA.gradient.x1, y1: ORAZAKA.gradient.y1, x2: ORAZAKA.gradient.x2, y2: ORAZAKA.gradient.y2, children: ORAZAKA.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx29(Stop6, { offset, stopColor: color }, offset)) });
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)) });
3052
3042
  const fill = `url(#${id}a)`;
3053
3043
  return /* @__PURE__ */ jsxs26(View25, { style: { width: size, height: size }, ...markA11y(title), children: [
3054
3044
  /* @__PURE__ */ jsxs26(Svg11, { viewBox, style: layer, children: [
@@ -3075,7 +3065,7 @@ function OrazakaMark({ size = 48, animated = true, title, neutral }) {
3075
3065
  // src/native/OrochiaMark.tsx
3076
3066
  import { useEffect as useEffect12, useState as useState20 } from "react";
3077
3067
  import { AccessibilityInfo as AccessibilityInfo6, Animated as Animated10, Easing as Easing4, View as View26 } from "react-native";
3078
- import Svg12, { Circle as Circle6, Defs as Defs7, Ellipse, G as Group2, LinearGradient as LinearGradient7, Path as Path10, RadialGradient as RadialGradient5, Stop as Stop7 } from "react-native-svg";
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";
3079
3069
 
3080
3070
  // src/marks/orochia-geometry.ts
3081
3071
  var OROCHIA = {
@@ -3134,7 +3124,7 @@ function OrochiaMark({ size = 48, animated = true, title, neutral: neutralProp }
3134
3124
  const viewBox = size < 48 ? OROCHIA.croppedViewBox : OROCHIA.viewBox;
3135
3125
  const layer = { position: "absolute", width: size, height: size };
3136
3126
  const a11y = title ? { accessible: true, accessibilityRole: "image", accessibilityLabel: title } : { accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants" };
3137
- const bodyGradient = /* @__PURE__ */ jsx30(LinearGradient7, { id: "body", gradientUnits: "userSpaceOnUse", x1: OROCHIA.body.x1 + OROCHIA.offset, y1: OROCHIA.body.y1 + OROCHIA.offset, x2: OROCHIA.body.x2 + OROCHIA.offset, y2: OROCHIA.body.y2 + OROCHIA.offset, children: OROCHIA.body.stops.map(([offset, color]) => /* @__PURE__ */ jsx30(Stop7, { offset, stopColor: color }, offset)) });
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)) });
3138
3128
  return /* @__PURE__ */ jsxs27(View26, { style: { width: size, height: size }, ...a11y, children: [
3139
3129
  /* @__PURE__ */ jsxs27(Svg12, { viewBox, style: layer, children: [
3140
3130
  /* @__PURE__ */ jsx30(Defs7, { children: /* @__PURE__ */ jsxs27(RadialGradient5, { id: "glow", cx: "50%", cy: "50%", r: "50%", children: [
@@ -3157,7 +3147,7 @@ function OrochiaMark({ size = 48, animated = true, title, neutral: neutralProp }
3157
3147
  ] })
3158
3148
  ] }),
3159
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: [
3160
- /* @__PURE__ */ jsx30(Defs7, { children: /* @__PURE__ */ jsx30(LinearGradient7, { id: "flame", x1: "50%", y1: "100%", x2: "50%", y2: "0%", children: OROCHIA.flameGradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx30(Stop7, { offset, stopColor: color }, offset)) }) }),
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)) }) }),
3161
3151
  /* @__PURE__ */ jsxs27(Group2, { transform: `translate(${OROCHIA.offset} ${OROCHIA.offset})`, children: [
3162
3152
  /* @__PURE__ */ jsx30(Circle6, { cx: OROCHIA.eye.cx, cy: OROCHIA.eye.cy, r: OROCHIA.eye.r, fill: OROCHIA.eye.color }),
3163
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)" })
@@ -3167,9 +3157,8 @@ function OrochiaMark({ size = 48, animated = true, title, neutral: neutralProp }
3167
3157
  }
3168
3158
 
3169
3159
  // src/native/YasakiaMark.tsx
3170
- import React21 from "react";
3171
3160
  import { View as View27 } from "react-native";
3172
- import Svg13, { Circle as Circle7, Defs as Defs8, LinearGradient as LinearGradient8, Path as Path11, RadialGradient as RadialGradient6, Stop as Stop8 } from "react-native-svg";
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";
3173
3162
 
3174
3163
  // src/marks/yasakia-geometry.ts
3175
3164
  var turquoise = marks.yasakia[marks.yasakia.length - 1][1];
@@ -3177,23 +3166,21 @@ var YASAKIA = {
3177
3166
  viewBox: "0 0 400 400",
3178
3167
  croppedViewBox: "80 80 240 240",
3179
3168
  center: 200,
3180
- /** The two voices, left then right: each a bubble (cut around the lens) and its tail. */
3181
- voices: [
3182
- { 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" },
3183
- { 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"
3184
3174
  ],
3185
- /** The left voice, a shade deeper: the depth between the two. */
3186
- shade: { color: "#000", opacity: 0.22 },
3187
- /** Where the bubbles overlap: the core, lit from above. */
3188
- 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",
3189
3178
  gradient: { x1: 110, y1: 300, x2: 290, y2: 100, stops: marks.yasakia },
3190
- /** The light on the lens: bright at the top, fading down. */
3191
- highlight: { color: "#f0fdfa", from: 0.75, to: 0.2 },
3192
- /** The pair: two nodes on the orbit, opposite each other, that turn with it. */
3193
- 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] },
3194
3181
  glow: { color: turquoise, opacity: 0.16 },
3195
- /** The core's breathing shadow (web), in the mark's turquoise. */
3196
3182
  pulse: { color: turquoise, low: 0.3, high: 0.6 },
3183
+ motion: { spin: 30, breath: 3.2 },
3197
3184
  orbit: { r: 160, dash: "8 8", width: 1.5 },
3198
3185
  ring: { r: 134, width: 1 }
3199
3186
  };
@@ -3202,11 +3189,11 @@ var YASAKIA = {
3202
3189
  import { jsx as jsx31, jsxs as jsxs28 } from "react/jsx-runtime";
3203
3190
  function YasakiaMark({ size = 48, animated = true, title, neutral }) {
3204
3191
  const { theme } = useTheme();
3205
- const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated);
3192
+ const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, YASAKIA.motion.spin * 1e3);
3206
3193
  const id = useSvgId("yzm");
3207
3194
  const viewBox = size < 48 ? YASAKIA.croppedViewBox : YASAKIA.viewBox;
3208
3195
  const stroke = neutral ?? theme.textMuted;
3209
- const gradient = /* @__PURE__ */ jsx31(LinearGradient8, { id: `${id}a`, gradientUnits: "userSpaceOnUse", x1: YASAKIA.gradient.x1, y1: YASAKIA.gradient.y1, x2: YASAKIA.gradient.x2, y2: YASAKIA.gradient.y2, children: YASAKIA.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx31(Stop8, { offset, stopColor: color }, offset)) });
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)) });
3210
3197
  const fill = `url(#${id}a)`;
3211
3198
  return /* @__PURE__ */ jsxs28(View27, { style: { width: size, height: size }, ...markA11y(title), children: [
3212
3199
  /* @__PURE__ */ jsxs28(Svg13, { viewBox, style: layer, children: [
@@ -3219,35 +3206,23 @@ function YasakiaMark({ size = 48, animated = true, title, neutral }) {
3219
3206
  ] }),
3220
3207
  size >= 48 ? /* @__PURE__ */ jsx31(Circle7, { cx: YASAKIA.center, cy: YASAKIA.center, r: 190, fill: `url(#${id}g)` }) : null,
3221
3208
  /* @__PURE__ */ jsx31(Circle7, { cx: YASAKIA.center, cy: YASAKIA.center, r: YASAKIA.ring.r, stroke, strokeWidth: YASAKIA.ring.width, opacity: 0.35, fill: "none" }),
3222
- YASAKIA.voices.map((v, i) => /* @__PURE__ */ jsxs28(React21.Fragment, { children: [
3223
- /* @__PURE__ */ jsx31(Path11, { d: v.body, fill }),
3224
- /* @__PURE__ */ jsx31(Path11, { d: v.tail, fill }),
3225
- i === 0 ? /* @__PURE__ */ jsx31(Path11, { d: `${v.body} ${v.tail}`, fill: YASAKIA.shade.color, opacity: YASAKIA.shade.opacity }) : null
3226
- ] }, v.body))
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 })
3227
3211
  ] }),
3228
3212
  /* @__PURE__ */ jsx31(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs28(Svg13, { viewBox, style: layer, children: [
3229
3213
  /* @__PURE__ */ jsx31(Defs8, { children: gradient }),
3230
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" }),
3231
- YASAKIA.pair.at.map(([cx, cy]) => /* @__PURE__ */ jsx31(Circle7, { cx, cy, r: YASAKIA.pair.r, fill }, cx))
3215
+ /* @__PURE__ */ jsx31(Circle7, { cx: YASAKIA.node.at[0], cy: YASAKIA.node.at[1], r: YASAKIA.node.r, fill })
3232
3216
  ] }) }),
3233
- /* @__PURE__ */ jsx31(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs28(Svg13, { viewBox, style: layer, children: [
3234
- /* @__PURE__ */ jsxs28(Defs8, { children: [
3235
- gradient,
3236
- /* @__PURE__ */ jsxs28(LinearGradient8, { id: `${id}l`, gradientUnits: "userSpaceOnUse", x1: 0, y1: YASAKIA.lens.y1, x2: 0, y2: YASAKIA.lens.y2, children: [
3237
- /* @__PURE__ */ jsx31(Stop8, { offset: "0%", stopColor: YASAKIA.highlight.color, stopOpacity: YASAKIA.highlight.from }),
3238
- /* @__PURE__ */ jsx31(Stop8, { offset: "100%", stopColor: YASAKIA.highlight.color, stopOpacity: YASAKIA.highlight.to })
3239
- ] })
3240
- ] }),
3241
- /* @__PURE__ */ jsx31(Path11, { d: YASAKIA.lens.d, fill }),
3242
- /* @__PURE__ */ jsx31(Path11, { d: YASAKIA.lens.d, fill: `url(#${id}l)` })
3243
- ] }) })
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" }) }) })
3244
3218
  ] });
3245
3219
  }
3246
3220
  var YazakiaMark = YasakiaMark;
3247
3221
 
3248
3222
  // src/native/YomizakaMark.tsx
3223
+ import React21 from "react";
3249
3224
  import { View as View28 } from "react-native";
3250
- import Svg14, { Circle as Circle8, Defs as Defs9, LinearGradient as LinearGradient9, Path as Path12, RadialGradient as RadialGradient7, Stop as Stop9 } from "react-native-svg";
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";
3251
3226
 
3252
3227
  // src/marks/yomizaka-geometry.ts
3253
3228
  var indigo = marks.yomizaka[marks.yomizaka.length - 1][1];
@@ -3255,26 +3230,26 @@ var YOMIZAKA = {
3255
3230
  viewBox: "0 0 400 400",
3256
3231
  croppedViewBox: "80 80 240 240",
3257
3232
  center: 200,
3258
- /** The page, cut at its corner (the Krizaka chamfer) and around the lens. */
3259
- page: "M128 92 H228 L264 128 V185.87 A52 52 0 1 0 264 278.13 V300 H128 Z",
3260
- /** Three lines of text and the start of a fourth, in light: they wrap around the lens. */
3261
- lines: "M156 140 H226 M156 170 H236 M156 200 H184 M156 230 H176",
3262
- line: { color: "#f4f5ff", opacity: 0.6, width: 10 },
3263
- /** The lens: a ring in the brand gradient, its pale core lit from above, a glint; the handle leaves the page. */
3264
- lens: { cx: 240, cy: 232, r: 40, width: 12, core: 28, glint: { cx: 230, cy: 222, r: 8 } },
3265
- handle: "M276 268 L304 296",
3266
- handleWidth: 20,
3267
- gradient: { x1: 128, y1: 300, x2: 304, y2: 92, stops: marks.yomizaka },
3268
- /** The lens' core: a pale indigo light, brighter at the top. */
3269
- coreGradient: { stops: [["0%", "#c9ceff"], ["100%", "#f4f5ff"]] },
3270
- highlight: "#ffffff",
3271
- /** The reading (web): a line of light that scans the page from top to bottom, clipped to the page. */
3272
- scan: { d: "M136 100 H236", travel: 192, color: "#f4f5ff", opacity: 0.7, width: 3 },
3273
- /** 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. */
3274
3249
  node: { r: 9, at: [200, 40] },
3275
3250
  glow: { color: indigo, opacity: 0.18 },
3276
- /** The lens' breathing shadow (web), in the indigo. */
3277
3251
  pulse: { color: indigo, low: 0.3, high: 0.6 },
3252
+ motion: { spin: 32, breath: 3.6 },
3278
3253
  orbit: { r: 160, dash: "8 8", width: 1.5 },
3279
3254
  ring: { r: 134, width: 1 }
3280
3255
  };
@@ -3283,11 +3258,11 @@ var YOMIZAKA = {
3283
3258
  import { jsx as jsx32, jsxs as jsxs29 } from "react/jsx-runtime";
3284
3259
  function YomizakaMark({ size = 48, animated = true, title, neutral }) {
3285
3260
  const { theme } = useTheme();
3286
- const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, 32e3);
3261
+ const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, YOMIZAKA.motion.spin * 1e3);
3287
3262
  const id = useSvgId("ymm");
3288
3263
  const viewBox = size < 48 ? YOMIZAKA.croppedViewBox : YOMIZAKA.viewBox;
3289
3264
  const stroke = neutral ?? theme.textMuted;
3290
- const gradient = /* @__PURE__ */ jsx32(LinearGradient9, { id: `${id}a`, gradientUnits: "userSpaceOnUse", x1: YOMIZAKA.gradient.x1, y1: YOMIZAKA.gradient.y1, x2: YOMIZAKA.gradient.x2, y2: YOMIZAKA.gradient.y2, children: YOMIZAKA.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx32(Stop9, { offset, stopColor: color }, offset)) });
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)) });
3291
3266
  const fill = `url(#${id}a)`;
3292
3267
  return /* @__PURE__ */ jsxs29(View28, { style: { width: size, height: size }, ...markA11y(title), children: [
3293
3268
  /* @__PURE__ */ jsxs29(Svg14, { viewBox, style: layer, children: [
@@ -3300,9 +3275,8 @@ function YomizakaMark({ size = 48, animated = true, title, neutral }) {
3300
3275
  ] }),
3301
3276
  size >= 48 ? /* @__PURE__ */ jsx32(Circle8, { cx: YOMIZAKA.center, cy: YOMIZAKA.center, r: 190, fill: `url(#${id}g)` }) : null,
3302
3277
  /* @__PURE__ */ jsx32(Circle8, { cx: YOMIZAKA.center, cy: YOMIZAKA.center, r: YOMIZAKA.ring.r, stroke, strokeWidth: YOMIZAKA.ring.width, opacity: 0.35, fill: "none" }),
3303
- /* @__PURE__ */ jsx32(Path12, { d: YOMIZAKA.page, fill }),
3304
- /* @__PURE__ */ jsx32(Path12, { d: YOMIZAKA.lines, stroke: YOMIZAKA.line.color, strokeOpacity: YOMIZAKA.line.opacity, strokeWidth: YOMIZAKA.line.width, strokeLinecap: "round", fill: "none" }),
3305
- /* @__PURE__ */ jsx32(Path12, { d: YOMIZAKA.handle, stroke: fill, strokeWidth: YOMIZAKA.handleWidth, strokeLinecap: "round", fill: "none" })
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))
3306
3280
  ] }),
3307
3281
  /* @__PURE__ */ jsx32(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs29(Svg14, { viewBox, style: layer, children: [
3308
3282
  /* @__PURE__ */ jsx32(Defs9, { children: gradient }),
@@ -3310,19 +3284,18 @@ function YomizakaMark({ size = 48, animated = true, title, neutral }) {
3310
3284
  /* @__PURE__ */ jsx32(Circle8, { cx: YOMIZAKA.node.at[0], cy: YOMIZAKA.node.at[1], r: YOMIZAKA.node.r, fill })
3311
3285
  ] }) }),
3312
3286
  /* @__PURE__ */ jsx32(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs29(Svg14, { viewBox, style: layer, children: [
3313
- /* @__PURE__ */ jsxs29(Defs9, { children: [
3314
- gradient,
3315
- /* @__PURE__ */ jsx32(LinearGradient9, { id: `${id}c`, x1: "50%", y1: "100%", x2: "50%", y2: "0%", children: YOMIZAKA.coreGradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx32(Stop9, { offset, stopColor: color }, offset)) })
3316
- ] }),
3317
- /* @__PURE__ */ jsx32(Circle8, { cx: YOMIZAKA.lens.cx, cy: YOMIZAKA.lens.cy, r: YOMIZAKA.lens.r, stroke: fill, strokeWidth: YOMIZAKA.lens.width, fill: `url(#${id}c)` }),
3318
- /* @__PURE__ */ jsx32(Circle8, { cx: YOMIZAKA.lens.glint.cx, cy: YOMIZAKA.lens.glint.cy, r: YOMIZAKA.lens.glint.r, fill: YOMIZAKA.highlight })
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))
3319
3292
  ] }) })
3320
3293
  ] });
3321
3294
  }
3322
3295
 
3323
3296
  // src/native/YororisMark.tsx
3324
3297
  import { View as View29 } from "react-native";
3325
- import Svg15, { Circle as Circle9, Defs as Defs10, LinearGradient as LinearGradient10, Path as Path13, RadialGradient as RadialGradient8, Stop as Stop10 } from "react-native-svg";
3298
+ import Svg15, { Circle as Circle9, Defs as Defs10, Path as Path13, RadialGradient as RadialGradient8, Stop as Stop10 } from "react-native-svg";
3326
3299
 
3327
3300
  // src/marks/yororis-geometry.ts
3328
3301
  var sand = marks.yororis[0][1];
@@ -3331,28 +3304,20 @@ var YORORIS = {
3331
3304
  viewBox: "0 0 400 400",
3332
3305
  croppedViewBox: "80 80 240 240",
3333
3306
  center: 200,
3334
- /** The two leaves — open hands, mirrored around x = 200 — filled, rising from the stem. */
3335
- leaves: [
3336
- "M200 262 C142 256 104 206 110 122 C138 130 154 152 160 180 C168 218 182 238 204 246 Z",
3337
- "M200 262 C258 256 296 206 290 122 C262 130 246 152 240 180 C232 218 218 238 196 246 Z"
3338
- ],
3339
- /** A vein of light along each leaf (dashed, it drifts slowly when animated). */
3340
- veins: "M122 142 C128 196 156 232 192 248 M278 142 C272 196 244 232 208 248",
3341
- vein: { color: "#fbf6ea", opacity: 0.45, width: 3, dash: "2 14" },
3342
- /** The stem, from the junction down. */
3343
- stem: "M200 244 L200 312",
3344
- stroke: 30,
3345
- gradient: { x1: 110, y1: 300, x2: 290, y2: 100, stops: marks.yororis },
3346
- /** The core's warm light: from the mark's sand (below) to a light sand (above). */
3347
- coreGradient: { stops: [["0%", sand], ["100%", "#e6c993"]] },
3348
- /** The core, held in the hollow of the leaves (not on the junction): the one who is listened to. It breathes. */
3349
- 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 },
3350
3314
  highlight: "#fbf6ea",
3351
- /** The moment: one node on the orbit, that turns with it. */
3352
- 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] },
3353
3318
  glow: { color: sage, opacity: 0.18 },
3354
- /** The core's breathing shadow (web), in the core's warm sand. */
3355
3319
  pulse: { color: sand, low: 0.3, high: 0.6 },
3320
+ motion: { spin: 36, breath: 4.2 },
3356
3321
  orbit: { r: 160, dash: "8 8", width: 1.5 },
3357
3322
  ring: { r: 134, width: 1 }
3358
3323
  };
@@ -3361,35 +3326,26 @@ var YORORIS = {
3361
3326
  import { jsx as jsx33, jsxs as jsxs30 } from "react/jsx-runtime";
3362
3327
  function YororisMark({ size = 48, animated = true, title, neutral }) {
3363
3328
  const { theme } = useTheme();
3364
- const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, 36e3);
3329
+ const { Animated: Animated28, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, YORORIS.motion.spin * 1e3);
3365
3330
  const id = useSvgId("yrm");
3366
3331
  const viewBox = size < 48 ? YORORIS.croppedViewBox : YORORIS.viewBox;
3367
3332
  const stroke = neutral ?? theme.textMuted;
3368
- const gradient = /* @__PURE__ */ jsx33(LinearGradient10, { id: `${id}a`, gradientUnits: "userSpaceOnUse", x1: YORORIS.gradient.x1, y1: YORORIS.gradient.y1, x2: YORORIS.gradient.x2, y2: YORORIS.gradient.y2, children: YORORIS.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx33(Stop10, { offset, stopColor: color }, offset)) });
3369
- const fill = `url(#${id}a)`;
3370
3333
  return /* @__PURE__ */ jsxs30(View29, { style: { width: size, height: size }, ...markA11y(title), children: [
3371
3334
  /* @__PURE__ */ jsxs30(Svg15, { viewBox, style: layer, children: [
3372
- /* @__PURE__ */ jsxs30(Defs10, { children: [
3373
- /* @__PURE__ */ jsxs30(RadialGradient8, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
3374
- /* @__PURE__ */ jsx33(Stop10, { offset: "0%", stopColor: YORORIS.glow.color, stopOpacity: YORORIS.glow.opacity }),
3375
- /* @__PURE__ */ jsx33(Stop10, { offset: "100%", stopColor: YORORIS.glow.color, stopOpacity: 0 })
3376
- ] }),
3377
- gradient
3378
- ] }),
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
+ ] }) }),
3379
3339
  size >= 48 ? /* @__PURE__ */ jsx33(Circle9, { cx: YORORIS.center, cy: YORORIS.center, r: 190, fill: `url(#${id}g)` }) : null,
3380
3340
  /* @__PURE__ */ jsx33(Circle9, { cx: YORORIS.center, cy: YORORIS.center, r: YORORIS.ring.r, stroke, strokeWidth: YORORIS.ring.width, opacity: 0.35, fill: "none" }),
3381
- /* @__PURE__ */ jsx33(Path13, { d: YORORIS.stem, stroke: fill, strokeWidth: YORORIS.stroke, strokeLinecap: "round", fill: "none" }),
3382
- YORORIS.leaves.map((d) => /* @__PURE__ */ jsx33(Path13, { d, fill }, d)),
3383
- /* @__PURE__ */ jsx33(Path13, { d: YORORIS.veins, stroke: YORORIS.vein.color, strokeOpacity: YORORIS.vein.opacity, strokeWidth: YORORIS.vein.width, strokeLinecap: "round", strokeDasharray: YORORIS.vein.dash, fill: "none" })
3341
+ /* @__PURE__ */ jsx33(Path13, { d: YORORIS.hands, stroke: YORORIS.sage, strokeWidth: YORORIS.stroke, strokeLinecap: "round", fill: "none" })
3384
3342
  ] }),
3385
3343
  /* @__PURE__ */ jsx33(Animated28.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs30(Svg15, { viewBox, style: layer, children: [
3386
- /* @__PURE__ */ jsx33(Defs10, { children: gradient }),
3387
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" }),
3388
- /* @__PURE__ */ jsx33(Circle9, { cx: YORORIS.moment.at[0], cy: YORORIS.moment.at[1], r: YORORIS.moment.r, fill })
3345
+ /* @__PURE__ */ jsx33(Circle9, { cx: YORORIS.node.at[0], cy: YORORIS.node.at[1], r: YORORIS.node.r, fill: YORORIS.sage })
3389
3346
  ] }) }),
3390
3347
  /* @__PURE__ */ jsx33(Animated28.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs30(Svg15, { viewBox, style: layer, children: [
3391
- /* @__PURE__ */ jsx33(Defs10, { children: /* @__PURE__ */ jsx33(LinearGradient10, { id: `${id}c`, x1: "50%", y1: "100%", x2: "50%", y2: "0%", children: YORORIS.coreGradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx33(Stop10, { offset, stopColor: color }, offset)) }) }),
3392
- /* @__PURE__ */ jsx33(Circle9, { cx: YORORIS.core.cx, cy: YORORIS.core.cy, r: YORORIS.core.r, fill: `url(#${id}c)` }),
3348
+ /* @__PURE__ */ jsx33(Circle9, { cx: YORORIS.core.cx, cy: YORORIS.core.cy, r: YORORIS.core.r, fill: YORORIS.sand }),
3393
3349
  /* @__PURE__ */ jsx33(Circle9, { cx: YORORIS.core.cx, cy: YORORIS.core.cy, r: YORORIS.core.inner, fill: YORORIS.highlight })
3394
3350
  ] }) })
3395
3351
  ] });
@@ -3536,7 +3492,7 @@ import { AccessibilityInfo as AccessibilityInfo9, Animated as Animated13, Easing
3536
3492
  // src/native/mascots.tsx
3537
3493
  import { useEffect as useEffect14, useState as useState22 } from "react";
3538
3494
  import { AccessibilityInfo as AccessibilityInfo8, Animated as Animated12, Easing as Easing6, View as View32 } from "react-native";
3539
- import Svg17, { Circle as Circle11, Defs as Defs11, Ellipse as Ellipse2, G, LinearGradient as LinearGradient11, Path as Path15, Rect as Rect3, Stop as Stop11 } from "react-native-svg";
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";
3540
3496
 
3541
3497
  // src/mascots/geometry.ts
3542
3498
  var mirror = (d) => d.replace(/(-?\d+(?:\.\d+)?) (-?\d+(?:\.\d+)?)/g, (_, x, y) => `${120 - Number(x)} ${y}`);
@@ -3773,7 +3729,7 @@ function Mascot({ bird = "owl", mood = "welcome", tone: tone3 = "brand", size =
3773
3729
  const rot = (deg, [x, y]) => `rotate(${deg} ${x} ${y})`;
3774
3730
  const [wl, wr] = g.wings;
3775
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: [
3776
- /* @__PURE__ */ jsx37(Defs11, { children: /* @__PURE__ */ jsxs33(LinearGradient11, { id, x1: "0", y1: "0", x2: "0", y2: "1", children: [
3732
+ /* @__PURE__ */ jsx37(Defs11, { children: /* @__PURE__ */ jsxs33(LinearGradient8, { id, x1: "0", y1: "0", x2: "0", y2: "1", children: [
3777
3733
  /* @__PURE__ */ jsx37(Stop11, { offset: "0%", stopColor: p.from }),
3778
3734
  /* @__PURE__ */ jsx37(Stop11, { offset: "100%", stopColor: p.to })
3779
3735
  ] }) }),
@@ -3794,7 +3750,7 @@ function Mascot({ bird = "owl", mood = "welcome", tone: tone3 = "brand", size =
3794
3750
  g.neck && /* @__PURE__ */ jsx37(Path15, { d: g.neck.d, stroke: body, strokeWidth: g.neck.width, strokeLinecap: "round", fill: "none" }),
3795
3751
  g.head.r > 0 && /* @__PURE__ */ jsx37(Circle11, { cx: g.head.cx, cy: g.head.cy, r: g.head.r, fill: body, ...line }),
3796
3752
  g.details.map((d) => /* @__PURE__ */ jsx37(Path15, { d, fill: p.detail, ...line }, d)),
3797
- g.visor && /* @__PURE__ */ jsx37(Rect3, { x: g.visor.x, y: g.visor.y, width: g.visor.w, height: g.visor.h, rx: 4, fill: theme.surface0, ...line }),
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 }),
3798
3754
  g.eyes.at.map(
3799
3755
  (at, i) => mood === "empty" && g.eyes.white > 0 ? /* @__PURE__ */ jsxs33(G, { children: [
3800
3756
  /* @__PURE__ */ jsx37(Circle11, { cx: at[0], cy: at[1], r: g.eyes.white, fill: LIGHT, ...line }),
@@ -3931,10 +3887,26 @@ var styles28 = StyleSheet28.create({
3931
3887
  secondary: { minHeight: 48, borderRadius: 999, borderWidth: 1.5, alignItems: "center", justifyContent: "center" }
3932
3888
  });
3933
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
+
3934
3906
  // src/native/meter.tsx
3935
- import { StyleSheet as StyleSheet29, View as View35 } from "react-native";
3907
+ import { StyleSheet as StyleSheet29, View as View36 } from "react-native";
3936
3908
  import Svg19, { Circle as Circle12 } from "react-native-svg";
3937
- import { jsx as jsx40, jsxs as jsxs36 } from "react/jsx-runtime";
3909
+ import { jsx as jsx41, jsxs as jsxs37 } from "react/jsx-runtime";
3938
3910
  var THICK = { sm: 6, md: 8, lg: 12 };
3939
3911
  var RING = { sm: 56, md: 96, lg: 144 };
3940
3912
  var partColor = (t, i) => [t.accent, t.warning, t.success, t.textSecondary, t.danger][i % 5];
@@ -3947,10 +3919,10 @@ function Meter({ label, value = 0, min = 0, max = 100, valueText, thresholds, op
3947
3919
  const words2 = valueText ?? `${Math.round(ratio * 100)} %`;
3948
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)} %` }));
3949
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 };
3950
- const legend = parts ? /* @__PURE__ */ jsx40(View35, { style: styles29.legend, "aria-hidden": true, children: shares.map((p, i) => /* @__PURE__ */ jsxs36(View35, { style: styles29.legendItem, children: [
3951
- /* @__PURE__ */ jsx40(View35, { style: [styles29.swatch, { backgroundColor: p.color }] }),
3952
- /* @__PURE__ */ jsx40(Txt, { variant: "caption", children: p.label }),
3953
- /* @__PURE__ */ jsx40(Txt, { variant: "caption", tone: "secondary", children: p.words })
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 })
3954
3926
  ] }, i)) }) : null;
3955
3927
  if (variant === "ring") {
3956
3928
  const side = RING[size];
@@ -3962,23 +3934,23 @@ function Meter({ label, value = 0, min = 0, max = 100, valueText, thresholds, op
3962
3934
  offset += p.ratio;
3963
3935
  return arc;
3964
3936
  }) : [{ color: tone3, len: ratio, start: 0 }];
3965
- return /* @__PURE__ */ jsxs36(View35, { accessible: true, ...a11y, style: [styles29.ringRoot, style], children: [
3966
- /* @__PURE__ */ jsxs36(View35, { style: { width: side, height: side }, children: [
3967
- /* @__PURE__ */ jsxs36(Svg19, { width: side, height: side, viewBox: "0 0 100 100", style: { transform: [{ rotate: "-90deg" }] }, children: [
3968
- /* @__PURE__ */ jsx40(Circle12, { cx: 50, cy: 50, r, fill: "none", stroke: theme.borderDefault, strokeWidth: 9 }),
3969
- arcs.map((a, i) => /* @__PURE__ */ jsx40(Circle12, { cx: 50, cy: 50, r, fill: "none", stroke: a.color, strokeWidth: 9, strokeDasharray: `${Math.max(0, a.len * c - (parts ? 2 : 0))} ${c}`, strokeDashoffset: -a.start * c, strokeLinecap: parts ? "butt" : "round" }, i))
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))
3970
3942
  ] }),
3971
- children !== void 0 ? /* @__PURE__ */ jsx40(View35, { style: [StyleSheet29.absoluteFill, styles29.center], children }) : null
3943
+ children !== void 0 ? /* @__PURE__ */ jsx41(View36, { style: [StyleSheet29.absoluteFill, styles29.center], children }) : null
3972
3944
  ] }),
3973
3945
  legend
3974
3946
  ] });
3975
3947
  }
3976
- return /* @__PURE__ */ jsxs36(View35, { accessible: true, ...a11y, style: [styles29.root, style], children: [
3977
- showLabel ? /* @__PURE__ */ jsxs36(View35, { style: styles29.header, "aria-hidden": true, children: [
3978
- /* @__PURE__ */ jsx40(Txt, { variant: "caption", numberOfLines: 1, style: styles29.caption, children: label }),
3979
- !parts ? /* @__PURE__ */ jsx40(Txt, { variant: "caption", tone: "secondary", children: words2 }) : null
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
3980
3952
  ] }) : null,
3981
- /* @__PURE__ */ jsx40(View35, { style: [styles29.track, { height: THICK[size], backgroundColor: theme.surface3 }], children: parts ? shares.map((p, i) => /* @__PURE__ */ jsx40(View35, { style: { width: `${p.ratio * 100}%`, backgroundColor: p.color } }, i)) : /* @__PURE__ */ jsx40(View35, { style: [styles29.fill, { width: `${ratio * 100}%`, backgroundColor: tone3 }] }) }),
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 }] }) }),
3982
3954
  legend
3983
3955
  ] });
3984
3956
  }
@@ -3998,7 +3970,7 @@ var styles29 = StyleSheet29.create({
3998
3970
  // src/native/number-ticker.tsx
3999
3971
  import * as React26 from "react";
4000
3972
  import { AccessibilityInfo as AccessibilityInfo11, Animated as Animated15, Easing as Easing9, Text as Text13 } from "react-native";
4001
- import { jsx as jsx41 } from "react/jsx-runtime";
3973
+ import { jsx as jsx42 } from "react/jsx-runtime";
4002
3974
  function NumberTicker({ value, locale, format, trigger = "mount", duration = 1100, announce, variant = "display", tone: tone3 = "text", style }) {
4003
3975
  const reduce = useReducedMotion();
4004
3976
  const writer = React26.useMemo(() => new Intl.NumberFormat(locale, format), [locale, format]);
@@ -4026,13 +3998,13 @@ function NumberTicker({ value, locale, format, trigger = "mount", duration = 110
4026
3998
  };
4027
3999
  }, [value, reduce, trigger, duration, announce, anim, writer]);
4028
4000
  const digits = Number.isInteger(value) ? Math.round(shown) : shown;
4029
- return /* @__PURE__ */ jsx41(Txt, { variant, tone: tone3, "aria-label": writer.format(value), style: [{ fontVariant: ["tabular-nums"] }, style], children: /* @__PURE__ */ jsx41(Text13, { "aria-hidden": true, children: writer.format(digits) }) });
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) }) });
4030
4002
  }
4031
4003
 
4032
4004
  // src/native/onboarding.tsx
4033
4005
  import * as React27 from "react";
4034
- import { ScrollView as ScrollView5, StyleSheet as StyleSheet30, View as View36 } from "react-native";
4035
- import { jsx as jsx42, jsxs as jsxs37 } from "react/jsx-runtime";
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";
4036
4008
  function Onboarding({ slides, labels, onDone, style }) {
4037
4009
  const { theme, insets, haptic } = useTheme();
4038
4010
  const [width, setWidth] = React27.useState(0);
@@ -4047,15 +4019,15 @@ function Onboarding({ slides, labels, onDone, style }) {
4047
4019
  const onScroll = (e) => {
4048
4020
  if (width > 0) setPage(Math.round(e.nativeEvent.contentOffset.x / width));
4049
4021
  };
4050
- return /* @__PURE__ */ jsxs37(View36, { style: [styles30.root, { backgroundColor: theme.surface0, paddingTop: insets.top + 8, paddingBottom: insets.bottom + 16 }, style], onLayout: (e) => setWidth(e.nativeEvent.layout.width), children: [
4051
- /* @__PURE__ */ jsx42(View36, { style: styles30.top, children: !last ? /* @__PURE__ */ jsx42(Button, { label: labels.skip, variant: "ghost", size: "sm", onPress: onDone }) : /* @__PURE__ */ jsx42(View36, { style: styles30.spacer }) }),
4052
- /* @__PURE__ */ jsx42(ScrollView5, { ref: scroller, tabIndex: 0, horizontal: true, pagingEnabled: true, showsHorizontalScrollIndicator: false, onMomentumScrollEnd: onScroll, style: styles30.flex, children: slides.map((slide, i) => /* @__PURE__ */ jsxs37(View36, { style: [styles30.slide, { width: width || void 0 }], accessible: true, "aria-label": `${labels.position(i + 1, slides.length)}. ${slide.title}. ${slide.description}`, "aria-hidden": i !== page, children: [
4053
- slide.visual ? /* @__PURE__ */ jsx42(View36, { style: styles30.visual, children: slide.visual }) : null,
4054
- /* @__PURE__ */ jsx42(Txt, { variant: "display", style: styles30.centred, children: slide.title }),
4055
- /* @__PURE__ */ jsx42(Txt, { tone: "secondary", style: [styles30.centred, styles30.description], children: slide.description })
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 })
4056
4028
  ] }, i)) }),
4057
- /* @__PURE__ */ jsx42(View36, { style: styles30.dots, "aria-hidden": true, children: slides.map((_, i) => /* @__PURE__ */ jsx42(View36, { style: [styles30.dot, { width: i === page ? 22 : 8, backgroundColor: i === page ? theme.accent : theme.borderStrong }] }, i)) }),
4058
- /* @__PURE__ */ jsx42(View36, { style: styles30.bottom, children: /* @__PURE__ */ jsx42(Button, { label: last ? labels.done : labels.next, variant: last ? "gradient" : "primary", size: "lg", onPress: () => last ? onDone() : go(page + 1) }) })
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) }) })
4059
4031
  ] });
4060
4032
  }
4061
4033
  var styles30 = StyleSheet30.create({
@@ -4074,8 +4046,8 @@ var styles30 = StyleSheet30.create({
4074
4046
 
4075
4047
  // src/native/otp-input.tsx
4076
4048
  import * as React28 from "react";
4077
- import { Platform as Platform2, Pressable as Pressable15, StyleSheet as StyleSheet31, TextInput as TextInput5, View as View37 } from "react-native";
4078
- import { jsx as jsx43, jsxs as jsxs38 } from "react/jsx-runtime";
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";
4079
4051
  function OtpInput({ label, length = 6, value, onValueChange, onComplete, mode = "numeric", invalid, disabled, autoFocus, style }) {
4080
4052
  const { theme, radius: radius3, haptic } = useTheme();
4081
4053
  const [own, setOwn] = React28.useState("");
@@ -4094,11 +4066,11 @@ function OtpInput({ label, length = 6, value, onValueChange, onComplete, mode =
4094
4066
  onComplete?.(next);
4095
4067
  }
4096
4068
  };
4097
- return /* @__PURE__ */ jsxs38(Pressable15, { onPress: () => input.current?.focus(), disabled, accessible: false, style: [styles31.root, style], children: [
4098
- /* @__PURE__ */ jsx43(View37, { style: styles31.boxes, "aria-hidden": true, children: Array.from({ length }, (_, i) => {
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) => {
4099
4071
  const active = focused && i === Math.min(code.length, length - 1);
4100
- return /* @__PURE__ */ jsx43(
4101
- View37,
4072
+ return /* @__PURE__ */ jsx44(
4073
+ View38,
4102
4074
  {
4103
4075
  style: [
4104
4076
  styles31.box,
@@ -4109,12 +4081,12 @@ function OtpInput({ label, length = 6, value, onValueChange, onComplete, mode =
4109
4081
  borderWidth: invalid || active ? 2 : 1
4110
4082
  }
4111
4083
  ],
4112
- children: /* @__PURE__ */ jsx43(Txt, { variant: "title", children: code[i] ?? "" })
4084
+ children: /* @__PURE__ */ jsx44(Txt, { variant: "title", children: code[i] ?? "" })
4113
4085
  },
4114
4086
  i
4115
4087
  );
4116
4088
  }) }),
4117
- /* @__PURE__ */ jsx43(
4089
+ /* @__PURE__ */ jsx44(
4118
4090
  TextInput5,
4119
4091
  {
4120
4092
  ref: input,
@@ -4146,11 +4118,11 @@ var styles31 = StyleSheet31.create({
4146
4118
  });
4147
4119
 
4148
4120
  // src/native/pagination.tsx
4149
- import { Pressable as Pressable16, StyleSheet as StyleSheet32, Text as Text14, View as View38 } from "react-native";
4121
+ import { Pressable as Pressable16, StyleSheet as StyleSheet32, Text as Text14, View as View39 } from "react-native";
4150
4122
  import Svg20, { Path as Path17 } from "react-native-svg";
4151
- import { jsx as jsx44, jsxs as jsxs39 } from "react/jsx-runtime";
4123
+ import { jsx as jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
4152
4124
  function Chevron3({ direction, color }) {
4153
- return /* @__PURE__ */ jsx44(Svg20, { width: 18, height: 18, viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: 2.2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: /* @__PURE__ */ jsx44(Path17, { d: direction === "left" ? "m15 6-6 6 6 6" : "m9 6 6 6-6 6" }) });
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" }) });
4154
4126
  }
4155
4127
  function Pagination({ page = 1, pageCount, onPageChange, hasPrevious, hasNext, onPrevious, onNext, status, disabled, labels, style }) {
4156
4128
  const { theme, radius: radius3 } = useTheme();
@@ -4159,7 +4131,7 @@ function Pagination({ page = 1, pageCount, onPageChange, hasPrevious, hasNext, o
4159
4131
  const current = Math.min(Math.max(1, page), count);
4160
4132
  const canPrevious = !disabled && (paged ? current > 1 : Boolean(hasPrevious));
4161
4133
  const canNext = !disabled && (paged ? current < count : Boolean(hasNext));
4162
- const button = (direction, enabled, onPress, label) => /* @__PURE__ */ jsx44(
4134
+ const button = (direction, enabled, onPress, label) => /* @__PURE__ */ jsx45(
4163
4135
  Pressable16,
4164
4136
  {
4165
4137
  role: "button",
@@ -4172,13 +4144,13 @@ function Pagination({ page = 1, pageCount, onPageChange, hasPrevious, hasNext, o
4172
4144
  styles32.button,
4173
4145
  { borderRadius: radius3.sm, borderColor: theme.borderDefault, backgroundColor: theme.surface1, opacity: enabled ? pressed ? 0.8 : 1 : 0.4 }
4174
4146
  ],
4175
- children: /* @__PURE__ */ jsx44(Chevron3, { direction, color: theme.textPrimary })
4147
+ children: /* @__PURE__ */ jsx45(Chevron3, { direction, color: theme.textPrimary })
4176
4148
  }
4177
4149
  );
4178
4150
  const text = status ?? (paged ? labels.compact(current, count) : null);
4179
- return /* @__PURE__ */ jsxs39(View38, { role: "navigation", style: [styles32.row, style], children: [
4151
+ return /* @__PURE__ */ jsxs40(View39, { role: "navigation", style: [styles32.row, style], children: [
4180
4152
  button("left", canPrevious, paged ? () => onPageChange?.(current - 1) : onPrevious, labels.previous),
4181
- text ? /* @__PURE__ */ jsx44(Text14, { "aria-live": "polite", style: [styles32.status, { color: theme.textSecondary }], children: text }) : null,
4153
+ text ? /* @__PURE__ */ jsx45(Text14, { "aria-live": "polite", style: [styles32.status, { color: theme.textSecondary }], children: text }) : null,
4182
4154
  button("right", canNext, paged ? () => onPageChange?.(current + 1) : onNext, labels.next)
4183
4155
  ] });
4184
4156
  }
@@ -4189,8 +4161,8 @@ var styles32 = StyleSheet32.create({
4189
4161
  });
4190
4162
 
4191
4163
  // src/native/permission-prompt.tsx
4192
- import { StyleSheet as StyleSheet33, View as View39 } from "react-native";
4193
- import { Fragment as Fragment6, jsx as jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
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";
4194
4166
  function PermissionPrompt({
4195
4167
  status,
4196
4168
  title,
@@ -4207,15 +4179,15 @@ function PermissionPrompt({
4207
4179
  style
4208
4180
  }) {
4209
4181
  const { theme, radius: radius3 } = useTheme();
4210
- if (status === "granted") return /* @__PURE__ */ jsx45(Fragment6, { children: children ?? null });
4182
+ if (status === "granted") return /* @__PURE__ */ jsx46(Fragment6, { children: children ?? null });
4211
4183
  const blocked = status === "blocked" || status === "denied" && Boolean(onOpenSettings);
4212
- return /* @__PURE__ */ jsxs40(View39, { style: [styles33.root, { backgroundColor: theme.surface1, borderColor: theme.borderSubtle, borderRadius: radius3.xl }, style], children: [
4213
- /* @__PURE__ */ jsx45(Mascot, { bird: mascot, mood: blocked ? "error" : "welcome", size: 104 }),
4214
- /* @__PURE__ */ jsx45(Txt, { variant: "title", style: styles33.centred, children: title }),
4215
- /* @__PURE__ */ jsx45(Txt, { tone: "secondary", style: styles33.centred, children: blocked && blockedDescription ? blockedDescription : description }),
4216
- /* @__PURE__ */ jsxs40(View39, { style: styles33.actions, children: [
4217
- blocked && settingsLabel && onOpenSettings ? /* @__PURE__ */ jsx45(Button, { label: settingsLabel, variant: "primary", onPress: onOpenSettings }) : /* @__PURE__ */ jsx45(Button, { label: allowLabel, variant: "primary", onPress: onAllow }),
4218
- dismissLabel && onDismiss ? /* @__PURE__ */ jsx45(Button, { label: dismissLabel, variant: "ghost", onPress: onDismiss }) : null
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
4219
4191
  ] })
4220
4192
  ] });
4221
4193
  }
@@ -4227,8 +4199,8 @@ var styles33 = StyleSheet33.create({
4227
4199
 
4228
4200
  // src/native/phoenix.tsx
4229
4201
  import { useEffect as useEffect19, useState as useState28 } from "react";
4230
- import { AccessibilityInfo as AccessibilityInfo12, Animated as Animated16, Easing as Easing10, View as View40 } from "react-native";
4231
- import Svg21, { Circle as Circle13, Defs as Defs12, LinearGradient as LinearGradient12, Path as Path18, RadialGradient as RadialGradient9, Stop as Stop12 } from "react-native-svg";
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";
4232
4204
 
4233
4205
  // src/mascots/phoenix-geometry.ts
4234
4206
  var PHOENIX = {
@@ -4251,7 +4223,7 @@ var PHOENIX_PALETTES = {
4251
4223
  };
4252
4224
 
4253
4225
  // src/native/phoenix.tsx
4254
- import { jsx as jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
4226
+ import { jsx as jsx47, jsxs as jsxs42 } from "react/jsx-runtime";
4255
4227
  function useFloat(animated) {
4256
4228
  const [y] = useState28(() => new Animated16.Value(0));
4257
4229
  useEffect19(() => {
@@ -4276,37 +4248,37 @@ function Phoenix({ tone: tone3 = "own", size = 120, animated = true, title, styl
4276
4248
  const id = useSvgId("kzp");
4277
4249
  const y = useFloat(animated);
4278
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;
4279
- return /* @__PURE__ */ jsx46(View40, { style: [{ width: size, height: size }, style], ...markA11y(title), children: /* @__PURE__ */ jsx46(Animated16.View, { style: { transform: [{ translateY: y }] }, children: /* @__PURE__ */ jsxs41(Svg21, { width: size, height: size, viewBox: "0 0 120 120", children: [
4280
- /* @__PURE__ */ jsxs41(Defs12, { children: [
4281
- /* @__PURE__ */ jsxs41(LinearGradient12, { id: `${id}l`, x1: "1", y1: "0", x2: "0", y2: "1", children: [
4282
- /* @__PURE__ */ jsx46(Stop12, { offset: "0%", stopColor: p.left[0] }),
4283
- /* @__PURE__ */ jsx46(Stop12, { offset: "100%", stopColor: p.left[1] })
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] })
4284
4256
  ] }),
4285
- /* @__PURE__ */ jsxs41(LinearGradient12, { id: `${id}r`, x1: "0", y1: "0", x2: "1", y2: "1", children: [
4286
- /* @__PURE__ */ jsx46(Stop12, { offset: "0%", stopColor: p.right[0] }),
4287
- /* @__PURE__ */ jsx46(Stop12, { offset: "100%", stopColor: p.right[1] })
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] })
4288
4260
  ] }),
4289
- /* @__PURE__ */ jsxs41(RadialGradient9, { id: `${id}c`, children: [
4290
- /* @__PURE__ */ jsx46(Stop12, { offset: "0%", stopColor: p.core[0] }),
4291
- /* @__PURE__ */ jsx46(Stop12, { offset: "100%", stopColor: p.core[1], stopOpacity: 0 })
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 })
4292
4264
  ] })
4293
4265
  ] }),
4294
- /* @__PURE__ */ jsx46(Path18, { d: PHOENIX.wingL, fill: `url(#${id}l)` }),
4295
- /* @__PURE__ */ jsx46(Path18, { d: PHOENIX.wingR, fill: `url(#${id}r)` }),
4296
- /* @__PURE__ */ jsx46(Path18, { d: PHOENIX.tailL, fill: `url(#${id}l)`, opacity: 0.7 }),
4297
- /* @__PURE__ */ jsx46(Path18, { d: PHOENIX.tailR, fill: `url(#${id}r)`, opacity: 0.7 }),
4298
- /* @__PURE__ */ jsx46(Path18, { d: PHOENIX.body, fill: p.body, stroke: p.edge, strokeOpacity: 0.5 }),
4299
- /* @__PURE__ */ jsx46(Circle13, { cx: 60, cy: 58, r: 12, fill: `url(#${id}c)` }),
4300
- /* @__PURE__ */ jsx46(Circle13, { cx: 60, cy: 58, r: 3.5, fill: "#ffffff" }),
4301
- /* @__PURE__ */ jsx46(Path18, { d: PHOENIX.crest, stroke: p.crest, strokeWidth: 2, strokeLinecap: "round" })
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" })
4302
4274
  ] }) }) });
4303
4275
  }
4304
4276
 
4305
4277
  // src/native/photo-grid.tsx
4306
4278
  import * as React30 from "react";
4307
- import { Image as Image4, Pressable as Pressable17, StyleSheet as StyleSheet34, View as View41 } from "react-native";
4279
+ import { Image as Image4, Pressable as Pressable17, StyleSheet as StyleSheet34, View as View42 } from "react-native";
4308
4280
  import Svg22, { Path as Path19 } from "react-native-svg";
4309
- import { jsx as jsx47, jsxs as jsxs42 } from "react/jsx-runtime";
4281
+ import { jsx as jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
4310
4282
  function PhotoGrid({ value, onValueChange, onAdd, slots = 6, required = 1, columns = 3, labels, style }) {
4311
4283
  const { theme, radius: radius3, haptic } = useTheme();
4312
4284
  const [menu, setMenu] = React30.useState(null);
@@ -4323,11 +4295,11 @@ function PhotoGrid({ value, onValueChange, onAdd, slots = 6, required = 1, colum
4323
4295
  onValueChange(value.filter((_, j) => j !== i));
4324
4296
  };
4325
4297
  const width = `${100 / columns}%`;
4326
- return /* @__PURE__ */ jsxs42(View41, { style: [styles34.grid, style], children: [
4298
+ return /* @__PURE__ */ jsxs43(View42, { style: [styles34.grid, style], children: [
4327
4299
  Array.from({ length: slots }, (_, i) => {
4328
4300
  const photo = value[i];
4329
4301
  const cell = [styles34.slot, { borderRadius: radius3.lg, aspectRatio: 3 / 4 }];
4330
- return /* @__PURE__ */ jsx47(View41, { style: [styles34.cell, { width }], children: photo ? /* @__PURE__ */ jsxs42(
4302
+ return /* @__PURE__ */ jsx48(View42, { style: [styles34.cell, { width }], children: photo ? /* @__PURE__ */ jsxs43(
4331
4303
  Pressable17,
4332
4304
  {
4333
4305
  role: "button",
@@ -4351,11 +4323,11 @@ function PhotoGrid({ value, onValueChange, onAdd, slots = 6, required = 1, colum
4351
4323
  },
4352
4324
  style: [...cell, { backgroundColor: theme.surface3, overflow: "hidden" }],
4353
4325
  children: [
4354
- /* @__PURE__ */ jsx47(Image4, { source: { uri: photo.uri }, style: StyleSheet34.absoluteFill, resizeMode: "cover" }),
4355
- i === 0 ? /* @__PURE__ */ jsx47(View41, { style: [styles34.main, { backgroundColor: theme.accent, borderRadius: radius3.full }], children: /* @__PURE__ */ jsx47(Txt, { variant: "caption", tone: "onAccent", style: styles34.mainText, children: labels.main }) }) : null
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
4356
4328
  ]
4357
4329
  }
4358
- ) : /* @__PURE__ */ jsx47(
4330
+ ) : /* @__PURE__ */ jsx48(
4359
4331
  Pressable17,
4360
4332
  {
4361
4333
  role: "button",
@@ -4367,11 +4339,11 @@ function PhotoGrid({ value, onValueChange, onAdd, slots = 6, required = 1, colum
4367
4339
  styles34.empty,
4368
4340
  { borderColor: i < required ? theme.accent : theme.borderStrong, backgroundColor: pressed ? theme.surface2 : theme.surface1, opacity: i > value.length ? 0.5 : 1 }
4369
4341
  ],
4370
- children: /* @__PURE__ */ jsx47(View41, { style: [styles34.plus, { backgroundColor: i === value.length ? theme.accent : theme.surface3, borderRadius: radius3.full }], children: /* @__PURE__ */ jsx47(Svg22, { width: 16, height: 16, viewBox: "0 0 24 24", "aria-hidden": true, children: /* @__PURE__ */ jsx47(Path19, { d: "M12 5v14M5 12h14", stroke: i === value.length ? theme.onAccent : theme.textSecondary, strokeWidth: 2.6, strokeLinecap: "round" }) }) })
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" }) }) })
4371
4343
  }
4372
4344
  ) }, photo?.id ?? `empty-${i}`);
4373
4345
  }),
4374
- /* @__PURE__ */ jsx47(
4346
+ /* @__PURE__ */ jsx48(
4375
4347
  ActionSheet,
4376
4348
  {
4377
4349
  open: menu !== null,
@@ -4399,16 +4371,16 @@ var styles34 = StyleSheet34.create({
4399
4371
 
4400
4372
  // src/native/profile-card.tsx
4401
4373
  import * as React31 from "react";
4402
- import { Animated as Animated17, StyleSheet as StyleSheet35, View as View42 } from "react-native";
4403
- import { jsx as jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
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";
4404
4376
  var ratioOf = (value, max = 100) => Math.min(1, Math.max(0, value / (max || 1)));
4405
4377
  function Bar({ label, ratio, words: words2, animated, delay }) {
4406
4378
  const { theme } = useTheme();
4407
4379
  const t = useEntrance(animated, delay, 900);
4408
4380
  const [width, setWidth] = React31.useState(0);
4409
4381
  const translateX = t.interpolate({ inputRange: [0, 1], outputRange: [-width * ratio, 0] });
4410
- return /* @__PURE__ */ jsx48(
4411
- View42,
4382
+ return /* @__PURE__ */ jsx49(
4383
+ View43,
4412
4384
  {
4413
4385
  accessible: true,
4414
4386
  role: "meter",
@@ -4419,37 +4391,37 @@ function Bar({ label, ratio, words: words2, animated, delay }) {
4419
4391
  "aria-valuetext": words2,
4420
4392
  onLayout: (e) => setWidth(e.nativeEvent.layout.width),
4421
4393
  style: [styles35.track, { backgroundColor: theme.surface3 }],
4422
- children: /* @__PURE__ */ jsx48(Animated17.View, { style: [styles35.fill, { width: `${ratio * 100}%`, backgroundColor: theme.accent, transform: [{ translateX }] }] })
4394
+ children: /* @__PURE__ */ jsx49(Animated17.View, { style: [styles35.fill, { width: `${ratio * 100}%`, backgroundColor: theme.accent, transform: [{ translateX }] }] })
4423
4395
  }
4424
4396
  );
4425
4397
  }
4426
4398
  function ProfileCard({ visual, name, statLabel, value = 100, valueText, stats, caption, children, animated = true, style, ...props }) {
4427
4399
  const { theme, radius: radius3 } = useTheme();
4428
4400
  const ratio = ratioOf(value);
4429
- return /* @__PURE__ */ jsxs43(View42, { ...props, style: [styles35.root, { backgroundColor: theme.surface1, borderColor: theme.borderSubtle, borderRadius: radius3.xl }, style], children: [
4430
- /* @__PURE__ */ jsx48(View42, { "aria-hidden": true, style: [styles35.disc, { backgroundColor: theme.surface2, borderColor: theme.accentSoft }], children: visual }),
4431
- /* @__PURE__ */ jsxs43(View42, { style: styles35.head, children: [
4432
- /* @__PURE__ */ jsx48(Txt, { variant: "title", style: styles35.name, children: name }),
4433
- statLabel ? /* @__PURE__ */ jsxs43(Txt, { variant: "caption", tone: "secondary", children: [
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: [
4434
4406
  statLabel,
4435
4407
  " ",
4436
- /* @__PURE__ */ jsx48(Txt, { variant: "caption", children: valueText ?? `${Math.round(ratio * 100)} %` })
4408
+ /* @__PURE__ */ jsx49(Txt, { variant: "caption", children: valueText ?? `${Math.round(ratio * 100)} %` })
4437
4409
  ] }) : null
4438
4410
  ] }),
4439
- statLabel ? /* @__PURE__ */ jsx48(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,
4440
4412
  stats?.map((s, i) => {
4441
4413
  const r = ratioOf(s.value, s.max);
4442
4414
  const words2 = s.valueText ?? `${Math.round(r * 100)} %`;
4443
- return /* @__PURE__ */ jsxs43(View42, { style: styles35.stat, children: [
4444
- /* @__PURE__ */ jsxs43(View42, { "aria-hidden": true, style: styles35.statHead, children: [
4445
- /* @__PURE__ */ jsx48(Txt, { variant: "caption", tone: "secondary", children: s.label }),
4446
- /* @__PURE__ */ jsx48(Txt, { variant: "caption", children: words2 })
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 })
4447
4419
  ] }),
4448
- /* @__PURE__ */ jsx48(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 })
4449
4421
  ] }, s.label);
4450
4422
  }),
4451
- caption ? /* @__PURE__ */ jsx48(Txt, { variant: "caption", tone: "secondary", style: styles35.caption, children: caption }) : null,
4452
- children ? /* @__PURE__ */ jsx48(View42, { style: styles35.extra, children }) : null
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
4453
4425
  ] });
4454
4426
  }
4455
4427
  var styles35 = StyleSheet35.create({
@@ -4467,9 +4439,9 @@ var styles35 = StyleSheet35.create({
4467
4439
 
4468
4440
  // src/native/progress.tsx
4469
4441
  import * as React32 from "react";
4470
- import { Animated as Animated18, Easing as Easing11, StyleSheet as StyleSheet36, View as View43 } from "react-native";
4471
- import Svg23, { Circle as Circle14, Defs as Defs13, LinearGradient as LinearGradient13, Rect as Rect4, Stop as Stop13 } from "react-native-svg";
4472
- import { jsx as jsx49, jsxs as jsxs44 } 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";
4473
4445
  var AnimatedCircle = Animated18.createAnimatedComponent(Circle14);
4474
4446
  var BAR2 = { sm: 4, md: 8, lg: 12 };
4475
4447
  var RING2 = { sm: 40, md: 80, lg: 144 };
@@ -4511,9 +4483,9 @@ function Progress({ variant = "bar", size = "md", value, max = 100, label, value
4511
4483
  "aria-valuenow": known ? Math.min(max, Math.max(0, value)) : void 0,
4512
4484
  "aria-valuetext": known ? valueText ?? `${percent}%` : valueText
4513
4485
  };
4514
- const gradient = /* @__PURE__ */ jsx49(Defs13, { children: /* @__PURE__ */ jsxs44(LinearGradient13, { id, x1: "0", y1: "0", x2: "1", y2: variant === "ring" ? "1" : "0", children: [
4515
- /* @__PURE__ */ jsx49(Stop13, { offset: "0", stopColor: theme.accent }),
4516
- /* @__PURE__ */ jsx49(Stop13, { offset: "1", stopColor: theme.accent2 })
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 })
4517
4489
  ] }) });
4518
4490
  if (variant === "ring") {
4519
4491
  const side = RING2[size];
@@ -4522,11 +4494,11 @@ function Progress({ variant = "bar", size = "md", value, max = 100, label, value
4522
4494
  const circumference = 2 * Math.PI * r;
4523
4495
  const offset = known ? progress.interpolate({ inputRange: [0, 1], outputRange: [circumference, 0] }) : circumference * 0.75;
4524
4496
  const rotate = spin.interpolate({ inputRange: [0, 1], outputRange: ["0deg", "360deg"] });
4525
- return /* @__PURE__ */ jsxs44(View43, { ...a11y, style: [styles36.ring, { width: side, height: side }, style], children: [
4526
- /* @__PURE__ */ jsx49(Animated18.View, { style: [StyleSheet36.absoluteFill, { transform: [{ rotate: known ? "-90deg" : rotate }] }], children: /* @__PURE__ */ jsxs44(Svg23, { width: side, height: side, viewBox: "0 0 100 100", children: [
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: [
4527
4499
  gradient,
4528
- /* @__PURE__ */ jsx49(Circle14, { cx: 50, cy: 50, r, fill: "none", stroke: theme.borderDefault, strokeWidth: stroke }),
4529
- /* @__PURE__ */ jsx49(
4500
+ /* @__PURE__ */ jsx50(Circle14, { cx: 50, cy: 50, r, fill: "none", stroke: theme.borderDefault, strokeWidth: stroke }),
4501
+ /* @__PURE__ */ jsx50(
4530
4502
  AnimatedCircle,
4531
4503
  {
4532
4504
  cx: 50,
@@ -4546,15 +4518,15 @@ function Progress({ variant = "bar", size = "md", value, max = 100, label, value
4546
4518
  }
4547
4519
  const width = known ? progress.interpolate({ inputRange: [0, 1], outputRange: ["0%", "100%"] }) : "40%";
4548
4520
  const translate = spin.interpolate({ inputRange: [0, 1], outputRange: [-0.4 * track, track] });
4549
- return /* @__PURE__ */ jsx49(
4550
- View43,
4521
+ return /* @__PURE__ */ jsx50(
4522
+ View44,
4551
4523
  {
4552
4524
  ...a11y,
4553
4525
  onLayout: known ? void 0 : (event) => setTrack(event.nativeEvent.layout.width),
4554
4526
  style: [styles36.bar, { height: BAR2[size], backgroundColor: theme.surface3 }, style],
4555
- children: /* @__PURE__ */ jsx49(Animated18.View, { style: [styles36.fill, { width }, known || reduce ? null : { transform: [{ translateX: translate }] }], children: /* @__PURE__ */ jsxs44(Svg23, { width: "100%", height: "100%", preserveAspectRatio: "none", children: [
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: [
4556
4528
  gradient,
4557
- /* @__PURE__ */ jsx49(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})` })
4558
4530
  ] }) })
4559
4531
  }
4560
4532
  );
@@ -4567,11 +4539,11 @@ var styles36 = StyleSheet36.create({
4567
4539
 
4568
4540
  // src/native/pull-to-refresh.tsx
4569
4541
  import * as React33 from "react";
4570
- import { AccessibilityInfo as AccessibilityInfo13, Animated as Animated19, RefreshControl, StyleSheet as StyleSheet37, View as View44 } from "react-native";
4571
- import { jsx as jsx50, jsxs as jsxs45 } from "react/jsx-runtime";
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";
4572
4544
  function PullToRefresh({ label, ...props }) {
4573
4545
  const { theme } = useTheme();
4574
- return /* @__PURE__ */ jsx50(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 });
4575
4547
  }
4576
4548
  var pullProgress = (offset, threshold) => Math.min(1, Math.max(0, -offset / threshold));
4577
4549
  function BrandedRefresh({ product, refreshing, onRefresh, label, children, threshold = 72 }) {
@@ -4588,14 +4560,14 @@ function BrandedRefresh({ product, refreshing, onRefresh, label, children, thres
4588
4560
  const shown = refreshing ? 1 : pull;
4589
4561
  const scale = refreshing || reduce ? 1 : pull.interpolate({ inputRange: [0, 1], outputRange: [0.4, 1] });
4590
4562
  const rotate = refreshing || reduce ? "0deg" : pull.interpolate({ inputRange: [0, 1], outputRange: ["-90deg", "0deg"] });
4591
- return /* @__PURE__ */ jsxs45(View44, { style: styles37.root, children: [
4563
+ return /* @__PURE__ */ jsxs46(View45, { style: styles37.root, children: [
4592
4564
  children({
4593
4565
  // The platform's control does the gesture and the haptics, drawn transparent: the mark is ours.
4594
- refreshControl: /* @__PURE__ */ jsx50(RefreshControl, { refreshing, onRefresh, tintColor: "transparent", colors: ["transparent"], progressBackgroundColor: "transparent" }),
4566
+ refreshControl: /* @__PURE__ */ jsx51(RefreshControl, { refreshing, onRefresh, tintColor: "transparent", colors: ["transparent"], progressBackgroundColor: "transparent" }),
4595
4567
  onScroll,
4596
4568
  scrollEventThrottle: 16
4597
4569
  }),
4598
- /* @__PURE__ */ jsx50(Animated19.View, { pointerEvents: "none", "aria-hidden": true, style: [styles37.mark, { opacity: shown, transform: [{ scale }, { rotate }] }], children: /* @__PURE__ */ jsx50(ProductMark, { id: product, size: 32, animated: refreshing, neutral: theme.textMuted }) })
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 }) })
4599
4571
  ] });
4600
4572
  }
4601
4573
  var styles37 = StyleSheet37.create({
@@ -4605,11 +4577,11 @@ var styles37 = StyleSheet37.create({
4605
4577
 
4606
4578
  // src/native/radio-group.tsx
4607
4579
  import * as React34 from "react";
4608
- import { Animated as Animated20, Pressable as Pressable18, StyleSheet as StyleSheet38, Text as Text15, View as View45 } from "react-native";
4580
+ import { Animated as Animated20, Pressable as Pressable18, StyleSheet as StyleSheet38, Text as Text15, View as View46 } from "react-native";
4609
4581
  import Svg24, { Path as Path20 } from "react-native-svg";
4610
- import { jsx as jsx51, jsxs as jsxs46 } from "react/jsx-runtime";
4582
+ import { jsx as jsx52, jsxs as jsxs47 } from "react/jsx-runtime";
4611
4583
  function Check({ color }) {
4612
- return /* @__PURE__ */ jsx51(Svg24, { width: 12, height: 12, viewBox: "0 0 24 24", fill: "none", stroke: color, strokeWidth: 3.2, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: /* @__PURE__ */ jsx51(Path20, { d: "M20 6 9 17l-5-5" }) });
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" }) });
4613
4585
  }
4614
4586
  function Key({ option, checked, disabled, onPress }) {
4615
4587
  const { theme, radius: radius3, motion: motion3 } = useTheme();
@@ -4619,7 +4591,7 @@ function Key({ option, checked, disabled, onPress }) {
4619
4591
  React34.useEffect(() => {
4620
4592
  Animated20.timing(sink, { toValue: down ? 1 : 0, duration: motion3.duration.fast, useNativeDriver: true }).start();
4621
4593
  }, [down, sink, motion3.duration.fast]);
4622
- return /* @__PURE__ */ jsxs46(
4594
+ return /* @__PURE__ */ jsxs47(
4623
4595
  Pressable18,
4624
4596
  {
4625
4597
  role: "radio",
@@ -4632,8 +4604,8 @@ function Key({ option, checked, disabled, onPress }) {
4632
4604
  onPressOut: () => setHeld(false),
4633
4605
  style: [styles38.keySlot, disabled ? styles38.disabled : null],
4634
4606
  children: [
4635
- /* @__PURE__ */ jsx51(View45, { style: [styles38.ledge, { borderRadius: radius3.lg, backgroundColor: checked ? theme.accentHover : theme.borderStrong }] }),
4636
- /* @__PURE__ */ jsxs46(
4607
+ /* @__PURE__ */ jsx52(View46, { style: [styles38.ledge, { borderRadius: radius3.lg, backgroundColor: checked ? theme.accentHover : theme.borderStrong }] }),
4608
+ /* @__PURE__ */ jsxs47(
4637
4609
  Animated20.View,
4638
4610
  {
4639
4611
  style: [
@@ -4646,8 +4618,8 @@ function Key({ option, checked, disabled, onPress }) {
4646
4618
  }
4647
4619
  ],
4648
4620
  children: [
4649
- /* @__PURE__ */ jsx51(Text15, { style: [styles38.keyLabel, { color: checked ? theme.onAccent : theme.textPrimary }], children: option.label }),
4650
- option.hint ? /* @__PURE__ */ jsx51(Text15, { style: [styles38.keyHint, { color: checked ? theme.onAccent : theme.textSecondary }], children: option.hint }) : null
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
4651
4623
  ]
4652
4624
  }
4653
4625
  )
@@ -4668,9 +4640,9 @@ function RadioGroup({ label, options, value: valueProp, defaultValue = null, onV
4668
4640
  const checked = o.value === value;
4669
4641
  const off = Boolean(disabled || o.disabled);
4670
4642
  const name = o.description ? `${o.label}, ${o.description}` : o.label;
4671
- if (variant === "buttons") return /* @__PURE__ */ jsx51(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);
4672
4644
  if (variant === "segmented")
4673
- return /* @__PURE__ */ jsx51(
4645
+ return /* @__PURE__ */ jsx52(
4674
4646
  Pressable18,
4675
4647
  {
4676
4648
  role: "radio",
@@ -4680,12 +4652,12 @@ function RadioGroup({ label, options, value: valueProp, defaultValue = null, onV
4680
4652
  disabled: off,
4681
4653
  onPress: () => pick(o.value),
4682
4654
  style: [styles38.segment, { borderRadius: radius3.md }, checked ? { backgroundColor: theme.surface0, borderColor: theme.borderDefault } : null, off ? styles38.disabled : null],
4683
- children: /* @__PURE__ */ jsx51(Text15, { numberOfLines: 1, style: [styles38.segmentLabel, { color: checked ? theme.textPrimary : theme.textSecondary }], children: o.label })
4655
+ children: /* @__PURE__ */ jsx52(Text15, { numberOfLines: 1, style: [styles38.segmentLabel, { color: checked ? theme.textPrimary : theme.textSecondary }], children: o.label })
4684
4656
  },
4685
4657
  o.value
4686
4658
  );
4687
4659
  if (variant === "cards")
4688
- return /* @__PURE__ */ jsxs46(
4660
+ return /* @__PURE__ */ jsxs47(
4689
4661
  Pressable18,
4690
4662
  {
4691
4663
  role: "radio",
@@ -4700,24 +4672,24 @@ function RadioGroup({ label, options, value: valueProp, defaultValue = null, onV
4700
4672
  off ? styles38.disabled : null
4701
4673
  ],
4702
4674
  children: [
4703
- /* @__PURE__ */ jsx51(View45, { style: [styles38.cardCheck, { borderColor: checked ? theme.accent : theme.borderStrong, backgroundColor: checked ? theme.accent : theme.surface1 }], children: checked ? /* @__PURE__ */ jsx51(Check, { color: theme.onAccent }) : null }),
4704
- /* @__PURE__ */ jsx51(Text15, { style: [styles38.cardLabel, { color: theme.textPrimary }], children: o.label }),
4705
- o.description ? /* @__PURE__ */ jsx51(Text15, { style: [styles38.cardDescription, { color: theme.textSecondary }], children: o.description }) : null
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
4706
4678
  ]
4707
4679
  },
4708
4680
  o.value
4709
4681
  );
4710
- return /* @__PURE__ */ jsxs46(Pressable18, { role: "radio", "aria-checked": checked, "aria-label": name, "aria-disabled": off || void 0, disabled: off, onPress: () => pick(o.value), style: [styles38.row, off ? styles38.disabled : null], children: [
4711
- /* @__PURE__ */ jsx51(View45, { style: [styles38.dot, { borderColor: checked ? theme.accent : theme.borderStrong, backgroundColor: checked ? theme.accent : theme.surface1 }], children: checked ? /* @__PURE__ */ jsx51(View45, { style: [styles38.dotIn, { backgroundColor: theme.onAccent }] }) : null }),
4712
- /* @__PURE__ */ jsxs46(View45, { style: styles38.rowText, children: [
4713
- /* @__PURE__ */ jsx51(Text15, { style: [styles38.rowLabel, { color: theme.textPrimary }], children: o.label }),
4714
- o.description ? /* @__PURE__ */ jsx51(Text15, { style: [styles38.cardDescription, { color: theme.textSecondary }], children: o.description }) : null
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
4715
4687
  ] })
4716
4688
  ] }, o.value);
4717
4689
  });
4718
- return /* @__PURE__ */ jsxs46(View45, { style: [styles38.root, style], children: [
4719
- /* @__PURE__ */ jsx51(
4720
- View45,
4690
+ return /* @__PURE__ */ jsxs47(View46, { style: [styles38.root, style], children: [
4691
+ /* @__PURE__ */ jsx52(
4692
+ View46,
4721
4693
  {
4722
4694
  role: "radiogroup",
4723
4695
  "aria-label": label,
@@ -4725,7 +4697,7 @@ function RadioGroup({ label, options, value: valueProp, defaultValue = null, onV
4725
4697
  children: body
4726
4698
  }
4727
4699
  ),
4728
- error ? /* @__PURE__ */ jsx51(Text15, { role: "alert", "aria-live": "polite", style: [styles38.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
4729
4701
  ] });
4730
4702
  }
4731
4703
  var styles38 = StyleSheet38.create({
@@ -4755,26 +4727,26 @@ var styles38 = StyleSheet38.create({
4755
4727
  });
4756
4728
 
4757
4729
  // src/native/screen.tsx
4758
- import { KeyboardAvoidingView, Platform as Platform3, ScrollView as ScrollView6, StyleSheet as StyleSheet39, View as View46 } from "react-native";
4759
- import { Fragment as Fragment7, jsx as jsx52, jsxs as jsxs47 } from "react/jsx-runtime";
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";
4760
4732
  function Screen({ header, footer, children, scroll = true, keyboard = true, padding = 16, surface = "surface0", contentStyle }) {
4761
4733
  const { theme, insets } = useTheme();
4762
- const body = scroll ? /* @__PURE__ */ jsx52(ScrollView6, { style: styles39.flex, contentContainerStyle: [{ padding, paddingTop: header ? padding : padding + insets.top, gap: 16 }, contentStyle], keyboardShouldPersistTaps: "handled", tabIndex: 0, children }) : /* @__PURE__ */ jsx52(View46, { style: [styles39.flex, { paddingTop: header ? 0 : insets.top }, contentStyle], children });
4763
- const inner = /* @__PURE__ */ jsxs47(Fragment7, { children: [
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: [
4764
4736
  header,
4765
4737
  body,
4766
4738
  footer
4767
4739
  ] });
4768
- return /* @__PURE__ */ jsx52(View46, { style: [styles39.flex, { backgroundColor: theme[surface] }], children: keyboard ? /* @__PURE__ */ jsx52(KeyboardAvoidingView, { style: styles39.flex, behavior: Platform3.OS === "ios" ? "padding" : void 0, children: inner }) : inner });
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 });
4769
4741
  }
4770
4742
  var styles39 = StyleSheet39.create({ flex: { flex: 1 } });
4771
4743
 
4772
4744
  // src/native/search-field.tsx
4773
4745
  import { useDebouncedCallback } from "@krizaka/pacer/react";
4774
4746
  import * as React35 from "react";
4775
- import { Pressable as Pressable19, StyleSheet as StyleSheet40, TextInput as TextInput6, View as View47 } from "react-native";
4747
+ import { Pressable as Pressable19, StyleSheet as StyleSheet40, TextInput as TextInput6, View as View48 } from "react-native";
4776
4748
  import Svg25, { Circle as Circle15, Path as Path21 } from "react-native-svg";
4777
- import { jsx as jsx53, jsxs as jsxs48 } from "react/jsx-runtime";
4749
+ import { jsx as jsx54, jsxs as jsxs49 } from "react/jsx-runtime";
4778
4750
  function SearchField({ label, value, defaultValue = "", onValueChange, onSearch, debounce = 300, onSubmit, clearLabel, cancelLabel, onCancel, style, placeholder, onFocus, onBlur, ...props }) {
4779
4751
  const [focused, setFocused] = React35.useState(false);
4780
4752
  const input = React35.useRef(null);
@@ -4788,12 +4760,12 @@ function SearchField({ label, value, defaultValue = "", onValueChange, onSearch,
4788
4760
  search.cancel();
4789
4761
  if (onSearch) search(next);
4790
4762
  };
4791
- const field = /* @__PURE__ */ jsxs48(View47, { style: [styles40.frame, { borderRadius: radius3.md, borderColor: theme.borderDefault, backgroundColor: theme.surface2 }, style], children: [
4792
- /* @__PURE__ */ jsxs48(Svg25, { width: 18, height: 18, viewBox: "0 0 24 24", fill: "none", stroke: theme.textSecondary, strokeWidth: 2, strokeLinecap: "round", "aria-hidden": true, children: [
4793
- /* @__PURE__ */ jsx53(Circle15, { cx: 11, cy: 11, r: 7 }),
4794
- /* @__PURE__ */ jsx53(Path21, { d: "m20 20-3.5-3.5" })
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" })
4795
4767
  ] }),
4796
- /* @__PURE__ */ jsx53(
4768
+ /* @__PURE__ */ jsx54(
4797
4769
  TextInput6,
4798
4770
  {
4799
4771
  ref: input,
@@ -4824,12 +4796,12 @@ function SearchField({ label, value, defaultValue = "", onValueChange, onSearch,
4824
4796
  ...props
4825
4797
  }
4826
4798
  ),
4827
- query ? /* @__PURE__ */ jsx53(Pressable19, { role: "button", "aria-label": clearLabel, hitSlop: 10, onPress: () => change(""), style: styles40.clear, children: /* @__PURE__ */ jsx53(Svg25, { width: 16, height: 16, viewBox: "0 0 24 24", fill: "none", stroke: theme.textSecondary, strokeWidth: 2.4, strokeLinecap: "round", "aria-hidden": true, children: /* @__PURE__ */ jsx53(Path21, { d: "M18 6 6 18M6 6l12 12" }) }) }) : null
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
4828
4800
  ] });
4829
4801
  if (!cancelLabel || !onCancel) return field;
4830
- return /* @__PURE__ */ jsxs48(View47, { style: styles40.bar, children: [
4831
- /* @__PURE__ */ jsx53(View47, { style: styles40.grow, children: field }),
4832
- focused || query ? /* @__PURE__ */ jsx53(
4802
+ return /* @__PURE__ */ jsxs49(View48, { style: styles40.bar, children: [
4803
+ /* @__PURE__ */ jsx54(View48, { style: styles40.grow, children: field }),
4804
+ focused || query ? /* @__PURE__ */ jsx54(
4833
4805
  Pressable19,
4834
4806
  {
4835
4807
  role: "button",
@@ -4840,7 +4812,7 @@ function SearchField({ label, value, defaultValue = "", onValueChange, onSearch,
4840
4812
  },
4841
4813
  hitSlop: 8,
4842
4814
  style: styles40.cancel,
4843
- children: /* @__PURE__ */ jsx53(Txt, { variant: "label", tone: "accent", children: cancelLabel })
4815
+ children: /* @__PURE__ */ jsx54(Txt, { variant: "label", tone: "accent", children: cancelLabel })
4844
4816
  }
4845
4817
  ) : null
4846
4818
  ] });
@@ -4855,19 +4827,19 @@ var styles40 = StyleSheet40.create({
4855
4827
  });
4856
4828
 
4857
4829
  // src/native/segmented.tsx
4858
- import { Pressable as Pressable20, StyleSheet as StyleSheet41, Text as Text16, View as View48 } from "react-native";
4859
- import { jsx as jsx54 } from "react/jsx-runtime";
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";
4860
4832
  function Segmented({ options, value, onValueChange, size = "md", "aria-label": label, style }) {
4861
4833
  const { theme, radius: radius3 } = useTheme();
4862
- return /* @__PURE__ */ jsx54(
4863
- View48,
4834
+ return /* @__PURE__ */ jsx55(
4835
+ View49,
4864
4836
  {
4865
4837
  role: "tablist",
4866
4838
  "aria-label": label,
4867
4839
  style: [styles41.track, { backgroundColor: theme.surface2, borderColor: theme.borderSubtle, borderRadius: radius3.md, height: size === "sm" ? 32 : 40 }, style],
4868
4840
  children: options.map((option) => {
4869
4841
  const selected = option.value === value;
4870
- return /* @__PURE__ */ jsx54(
4842
+ return /* @__PURE__ */ jsx55(
4871
4843
  Pressable20,
4872
4844
  {
4873
4845
  role: "tab",
@@ -4883,7 +4855,7 @@ function Segmented({ options, value, onValueChange, size = "md", "aria-label": l
4883
4855
  selected ? { backgroundColor: theme.surface0, borderColor: theme.borderDefault } : null,
4884
4856
  option.disabled ? styles41.disabled : null
4885
4857
  ],
4886
- children: /* @__PURE__ */ jsx54(Text16, { numberOfLines: 1, style: [styles41.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 })
4887
4859
  },
4888
4860
  option.value
4889
4861
  );
@@ -4900,9 +4872,9 @@ var styles41 = StyleSheet41.create({
4900
4872
 
4901
4873
  // src/native/showcase.tsx
4902
4874
  import * as React36 from "react";
4903
- import { Animated as Animated21, AppState, Easing as Easing12, FlatList, Pressable as Pressable21, StyleSheet as StyleSheet42, View as View49 } 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";
4904
4876
  import Svg26, { Path as Path22 } from "react-native-svg";
4905
- import { jsx as jsx55, jsxs as jsxs49 } from "react/jsx-runtime";
4877
+ import { jsx as jsx56, jsxs as jsxs50 } from "react/jsx-runtime";
4906
4878
  var showcaseLabels = {
4907
4879
  previous: "Previous slide",
4908
4880
  next: "Next slide",
@@ -4961,9 +4933,9 @@ function Showcase({ label, items: items2, getId, renderItem, getTitle, interval
4961
4933
  const item = items2[current];
4962
4934
  const title = item !== void 0 ? getTitle?.(item) : void 0;
4963
4935
  const control = [styles42.control, { borderColor: theme.borderDefault, backgroundColor: theme.surface1 }];
4964
- const icon = (d) => /* @__PURE__ */ jsx55(Svg26, { width: 16, height: 16, viewBox: "0 0 24 24", "aria-hidden": true, children: /* @__PURE__ */ jsx55(Path22, { d, stroke: theme.textSecondary, strokeWidth: 2.2, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" }) });
4965
- return /* @__PURE__ */ jsxs49(View49, { role: "group", "aria-label": label, style: [styles42.root, style], children: [
4966
- /* @__PURE__ */ jsx55(View49, { "aria-live": announce ? "polite" : "off", onLayout: (e) => setWidth(e.nativeEvent.layout.width), children: /* @__PURE__ */ jsx55(
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(
4967
4939
  FlatList,
4968
4940
  {
4969
4941
  ref: list,
@@ -4984,21 +4956,21 @@ function Showcase({ label, items: items2, getId, renderItem, getTitle, interval
4984
4956
  onIndexChange?.(next, true);
4985
4957
  }
4986
4958
  },
4987
- renderItem: ({ item: slide, index }) => /* @__PURE__ */ jsx55(View49, { role: "group", "aria-label": labels.slide(index + 1, total), style: { width }, children: Math.abs(index - current) <= 1 ? renderItem(slide, { index, active: index === current }) : null })
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 })
4988
4960
  }
4989
4961
  ) }),
4990
- /* @__PURE__ */ jsx55(View49, { style: styles42.segments, children: items2.map((slide, i) => /* @__PURE__ */ jsx55(Pressable21, { role: "button", "aria-label": labels.goTo(i + 1, total), "aria-current": i === current ? true : void 0, onPress: () => go(i, true), style: styles42.segment, children: /* @__PURE__ */ jsxs49(View49, { style: [styles42.track, { backgroundColor: theme.surface3 }], children: [
4991
- i < current || i === current && !playing ? /* @__PURE__ */ jsx55(View49, { style: [StyleSheet42.absoluteFill, { backgroundColor: theme.accent }] }) : null,
4992
- i === current && playing ? /* @__PURE__ */ jsx55(Animated21.View, { style: [styles42.fill, { backgroundColor: theme.accent, width: fill.interpolate({ inputRange: [0, 1], outputRange: ["0%", "100%"] }) }] }) : null
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
4993
4965
  ] }) }, getId(slide))) }),
4994
- /* @__PURE__ */ jsxs49(View49, { style: styles42.bar, children: [
4995
- /* @__PURE__ */ jsxs49(Txt, { variant: "caption", tone: "secondary", numberOfLines: 1, style: styles42.counter, children: [
4966
+ /* @__PURE__ */ jsxs50(View50, { style: styles42.bar, children: [
4967
+ /* @__PURE__ */ jsxs50(Txt, { variant: "caption", tone: "secondary", numberOfLines: 1, style: styles42.counter, children: [
4996
4968
  title ? `${title} \xB7 ` : "",
4997
4969
  labels.counter(current + 1, total)
4998
4970
  ] }),
4999
- /* @__PURE__ */ jsx55(Pressable21, { role: "button", "aria-label": labels.previous, disabled: !loop && current === 0, hitSlop: 6, onPress: () => go(current - 1, true), style: control, children: icon("M15 5l-7 7 7 7") }),
5000
- playing ? /* @__PURE__ */ jsx55(Pressable21, { role: "button", "aria-label": paused ? labels.play : labels.pause, hitSlop: 6, onPress: () => setPaused(!paused), style: control, children: icon(paused ? "M8 5.5v13l10-6.5Z" : "M8 5v14M16 5v14") }) : null,
5001
- /* @__PURE__ */ jsx55(Pressable21, { role: "button", "aria-label": labels.next, disabled: !loop && current === total - 1, hitSlop: 6, onPress: () => go(current + 1, true), style: control, children: icon("M9 5l7 7-7 7") })
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") })
5002
4974
  ] })
5003
4975
  ] });
5004
4976
  }
@@ -5016,7 +4988,7 @@ var styles42 = StyleSheet42.create({
5016
4988
  // src/native/skeleton.tsx
5017
4989
  import * as React37 from "react";
5018
4990
  import { Animated as Animated22 } from "react-native";
5019
- import { jsx as jsx56 } from "react/jsx-runtime";
4991
+ import { jsx as jsx57 } from "react/jsx-runtime";
5020
4992
  var SHAPE = {
5021
4993
  text: { width: "100%", height: 12, radius: 4 },
5022
4994
  circle: { width: 40, height: 40, radius: 9999 },
@@ -5042,7 +5014,7 @@ function Skeleton({ shape = "text", width, height, style, testID }) {
5042
5014
  }, [reduce, opacity]);
5043
5015
  const s = SHAPE[shape];
5044
5016
  const side = shape === "circle" ? width ?? height ?? s.width : void 0;
5045
- return /* @__PURE__ */ jsx56(
5017
+ return /* @__PURE__ */ jsx57(
5046
5018
  Animated22.View,
5047
5019
  {
5048
5020
  testID,
@@ -5057,9 +5029,9 @@ function Skeleton({ shape = "text", width, height, style, testID }) {
5057
5029
 
5058
5030
  // src/native/slider.tsx
5059
5031
  import * as React38 from "react";
5060
- import { PanResponder as PanResponder2, StyleSheet as StyleSheet43, Text as Text17, View as View50 } from "react-native";
5061
- import Svg27, { Defs as Defs14, LinearGradient as LinearGradient14, Rect as Rect5, Stop as Stop14 } from "react-native-svg";
5062
- import { jsx as jsx57, jsxs as jsxs50 } 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";
5063
5035
  var THUMB = 26;
5064
5036
  var toArray = (v) => v === void 0 ? void 0 : typeof v === "number" ? [v] : [...v];
5065
5037
  function Slider({
@@ -5151,24 +5123,24 @@ function Slider({
5151
5123
  const along = (p) => vertical ? { bottom: p * length } : { left: p * length };
5152
5124
  const onLayout = (e) => setLength(vertical ? e.nativeEvent.layout.height : e.nativeEvent.layout.width);
5153
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 };
5154
- return /* @__PURE__ */ jsxs50(View50, { style: [styles43.root, vertical ? styles43.rootVertical : null, disabled ? styles43.disabled : null, style], children: [
5155
- showLabel ? /* @__PURE__ */ jsxs50(View50, { style: styles43.header, children: [
5156
- /* @__PURE__ */ jsx57(Text17, { style: [styles43.label, { color: theme.textSecondary }], children: label }),
5157
- /* @__PURE__ */ jsx57(Text17, { "aria-hidden": true, style: [styles43.value, { color: theme.textSecondary }], children: current.map(formatValue).join(" \u2013 ") })
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 ") })
5158
5130
  ] }) : null,
5159
- /* @__PURE__ */ jsxs50(View50, { ...responder.panHandlers, style: vertical ? styles43.controlVertical : styles43.control, children: [
5160
- /* @__PURE__ */ jsxs50(View50, { onLayout, pointerEvents: "none", style: [vertical ? styles43.trackVertical : styles43.track, { borderRadius: radius3.full, backgroundColor: theme.surface3 }], children: [
5161
- /* @__PURE__ */ jsx57(View50, { style: [styles43.fill, fill, { borderRadius: radius3.full, overflow: "hidden", backgroundColor: theme.accent }], children: tone3 === "gradient" ? /* @__PURE__ */ jsxs50(Svg27, { width: "100%", height: "100%", "aria-hidden": true, children: [
5162
- /* @__PURE__ */ jsx57(Defs14, { children: /* @__PURE__ */ jsxs50(LinearGradient14, { id: gradientId, x1: "0", y1: vertical ? "1" : "0", x2: vertical ? "0" : "1", y2: "0", children: [
5163
- /* @__PURE__ */ jsx57(Stop14, { offset: "0", stopColor: theme.accent }),
5164
- /* @__PURE__ */ jsx57(Stop14, { offset: "1", stopColor: theme.accent2 })
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 })
5165
5137
  ] }) }),
5166
- /* @__PURE__ */ jsx57(Rect5, { width: "100%", height: "100%", fill: `url(#${gradientId})` })
5138
+ /* @__PURE__ */ jsx58(Rect4, { width: "100%", height: "100%", fill: `url(#${gradientId})` })
5167
5139
  ] }) : null }),
5168
- tickValues.map((t) => /* @__PURE__ */ jsx57(View50, { style: [vertical ? styles43.tickVertical : styles43.tick, along(pct(t)), { backgroundColor: t > lo && t < hi ? theme.onAccent : theme.borderStrong }] }, t))
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))
5169
5141
  ] }),
5170
- current.map((v, i) => /* @__PURE__ */ jsx57(
5171
- View50,
5142
+ current.map((v, i) => /* @__PURE__ */ jsx58(
5143
+ View51,
5172
5144
  {
5173
5145
  accessible: true,
5174
5146
  role: "slider",
@@ -5188,12 +5160,12 @@ function Slider({
5188
5160
  },
5189
5161
  pointerEvents: "none",
5190
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 }],
5191
- children: floatingValue === "always" || floatingValue && dragging === i ? /* @__PURE__ */ jsx57(View50, { "aria-hidden": true, style: [vertical ? styles43.bubbleVertical : styles43.bubble, { backgroundColor: theme.textPrimary, borderRadius: radius3.md }], children: /* @__PURE__ */ jsx57(Text17, { style: [styles43.bubbleText, { color: theme.surface0 }], children: formatValue(v) }) }) : null
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
5192
5164
  },
5193
5165
  i
5194
5166
  ))
5195
5167
  ] }),
5196
- marks2?.length && !vertical ? /* @__PURE__ */ jsx57(View50, { "aria-hidden": true, style: styles43.marks, children: marks2.map((m) => /* @__PURE__ */ jsx57(Text17, { style: [styles43.mark, { left: pct(m.value) * length, color: theme.textSecondary, transform: [{ translateX: m.value === min ? 0 : m.value === max ? -40 : -20 }], textAlign: m.value === min ? "left" : m.value === max ? "right" : "center" }], children: m.label }, m.value)) }) : null
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
5197
5169
  ] });
5198
5170
  }
5199
5171
  var styles43 = StyleSheet43.create({
@@ -5232,10 +5204,10 @@ var styles43 = StyleSheet43.create({
5232
5204
 
5233
5205
  // src/native/spinner.tsx
5234
5206
  import { ActivityIndicator as ActivityIndicator2 } from "react-native";
5235
- import { jsx as jsx58 } from "react/jsx-runtime";
5207
+ import { jsx as jsx59 } from "react/jsx-runtime";
5236
5208
  function Spinner({ label, size = "md", ...props }) {
5237
5209
  const { theme } = useTheme();
5238
- return /* @__PURE__ */ jsx58(
5210
+ return /* @__PURE__ */ jsx59(
5239
5211
  ActivityIndicator2,
5240
5212
  {
5241
5213
  accessible: true,
@@ -5251,8 +5223,8 @@ function Spinner({ label, size = "md", ...props }) {
5251
5223
 
5252
5224
  // src/native/splash-handoff.tsx
5253
5225
  import * as React39 from "react";
5254
- import { Animated as Animated23, Easing as Easing13, StyleSheet as StyleSheet44, View as View51 } from "react-native";
5255
- import { jsx as jsx59 } from "react/jsx-runtime";
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";
5256
5228
  function SplashHandoff({ product, ready, onShown, onDone, size = 96, background, label, duration = 320, style }) {
5257
5229
  const { theme } = useTheme();
5258
5230
  const reduce = useReducedMotion();
@@ -5270,7 +5242,7 @@ function SplashHandoff({ product, ready, onShown, onDone, size = 96, background,
5270
5242
  return () => animation.stop();
5271
5243
  }, [ready, reduce, duration, opacity, onDone]);
5272
5244
  if (gone) return null;
5273
- return /* @__PURE__ */ jsx59(
5245
+ return /* @__PURE__ */ jsx60(
5274
5246
  Animated23.View,
5275
5247
  {
5276
5248
  accessible: true,
@@ -5280,26 +5252,26 @@ function SplashHandoff({ product, ready, onShown, onDone, size = 96, background,
5280
5252
  pointerEvents: ready ? "none" : "auto",
5281
5253
  onLayout: onShown,
5282
5254
  style: [StyleSheet44.absoluteFill, styles44.root, { backgroundColor: background ?? theme.surface0, opacity }, style],
5283
- children: /* @__PURE__ */ jsx59(View51, { children: /* @__PURE__ */ jsx59(ProductMark, { id: product, size, animated: true }) })
5255
+ children: /* @__PURE__ */ jsx60(View52, { children: /* @__PURE__ */ jsx60(ProductMark, { id: product, size, animated: true }) })
5284
5256
  }
5285
5257
  );
5286
5258
  }
5287
5259
  var styles44 = StyleSheet44.create({ root: { alignItems: "center", justifyContent: "center", zIndex: 100 } });
5288
5260
 
5289
5261
  // src/native/step-progress.tsx
5290
- import { Pressable as Pressable22, StyleSheet as StyleSheet45, View as View52 } from "react-native";
5262
+ import { Pressable as Pressable22, StyleSheet as StyleSheet45, View as View53 } from "react-native";
5291
5263
  import Svg28, { Path as Path23 } from "react-native-svg";
5292
- import { jsx as jsx60, jsxs as jsxs51 } from "react/jsx-runtime";
5264
+ import { jsx as jsx61, jsxs as jsxs52 } from "react/jsx-runtime";
5293
5265
  function StepProgress({ step, total, label, backLabel, onBack, trailing, style }) {
5294
5266
  const { theme, insets } = useTheme();
5295
5267
  const words2 = label(step, total);
5296
- return /* @__PURE__ */ jsxs51(View52, { style: [styles45.root, { paddingTop: insets.top + 8 }, style], children: [
5297
- /* @__PURE__ */ jsxs51(View52, { style: styles45.row, children: [
5298
- onBack && backLabel ? /* @__PURE__ */ jsx60(Pressable22, { role: "button", "aria-label": backLabel, hitSlop: 10, onPress: onBack, style: styles45.back, children: /* @__PURE__ */ jsx60(Svg28, { width: 22, height: 22, viewBox: "0 0 24 24", "aria-hidden": true, children: /* @__PURE__ */ jsx60(Path23, { d: "M15 5l-7 7 7 7", stroke: theme.textPrimary, strokeWidth: 2.4, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" }) }) }) : /* @__PURE__ */ jsx60(View52, { style: styles45.back }),
5299
- /* @__PURE__ */ jsx60(View52, { accessible: true, role: "progressbar", "aria-label": words2, "aria-valuemin": 1, "aria-valuemax": total, "aria-valuenow": step, "aria-valuetext": words2, style: styles45.bars, children: Array.from({ length: total }, (_, i) => /* @__PURE__ */ jsx60(View52, { style: [styles45.bar, { backgroundColor: i < step ? theme.accent : theme.surface3 }] }, i)) }),
5300
- /* @__PURE__ */ jsx60(View52, { style: styles45.trailing, children: trailing })
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 })
5301
5273
  ] }),
5302
- /* @__PURE__ */ jsx60(Txt, { variant: "caption", tone: "secondary", style: styles45.words, "aria-hidden": true, children: words2 })
5274
+ /* @__PURE__ */ jsx61(Txt, { variant: "caption", tone: "secondary", style: styles45.words, "aria-hidden": true, children: words2 })
5303
5275
  ] });
5304
5276
  }
5305
5277
  var styles45 = StyleSheet45.create({
@@ -5313,31 +5285,31 @@ var styles45 = StyleSheet45.create({
5313
5285
  });
5314
5286
 
5315
5287
  // src/native/stepper.tsx
5316
- import { StyleSheet as StyleSheet46, View as View53 } from "react-native";
5288
+ import { StyleSheet as StyleSheet46, View as View54 } from "react-native";
5317
5289
  import Svg29, { Circle as Circle16, Path as Path24 } from "react-native-svg";
5318
- import { jsx as jsx61, jsxs as jsxs52 } from "react/jsx-runtime";
5290
+ import { jsx as jsx62, jsxs as jsxs53 } from "react/jsx-runtime";
5319
5291
  var WORDS = { done: "done", current: "in progress", upcoming: "to come", error: "failed" };
5320
5292
  function Stepper({ steps, current = 0, orientation = "vertical", statusLabels, "aria-label": label, style }) {
5321
5293
  const { theme } = useTheme();
5322
5294
  const words2 = { ...WORDS, ...statusLabels };
5323
5295
  const vertical = orientation === "vertical";
5324
- return /* @__PURE__ */ jsx61(View53, { role: "list", "aria-label": label, style: [vertical ? styles46.column : styles46.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) => {
5325
5297
  const status = step.status ?? (i < current ? "done" : i === current ? "current" : "upcoming");
5326
5298
  const last = i === steps.length - 1;
5327
- const node = status === "current" ? /* @__PURE__ */ jsx61(LoaderGlyph, { value: step.value ?? null, size: 24 }) : status === "error" ? /* @__PURE__ */ jsx61(LoaderGlyph, { state: "error", size: 24 }) : /* @__PURE__ */ jsxs52(Svg29, { width: 24, height: 24, viewBox: "0 0 24 24", "aria-hidden": true, children: [
5328
- /* @__PURE__ */ jsx61(Circle16, { cx: 12, cy: 12, r: 10, fill: status === "done" ? theme.accent : "none", stroke: status === "done" ? theme.accent : theme.borderStrong, strokeWidth: 2 }),
5329
- status === "done" ? /* @__PURE__ */ jsx61(Path24, { d: "M7.5 12.3l3 3 6-6.3", stroke: theme.onAccent, strokeWidth: 2.2, fill: "none", strokeLinecap: "round", strokeLinejoin: "round" }) : null
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
5330
5302
  ] });
5331
- const connector = !last ? /* @__PURE__ */ jsx61(View53, { "aria-hidden": true, style: [vertical ? styles46.vLine : styles46.hLine, { backgroundColor: status === "done" ? theme.accent : theme.borderDefault }] }) : null;
5332
- return /* @__PURE__ */ jsxs52(View53, { role: "listitem", accessible: true, "aria-label": `${step.title}, ${words2[status]}`, style: vertical ? styles46.vStep : styles46.hStep, children: [
5333
- /* @__PURE__ */ jsxs52(View53, { style: vertical ? styles46.vRail : styles46.hRail, children: [
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: [
5334
5306
  node,
5335
5307
  connector
5336
5308
  ] }),
5337
- /* @__PURE__ */ jsxs52(View53, { style: [styles46.body, vertical && !last ? { paddingBottom: 20 } : null], children: [
5338
- /* @__PURE__ */ jsx61(Txt, { variant: "label", tone: status === "upcoming" ? "secondary" : "text", numberOfLines: vertical ? void 0 : 2, children: step.title }),
5339
- step.description ? /* @__PURE__ */ jsx61(Txt, { variant: "caption", tone: "secondary", children: step.description }) : null,
5340
- step.content && (status === "current" || status === "error") ? /* @__PURE__ */ jsx61(View53, { style: styles46.content, children: step.content }) : null
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
5341
5313
  ] })
5342
5314
  ] }, i);
5343
5315
  }) });
@@ -5357,17 +5329,17 @@ var styles46 = StyleSheet46.create({
5357
5329
 
5358
5330
  // src/native/swipe-deck.tsx
5359
5331
  import * as React40 from "react";
5360
- import { AccessibilityInfo as AccessibilityInfo14, Animated as Animated24, Image as Image5, PanResponder as PanResponder3, Platform as Platform4, Pressable as Pressable23, StyleSheet as StyleSheet47, useWindowDimensions as useWindowDimensions2, View as View54 } from "react-native";
5361
- import Svg30, { Defs as Defs15, LinearGradient as LinearGradient15, Path as Path25, Rect as Rect6, Stop as Stop15 } from "react-native-svg";
5362
- import { Fragment as Fragment8, jsx as jsx62, jsxs as jsxs53 } 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";
5363
5335
  function PersonCard({ photos, name, age, badge, meta, bio, footer, photoLabel = (n, t) => `Photo ${n} of ${t}`, style }) {
5364
5336
  const { theme, radius: radius3 } = useTheme();
5365
5337
  const [index, setIndex] = React40.useState(0);
5366
5338
  const gradient = useSvgId("kz-profile-");
5367
5339
  const [box, setBox] = React40.useState(null);
5368
5340
  const photo = photos[index];
5369
- return /* @__PURE__ */ jsxs53(
5370
- View54,
5341
+ return /* @__PURE__ */ jsxs54(
5342
+ View55,
5371
5343
  {
5372
5344
  accessible: Platform4.OS !== "web",
5373
5345
  accessibilityActions: photos.length > 1 ? [{ name: "increment" }, { name: "decrement" }] : [],
@@ -5376,39 +5348,39 @@ function PersonCard({ photos, name, age, badge, meta, bio, footer, photoLabel =
5376
5348
  "aria-label": [`${name}${age !== void 0 ? `, ${age}` : ""}`, bio, photos.length > 1 ? photoLabel(index + 1, photos.length) : null].filter(Boolean).join(". "),
5377
5349
  style: [styles47.card, { borderRadius: radius3.xl, backgroundColor: theme.media }, style],
5378
5350
  children: [
5379
- photo ? /* @__PURE__ */ jsx62(Image5, { testID: "person-card-photo", source: { uri: photo.uri }, style: StyleSheet47.absoluteFill, resizeMode: "cover" }) : null,
5380
- photos.length > 1 ? /* @__PURE__ */ jsxs53(Fragment8, { children: [
5381
- /* @__PURE__ */ jsx62(View54, { style: styles47.bars, "aria-hidden": true, children: photos.map((_, i) => /* @__PURE__ */ jsx62(View54, { style: [styles47.bar, { backgroundColor: theme.textOnMedia, opacity: i === index ? 1 : 0.4 }] }, i)) }),
5382
- /* @__PURE__ */ jsx62(Pressable23, { "aria-hidden": true, accessible: false, focusable: false, tabIndex: -1, style: [styles47.half, { left: 0 }], onPress: () => setIndex((i) => Math.max(0, i - 1)) }),
5383
- /* @__PURE__ */ jsx62(Pressable23, { "aria-hidden": true, accessible: false, focusable: false, tabIndex: -1, style: [styles47.half, { right: 0 }], onPress: () => setIndex((i) => Math.min(photos.length - 1, i + 1)) })
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)) })
5384
5356
  ] }) : null,
5385
- /* @__PURE__ */ jsxs53(
5386
- View54,
5357
+ /* @__PURE__ */ jsxs54(
5358
+ View55,
5387
5359
  {
5388
5360
  testID: "person-card-overlay",
5389
5361
  pointerEvents: "box-none",
5390
5362
  style: styles47.bottom,
5391
5363
  onLayout: (e) => setBox({ width: e.nativeEvent.layout.width, height: e.nativeEvent.layout.height }),
5392
5364
  children: [
5393
- box ? /* @__PURE__ */ jsxs53(Svg30, { testID: "person-card-scrim", style: styles47.scrim, width: box.width, height: box.height, "aria-hidden": true, children: [
5394
- /* @__PURE__ */ jsx62(Defs15, { children: /* @__PURE__ */ jsxs53(LinearGradient15, { id: gradient, x1: "0", y1: "0", x2: "0", y2: "1", children: [
5395
- /* @__PURE__ */ jsx62(Stop15, { offset: "0", stopColor: theme.scrimStrong, stopOpacity: 0 }),
5396
- /* @__PURE__ */ jsx62(Stop15, { offset: "0.5", stopColor: theme.scrimStrong, stopOpacity: 0.8 }),
5397
- /* @__PURE__ */ jsx62(Stop15, { offset: "1", stopColor: theme.scrimStrong, stopOpacity: 1 })
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 })
5398
5370
  ] }) }),
5399
- /* @__PURE__ */ jsx62(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})` })
5400
5372
  ] }) : null,
5401
- /* @__PURE__ */ jsxs53(View54, { style: styles47.text, children: [
5402
- /* @__PURE__ */ jsxs53(View54, { style: styles47.nameRow, children: [
5403
- /* @__PURE__ */ jsxs53(Txt, { variant: "display", tone: "onMedia", style: styles47.name, numberOfLines: 1, children: [
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: [
5404
5376
  name,
5405
- age !== void 0 ? /* @__PURE__ */ jsx62(Txt, { variant: "display", tone: "onMedia", style: styles47.age, children: ` ${age}` }) : null
5377
+ age !== void 0 ? /* @__PURE__ */ jsx63(Txt, { variant: "display", tone: "onMedia", style: styles47.age, children: ` ${age}` }) : null
5406
5378
  ] }),
5407
5379
  badge
5408
5380
  ] }),
5409
5381
  meta,
5410
- bio ? /* @__PURE__ */ jsx62(Txt, { tone: "onMedia", numberOfLines: 2, children: bio }) : null,
5411
- footer ? /* @__PURE__ */ jsx62(View54, { style: styles47.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
5412
5384
  ] })
5413
5385
  ]
5414
5386
  }
@@ -5452,7 +5424,7 @@ function SwipeDeck({ items: items2, getId, renderCard, onSwipe, empty: empty2, l
5452
5424
  const rotate = x.interpolate({ inputRange: [-width, 0, width], outputRange: ["-14deg", "0deg", "14deg"] });
5453
5425
  const likeOpacity = x.interpolate({ inputRange: [0, width / 4], outputRange: [0, 1], extrapolate: "clamp" });
5454
5426
  const passOpacity = x.interpolate({ inputRange: [-width / 4, 0], outputRange: [1, 0], extrapolate: "clamp" });
5455
- const button = (direction) => /* @__PURE__ */ jsx62(
5427
+ const button = (direction) => /* @__PURE__ */ jsx63(
5456
5428
  Pressable23,
5457
5429
  {
5458
5430
  role: "button",
@@ -5463,15 +5435,15 @@ function SwipeDeck({ items: items2, getId, renderCard, onSwipe, empty: empty2, l
5463
5435
  styles47.button,
5464
5436
  { borderColor: direction === "like" ? theme.success : theme.danger, backgroundColor: theme.surface1, transform: [{ scale: pressed ? 0.92 : 1 }], opacity: top ? 1 : 0.4 }
5465
5437
  ],
5466
- children: /* @__PURE__ */ jsx62(Svg30, { width: 28, height: 28, viewBox: "0 0 24 24", "aria-hidden": true, children: direction === "like" ? /* @__PURE__ */ jsx62(Path25, { d: "M12 20s-7-4.4-7-10a4 4 0 0 1 7-2.6A4 4 0 0 1 19 10c0 5.6-7 10-7 10z", fill: theme.success }) : /* @__PURE__ */ jsx62(Path25, { d: "M6 6l12 12M18 6 6 18", stroke: theme.danger, strokeWidth: 3, strokeLinecap: "round" }) })
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" }) })
5467
5439
  }
5468
5440
  );
5469
- return /* @__PURE__ */ jsxs53(View54, { style: [styles47.deck, style], children: [
5470
- /* @__PURE__ */ jsxs53(View54, { style: styles47.stack, children: [
5441
+ return /* @__PURE__ */ jsxs54(View55, { style: [styles47.deck, style], children: [
5442
+ /* @__PURE__ */ jsxs54(View55, { style: styles47.stack, children: [
5471
5443
  !top ? empty2 ?? null : null,
5472
5444
  items2.slice(0, 2).reverse().map((item) => {
5473
5445
  const isTop = item === top;
5474
- return /* @__PURE__ */ jsxs53(
5446
+ return /* @__PURE__ */ jsxs54(
5475
5447
  Animated24.View,
5476
5448
  {
5477
5449
  ...isTop ? pan.panHandlers : {},
@@ -5483,9 +5455,9 @@ function SwipeDeck({ items: items2, getId, renderCard, onSwipe, empty: empty2, l
5483
5455
  style: [StyleSheet47.absoluteFill, isTop ? { transform: [{ translateX: x }, { rotate }] } : { transform: [{ scale: 0.96 }], opacity: 0.9 }],
5484
5456
  children: [
5485
5457
  renderCard(item),
5486
- isTop ? /* @__PURE__ */ jsxs53(Fragment8, { children: [
5487
- /* @__PURE__ */ jsx62(Animated24.View, { pointerEvents: "none", style: [styles47.stamp, styles47.stampLike, { borderColor: theme.success, opacity: likeOpacity }], "aria-hidden": true, children: /* @__PURE__ */ jsx62(Txt, { variant: "title", style: { color: theme.success }, children: labels.likeStamp ?? labels.like.toUpperCase() }) }),
5488
- /* @__PURE__ */ jsx62(Animated24.View, { pointerEvents: "none", style: [styles47.stamp, styles47.stampPass, { borderColor: theme.danger, opacity: passOpacity }], "aria-hidden": true, children: /* @__PURE__ */ jsx62(Txt, { variant: "title", style: { color: theme.danger }, children: labels.passStamp ?? labels.pass.toUpperCase() }) })
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() }) })
5489
5461
  ] }) : null
5490
5462
  ]
5491
5463
  },
@@ -5493,7 +5465,7 @@ function SwipeDeck({ items: items2, getId, renderCard, onSwipe, empty: empty2, l
5493
5465
  );
5494
5466
  })
5495
5467
  ] }),
5496
- hideButtons ? null : /* @__PURE__ */ jsxs53(View54, { style: styles47.buttons, children: [
5468
+ hideButtons ? null : /* @__PURE__ */ jsxs54(View55, { style: styles47.buttons, children: [
5497
5469
  button("pass"),
5498
5470
  button("like")
5499
5471
  ] })
@@ -5522,8 +5494,8 @@ var styles47 = StyleSheet47.create({
5522
5494
 
5523
5495
  // src/native/swipeable-row.tsx
5524
5496
  import * as React41 from "react";
5525
- import { Animated as Animated25, PanResponder as PanResponder4, Pressable as Pressable24, StyleSheet as StyleSheet48, View as View55 } from "react-native";
5526
- import { jsx as jsx63, jsxs as jsxs54 } from "react/jsx-runtime";
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";
5527
5499
  var toneColor = (t, tone3) => ({ neutral: t.surface3, accent: t.accent, success: t.success, warning: t.warning, danger: t.danger })[tone3 ?? "neutral"];
5528
5500
  var toneText = (tone3) => tone3 === "neutral" || tone3 === void 0 ? "text" : "onAccent";
5529
5501
  function SwipeableRow({ children, trailing = [], leading = [], fullSwipe = 0.6, actionWidth = 80, onActivate, testID, style }) {
@@ -5571,18 +5543,18 @@ function SwipeableRow({ children, trailing = [], leading = [], fullSwipe = 0.6,
5571
5543
  [trailing, leading, fullSwipe, width, actionWidth]
5572
5544
  // eslint-disable-line react-hooks/exhaustive-deps -- run/settle are stable in effect
5573
5545
  );
5574
- const side = (actions, edge) => /* @__PURE__ */ jsx63(View55, { "aria-hidden": true, style: [styles48.side, edge === "left" ? { left: 0 } : { right: 0, flexDirection: "row-reverse" }], children: actions.map((action, i) => (
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) => (
5575
5547
  // eslint-disable-next-line react-hooks/refs -- runs on a press, never during render
5576
- /* @__PURE__ */ jsxs54(Pressable24, { focusable: false, tabIndex: -1, onPress: () => run(action), style: [styles48.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: [
5577
5549
  action.icon,
5578
- /* @__PURE__ */ jsx63(Txt, { variant: "caption", tone: toneText(action.tone), style: styles48.actionText, numberOfLines: 1, children: action.label })
5550
+ /* @__PURE__ */ jsx64(Txt, { variant: "caption", tone: toneText(action.tone), style: styles48.actionText, numberOfLines: 1, children: action.label })
5579
5551
  ] }, i)
5580
5552
  )) });
5581
5553
  const all = [...leading, ...trailing];
5582
- return /* @__PURE__ */ jsxs54(View55, { style: [styles48.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: [
5583
5555
  leading.length > 0 ? side(leading, "left") : null,
5584
5556
  trailing.length > 0 ? side(trailing, "right") : null,
5585
- /* @__PURE__ */ jsx63(
5557
+ /* @__PURE__ */ jsx64(
5586
5558
  Animated25.View,
5587
5559
  {
5588
5560
  ...pan.panHandlers,
@@ -5610,8 +5582,8 @@ var styles48 = StyleSheet48.create({
5610
5582
 
5611
5583
  // src/native/switch.tsx
5612
5584
  import * as React42 from "react";
5613
- import { Animated as Animated26, Pressable as Pressable25, StyleSheet as StyleSheet49, Text as Text18, View as View56 } from "react-native";
5614
- import { jsx as jsx64, jsxs as jsxs55 } from "react/jsx-runtime";
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";
5615
5587
  var SIZES = { sm: { w: 40, h: 24, knob: 18 }, md: { w: 52, h: 32, knob: 26 } };
5616
5588
  function Switch({ label, checked, defaultChecked = false, onCheckedChange, description, showLabel, size = "md", error, disabled, style }) {
5617
5589
  const { theme, motion: motion3, haptic } = useTheme();
@@ -5628,7 +5600,7 @@ function Switch({ label, checked, defaultChecked = false, onCheckedChange, descr
5628
5600
  if (checked === void 0) setOwn(!on);
5629
5601
  onCheckedChange?.(!on);
5630
5602
  };
5631
- const track = /* @__PURE__ */ jsx64(View56, { style: [styles49.track, { width: d.w, height: d.h, borderRadius: d.h / 2, backgroundColor: on ? theme.accent : theme.surface3, borderColor: error ? theme.danger : on ? theme.accent : theme.borderDefault }], children: /* @__PURE__ */ jsx64(
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(
5632
5604
  Animated26.View,
5633
5605
  {
5634
5606
  style: [
@@ -5654,16 +5626,16 @@ function Switch({ label, checked, defaultChecked = false, onCheckedChange, descr
5654
5626
  onPress: toggle
5655
5627
  };
5656
5628
  if (!showLabel)
5657
- return /* @__PURE__ */ jsx64(Pressable25, { ...a11y, hitSlop: { top: (44 - d.h) / 2, bottom: (44 - d.h) / 2, left: Math.max(0, (44 - d.w) / 2), right: Math.max(0, (44 - d.w) / 2) }, style: [disabled ? styles49.disabled : null, style], children: track });
5658
- return /* @__PURE__ */ jsxs55(View56, { style: [styles49.root, style], children: [
5659
- /* @__PURE__ */ jsxs55(Pressable25, { ...a11y, style: [styles49.row, disabled ? styles49.disabled : null], children: [
5660
- /* @__PURE__ */ jsxs55(View56, { style: styles49.text, children: [
5661
- /* @__PURE__ */ jsx64(Text18, { style: [styles49.label, { color: theme.textPrimary }], children: label }),
5662
- description ? /* @__PURE__ */ jsx64(Text18, { style: [styles49.description, { color: theme.textSecondary }], children: description }) : null
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
5663
5635
  ] }),
5664
5636
  track
5665
5637
  ] }),
5666
- error ? /* @__PURE__ */ jsx64(Text18, { role: "alert", "aria-live": "polite", style: [styles49.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
5667
5639
  ] });
5668
5640
  }
5669
5641
  var styles49 = StyleSheet49.create({
@@ -5678,15 +5650,15 @@ var styles49 = StyleSheet49.create({
5678
5650
  });
5679
5651
 
5680
5652
  // src/native/tab-bar.tsx
5681
- import { Pressable as Pressable26, StyleSheet as StyleSheet50, Text as Text19, View as View57 } from "react-native";
5682
- import { jsx as jsx65, jsxs as jsxs56 } from "react/jsx-runtime";
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";
5683
5655
  function TabBar({ items: items2, value, onValueChange, onReselect, "aria-label": label, style }) {
5684
5656
  const { theme, insets, haptic } = useTheme();
5685
- return /* @__PURE__ */ jsx65(View57, { role: "tablist", "aria-label": label, style: [styles50.bar, { backgroundColor: theme.glassBg, borderTopColor: theme.glassBorder, paddingBottom: Math.max(6, insets.bottom) }, style], children: items2.map((item) => {
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) => {
5686
5658
  const selected = item.value === value;
5687
5659
  const color = selected ? theme.accentText : theme.textSecondary;
5688
5660
  const badge = item.badge === true ? "" : typeof item.badge === "number" && item.badge > 0 ? item.badge > 99 ? "99+" : String(item.badge) : null;
5689
- return /* @__PURE__ */ jsxs56(
5661
+ return /* @__PURE__ */ jsxs57(
5690
5662
  Pressable26,
5691
5663
  {
5692
5664
  role: "tab",
@@ -5698,12 +5670,12 @@ function TabBar({ items: items2, value, onValueChange, onReselect, "aria-label":
5698
5670
  },
5699
5671
  style: ({ pressed }) => [styles50.item, { opacity: pressed ? 0.7 : 1 }],
5700
5672
  children: [
5701
- /* @__PURE__ */ jsxs56(View57, { "aria-hidden": true, style: styles50.icon, children: [
5673
+ /* @__PURE__ */ jsxs57(View58, { "aria-hidden": true, style: styles50.icon, children: [
5702
5674
  item.icon(selected, color),
5703
- badge !== null ? /* @__PURE__ */ jsx65(View57, { style: [badge ? styles50.count : styles50.dot, { backgroundColor: theme.danger, borderColor: theme.surface1 }], children: badge ? /* @__PURE__ */ jsx65(Text19, { style: [styles50.countText, { color: theme.onAccent }], children: badge }) : null }) : null
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
5704
5676
  ] }),
5705
- /* @__PURE__ */ jsx65(Text19, { numberOfLines: 1, style: [styles50.label, { color, fontWeight: selected ? "700" : "500" }], children: item.label }),
5706
- badge !== null && item.badgeLabel ? /* @__PURE__ */ jsx65(Text19, { style: styles50.unseen, children: `, ${item.badgeLabel}` }) : null
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
5707
5679
  ]
5708
5680
  },
5709
5681
  item.value
@@ -5723,8 +5695,8 @@ var styles50 = StyleSheet50.create({
5723
5695
 
5724
5696
  // src/native/tabs.tsx
5725
5697
  import * as React43 from "react";
5726
- import { Pressable as Pressable27, ScrollView as ScrollView7, StyleSheet as StyleSheet51, View as View58 } from "react-native";
5727
- import { jsx as jsx66, jsxs as jsxs57 } from "react/jsx-runtime";
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";
5728
5700
  function Tabs({ items: items2, value, defaultValue, onValueChange, "aria-label": label, variant = "underline", style }) {
5729
5701
  const { theme, radius: radius3, haptic } = useTheme();
5730
5702
  const [own, setOwn] = React43.useState(defaultValue ?? items2[0]?.value);
@@ -5738,7 +5710,7 @@ function Tabs({ items: items2, value, defaultValue, onValueChange, "aria-label":
5738
5710
  const segmented = variant === "segmented";
5739
5711
  const tabs = items2.map((item) => {
5740
5712
  const selected = item.value === current;
5741
- return /* @__PURE__ */ jsx66(
5713
+ return /* @__PURE__ */ jsx67(
5742
5714
  Pressable27,
5743
5715
  {
5744
5716
  role: "tab",
@@ -5752,18 +5724,18 @@ function Tabs({ items: items2, value, defaultValue, onValueChange, "aria-label":
5752
5724
  !segmented ? { borderBottomColor: selected ? theme.accent : "transparent" } : null,
5753
5725
  item.disabled ? styles51.disabled : null
5754
5726
  ],
5755
- children: /* @__PURE__ */ jsxs57(Txt, { variant: "label", tone: selected ? "text" : "secondary", numberOfLines: 1, children: [
5727
+ children: /* @__PURE__ */ jsxs58(Txt, { variant: "label", tone: selected ? "text" : "secondary", numberOfLines: 1, children: [
5756
5728
  item.label,
5757
- item.count !== void 0 ? /* @__PURE__ */ jsx66(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
5758
5730
  ] })
5759
5731
  },
5760
5732
  item.value
5761
5733
  );
5762
5734
  });
5763
5735
  const panel = items2.find((i) => i.value === current)?.content;
5764
- return /* @__PURE__ */ jsxs57(View58, { style: [styles51.root, style], children: [
5765
- segmented ? /* @__PURE__ */ jsx66(View58, { role: "tablist", "aria-label": label, style: [styles51.track, { backgroundColor: theme.surface2, borderColor: theme.borderSubtle, borderRadius: radius3.md }], children: tabs }) : /* @__PURE__ */ jsx66(View58, { style: [styles51.underline, { borderBottomColor: theme.borderSubtle }], children: /* @__PURE__ */ jsx66(ScrollView7, { horizontal: true, showsHorizontalScrollIndicator: false, role: "tablist", "aria-label": label, contentContainerStyle: styles51.scroll, children: tabs }) }),
5766
- panel !== void 0 ? /* @__PURE__ */ jsx66(View58, { role: "tabpanel", children: panel }) : null
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
5767
5739
  ] });
5768
5740
  }
5769
5741
  var styles51 = StyleSheet51.create({
@@ -5777,15 +5749,15 @@ var styles51 = StyleSheet51.create({
5777
5749
  });
5778
5750
 
5779
5751
  // src/native/tag-selector.tsx
5780
- import { StyleSheet as StyleSheet52, View as View59 } from "react-native";
5781
- import { jsx as jsx67, jsxs as jsxs58 } 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";
5782
5754
  function TagSelector({ label, options, value, onValueChange, max, countLabel, style }) {
5783
5755
  const { haptic } = useTheme();
5784
5756
  const full = max !== void 0 && value.length >= max;
5785
- return /* @__PURE__ */ jsxs58(View59, { style: [styles52.root, style], children: [
5786
- /* @__PURE__ */ jsx67(View59, { role: "group", "aria-label": label, style: styles52.wrap, children: options.map((option) => {
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) => {
5787
5759
  const on = value.includes(option.value);
5788
- return /* @__PURE__ */ jsx67(
5760
+ return /* @__PURE__ */ jsx68(
5789
5761
  Chip,
5790
5762
  {
5791
5763
  selected: on,
@@ -5799,15 +5771,15 @@ function TagSelector({ label, options, value, onValueChange, max, countLabel, st
5799
5771
  option.value
5800
5772
  );
5801
5773
  }) }),
5802
- max !== void 0 && countLabel ? /* @__PURE__ */ jsx67(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
5803
5775
  ] });
5804
5776
  }
5805
5777
  var styles52 = StyleSheet52.create({ root: { gap: 8 }, wrap: { flexDirection: "row", flexWrap: "wrap", gap: 8 } });
5806
5778
 
5807
5779
  // src/native/toast.tsx
5808
5780
  import * as React44 from "react";
5809
- import { AccessibilityInfo as AccessibilityInfo15, Animated as Animated27, PanResponder as PanResponder5, Pressable as Pressable28, StyleSheet as StyleSheet53, Text as Text20, View as View60 } from "react-native";
5810
- import { Fragment as Fragment9, jsx as jsx68, jsxs as jsxs59 } from "react/jsx-runtime";
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";
5811
5783
  var items = [];
5812
5784
  var listeners2 = /* @__PURE__ */ new Set();
5813
5785
  var counter = 0;
@@ -5874,15 +5846,15 @@ function ToastView({ item, closeLabel, duration }) {
5874
5846
  return () => clearTimeout(timer2);
5875
5847
  }, [item.id, ms]);
5876
5848
  const edge = { success: theme.success, warning: theme.warning, error: theme.danger, info: theme.info, default: theme.borderDefault }[item.tone ?? "default"];
5877
- const text = /* @__PURE__ */ jsxs59(Fragment9, { children: [
5878
- item.icon ? /* @__PURE__ */ jsx68(View60, { "aria-hidden": true, children: item.icon }) : null,
5879
- /* @__PURE__ */ jsxs59(View60, { style: styles53.content, children: [
5880
- /* @__PURE__ */ jsx68(Txt, { variant: "label", numberOfLines: 2, children: item.title }),
5881
- item.description ? /* @__PURE__ */ jsx68(Txt, { variant: "caption", tone: "secondary", numberOfLines: 3, children: item.description }) : null
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
5882
5854
  ] })
5883
5855
  ] });
5884
- const body = /* @__PURE__ */ jsxs59(Fragment9, { children: [
5885
- item.onPress ? /* @__PURE__ */ jsx68(
5856
+ const body = /* @__PURE__ */ jsxs60(Fragment9, { children: [
5857
+ item.onPress ? /* @__PURE__ */ jsx69(
5886
5858
  Pressable28,
5887
5859
  {
5888
5860
  role: "button",
@@ -5893,8 +5865,8 @@ function ToastView({ item, closeLabel, duration }) {
5893
5865
  style: ({ pressed }) => [styles53.main, { opacity: pressed ? 0.8 : 1 }],
5894
5866
  children: text
5895
5867
  }
5896
- ) : /* @__PURE__ */ jsx68(View60, { style: styles53.main, children: text }),
5897
- item.action ? /* @__PURE__ */ jsx68(
5868
+ ) : /* @__PURE__ */ jsx69(View61, { style: styles53.main, children: text }),
5869
+ item.action ? /* @__PURE__ */ jsx69(
5898
5870
  Pressable28,
5899
5871
  {
5900
5872
  role: "button",
@@ -5903,23 +5875,23 @@ function ToastView({ item, closeLabel, duration }) {
5903
5875
  dismiss(item.id);
5904
5876
  },
5905
5877
  style: [styles53.action, { backgroundColor: theme.accent, borderRadius: radius3.sm }],
5906
- children: /* @__PURE__ */ jsx68(Text20, { style: [styles53.actionLabel, { color: theme.onAccent }], children: item.action.label })
5878
+ children: /* @__PURE__ */ jsx69(Text20, { style: [styles53.actionLabel, { color: theme.onAccent }], children: item.action.label })
5907
5879
  }
5908
5880
  ) : null,
5909
- /* @__PURE__ */ jsx68(Pressable28, { role: "button", "aria-label": closeLabel, hitSlop: 10, onPress: () => dismiss(item.id), style: styles53.close, children: /* @__PURE__ */ jsx68(Text20, { style: [styles53.cross, { color: theme.textSecondary }], children: "\xD7" }) })
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" }) })
5910
5882
  ] });
5911
5883
  const frame = [
5912
5884
  styles53.toast,
5913
5885
  { backgroundColor: theme.surface2, borderColor: theme.borderDefault, borderLeftColor: edge, borderRadius: radius3.lg, shadowColor: theme.scrimStrong }
5914
5886
  ];
5915
5887
  const motion3 = { transform: [{ translateY: enter.interpolate({ inputRange: [0, 1], outputRange: [-8, 0] }) }, { translateX: swipe }] };
5916
- return /* @__PURE__ */ jsx68(Animated27.View, { "aria-live": "polite", style: motion3, ...drag.panHandlers, children: /* @__PURE__ */ jsx68(View60, { 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 }) });
5917
5889
  }
5918
5890
  function Toaster({ closeLabel, position = "top", offset = 12, duration = 6e3, max = 3 }) {
5919
5891
  const all = React44.useSyncExternalStore(subscribe2, snapshot, snapshot);
5920
5892
  const shown = all.slice(-max);
5921
5893
  if (shown.length === 0) return null;
5922
- return /* @__PURE__ */ jsx68(View60, { pointerEvents: "box-none", style: [styles53.stack, position === "top" ? { top: offset } : { bottom: offset }], children: (position === "top" ? shown : [...shown].reverse()).map((item) => /* @__PURE__ */ jsx68(ToastView, { item, closeLabel, duration }, item.id)) });
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)) });
5923
5895
  }
5924
5896
  var styles53 = StyleSheet53.create({
5925
5897
  stack: { position: "absolute", left: 12, right: 12, gap: 8, zIndex: 100 },
@@ -5944,28 +5916,28 @@ var styles53 = StyleSheet53.create({
5944
5916
  });
5945
5917
 
5946
5918
  // src/native/update-prompt.tsx
5947
- import { StyleSheet as StyleSheet54, View as View61 } from "react-native";
5948
- import { jsx as jsx69, jsxs as jsxs60 } from "react/jsx-runtime";
5919
+ import { StyleSheet as StyleSheet54, View as View62 } from "react-native";
5920
+ import { jsx as jsx70, jsxs as jsxs61 } from "react/jsx-runtime";
5949
5921
  function UpdatePrompt({ title, message, versionLabel, mark, updateLabel, onUpdate, laterLabel, onLater, style }) {
5950
5922
  const { theme, radius: radius3 } = useTheme();
5951
- return /* @__PURE__ */ jsxs60(
5952
- View61,
5923
+ return /* @__PURE__ */ jsxs61(
5924
+ View62,
5953
5925
  {
5954
5926
  role: "region",
5955
5927
  "aria-label": title,
5956
5928
  style: [styles54.root, { backgroundColor: theme.surface1, borderColor: theme.borderSubtle, borderRadius: radius3.xl }, style],
5957
5929
  children: [
5958
- /* @__PURE__ */ jsxs60(View61, { style: styles54.head, children: [
5959
- mark ? /* @__PURE__ */ jsx69(View61, { accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants", style: styles54.mark, children: mark }) : null,
5960
- /* @__PURE__ */ jsxs60(View61, { style: styles54.text, children: [
5961
- /* @__PURE__ */ jsx69(Txt, { variant: "label", children: title }),
5962
- message ? /* @__PURE__ */ jsx69(Txt, { tone: "secondary", children: message }) : null,
5963
- versionLabel ? /* @__PURE__ */ jsx69(Txt, { variant: "mono", tone: "secondary", children: versionLabel }) : null
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
5964
5936
  ] })
5965
5937
  ] }),
5966
- /* @__PURE__ */ jsxs60(View61, { style: styles54.actions, children: [
5967
- /* @__PURE__ */ jsx69(Button, { label: laterLabel, variant: "ghost", size: "sm", onPress: onLater }),
5968
- /* @__PURE__ */ jsx69(Button, { label: updateLabel, variant: "primary", size: "sm", onPress: onUpdate })
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 })
5969
5941
  ] })
5970
5942
  ]
5971
5943
  }
@@ -5980,14 +5952,14 @@ var styles54 = StyleSheet54.create({
5980
5952
  });
5981
5953
 
5982
5954
  // src/native/verified-badge.tsx
5983
- import { StyleSheet as StyleSheet55, View as View62 } from "react-native";
5955
+ import { StyleSheet as StyleSheet55, View as View63 } from "react-native";
5984
5956
  import Svg31, { Path as Path26 } from "react-native-svg";
5985
- import { jsx as jsx70, jsxs as jsxs61 } from "react/jsx-runtime";
5957
+ import { jsx as jsx71, jsxs as jsxs62 } from "react/jsx-runtime";
5986
5958
  function VerifiedBadge({ label, showLabel, size = 16, on = "surface" }) {
5987
5959
  const { theme } = useTheme();
5988
- return /* @__PURE__ */ jsxs61(View62, { accessible: true, role: "img", "aria-label": label, style: styles55.row, children: [
5989
- /* @__PURE__ */ jsxs61(Svg31, { width: size, height: size, viewBox: "0 0 24 24", "aria-hidden": true, children: [
5990
- /* @__PURE__ */ jsx70(
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(
5991
5963
  Path26,
5992
5964
  {
5993
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",
@@ -5996,9 +5968,9 @@ function VerifiedBadge({ label, showLabel, size = 16, on = "surface" }) {
5996
5968
  strokeWidth: 1.2
5997
5969
  }
5998
5970
  ),
5999
- /* @__PURE__ */ jsx70(Path26, { d: "M8.3 12.3l2.5 2.5 4.9-5.2", fill: "none", stroke: theme.onAccent, strokeWidth: 2.2, strokeLinecap: "round", strokeLinejoin: "round" })
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" })
6000
5972
  ] }),
6001
- showLabel ? /* @__PURE__ */ jsx70(Txt, { variant: "caption", tone: on === "media" ? "onMedia" : "accent", style: styles55.text, children: label }) : null
5973
+ showLabel ? /* @__PURE__ */ jsx71(Txt, { variant: "caption", tone: on === "media" ? "onMedia" : "accent", style: styles55.text, children: label }) : null
6002
5974
  ] });
6003
5975
  }
6004
5976
  var styles55 = StyleSheet55.create({ row: { flexDirection: "row", alignItems: "center", gap: 4 }, text: { fontWeight: "700" } });
@@ -6050,6 +6022,7 @@ export {
6050
6022
  MatchDialog,
6051
6023
  MessageBubble,
6052
6024
  MessageComposer,
6025
+ MetaRow,
6053
6026
  Meter,
6054
6027
  MonthPicker,
6055
6028
  NumberTicker,