@krizaka/ui 3.0.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/README.md +1 -1
  2. package/dist/achievement.js +1 -1
  3. package/dist/action-bar.js +1 -1
  4. package/dist/app-shell.js +1 -1
  5. package/dist/argument-card.js +2 -2
  6. package/dist/card-grid.js +1 -1
  7. package/dist/card.js +1 -1
  8. package/dist/choice-grid.js +1 -1
  9. package/dist/{chunk-OGJI5X4W.js → chunk-2PUDI7JS.js} +2 -2
  10. package/dist/chunk-4LOMIQVX.js +21 -0
  11. package/dist/chunk-4LOMIQVX.js.map +1 -0
  12. package/dist/{chunk-K3SWZXYT.js → chunk-DGQMDJXK.js} +2 -2
  13. package/dist/chunk-G3ETON2A.js +22 -0
  14. package/dist/chunk-G3ETON2A.js.map +1 -0
  15. package/dist/chunk-I5RVM5CW.js +27 -0
  16. package/dist/chunk-I5RVM5CW.js.map +1 -0
  17. package/dist/chunk-IZ7MV6HM.js +26 -0
  18. package/dist/chunk-IZ7MV6HM.js.map +1 -0
  19. package/dist/chunk-ZNMFG62E.js +20 -0
  20. package/dist/chunk-ZNMFG62E.js.map +1 -0
  21. package/dist/cn.d.ts +9 -1
  22. package/dist/cn.js +5 -3
  23. package/dist/code-block.js +1 -1
  24. package/dist/command.js +1 -1
  25. package/dist/confirm-button.js +1 -1
  26. package/dist/continue-prompt.js +1 -1
  27. package/dist/cta-panel.js +1 -1
  28. package/dist/data-table.js +2 -2
  29. package/dist/date-picker.d.ts +650 -61
  30. package/dist/date-picker.js +918 -122
  31. package/dist/date-picker.js.map +1 -1
  32. package/dist/decision-list.js +1 -1
  33. package/dist/dropdown-menu.js +1 -1
  34. package/dist/error-page.js +1 -1
  35. package/dist/field.js +1 -1
  36. package/dist/filter-bar.js +2 -2
  37. package/dist/form/server.d.ts +96 -0
  38. package/dist/form/server.js +82 -0
  39. package/dist/form/server.js.map +1 -0
  40. package/dist/form.d.ts +503 -0
  41. package/dist/form.js +760 -0
  42. package/dist/form.js.map +1 -0
  43. package/dist/gallery-page.js +1 -1
  44. package/dist/glow-card.js +1 -1
  45. package/dist/goal-gauge.js +1 -1
  46. package/dist/how-it-works-page.js +1 -1
  47. package/dist/landscape.js +1 -1
  48. package/dist/link-card.js +1 -1
  49. package/dist/longform-page.js +1 -1
  50. package/dist/marquee.js +1 -1
  51. package/dist/mascot-quote.js +1 -1
  52. package/dist/motion.css +18 -1
  53. package/dist/native/form.d.ts +376 -0
  54. package/dist/native/form.js +650 -0
  55. package/dist/native/form.js.map +1 -0
  56. package/dist/native.d.ts +351 -3
  57. package/dist/native.js +1205 -399
  58. package/dist/native.js.map +1 -1
  59. package/dist/nav-bar.js +1 -1
  60. package/dist/page-hero.js +2 -2
  61. package/dist/page.js +2 -2
  62. package/dist/popover.js +1 -1
  63. package/dist/pricing-page.js +1 -1
  64. package/dist/product-page.js +1 -1
  65. package/dist/profile-card.js +1 -1
  66. package/dist/promise-card.js +1 -1
  67. package/dist/scroll-stage.js +1 -1
  68. package/dist/stage-banner.js +1 -1
  69. package/dist/terminal-replay.js +1 -1
  70. package/dist/toast.js +1 -1
  71. package/dist/toc.js +1 -1
  72. package/dist/tooltip.js +1 -1
  73. package/package.json +50 -7
  74. package/registry/achievement.json +1 -1
  75. package/registry/action-bar.json +1 -1
  76. package/registry/alert.json +1 -1
  77. package/registry/app-shell.json +1 -1
  78. package/registry/argument-card.json +1 -1
  79. package/registry/audio-player.json +1 -1
  80. package/registry/auth-layout.json +1 -1
  81. package/registry/avatar.json +1 -1
  82. package/registry/badge.json +1 -1
  83. package/registry/button.json +1 -1
  84. package/registry/card-grid.json +1 -1
  85. package/registry/card.json +1 -1
  86. package/registry/catalogue-page.json +1 -1
  87. package/registry/changelog-page.json +1 -1
  88. package/registry/checkbox.json +89 -4
  89. package/registry/chip-link.json +1 -1
  90. package/registry/chip.json +1 -1
  91. package/registry/choice-grid.json +1 -1
  92. package/registry/cn.json +1 -1
  93. package/registry/code-block.json +1 -1
  94. package/registry/combobox.json +1 -1
  95. package/registry/command.json +1 -1
  96. package/registry/component-page.json +1 -1
  97. package/registry/confirm-button.json +1 -1
  98. package/registry/contact-page.json +1 -1
  99. package/registry/continue-prompt.json +1 -1
  100. package/registry/countdown.json +1 -1
  101. package/registry/cta-panel.json +1 -1
  102. package/registry/dashboard-layout.json +1 -1
  103. package/registry/data-table.json +1 -1
  104. package/registry/date-picker.json +1811 -236
  105. package/registry/decision-list.json +1 -1
  106. package/registry/detail-layout.json +1 -1
  107. package/registry/dialog.json +1 -1
  108. package/registry/docs-article-page.json +1 -1
  109. package/registry/docs-hub-page.json +1 -1
  110. package/registry/docs-layout.json +1 -1
  111. package/registry/dropdown-menu.json +1 -1
  112. package/registry/empty-state.json +1 -1
  113. package/registry/error-page.json +1 -1
  114. package/registry/examples/checkbox/native/terms.d.ts +4 -0
  115. package/registry/examples/checkbox/native/terms.dark.png +0 -0
  116. package/registry/examples/checkbox/native/terms.js +26 -0
  117. package/registry/examples/checkbox/native/terms.light.png +0 -0
  118. package/registry/examples/checkbox/native/terms.tsx +28 -0
  119. package/registry/examples/date-picker/birth-date-wheel.d.ts +4 -0
  120. package/registry/examples/date-picker/birth-date-wheel.js +13 -0
  121. package/registry/examples/date-picker/birth-date-wheel.tsx +11 -0
  122. package/registry/examples/date-picker/birth-date.d.ts +4 -0
  123. package/registry/examples/date-picker/birth-date.js +25 -0
  124. package/registry/examples/date-picker/birth-date.tsx +21 -0
  125. package/registry/examples/date-picker/calendar.js +1 -1
  126. package/registry/examples/date-picker/calendar.tsx +2 -6
  127. package/registry/examples/date-picker/day-strip.d.ts +4 -0
  128. package/registry/examples/date-picker/day-strip.js +28 -0
  129. package/registry/examples/date-picker/day-strip.tsx +27 -0
  130. package/registry/examples/date-picker/month-year.d.ts +4 -0
  131. package/registry/examples/date-picker/month-year.js +13 -0
  132. package/registry/examples/date-picker/month-year.tsx +10 -0
  133. package/registry/examples/date-picker/native/birth-date-wheel.d.ts +4 -0
  134. package/registry/examples/date-picker/native/birth-date-wheel.dark.png +0 -0
  135. package/registry/examples/date-picker/native/birth-date-wheel.js +13 -0
  136. package/registry/examples/date-picker/native/birth-date-wheel.light.png +0 -0
  137. package/registry/examples/date-picker/native/birth-date-wheel.tsx +9 -0
  138. package/registry/examples/date-picker/native/birth-date.d.ts +4 -0
  139. package/registry/examples/date-picker/native/birth-date.dark.png +0 -0
  140. package/registry/examples/date-picker/native/birth-date.js +30 -0
  141. package/registry/examples/date-picker/native/birth-date.light.png +0 -0
  142. package/registry/examples/date-picker/native/birth-date.tsx +27 -0
  143. package/registry/examples/date-picker/native/calendar.d.ts +4 -0
  144. package/registry/examples/date-picker/native/calendar.dark.png +0 -0
  145. package/registry/examples/date-picker/native/calendar.js +13 -0
  146. package/registry/examples/date-picker/native/calendar.light.png +0 -0
  147. package/registry/examples/date-picker/native/calendar.tsx +8 -0
  148. package/registry/examples/date-picker/native/day-strip.d.ts +4 -0
  149. package/registry/examples/date-picker/native/day-strip.dark.png +0 -0
  150. package/registry/examples/date-picker/native/day-strip.js +29 -0
  151. package/registry/examples/date-picker/native/day-strip.light.png +0 -0
  152. package/registry/examples/date-picker/native/day-strip.tsx +26 -0
  153. package/registry/examples/date-picker/native/month-year.d.ts +4 -0
  154. package/registry/examples/date-picker/native/month-year.dark.png +0 -0
  155. package/registry/examples/date-picker/native/month-year.js +13 -0
  156. package/registry/examples/date-picker/native/month-year.light.png +0 -0
  157. package/registry/examples/date-picker/native/month-year.tsx +8 -0
  158. package/registry/examples/date-picker/native/time-slots.d.ts +4 -0
  159. package/registry/examples/date-picker/native/time-slots.dark.png +0 -0
  160. package/registry/examples/date-picker/native/time-slots.js +15 -0
  161. package/registry/examples/date-picker/native/time-slots.light.png +0 -0
  162. package/registry/examples/date-picker/native/time-slots.tsx +15 -0
  163. package/registry/examples/date-picker/native/time-wheel.d.ts +4 -0
  164. package/registry/examples/date-picker/native/time-wheel.dark.png +0 -0
  165. package/registry/examples/date-picker/native/time-wheel.js +13 -0
  166. package/registry/examples/date-picker/native/time-wheel.light.png +0 -0
  167. package/registry/examples/date-picker/native/time-wheel.tsx +8 -0
  168. package/registry/examples/date-picker/time-slots.d.ts +4 -0
  169. package/registry/examples/date-picker/time-slots.js +26 -0
  170. package/registry/examples/date-picker/time-slots.tsx +25 -0
  171. package/registry/examples/date-picker/time-wheel.d.ts +4 -0
  172. package/registry/examples/date-picker/time-wheel.js +13 -0
  173. package/registry/examples/date-picker/time-wheel.tsx +10 -0
  174. package/registry/examples/date-picker/wheel.d.ts +4 -0
  175. package/registry/examples/date-picker/wheel.js +14 -0
  176. package/registry/examples/date-picker/wheel.tsx +16 -0
  177. package/registry/examples/field/native/default.d.ts +4 -0
  178. package/registry/examples/field/native/default.dark.png +0 -0
  179. package/registry/examples/field/native/default.js +29 -0
  180. package/registry/examples/field/native/default.light.png +0 -0
  181. package/registry/examples/field/native/default.tsx +23 -0
  182. package/registry/examples/form/amount.d.ts +4 -0
  183. package/registry/examples/form/amount.js +30 -0
  184. package/registry/examples/form/amount.tsx +36 -0
  185. package/registry/examples/form/audience.d.ts +4 -0
  186. package/registry/examples/form/audience.js +29 -0
  187. package/registry/examples/form/audience.tsx +31 -0
  188. package/registry/examples/form/native/amount.d.ts +4 -0
  189. package/registry/examples/form/native/amount.dark.png +0 -0
  190. package/registry/examples/form/native/amount.js +26 -0
  191. package/registry/examples/form/native/amount.light.png +0 -0
  192. package/registry/examples/form/native/amount.tsx +30 -0
  193. package/registry/examples/form/native/audience.d.ts +4 -0
  194. package/registry/examples/form/native/audience.dark.png +0 -0
  195. package/registry/examples/form/native/audience.js +24 -0
  196. package/registry/examples/form/native/audience.light.png +0 -0
  197. package/registry/examples/form/native/audience.tsx +24 -0
  198. package/registry/examples/form/native/profile.d.ts +4 -0
  199. package/registry/examples/form/native/profile.dark.png +0 -0
  200. package/registry/examples/form/native/profile.js +33 -0
  201. package/registry/examples/form/native/profile.light.png +0 -0
  202. package/registry/examples/form/native/profile.tsx +36 -0
  203. package/registry/examples/form/native/settings.d.ts +4 -0
  204. package/registry/examples/form/native/settings.dark.png +0 -0
  205. package/registry/examples/form/native/settings.js +25 -0
  206. package/registry/examples/form/native/settings.light.png +0 -0
  207. package/registry/examples/form/native/settings.tsx +23 -0
  208. package/registry/examples/form/native/sign-up.d.ts +4 -0
  209. package/registry/examples/form/native/sign-up.dark.png +0 -0
  210. package/registry/examples/form/native/sign-up.js +38 -0
  211. package/registry/examples/form/native/sign-up.light.png +0 -0
  212. package/registry/examples/form/native/sign-up.tsx +34 -0
  213. package/registry/examples/form/native/upload.d.ts +4 -0
  214. package/registry/examples/form/native/upload.dark.png +0 -0
  215. package/registry/examples/form/native/upload.js +23 -0
  216. package/registry/examples/form/native/upload.light.png +0 -0
  217. package/registry/examples/form/native/upload.tsx +22 -0
  218. package/registry/examples/form/profile.d.ts +4 -0
  219. package/registry/examples/form/profile.js +35 -0
  220. package/registry/examples/form/profile.tsx +40 -0
  221. package/registry/examples/form/report.d.ts +4 -0
  222. package/registry/examples/form/report.js +30 -0
  223. package/registry/examples/form/report.tsx +30 -0
  224. package/registry/examples/form/settings.d.ts +4 -0
  225. package/registry/examples/form/settings.js +30 -0
  226. package/registry/examples/form/settings.tsx +31 -0
  227. package/registry/examples/form/sign-up.d.ts +4 -0
  228. package/registry/examples/form/sign-up.js +38 -0
  229. package/registry/examples/form/sign-up.tsx +37 -0
  230. package/registry/examples/form/upload.d.ts +4 -0
  231. package/registry/examples/form/upload.js +32 -0
  232. package/registry/examples/form/upload.tsx +32 -0
  233. package/registry/field.json +104 -4
  234. package/registry/file-upload.json +1 -1
  235. package/registry/filter-bar.json +1 -1
  236. package/registry/form.json +2940 -0
  237. package/registry/gallery-page.json +1 -1
  238. package/registry/glow-card.json +1 -1
  239. package/registry/goal-gauge.json +1 -1
  240. package/registry/how-it-works-page.json +1 -1
  241. package/registry/image-cropper.json +1 -1
  242. package/registry/index.json +43 -10
  243. package/registry/iso.json +1 -1
  244. package/registry/kbd.json +1 -1
  245. package/registry/landing-page.json +1 -1
  246. package/registry/landscape.json +1 -1
  247. package/registry/legal-page.json +1 -1
  248. package/registry/link-card.json +1 -1
  249. package/registry/loader.json +1 -1
  250. package/registry/longform-page.json +1 -1
  251. package/registry/marketing-layout.json +1 -1
  252. package/registry/marquee.json +1 -1
  253. package/registry/mascot-quote.json +1 -1
  254. package/registry/mascot-state.json +2 -2
  255. package/registry/mascots.json +2 -2
  256. package/registry/media-capture.json +1 -1
  257. package/registry/meter.json +1 -1
  258. package/registry/nav-bar.json +1 -1
  259. package/registry/number-ticker.json +1 -1
  260. package/registry/page-header.json +1 -1
  261. package/registry/page-hero.json +1 -1
  262. package/registry/page.json +1 -1
  263. package/registry/pagination.json +1 -1
  264. package/registry/pointer-light.json +1 -1
  265. package/registry/popover.json +1 -1
  266. package/registry/pricing-page.json +1 -1
  267. package/registry/product-page.json +1 -1
  268. package/registry/profile-card.json +1 -1
  269. package/registry/progress.json +1 -1
  270. package/registry/promise-card.json +1 -1
  271. package/registry/radio-group.json +1 -1
  272. package/registry/scroll-stage.json +1 -1
  273. package/registry/search-field.json +1 -1
  274. package/registry/section-backdrop.json +1 -1
  275. package/registry/separator.json +1 -1
  276. package/registry/settings-layout.json +1 -1
  277. package/registry/skeleton.json +1 -1
  278. package/registry/slider.json +1 -1
  279. package/registry/slot.json +1 -1
  280. package/registry/spinner.json +1 -1
  281. package/registry/split-view.json +1 -1
  282. package/registry/stage-banner.json +1 -1
  283. package/registry/stat.json +1 -1
  284. package/registry/status-page.json +1 -1
  285. package/registry/stepper.json +1 -1
  286. package/registry/switch.json +1 -1
  287. package/registry/tabs.json +1 -1
  288. package/registry/tag-input.json +1 -1
  289. package/registry/terminal-replay.json +1 -1
  290. package/registry/theme.json +8 -1
  291. package/registry/toast.json +1 -1
  292. package/registry/toc.json +1 -1
  293. package/registry/tooltip.json +1 -1
  294. package/registry/video-player.json +1 -1
  295. package/registry/video-trimmer.json +1 -1
  296. package/registry/virtual.json +1 -1
  297. package/skills/date-picker/SKILL.md +43 -0
  298. package/skills/form/SKILL.md +44 -0
  299. package/dist/chunk-2USC2YT6.js +0 -17
  300. package/dist/chunk-2USC2YT6.js.map +0 -1
  301. package/dist/chunk-5AXLA4LK.js +0 -13
  302. package/dist/chunk-5AXLA4LK.js.map +0 -1
  303. package/dist/chunk-FJDSLNXK.js +0 -11
  304. package/dist/chunk-FJDSLNXK.js.map +0 -1
  305. package/dist/chunk-KNBYZGSQ.js +0 -11
  306. package/dist/chunk-KNBYZGSQ.js.map +0 -1
  307. package/dist/chunk-VCAAHCHL.js +0 -17
  308. package/dist/chunk-VCAAHCHL.js.map +0 -1
  309. /package/dist/{chunk-OGJI5X4W.js.map → chunk-2PUDI7JS.js.map} +0 -0
  310. /package/dist/{chunk-K3SWZXYT.js.map → chunk-DGQMDJXK.js.map} +0 -0
package/dist/native.js CHANGED
@@ -27,6 +27,130 @@ function countdownParts(ms, units) {
27
27
  return d > 0 ? [[d, units.d], [h, units.h], [m, units.m]] : [[h, units.h], [m, units.m], [s, units.s]];
28
28
  }
29
29
 
30
+ // src/date-picker/parts.ts
31
+ var DATE_PART_LENGTH = { day: 2, month: 2, year: 4 };
32
+ function datePartsOrder(locale) {
33
+ try {
34
+ const parts = new Intl.DateTimeFormat(locale, { day: "2-digit", month: "2-digit", year: "numeric" }).formatToParts(new Date(2001, 10, 22));
35
+ const order = parts.map((p) => p.type).filter((t) => t === "day" || t === "month" || t === "year");
36
+ if (order.length === 3) return order;
37
+ } catch {
38
+ }
39
+ return ["day", "month", "year"];
40
+ }
41
+ function composeDate(parts) {
42
+ if (!parts.day && !parts.month && !parts.year) return "";
43
+ const pad = (v) => v.length === 1 ? `0${v}` : v;
44
+ return `${parts.year}-${pad(parts.month)}-${pad(parts.day)}`;
45
+ }
46
+ function splitDate(value) {
47
+ const m = /^(\d*)-(\d*)-(\d*)$/.exec(value ?? "");
48
+ return m ? { year: m[1], month: m[2], day: m[3] } : { day: "", month: "", year: "" };
49
+ }
50
+ function isRealDate(value) {
51
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(value)) return false;
52
+ const date = /* @__PURE__ */ new Date(`${value}T00:00:00Z`);
53
+ return !Number.isNaN(date.getTime()) && date.toISOString().slice(0, 10) === value;
54
+ }
55
+ function latestBirthDate(age, today = /* @__PURE__ */ new Date()) {
56
+ return new Date(Date.UTC(today.getFullYear() - age, today.getMonth(), today.getDate())).toISOString().slice(0, 10);
57
+ }
58
+ function daysInMonth(year, month) {
59
+ return new Date(Date.UTC(year, month, 0)).getUTCDate();
60
+ }
61
+ function isoParts(iso) {
62
+ const [year = 0, month = 0, day = 0] = iso.split("-").map(Number);
63
+ return { year, month, day };
64
+ }
65
+ function isoOf(year, month, day) {
66
+ const d = Math.min(Math.max(day, 1), daysInMonth(year, month));
67
+ return `${String(year).padStart(4, "0")}-${String(month).padStart(2, "0")}-${String(d).padStart(2, "0")}`;
68
+ }
69
+ function todayIso(now = /* @__PURE__ */ new Date()) {
70
+ return isoOf(now.getFullYear(), now.getMonth() + 1, now.getDate());
71
+ }
72
+ function ageOn(birth, today = todayIso()) {
73
+ const b = isoParts(birth);
74
+ const t = isoParts(today);
75
+ return t.year - b.year - (t.month < b.month || t.month === b.month && t.day < b.day ? 1 : 0);
76
+ }
77
+ function monthNames(locale, style = "long") {
78
+ const format = new Intl.DateTimeFormat(locale, { month: style, timeZone: "UTC" });
79
+ return Array.from({ length: 12 }, (_, i) => format.format(new Date(Date.UTC(2001, i, 1))));
80
+ }
81
+ function yearRange(from, to) {
82
+ const step = from <= to ? 1 : -1;
83
+ return Array.from({ length: Math.abs(to - from) + 1 }, (_, i) => from + i * step);
84
+ }
85
+ function timeToMinutes(value) {
86
+ const m = /^(\d{1,2}):(\d{1,2})$/.exec(value ?? "");
87
+ if (!m) return null;
88
+ const h = Number(m[1]);
89
+ const min = Number(m[2]);
90
+ return h < 24 && min < 60 ? h * 60 + min : null;
91
+ }
92
+ function minutesToTime(minutes) {
93
+ const m = (Math.round(minutes) % 1440 + 1440) % 1440;
94
+ return `${String(Math.floor(m / 60)).padStart(2, "0")}:${String(m % 60).padStart(2, "0")}`;
95
+ }
96
+ function timeSlots(start, end, step = 30) {
97
+ const a = timeToMinutes(start);
98
+ const b = timeToMinutes(end);
99
+ if (a === null || b === null || step <= 0) return [];
100
+ const slots = [];
101
+ for (let m = a; m < b; m += step) slots.push(minutesToTime(m));
102
+ return slots;
103
+ }
104
+ function uses12Hours(locale) {
105
+ try {
106
+ const options = new Intl.DateTimeFormat(locale, { hour: "numeric" }).resolvedOptions();
107
+ return options.hourCycle ? options.hourCycle === "h12" || options.hourCycle === "h11" : Boolean(options.hour12);
108
+ } catch {
109
+ return false;
110
+ }
111
+ }
112
+ function dayPeriods(locale) {
113
+ const format = new Intl.DateTimeFormat(locale, { hour: "numeric", hour12: true, timeZone: "UTC" });
114
+ const period = (h) => format.formatToParts(new Date(Date.UTC(2001, 0, 1, h))).find((p) => p.type === "dayPeriod")?.value ?? (h < 12 ? "AM" : "PM");
115
+ return [period(9), period(15)];
116
+ }
117
+ function formatTime(locale, value) {
118
+ const minutes = timeToMinutes(value);
119
+ if (minutes === null) return "";
120
+ return new Intl.DateTimeFormat(locale, { hour: "numeric", minute: "2-digit", timeZone: "UTC" }).format(new Date(Date.UTC(2001, 0, 1, 0, minutes)));
121
+ }
122
+ var toLocalDate = (iso) => {
123
+ const { year, month, day } = isoParts(iso);
124
+ return new Date(year, month - 1, day);
125
+ };
126
+ var toIsoDate = (date) => `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}-${String(date.getDate()).padStart(2, "0")}`;
127
+ var addDays = (iso, days) => {
128
+ const date = toLocalDate(iso);
129
+ date.setDate(date.getDate() + days);
130
+ return toIsoDate(date);
131
+ };
132
+ var addMonths = (iso, months) => {
133
+ const { year, month, day } = isoParts(iso);
134
+ const first = new Date(year, month - 1 + months, 1);
135
+ return isoOf(first.getFullYear(), first.getMonth() + 1, day);
136
+ };
137
+ function weekStartOf(locale) {
138
+ try {
139
+ const info = new Intl.Locale(locale);
140
+ const firstDay = info.getWeekInfo?.().firstDay ?? info.weekInfo?.firstDay;
141
+ return firstDay ? firstDay % 7 : 1;
142
+ } catch {
143
+ return 1;
144
+ }
145
+ }
146
+ function monthGrid(month, weekStartsOn) {
147
+ const first = `${month.slice(0, 7)}-01`;
148
+ const lead = (toLocalDate(first).getDay() - weekStartsOn + 7) % 7;
149
+ const start = addDays(first, -lead);
150
+ const days = Array.from({ length: 42 }, (_, i) => addDays(start, i));
151
+ return Array.from({ length: 6 }, (_, w) => days.slice(w * 7, w * 7 + 7)).filter((week, w) => w < 5 || week[0].slice(0, 7) === first.slice(0, 7));
152
+ }
153
+
30
154
  // src/native/avatar.tsx
31
155
  import * as React2 from "react";
32
156
  import { Image, StyleSheet, Text, View } from "react-native";
@@ -198,11 +322,12 @@ var radius2 = radius;
198
322
  var motion2 = motion;
199
323
  var stillMotion = { ...motion2, duration: { instant: 0, fast: 0, base: 0 } };
200
324
  var ThemeContext = React.createContext(null);
325
+ var noop = () => void 0;
201
326
  function resolve(mode, system) {
202
327
  if (mode === "system") return system === "light" ? "light" : "dark";
203
328
  return mode;
204
329
  }
205
- function ThemeProvider({ children, mode: controlled, defaultMode = "system", onModeChange, overrides, fonts }) {
330
+ function ThemeProvider({ children, mode: controlled, defaultMode = "system", onModeChange, overrides, fonts, haptics }) {
206
331
  const system = useColorScheme();
207
332
  const [own, setOwn] = React.useState(defaultMode);
208
333
  const mode = controlled ?? own;
@@ -218,18 +343,17 @@ function ThemeProvider({ children, mode: controlled, defaultMode = "system", onM
218
343
  const reduce = useReducedMotion();
219
344
  const theme = React.useMemo(() => override ? { ...themes2[scheme], ...override } : themes2[scheme], [scheme, override]);
220
345
  const value = React.useMemo(
221
- () => ({ mode, setMode, scheme, theme, radius: radius2, motion: reduce ? stillMotion : motion2, fonts: fonts ?? {} }),
222
- [mode, setMode, scheme, theme, fonts, reduce]
346
+ () => ({ mode, setMode, scheme, theme, radius: radius2, motion: reduce ? stillMotion : motion2, fonts: fonts ?? {}, haptic: haptics ?? noop }),
347
+ [mode, setMode, scheme, theme, fonts, reduce, haptics]
223
348
  );
224
349
  return /* @__PURE__ */ jsx(ThemeContext.Provider, { value, children });
225
350
  }
226
- var noop = () => void 0;
227
351
  function useTheme() {
228
352
  const context = React.useContext(ThemeContext);
229
353
  const system = useColorScheme();
230
354
  if (context) return context;
231
355
  const scheme = resolve("system", system);
232
- return { mode: "system", setMode: noop, scheme, theme: themes2[scheme], radius: radius2, motion: motion2, fonts: {} };
356
+ return { mode: "system", setMode: noop, scheme, theme: themes2[scheme], radius: radius2, motion: motion2, fonts: {}, haptic: noop };
233
357
  }
234
358
  function useReducedMotion() {
235
359
  const [reduce, setReduce] = React.useState(false);
@@ -572,19 +696,77 @@ var styles5 = StyleSheet5.create({
572
696
  footer: { flexDirection: "row", alignItems: "center", gap: 8, borderTopWidth: StyleSheet5.hairlineWidth, paddingTop: 12, marginTop: "auto" }
573
697
  });
574
698
 
575
- // src/native/chip.tsx
699
+ // src/native/checkbox.tsx
576
700
  import * as React5 from "react";
577
- import { Pressable as Pressable3, ScrollView, StyleSheet as StyleSheet6, Text as Text4, View as View4 } from "react-native";
578
- import { Fragment, jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
579
- var ChipGroupContext = React5.createContext(null);
701
+ import { Pressable as Pressable3, StyleSheet as StyleSheet6, Text as Text4, View as View4 } from "react-native";
702
+ import Svg2, { Path } from "react-native-svg";
703
+ import { jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
704
+ function Checkbox({ children, label, checked, defaultChecked = false, onCheckedChange, error, disabled, style }) {
705
+ const { theme, radius: radius3 } = useTheme();
706
+ const [own, setOwn] = React5.useState(defaultChecked);
707
+ const on = checked ?? own;
708
+ const toggle = () => {
709
+ if (checked === void 0) setOwn(!on);
710
+ onCheckedChange?.(!on);
711
+ };
712
+ const box = /* @__PURE__ */ jsx7(
713
+ View4,
714
+ {
715
+ style: [
716
+ styles6.box,
717
+ { borderRadius: radius3.xs + 2, borderColor: error ? theme.danger : on ? theme.accent : theme.borderStrong, backgroundColor: on ? theme.accent : theme.surface1 }
718
+ ],
719
+ children: on ? /* @__PURE__ */ jsx7(Svg2, { width: 14, height: 14, viewBox: "0 0 24 24", fill: "none", stroke: theme.onAccent, strokeWidth: 3, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": true, children: /* @__PURE__ */ jsx7(Path, { d: "M20 6 9 17l-5-5" }) }) : null
720
+ }
721
+ );
722
+ const plain = children === void 0 || typeof children === "string";
723
+ const a11y = {
724
+ role: "checkbox",
725
+ "aria-checked": on,
726
+ "aria-disabled": disabled || void 0,
727
+ "aria-label": label ?? (typeof children === "string" ? children : void 0),
728
+ accessibilityHint: error,
729
+ disabled,
730
+ onPress: toggle
731
+ };
732
+ return /* @__PURE__ */ jsxs4(View4, { style: [styles6.root, style], children: [
733
+ plain ? /* @__PURE__ */ jsxs4(Pressable3, { ...a11y, hitSlop: 4, style: [styles6.row, disabled ? styles6.disabled : null], children: [
734
+ box,
735
+ children !== void 0 ? /* @__PURE__ */ jsx7(View4, { style: styles6.text, children: /* @__PURE__ */ jsx7(Text4, { style: [styles6.label, { color: theme.textPrimary }], children }) }) : null
736
+ ] }) : (
737
+ // Words with links: the box alone is the control (a 44-pt target, named by `label`), the links stay links.
738
+ /* @__PURE__ */ jsxs4(View4, { style: [styles6.row, disabled ? styles6.disabled : null], children: [
739
+ /* @__PURE__ */ jsx7(Pressable3, { ...a11y, hitSlop: 11, style: styles6.target, children: box }),
740
+ /* @__PURE__ */ jsx7(View4, { style: styles6.text, children })
741
+ ] })
742
+ ),
743
+ error ? /* @__PURE__ */ jsx7(Text4, { role: "alert", "aria-live": "polite", style: [styles6.error, { color: theme.dangerText }], children: error }) : null
744
+ ] });
745
+ }
746
+ var styles6 = StyleSheet6.create({
747
+ root: { gap: 2, alignSelf: "stretch" },
748
+ row: { flexDirection: "row", alignItems: "center", gap: 12, minHeight: 44 },
749
+ target: { minHeight: 44, justifyContent: "center" },
750
+ box: { width: 22, height: 22, borderWidth: 1.5, alignItems: "center", justifyContent: "center" },
751
+ text: { flex: 1 },
752
+ label: { fontSize: 15, lineHeight: 21 },
753
+ error: { fontSize: 12, lineHeight: 16, paddingLeft: 34 },
754
+ disabled: { opacity: 0.4 }
755
+ });
756
+
757
+ // src/native/chip.tsx
758
+ import * as React6 from "react";
759
+ import { Pressable as Pressable4, ScrollView, StyleSheet as StyleSheet7, Text as Text5, View as View5 } from "react-native";
760
+ import { Fragment, jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
761
+ var ChipGroupContext = React6.createContext(null);
580
762
  function Label({ children, color, size }) {
581
- if (typeof children !== "string" && typeof children !== "number") return /* @__PURE__ */ jsx7(Fragment, { children });
582
- return /* @__PURE__ */ jsx7(Text4, { style: [styles6.label, { color, fontSize: size === "sm" ? 12 : 13 }], children });
763
+ if (typeof children !== "string" && typeof children !== "number") return /* @__PURE__ */ jsx8(Fragment, { children });
764
+ return /* @__PURE__ */ jsx8(Text5, { style: [styles7.label, { color, fontSize: size === "sm" ? 12 : 13 }], children });
583
765
  }
584
766
  function ChipBase(props) {
585
- const group = React5.useContext(ChipGroupContext);
767
+ const group = React6.useContext(ChipGroupContext);
586
768
  const { theme, radius: radius3 } = useTheme();
587
- const [own, setOwn] = React5.useState(props.removable ? false : props.defaultSelected ?? false);
769
+ const [own, setOwn] = React6.useState(props.removable ? false : props.defaultSelected ?? false);
588
770
  const size = props.size ?? group?.size ?? "md";
589
771
  const frame = (on2, pressed) => ({
590
772
  height: size === "sm" ? 28 : 36,
@@ -595,9 +777,9 @@ function ChipBase(props) {
595
777
  });
596
778
  if (props.removable) {
597
779
  const { removable: _r2, removeLabel, onRemove, disabled: disabled2, size: _s2, style: style2, children: children2, ...rest2 } = props;
598
- return /* @__PURE__ */ jsxs4(View4, { ...rest2, style: [styles6.base, frame(false, false), disabled2 ? styles6.disabled : null, style2], children: [
599
- /* @__PURE__ */ jsx7(Label, { color: theme.textSecondary, size, children: children2 }),
600
- /* @__PURE__ */ jsx7(Pressable3, { role: "button", "aria-label": removeLabel, disabled: disabled2 ?? void 0, hitSlop: 10, onPress: onRemove, style: styles6.remove, children: /* @__PURE__ */ jsx7(Text4, { style: [styles6.cross, { color: theme.textSecondary }], children: "\xD7" }) })
780
+ return /* @__PURE__ */ jsxs5(View5, { ...rest2, style: [styles7.base, frame(false, false), disabled2 ? styles7.disabled : null, style2], children: [
781
+ /* @__PURE__ */ jsx8(Label, { color: theme.textSecondary, size, children: children2 }),
782
+ /* @__PURE__ */ jsx8(Pressable4, { role: "button", "aria-label": removeLabel, disabled: disabled2 ?? void 0, hitSlop: 10, onPress: onRemove, style: styles7.remove, children: /* @__PURE__ */ jsx8(Text5, { style: [styles7.cross, { color: theme.textSecondary }], children: "\xD7" }) })
601
783
  ] });
602
784
  }
603
785
  const { removable: _r, value, selected, defaultSelected: _d, onSelectedChange, disabled: ownDisabled, size: _s, style, children, ...rest } = props;
@@ -610,8 +792,8 @@ function ChipBase(props) {
610
792
  onSelectedChange?.(!on);
611
793
  };
612
794
  const single = group?.type === "single";
613
- return /* @__PURE__ */ jsx7(
614
- Pressable3,
795
+ return /* @__PURE__ */ jsx8(
796
+ Pressable4,
615
797
  {
616
798
  role: single ? "radio" : "checkbox",
617
799
  "aria-checked": on,
@@ -619,17 +801,17 @@ function ChipBase(props) {
619
801
  ...rest,
620
802
  disabled,
621
803
  onPress: press,
622
- style: ({ pressed }) => [styles6.base, frame(on, pressed), disabled ? styles6.disabled : null, style],
623
- children: /* @__PURE__ */ jsx7(Label, { color: on ? theme.textPrimary : theme.textSecondary, size, children })
804
+ style: ({ pressed }) => [styles7.base, frame(on, pressed), disabled ? styles7.disabled : null, style],
805
+ children: /* @__PURE__ */ jsx8(Label, { color: on ? theme.textPrimary : theme.textSecondary, size, children })
624
806
  }
625
807
  );
626
808
  }
627
809
  function ChipGroup(props) {
628
810
  const { size, disabled, scrollable, "aria-label": label, style, children } = props;
629
811
  const initial = props.type === "single" ? props.defaultValue ?? "" : props.defaultValue ?? [];
630
- const [own, setOwn] = React5.useState(initial);
812
+ const [own, setOwn] = React6.useState(initial);
631
813
  const current = props.value ?? own;
632
- const context = React5.useMemo(() => {
814
+ const context = React6.useMemo(() => {
633
815
  const list = Array.isArray(current) ? current : [current];
634
816
  return {
635
817
  type: props.type,
@@ -644,10 +826,10 @@ function ChipGroup(props) {
644
826
  };
645
827
  }, [current, props.type, props.value, props.onValueChange, size, disabled]);
646
828
  const a11y = { role: props.type === "single" ? "radiogroup" : "group", "aria-label": label };
647
- return /* @__PURE__ */ jsx7(ChipGroupContext.Provider, { value: context, children: scrollable ? /* @__PURE__ */ jsx7(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, ...a11y, style, contentContainerStyle: styles6.row, children }) : /* @__PURE__ */ jsx7(View4, { ...a11y, style: [styles6.row, styles6.wrap, style], children }) });
829
+ return /* @__PURE__ */ jsx8(ChipGroupContext.Provider, { value: context, children: scrollable ? /* @__PURE__ */ jsx8(ScrollView, { horizontal: true, showsHorizontalScrollIndicator: false, ...a11y, style, contentContainerStyle: styles7.row, children }) : /* @__PURE__ */ jsx8(View5, { ...a11y, style: [styles7.row, styles7.wrap, style], children }) });
648
830
  }
649
831
  var Chip = Object.assign(ChipBase, { Group: ChipGroup });
650
- var styles6 = StyleSheet6.create({
832
+ var styles7 = StyleSheet7.create({
651
833
  base: { flexDirection: "row", alignItems: "center", justifyContent: "center", gap: 6, paddingHorizontal: 14, borderWidth: 1, alignSelf: "flex-start" },
652
834
  label: { fontWeight: "600" },
653
835
  remove: { marginRight: -6, width: 24, height: 24, alignItems: "center", justifyContent: "center" },
@@ -658,9 +840,9 @@ var styles6 = StyleSheet6.create({
658
840
  });
659
841
 
660
842
  // src/native/countdown.tsx
661
- import * as React6 from "react";
662
- import { Animated as Animated2, StyleSheet as StyleSheet7, Text as Text5 } from "react-native";
663
- import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
843
+ import * as React7 from "react";
844
+ import { Animated as Animated2, StyleSheet as StyleSheet8, Text as Text6 } from "react-native";
845
+ import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
664
846
  var FONT = { sm: 14, md: 20, lg: 32 };
665
847
  function Countdown({ target, skewMs = 0, units, urgentBelowMs = 6e4, size = "md", label, showLabel = false, style }) {
666
848
  const { theme, fonts } = useTheme();
@@ -668,8 +850,8 @@ function Countdown({ target, skewMs = 0, units, urgentBelowMs = 6e4, size = "md"
668
850
  const ms = useCountdown(target, skewMs);
669
851
  const urgent = ms > 0 && ms < urgentBelowMs;
670
852
  const parts = countdownParts(ms, units);
671
- const [opacity] = React6.useState(() => new Animated2.Value(1));
672
- React6.useEffect(() => {
853
+ const [opacity] = React7.useState(() => new Animated2.Value(1));
854
+ React7.useEffect(() => {
673
855
  if (!urgent || reduce) return;
674
856
  const loop = Animated2.loop(
675
857
  Animated2.sequence([
@@ -685,24 +867,24 @@ function Countdown({ target, skewMs = 0, units, urgentBelowMs = 6e4, size = "md"
685
867
  }, [urgent, reduce, opacity]);
686
868
  const color = urgent ? theme.dangerText : theme.textPrimary;
687
869
  const text = parts.map(([value, unit]) => `${String(value).padStart(2, "0")}${unit}`).join(" ");
688
- return /* @__PURE__ */ jsxs5(
870
+ return /* @__PURE__ */ jsxs6(
689
871
  Animated2.View,
690
872
  {
691
873
  accessible: true,
692
874
  role: "timer",
693
875
  "aria-label": `${label} ${text}`,
694
- style: [styles7.root, style],
876
+ style: [styles8.root, style],
695
877
  children: [
696
- showLabel ? /* @__PURE__ */ jsx8(Text5, { style: [styles7.label, { color: theme.textSecondary, fontSize: Math.max(11, Math.round(FONT[size] * 0.6)) }], children: label }) : null,
697
- parts.map(([value, unit], i) => /* @__PURE__ */ jsxs5(Animated2.View, { style: [styles7.segment, urgent && i === parts.length - 1 ? { opacity } : null], children: [
698
- /* @__PURE__ */ jsx8(Text5, { style: [styles7.value, { color, fontSize: FONT[size] }, fonts.display ? { fontFamily: fonts.display } : null], children: String(value).padStart(2, "0") }),
699
- /* @__PURE__ */ jsx8(Text5, { style: [styles7.unit, { color: theme.textSecondary, fontSize: Math.round(FONT[size] / 2) }], children: unit })
878
+ showLabel ? /* @__PURE__ */ jsx9(Text6, { style: [styles8.label, { color: theme.textSecondary, fontSize: Math.max(11, Math.round(FONT[size] * 0.6)) }], children: label }) : null,
879
+ parts.map(([value, unit], i) => /* @__PURE__ */ jsxs6(Animated2.View, { style: [styles8.segment, urgent && i === parts.length - 1 ? { opacity } : null], children: [
880
+ /* @__PURE__ */ jsx9(Text6, { style: [styles8.value, { color, fontSize: FONT[size] }, fonts.display ? { fontFamily: fonts.display } : null], children: String(value).padStart(2, "0") }),
881
+ /* @__PURE__ */ jsx9(Text6, { style: [styles8.unit, { color: theme.textSecondary, fontSize: Math.round(FONT[size] / 2) }], children: unit })
700
882
  ] }, unit))
701
883
  ]
702
884
  }
703
885
  );
704
886
  }
705
- var styles7 = StyleSheet7.create({
887
+ var styles8 = StyleSheet8.create({
706
888
  root: { flexDirection: "row", alignItems: "baseline", gap: 6 },
707
889
  segment: { flexDirection: "row", alignItems: "baseline" },
708
890
  value: { fontWeight: "900", fontVariant: ["tabular-nums"], letterSpacing: -0.3 },
@@ -710,34 +892,631 @@ var styles7 = StyleSheet7.create({
710
892
  label: { fontWeight: "600", marginRight: 2 }
711
893
  });
712
894
 
895
+ // src/native/date-picker.tsx
896
+ import * as React8 from "react";
897
+ import { Platform, StyleSheet as StyleSheet9, Text as Text7, TextInput, View as View6 } from "react-native";
898
+ import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
899
+ var LENGTH = DATE_PART_LENGTH;
900
+ var dateFieldLabels = { day: "Day", month: "Month", year: "Year" };
901
+ function DateField({ label, hint, error, value, defaultValue, onValueChange, onBlur, locale = "en-US", labels: given, autoComplete, disabled, inputRef, onSubmitEditing, returnKeyType = "done", style }) {
902
+ const { theme, radius: radius3 } = useTheme();
903
+ const labels = { ...dateFieldLabels, ...given };
904
+ const order = React8.useMemo(() => datePartsOrder(locale), [locale]);
905
+ const [parts, setParts] = React8.useState(() => splitDate(value ?? defaultValue));
906
+ const [focused, setFocused] = React8.useState(null);
907
+ const refs = { day: React8.useRef(null), month: React8.useRef(null), year: React8.useRef(null) };
908
+ if (value !== void 0 && value !== composeDate(parts) && composeDate(splitDate(value)) === value) setParts(splitDate(value));
909
+ const caption = error ?? hint;
910
+ const change = (part, text) => {
911
+ const digits = text.replace(/\D/g, "").slice(0, LENGTH[part]);
912
+ const next = { ...parts, [part]: digits };
913
+ setParts(next);
914
+ onValueChange?.(composeDate(next));
915
+ const following = order[order.indexOf(part) + 1];
916
+ if (digits.length === LENGTH[part] && following) refs[following].current?.focus();
917
+ };
918
+ return /* @__PURE__ */ jsxs7(View6, { role: "group", "aria-label": label, style: [styles9.root, disabled ? styles9.disabled : null, style], children: [
919
+ /* @__PURE__ */ jsx10(Text7, { style: [styles9.label, { color: theme.textSecondary }], children: label }),
920
+ /* @__PURE__ */ jsx10(View6, { style: styles9.row, children: order.map((part, i) => /* @__PURE__ */ jsxs7(View6, { style: part === "year" ? styles9.yearBox : styles9.box, children: [
921
+ /* @__PURE__ */ jsx10(Text7, { style: [styles9.part, { color: theme.textSecondary }], children: labels[part] }),
922
+ /* @__PURE__ */ jsx10(
923
+ TextInput,
924
+ {
925
+ ref: (node) => {
926
+ refs[part].current = node;
927
+ if (i === 0 && inputRef) {
928
+ if (typeof inputRef === "function") inputRef(node);
929
+ else inputRef.current = node;
930
+ }
931
+ },
932
+ "aria-label": `${label}, ${labels[part]}`,
933
+ accessibilityHint: caption,
934
+ value: parts[part],
935
+ editable: !disabled,
936
+ keyboardType: "number-pad",
937
+ inputMode: "numeric",
938
+ maxLength: LENGTH[part],
939
+ autoComplete: autoComplete === "bday" ? Platform.OS === "web" ? `bday-${part}` : `birthdate-${part}` : "off",
940
+ returnKeyType: i === order.length - 1 ? returnKeyType : "next",
941
+ submitBehavior: i === order.length - 1 && returnKeyType !== "next" ? "blurAndSubmit" : "submit",
942
+ onSubmitEditing: () => {
943
+ const following = order[i + 1];
944
+ if (following) refs[following].current?.focus();
945
+ else onSubmitEditing?.();
946
+ },
947
+ onChangeText: (text) => change(part, text),
948
+ onFocus: () => setFocused(part),
949
+ onBlur: () => {
950
+ setFocused(null);
951
+ if (i === order.length - 1) onBlur?.();
952
+ },
953
+ style: [
954
+ styles9.input,
955
+ { color: theme.textPrimary, backgroundColor: theme.surface2, borderRadius: radius3.md, borderColor: error ? theme.danger : focused === part ? theme.accent : theme.borderDefault }
956
+ ]
957
+ }
958
+ )
959
+ ] }, part)) }),
960
+ caption ? /* @__PURE__ */ jsx10(Text7, { role: error ? "alert" : void 0, "aria-live": error ? "polite" : void 0, style: [styles9.caption, { color: error ? theme.dangerText : theme.textSecondary }], children: caption }) : null
961
+ ] });
962
+ }
963
+ var styles9 = StyleSheet9.create({
964
+ root: { gap: 6, alignSelf: "stretch" },
965
+ label: { fontSize: 12, lineHeight: 16, fontWeight: "600" },
966
+ row: { flexDirection: "row", gap: 10 },
967
+ box: { width: 64, gap: 4 },
968
+ yearBox: { width: 88, gap: 4 },
969
+ part: { fontSize: 11, lineHeight: 14 },
970
+ input: { height: 44, borderWidth: 1, paddingHorizontal: 10, fontSize: 16, fontVariant: ["tabular-nums"], textAlign: "center" },
971
+ caption: { fontSize: 12, lineHeight: 16 },
972
+ disabled: { opacity: 0.5 }
973
+ });
974
+
975
+ // src/native/date-time.tsx
976
+ import * as React10 from "react";
977
+ import { Pressable as Pressable6, ScrollView as ScrollView3, StyleSheet as StyleSheet11, Text as Text9, View as View8 } from "react-native";
978
+ import Svg3, { Path as Path2 } from "react-native-svg";
979
+
980
+ // src/native/wheel.tsx
981
+ import * as React9 from "react";
982
+ import { Pressable as Pressable5, ScrollView as ScrollView2, StyleSheet as StyleSheet10, Text as Text8, View as View7 } from "react-native";
983
+ import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
984
+ var ITEM = 44;
985
+ var VisibleContext = React9.createContext(5);
986
+ function WheelPicker({ label, children, visible = 5, invalid, style }) {
987
+ const { theme, radius: radius3 } = useTheme();
988
+ return /* @__PURE__ */ jsx11(VisibleContext.Provider, { value: visible, children: /* @__PURE__ */ jsxs8(
989
+ View7,
990
+ {
991
+ role: "group",
992
+ "aria-label": label,
993
+ style: [styles10.root, { height: ITEM * visible, borderRadius: radius3.xl, backgroundColor: theme.surface1, borderColor: invalid ? theme.danger : theme.borderDefault }, style],
994
+ children: [
995
+ /* @__PURE__ */ jsx11(View7, { pointerEvents: "none", style: [styles10.band, { top: ITEM * (visible - 1) / 2, height: ITEM, borderRadius: radius3.lg, backgroundColor: theme.surface3, borderColor: theme.borderSubtle }] }),
996
+ children
997
+ ]
998
+ }
999
+ ) });
1000
+ }
1001
+ function WheelDivider({ children }) {
1002
+ const { theme } = useTheme();
1003
+ return /* @__PURE__ */ jsx11(Text8, { "aria-hidden": true, style: [styles10.divider, { color: theme.textSecondary }], children });
1004
+ }
1005
+ var nearestEnabled = (options, index) => {
1006
+ for (let d = 0; d < options.length; d++) {
1007
+ if (options[index + d] && !options[index + d].disabled) return index + d;
1008
+ if (options[index - d] && !options[index - d].disabled) return index - d;
1009
+ }
1010
+ return index;
1011
+ };
1012
+ function Wheel({ label, options, value: valueProp, defaultValue, onValueChange, disabled, style }) {
1013
+ const { theme, haptic } = useTheme();
1014
+ const visible = React9.useContext(VisibleContext);
1015
+ const [own, setOwn] = React9.useState(defaultValue ?? options[0]?.value ?? "");
1016
+ const value = valueProp ?? own;
1017
+ const index = Math.max(0, options.findIndex((o) => o.value === value));
1018
+ const scroller = React9.useRef(null);
1019
+ const passing = React9.useRef(index);
1020
+ const [shown, setShown] = React9.useState(index);
1021
+ const [seen, setSeen] = React9.useState(index);
1022
+ if (seen !== index) {
1023
+ setSeen(index);
1024
+ setShown(index);
1025
+ }
1026
+ const commit = (i) => {
1027
+ const target = nearestEnabled(options, Math.min(options.length - 1, Math.max(0, i)));
1028
+ const option = options[target];
1029
+ if (!option) return;
1030
+ if (target !== i) scroller.current?.scrollTo({ y: target * ITEM, animated: true });
1031
+ if (valueProp === void 0) setOwn(option.value);
1032
+ if (option.value !== value) onValueChange?.(option.value);
1033
+ };
1034
+ React9.useEffect(() => {
1035
+ passing.current = index;
1036
+ scroller.current?.scrollTo({ y: index * ITEM, animated: false });
1037
+ }, [index]);
1038
+ const onScroll = (e) => {
1039
+ const i = Math.round(e.nativeEvent.contentOffset.y / ITEM);
1040
+ if (i !== passing.current && i >= 0 && i < options.length) {
1041
+ passing.current = i;
1042
+ setShown(i);
1043
+ haptic("selection");
1044
+ }
1045
+ };
1046
+ const settle = (e) => commit(Math.round(e.nativeEvent.contentOffset.y / ITEM));
1047
+ const step = (by) => {
1048
+ let i = index + by;
1049
+ while (options[i]?.disabled) i += by;
1050
+ if (options[i]) commit(i);
1051
+ };
1052
+ const pad = (visible - 1) / 2 * ITEM;
1053
+ return /* @__PURE__ */ jsx11(
1054
+ View7,
1055
+ {
1056
+ accessible: true,
1057
+ role: "spinbutton",
1058
+ "aria-label": label,
1059
+ "aria-valuetext": options[index]?.label,
1060
+ "aria-valuenow": index,
1061
+ "aria-valuemin": 0,
1062
+ "aria-valuemax": Math.max(0, options.length - 1),
1063
+ "aria-disabled": disabled || void 0,
1064
+ accessibilityActions: [{ name: "increment" }, { name: "decrement" }],
1065
+ onAccessibilityAction: (e) => step(e.nativeEvent.actionName === "increment" ? 1 : -1),
1066
+ style: [styles10.column, disabled ? styles10.disabled : null, style],
1067
+ children: /* @__PURE__ */ jsx11(
1068
+ ScrollView2,
1069
+ {
1070
+ ref: scroller,
1071
+ "aria-hidden": true,
1072
+ importantForAccessibility: "no-hide-descendants",
1073
+ scrollEnabled: !disabled,
1074
+ showsVerticalScrollIndicator: false,
1075
+ snapToInterval: ITEM,
1076
+ decelerationRate: "fast",
1077
+ contentOffset: { x: 0, y: index * ITEM },
1078
+ contentContainerStyle: { paddingVertical: pad },
1079
+ scrollEventThrottle: 16,
1080
+ onScroll,
1081
+ onMomentumScrollEnd: settle,
1082
+ onScrollEndDrag: (e) => {
1083
+ if (Math.abs(e.nativeEvent.velocity?.y ?? 0) < 0.05) settle(e);
1084
+ },
1085
+ children: options.map((o, i) => {
1086
+ const distance = Math.abs(i - shown);
1087
+ return /* @__PURE__ */ jsx11(Pressable5, { focusable: false, tabIndex: -1, disabled: disabled || o.disabled, onPress: () => commit(i), style: [styles10.item, { height: ITEM }], children: /* @__PURE__ */ jsx11(
1088
+ Text8,
1089
+ {
1090
+ numberOfLines: 1,
1091
+ style: [
1092
+ styles10.itemText,
1093
+ {
1094
+ color: o.disabled ? theme.textMuted : i === shown ? theme.textPrimary : theme.textSecondary,
1095
+ fontWeight: i === shown ? "600" : "400",
1096
+ opacity: distance === 0 ? 1 : distance === 1 ? 0.7 : 0.4,
1097
+ transform: [{ scale: distance === 0 ? 1 : 0.92 }],
1098
+ textDecorationLine: o.disabled ? "line-through" : "none"
1099
+ }
1100
+ ],
1101
+ children: o.label
1102
+ }
1103
+ ) }, o.value);
1104
+ })
1105
+ }
1106
+ )
1107
+ }
1108
+ );
1109
+ }
1110
+ var styles10 = StyleSheet10.create({
1111
+ root: { flexDirection: "row", alignItems: "stretch", borderWidth: StyleSheet10.hairlineWidth, paddingHorizontal: 6, gap: 4, overflow: "hidden", alignSelf: "flex-start" },
1112
+ band: { position: "absolute", left: 6, right: 6, borderWidth: StyleSheet10.hairlineWidth },
1113
+ column: { minWidth: 56, flexGrow: 1 },
1114
+ item: { alignItems: "center", justifyContent: "center", paddingHorizontal: 8 },
1115
+ itemText: { fontSize: 18, fontVariant: ["tabular-nums"] },
1116
+ divider: { alignSelf: "center", fontSize: 18, fontWeight: "600" },
1117
+ disabled: { opacity: 0.4 }
1118
+ });
1119
+
1120
+ // src/native/date-time.tsx
1121
+ import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
1122
+ var longDate = (locale, iso) => new Intl.DateTimeFormat(locale, { dateStyle: "long" }).format(toLocalDate(iso));
1123
+ var useOwn = (value, initial) => {
1124
+ const [own, setOwn] = React10.useState(initial);
1125
+ return [value !== void 0 ? value : own, (next) => value === void 0 && setOwn(next)];
1126
+ };
1127
+ function Chevron({ direction, color }) {
1128
+ return /* @__PURE__ */ jsx12(Svg3, { 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__ */ jsx12(Path2, { d: direction === "left" ? "m15 18-6-6 6-6" : "m9 18 6-6-6-6" }) });
1129
+ }
1130
+ function NavButton({ label, direction, disabled, onPress }) {
1131
+ const { theme, radius: radius3 } = useTheme();
1132
+ return /* @__PURE__ */ jsx12(
1133
+ Pressable6,
1134
+ {
1135
+ role: "button",
1136
+ "aria-label": label,
1137
+ "aria-disabled": disabled || void 0,
1138
+ disabled,
1139
+ hitSlop: 6,
1140
+ onPress,
1141
+ style: ({ pressed }) => [styles11.nav, { borderRadius: radius3.md, backgroundColor: pressed ? theme.surface3 : theme.surface2, borderColor: theme.borderSubtle }, disabled ? styles11.disabled : null],
1142
+ children: /* @__PURE__ */ jsx12(Chevron, { direction, color: theme.textSecondary })
1143
+ }
1144
+ );
1145
+ }
1146
+ function Node({ color, style }) {
1147
+ return /* @__PURE__ */ jsx12(View8, { "aria-hidden": true, style: [styles11.node, { backgroundColor: color }, style] });
1148
+ }
1149
+ var calendarLabels = { previousMonth: "Previous month", nextMonth: "Next month" };
1150
+ function Calendar({ locale, value, range, onSelect, defaultMonth, min, max, isDateDisabled, weekStartsOn, today: todayProp, labels: given, style }) {
1151
+ const labels = { ...calendarLabels, ...given };
1152
+ const { theme, radius: radius3, haptic } = useTheme();
1153
+ const today = todayProp ?? todayIso();
1154
+ const [month, setMonth] = React10.useState(`${(defaultMonth ?? value ?? range?.start ?? today).slice(0, 7)}-01`);
1155
+ const start = weekStartsOn ?? weekStartOf(locale);
1156
+ const weeks = monthGrid(month, start);
1157
+ const weekday = new Intl.DateTimeFormat(locale, { weekday: "narrow" });
1158
+ const title = new Intl.DateTimeFormat(locale, { month: "long", year: "numeric" }).format(toLocalDate(month));
1159
+ const [lo, hi] = range?.end ? range.start <= range.end ? [range.start, range.end] : [range.end, range.start] : [null, null];
1160
+ const off = (iso) => Boolean(min && iso < min || max && iso > max || isDateDisabled?.(iso));
1161
+ return /* @__PURE__ */ jsxs9(View8, { style: [styles11.calendar, { backgroundColor: theme.surface1, borderColor: theme.borderDefault, borderRadius: radius3.xl }, style], children: [
1162
+ /* @__PURE__ */ jsxs9(View8, { style: styles11.header, children: [
1163
+ /* @__PURE__ */ jsx12(NavButton, { label: labels.previousMonth, direction: "left", disabled: Boolean(min && addDays(month, -1) < min), onPress: () => setMonth(addMonths(month, -1)) }),
1164
+ /* @__PURE__ */ jsx12(Text9, { role: "heading", "aria-live": "polite", style: [styles11.title, { color: theme.textPrimary }], children: title }),
1165
+ /* @__PURE__ */ jsx12(NavButton, { label: labels.nextMonth, direction: "right", disabled: Boolean(max && addMonths(month, 1) > max), onPress: () => setMonth(addMonths(month, 1)) })
1166
+ ] }),
1167
+ /* @__PURE__ */ jsx12(View8, { style: styles11.week, "aria-hidden": true, children: weeks[0].map((iso) => /* @__PURE__ */ jsx12(Text9, { style: [styles11.weekday, { color: theme.textSecondary }], children: weekday.format(toLocalDate(iso)) }, iso)) }),
1168
+ /* @__PURE__ */ jsx12(View8, { role: "radiogroup", "aria-label": title, children: weeks.map((week) => /* @__PURE__ */ jsx12(View8, { style: styles11.week, children: week.map((iso) => {
1169
+ const outside = iso.slice(0, 7) !== month.slice(0, 7);
1170
+ const selected = iso === value || Boolean(range && (iso === range.start || iso === range.end));
1171
+ const disabled = off(iso);
1172
+ const band = lo && hi && lo !== hi && iso >= lo && iso <= hi;
1173
+ return /* @__PURE__ */ jsx12(
1174
+ View8,
1175
+ {
1176
+ style: [
1177
+ styles11.cell,
1178
+ band ? { backgroundColor: theme.accentSoft } : null,
1179
+ band && iso === lo ? { borderTopLeftRadius: radius3.lg, borderBottomLeftRadius: radius3.lg } : null,
1180
+ band && iso === hi ? { borderTopRightRadius: radius3.lg, borderBottomRightRadius: radius3.lg } : null
1181
+ ],
1182
+ children: /* @__PURE__ */ jsxs9(
1183
+ Pressable6,
1184
+ {
1185
+ role: "radio",
1186
+ "aria-label": longDate(locale, iso),
1187
+ "aria-checked": selected,
1188
+ "aria-disabled": disabled || void 0,
1189
+ "aria-current": iso === today ? "date" : void 0,
1190
+ disabled,
1191
+ onPress: () => {
1192
+ haptic("selection");
1193
+ onSelect?.(iso);
1194
+ },
1195
+ style: ({ pressed }) => [
1196
+ styles11.day,
1197
+ { borderRadius: radius3.lg },
1198
+ selected ? { backgroundColor: theme.accent } : pressed ? { backgroundColor: theme.surface3 } : null
1199
+ ],
1200
+ children: [
1201
+ /* @__PURE__ */ jsx12(
1202
+ Text9,
1203
+ {
1204
+ style: [
1205
+ styles11.dayText,
1206
+ {
1207
+ color: selected ? theme.onAccent : disabled ? theme.textMuted : iso === today ? theme.accentText : outside ? theme.textSecondary : theme.textPrimary,
1208
+ fontWeight: selected || iso === today ? "700" : "400",
1209
+ textDecorationLine: disabled ? "line-through" : "none"
1210
+ }
1211
+ ],
1212
+ children: Number(iso.slice(8))
1213
+ }
1214
+ ),
1215
+ iso === today ? /* @__PURE__ */ jsx12(Node, { color: selected ? theme.onAccent : theme.accent, style: styles11.todayNode }) : null
1216
+ ]
1217
+ }
1218
+ )
1219
+ },
1220
+ iso
1221
+ );
1222
+ }) }, week[0])) })
1223
+ ] });
1224
+ }
1225
+ function MonthPicker({ locale, value, onValueChange, min, max, labels, style }) {
1226
+ const { theme, radius: radius3, haptic } = useTheme();
1227
+ const [year, setYear] = React10.useState(Number((value ?? todayIso()).slice(0, 4)));
1228
+ const names = monthNames(locale, "short").map((n) => n.replace(/\.$/, ""));
1229
+ const long = monthNames(locale, "long");
1230
+ return /* @__PURE__ */ jsxs9(View8, { style: [styles11.calendar, { backgroundColor: theme.surface1, borderColor: theme.borderDefault, borderRadius: radius3.xl }, style], children: [
1231
+ /* @__PURE__ */ jsxs9(View8, { style: styles11.header, children: [
1232
+ /* @__PURE__ */ jsx12(NavButton, { label: labels?.previousYear ?? "Previous year", direction: "left", disabled: Boolean(min && year - 1 < Number(min.slice(0, 4))), onPress: () => setYear(year - 1) }),
1233
+ /* @__PURE__ */ jsx12(Text9, { role: "heading", "aria-live": "polite", style: [styles11.title, { color: theme.textPrimary }], children: year }),
1234
+ /* @__PURE__ */ jsx12(NavButton, { label: labels?.nextYear ?? "Next year", direction: "right", disabled: Boolean(max && year + 1 > Number(max.slice(0, 4))), onPress: () => setYear(year + 1) })
1235
+ ] }),
1236
+ /* @__PURE__ */ jsx12(View8, { role: "radiogroup", "aria-label": String(year), style: styles11.months, children: names.map((name, i) => {
1237
+ const id = `${year}-${String(i + 1).padStart(2, "0")}`;
1238
+ const selected = id === value;
1239
+ const disabled = Boolean(min && id < min || max && id > max);
1240
+ return /* @__PURE__ */ jsx12(
1241
+ Pressable6,
1242
+ {
1243
+ role: "radio",
1244
+ "aria-checked": selected,
1245
+ "aria-label": `${long[i]} ${year}`,
1246
+ "aria-disabled": disabled || void 0,
1247
+ disabled,
1248
+ onPress: () => {
1249
+ haptic("selection");
1250
+ onValueChange?.(id);
1251
+ },
1252
+ style: ({ pressed }) => [styles11.month, { borderRadius: radius3.lg, backgroundColor: selected ? theme.accent : pressed ? theme.surface3 : "transparent" }, disabled ? styles11.disabled : null],
1253
+ children: /* @__PURE__ */ jsx12(Text9, { style: [styles11.monthText, { color: selected ? theme.onAccent : theme.textPrimary, fontWeight: selected ? "700" : "500" }], children: name })
1254
+ },
1255
+ id
1256
+ );
1257
+ }) })
1258
+ ] });
1259
+ }
1260
+ function DayStrip({ label, locale, value: valueProp, defaultValue = null, onValueChange, start, days = 14, isDateDisabled, isDateMarked, markedLabel = "has events", today: todayProp, style }) {
1261
+ const { theme, radius: radius3, haptic } = useTheme();
1262
+ const today = todayProp ?? todayIso();
1263
+ const first = start ?? today;
1264
+ const [value, setValue] = useOwn(valueProp, defaultValue);
1265
+ const weekday = new Intl.DateTimeFormat(locale, { weekday: "short" });
1266
+ const list = Array.from({ length: days }, (_, i) => addDays(first, i));
1267
+ return /* @__PURE__ */ jsx12(ScrollView3, { horizontal: true, showsHorizontalScrollIndicator: false, role: "radiogroup", "aria-label": label, contentContainerStyle: styles11.strip, style, children: list.map((iso) => {
1268
+ const selected = iso === value;
1269
+ const disabled = Boolean(isDateDisabled?.(iso));
1270
+ const marked = Boolean(isDateMarked?.(iso));
1271
+ const name = longDate(locale, iso);
1272
+ return /* @__PURE__ */ jsxs9(
1273
+ Pressable6,
1274
+ {
1275
+ role: "radio",
1276
+ "aria-checked": selected,
1277
+ "aria-label": marked ? `${name}, ${markedLabel}` : name,
1278
+ "aria-disabled": disabled || void 0,
1279
+ "aria-current": iso === today ? "date" : void 0,
1280
+ disabled,
1281
+ onPress: () => {
1282
+ haptic("selection");
1283
+ setValue(iso);
1284
+ onValueChange?.(iso);
1285
+ },
1286
+ style: ({ pressed }) => [
1287
+ styles11.stripDay,
1288
+ {
1289
+ borderRadius: radius3.xl,
1290
+ backgroundColor: selected ? theme.accent : disabled ? "transparent" : theme.surface2,
1291
+ borderColor: selected ? theme.accent : theme.borderDefault,
1292
+ borderStyle: disabled ? "dashed" : "solid",
1293
+ transform: [{ scale: pressed ? 0.95 : 1 }]
1294
+ }
1295
+ ],
1296
+ children: [
1297
+ iso === today ? /* @__PURE__ */ jsx12(Node, { color: selected ? theme.onAccent : theme.accent, style: styles11.stripNode }) : null,
1298
+ /* @__PURE__ */ jsx12(Text9, { style: [styles11.stripWeekday, { color: selected ? theme.onAccent : disabled ? theme.textMuted : theme.textSecondary }], children: weekday.format(toLocalDate(iso)).replace(/\.$/, "").toUpperCase() }),
1299
+ /* @__PURE__ */ jsx12(Text9, { style: [styles11.stripNumber, { color: selected ? theme.onAccent : disabled ? theme.textMuted : theme.textPrimary }], children: Number(iso.slice(8)) }),
1300
+ /* @__PURE__ */ jsx12(View8, { style: [styles11.dot, marked ? { backgroundColor: selected ? theme.onAccent : theme.textSecondary } : null] })
1301
+ ]
1302
+ },
1303
+ iso
1304
+ );
1305
+ }) });
1306
+ }
1307
+ function TimePicker({ label, locale, value: valueProp, defaultValue = null, onValueChange, variant = "wheel", minuteStep = 5, hour12, labels: given, slots = [], isTimeDisabled, disabled, style }) {
1308
+ const { theme, radius: radius3, haptic } = useTheme();
1309
+ const [value, setOwn] = useOwn(valueProp, defaultValue);
1310
+ const set = (next) => {
1311
+ setOwn(next);
1312
+ onValueChange?.(next);
1313
+ };
1314
+ if (variant === "slots")
1315
+ return /* @__PURE__ */ jsx12(View8, { role: "radiogroup", "aria-label": label, style: [styles11.slots, style], children: slots.map((t) => {
1316
+ const selected = t === value;
1317
+ const off = disabled || Boolean(isTimeDisabled?.(t));
1318
+ return /* @__PURE__ */ jsx12(
1319
+ Pressable6,
1320
+ {
1321
+ role: "radio",
1322
+ "aria-checked": selected,
1323
+ "aria-label": formatTime(locale, t),
1324
+ "aria-disabled": off || void 0,
1325
+ disabled: off,
1326
+ onPress: () => {
1327
+ haptic("selection");
1328
+ set(t);
1329
+ },
1330
+ style: ({ pressed }) => [
1331
+ styles11.slot,
1332
+ {
1333
+ borderRadius: radius3.lg,
1334
+ backgroundColor: selected ? theme.accent : off ? "transparent" : theme.surface2,
1335
+ borderColor: selected ? theme.accent : theme.borderDefault,
1336
+ borderStyle: off ? "dashed" : "solid",
1337
+ transform: [{ scale: pressed ? 0.97 : 1 }]
1338
+ }
1339
+ ],
1340
+ children: /* @__PURE__ */ jsx12(Text9, { style: [styles11.slotText, { color: selected ? theme.onAccent : off ? theme.textMuted : theme.textPrimary, textDecorationLine: off ? "line-through" : "none" }], children: formatTime(locale, t) })
1341
+ },
1342
+ t
1343
+ );
1344
+ }) });
1345
+ const labels = { hours: "Hours", minutes: "Minutes", period: "AM/PM", ...given };
1346
+ const twelve = hour12 ?? uses12Hours(locale);
1347
+ const total = timeToMinutes(value) ?? 9 * 60;
1348
+ const h24 = Math.floor(total / 60);
1349
+ const minute = total % 60;
1350
+ const pm = h24 >= 12;
1351
+ const two = (n) => String(n).padStart(2, "0");
1352
+ const put = (h, m) => set(`${two(h)}:${two(m)}`);
1353
+ const hours = twelve ? [12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11].map((h) => ({ value: String(h), label: String(h) })) : Array.from({ length: 24 }, (_, h) => ({ value: String(h), label: two(h) }));
1354
+ const minutes = Array.from({ length: Math.ceil(60 / minuteStep) }, (_, i) => ({ value: String(i * minuteStep), label: two(i * minuteStep) }));
1355
+ const [am, pmLabel] = dayPeriods(locale);
1356
+ return /* @__PURE__ */ jsxs9(WheelPicker, { label: value ? `${label}, ${formatTime(locale, value)}` : label, style, children: [
1357
+ /* @__PURE__ */ jsx12(Wheel, { label: labels.hours, options: hours, disabled, value: twelve ? String(h24 % 12 === 0 ? 12 : h24 % 12) : String(h24), onValueChange: (v) => put(twelve ? Number(v) % 12 + (pm ? 12 : 0) : Number(v), minute) }),
1358
+ /* @__PURE__ */ jsx12(WheelDivider, { children: ":" }),
1359
+ /* @__PURE__ */ jsx12(Wheel, { label: labels.minutes, options: minutes, disabled, value: String(Math.min(60 - minuteStep, Math.round(minute / minuteStep) * minuteStep)), onValueChange: (v) => put(h24, Number(v)) }),
1360
+ twelve ? /* @__PURE__ */ jsx12(
1361
+ Wheel,
1362
+ {
1363
+ label: labels.period,
1364
+ options: [
1365
+ { value: "am", label: am },
1366
+ { value: "pm", label: pmLabel }
1367
+ ],
1368
+ disabled,
1369
+ value: pm ? "pm" : "am",
1370
+ onValueChange: (v) => put(h24 % 12 + (v === "pm" ? 12 : 0), minute)
1371
+ }
1372
+ ) : null
1373
+ ] });
1374
+ }
1375
+ function DateWheel({ label, locale, value: valueProp, defaultValue = null, onValueChange, min, max, defaultView, hint, error, labels: given, disabled, style }) {
1376
+ const { theme } = useTheme();
1377
+ const names = { day: "Day", month: "Month", year: "Year", ...given };
1378
+ const [value, setOwn] = useOwn(valueProp, defaultValue);
1379
+ const today = todayIso();
1380
+ const hi = max ?? today;
1381
+ const lo = min ?? isoOf(Number(today.slice(0, 4)) - 120, 1, 1);
1382
+ const { year, month, day } = isoParts(value || defaultView || hi);
1383
+ const months = monthNames(locale, "long");
1384
+ const set = (y, m, d) => {
1385
+ let next = isoOf(y, m, d);
1386
+ if (next > hi) next = hi;
1387
+ if (next < lo) next = lo;
1388
+ setOwn(next);
1389
+ onValueChange?.(next);
1390
+ };
1391
+ const last = daysInMonth(year, month);
1392
+ const columns = {
1393
+ day: /* @__PURE__ */ jsx12(Wheel, { label: names.day, disabled, options: Array.from({ length: last }, (_, i) => ({ value: String(i + 1), label: String(i + 1), disabled: isoOf(year, month, i + 1) > hi || isoOf(year, month, i + 1) < lo })), value: String(Math.min(day, last)), onValueChange: (v) => set(year, month, Number(v)), style: styles11.dayWheel }, "day"),
1394
+ month: /* @__PURE__ */ jsx12(Wheel, { label: names.month, disabled, options: months.map((n, i) => ({ value: String(i + 1), label: n, disabled: isoOf(year, i + 1, 1) > hi || isoOf(year, i + 1, daysInMonth(year, i + 1)) < lo })), value: String(month), onValueChange: (v) => set(year, Number(v), day), style: styles11.monthWheel }, "month"),
1395
+ year: /* @__PURE__ */ jsx12(Wheel, { label: names.year, disabled, options: yearRange(Number(hi.slice(0, 4)), Number(lo.slice(0, 4))).map((y) => ({ value: String(y), label: String(y) })), value: String(year), onValueChange: (v) => set(Number(v), month, day), style: styles11.yearWheel }, "year")
1396
+ };
1397
+ const caption = error ?? hint;
1398
+ return /* @__PURE__ */ jsxs9(View8, { style: [styles11.field, style], children: [
1399
+ /* @__PURE__ */ jsx12(Text9, { "aria-hidden": true, style: [styles11.fieldLabel, { color: theme.textSecondary }], children: label }),
1400
+ /* @__PURE__ */ jsx12(WheelPicker, { label, invalid: Boolean(error), children: datePartsOrder(locale).map((part) => columns[part]) }),
1401
+ caption ? /* @__PURE__ */ jsx12(Text9, { role: error ? "alert" : void 0, "aria-live": error ? "polite" : void 0, style: [styles11.caption, { color: error ? theme.dangerText : theme.textSecondary }], children: caption }) : null
1402
+ ] });
1403
+ }
1404
+ var styles11 = StyleSheet11.create({
1405
+ calendar: { padding: 12, gap: 4, borderWidth: StyleSheet11.hairlineWidth, alignSelf: "flex-start" },
1406
+ header: { flexDirection: "row", alignItems: "center", justifyContent: "space-between", marginBottom: 6, gap: 8 },
1407
+ title: { fontSize: 15, fontWeight: "700", textTransform: "capitalize" },
1408
+ nav: { width: 36, height: 36, alignItems: "center", justifyContent: "center", borderWidth: StyleSheet11.hairlineWidth },
1409
+ week: { flexDirection: "row" },
1410
+ weekday: { width: 44, textAlign: "center", fontSize: 11, fontWeight: "700", paddingBottom: 4 },
1411
+ cell: { width: 44, height: 44, marginVertical: 1 },
1412
+ day: { flex: 1, alignItems: "center", justifyContent: "center" },
1413
+ dayText: { fontSize: 15, fontVariant: ["tabular-nums"] },
1414
+ node: { width: 5, height: 5, borderRadius: 1, transform: [{ rotate: "45deg" }] },
1415
+ todayNode: { position: "absolute", bottom: 5 },
1416
+ months: { flexDirection: "row", flexWrap: "wrap", width: 264, gap: 6 },
1417
+ month: { width: 84, height: 44, alignItems: "center", justifyContent: "center" },
1418
+ monthText: { fontSize: 14, textTransform: "capitalize" },
1419
+ strip: { gap: 8, paddingVertical: 4 },
1420
+ stripDay: { width: 56, height: 72, alignItems: "center", justifyContent: "center", gap: 2, borderWidth: 1 },
1421
+ stripNode: { position: "absolute", top: 6 },
1422
+ stripWeekday: { fontSize: 11, fontWeight: "700", letterSpacing: 0.5 },
1423
+ stripNumber: { fontSize: 19, fontWeight: "700", fontVariant: ["tabular-nums"] },
1424
+ dot: { width: 6, height: 6, borderRadius: 3 },
1425
+ slots: { flexDirection: "row", flexWrap: "wrap", gap: 8, alignSelf: "stretch" },
1426
+ slot: { minWidth: 88, height: 44, paddingHorizontal: 12, alignItems: "center", justifyContent: "center", borderWidth: 1 },
1427
+ slotText: { fontSize: 15, fontWeight: "600", fontVariant: ["tabular-nums"] },
1428
+ field: { gap: 6, alignSelf: "stretch" },
1429
+ fieldLabel: { fontSize: 12, lineHeight: 16, fontWeight: "600" },
1430
+ caption: { fontSize: 12, lineHeight: 16 },
1431
+ dayWheel: { minWidth: 56 },
1432
+ monthWheel: { minWidth: 128 },
1433
+ yearWheel: { minWidth: 76 },
1434
+ disabled: { opacity: 0.4 }
1435
+ });
1436
+
713
1437
  // src/native/empty-state.tsx
714
- import { StyleSheet as StyleSheet8, View as View5 } from "react-native";
715
- import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
1438
+ import { StyleSheet as StyleSheet12, View as View9 } from "react-native";
1439
+ import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
716
1440
  function EmptyState({ icon, title, description, action, style, ...props }) {
717
1441
  const { theme } = useTheme();
718
- return /* @__PURE__ */ jsxs6(View5, { ...props, style: [styles8.root, style], children: [
719
- icon ? /* @__PURE__ */ jsx9(View5, { "aria-hidden": true, style: [styles8.icon, { backgroundColor: theme.surface2 }], children: icon }) : null,
720
- /* @__PURE__ */ jsx9(Txt, { variant: "label", role: "heading", style: styles8.center, children: title }),
721
- description ? /* @__PURE__ */ jsx9(Txt, { tone: "secondary", style: styles8.center, children: description }) : null,
722
- action ? /* @__PURE__ */ jsx9(View5, { style: styles8.action, children: action }) : null
1442
+ return /* @__PURE__ */ jsxs10(View9, { ...props, style: [styles12.root, style], children: [
1443
+ icon ? /* @__PURE__ */ jsx13(View9, { "aria-hidden": true, style: [styles12.icon, { backgroundColor: theme.surface2 }], children: icon }) : null,
1444
+ /* @__PURE__ */ jsx13(Txt, { variant: "label", role: "heading", style: styles12.center, children: title }),
1445
+ description ? /* @__PURE__ */ jsx13(Txt, { tone: "secondary", style: styles12.center, children: description }) : null,
1446
+ action ? /* @__PURE__ */ jsx13(View9, { style: styles12.action, children: action }) : null
723
1447
  ] });
724
1448
  }
725
- var styles8 = StyleSheet8.create({
1449
+ var styles12 = StyleSheet12.create({
726
1450
  root: { alignItems: "center", justifyContent: "center", gap: 8, paddingVertical: 40, paddingHorizontal: 24 },
727
1451
  icon: { width: 48, height: 48, borderRadius: 24, alignItems: "center", justifyContent: "center", marginBottom: 4 },
728
1452
  center: { textAlign: "center", maxWidth: 360 },
729
1453
  action: { marginTop: 8, flexDirection: "row", flexWrap: "wrap", justifyContent: "center", gap: 8 }
730
1454
  });
731
1455
 
1456
+ // src/native/field.tsx
1457
+ import * as React11 from "react";
1458
+ import { StyleSheet as StyleSheet13, Text as Text10, TextInput as TextInput2, View as View10 } from "react-native";
1459
+ import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
1460
+ function TextField({ label, hint, error, value, defaultValue, onValueChange, disabled, end, inputRef, style, multiline, onFocus, onBlur, ...props }) {
1461
+ const { theme, radius: radius3 } = useTheme();
1462
+ const [focused, setFocused] = React11.useState(false);
1463
+ const caption = error ?? hint;
1464
+ const border = error ? theme.danger : focused ? theme.accent : theme.borderDefault;
1465
+ return /* @__PURE__ */ jsxs11(View10, { style: [styles13.root, disabled ? styles13.disabled : null, style], children: [
1466
+ /* @__PURE__ */ jsx14(Text10, { style: [styles13.label, { color: theme.textSecondary }], children: label }),
1467
+ /* @__PURE__ */ jsxs11(View10, { style: [styles13.frame, multiline ? styles13.multiline : null, { borderRadius: radius3.md, borderColor: border, backgroundColor: theme.surface2 }], children: [
1468
+ /* @__PURE__ */ jsx14(
1469
+ TextInput2,
1470
+ {
1471
+ ref: inputRef,
1472
+ "aria-label": label,
1473
+ "aria-disabled": disabled || void 0,
1474
+ accessibilityHint: caption,
1475
+ value,
1476
+ defaultValue,
1477
+ editable: !disabled,
1478
+ multiline,
1479
+ textAlignVertical: multiline ? "top" : "center",
1480
+ placeholderTextColor: theme.textMuted,
1481
+ onChangeText: onValueChange,
1482
+ onFocus: (event) => {
1483
+ setFocused(true);
1484
+ onFocus?.(event);
1485
+ },
1486
+ onBlur: (event) => {
1487
+ setFocused(false);
1488
+ onBlur?.(event);
1489
+ },
1490
+ style: [styles13.input, multiline ? styles13.inputMultiline : null, { color: theme.textPrimary }],
1491
+ ...props
1492
+ }
1493
+ ),
1494
+ end ? /* @__PURE__ */ jsx14(View10, { style: styles13.end, children: end }) : null
1495
+ ] }),
1496
+ caption ? /* @__PURE__ */ jsx14(Text10, { role: error ? "alert" : void 0, "aria-live": error ? "polite" : void 0, style: [styles13.caption, { color: error ? theme.dangerText : theme.textSecondary }], children: caption }) : null
1497
+ ] });
1498
+ }
1499
+ var styles13 = StyleSheet13.create({
1500
+ root: { gap: 6, alignSelf: "stretch" },
1501
+ label: { fontSize: 12, lineHeight: 16, fontWeight: "600" },
1502
+ frame: { flexDirection: "row", alignItems: "center", minHeight: 44, paddingHorizontal: 12, borderWidth: 1 },
1503
+ multiline: { alignItems: "flex-start", minHeight: 96, paddingVertical: 10 },
1504
+ input: { flex: 1, minHeight: 42, fontSize: 15, paddingVertical: 0 },
1505
+ inputMultiline: { minHeight: 76 },
1506
+ end: { marginLeft: 8 },
1507
+ caption: { fontSize: 12, lineHeight: 16 },
1508
+ disabled: { opacity: 0.5 }
1509
+ });
1510
+
732
1511
  // src/native/goal-gauge.tsx
733
- import { Animated as Animated4, StyleSheet as StyleSheet9, View as View6 } from "react-native";
1512
+ import { Animated as Animated4, StyleSheet as StyleSheet14, View as View11 } from "react-native";
734
1513
 
735
1514
  // src/native/story-motion.ts
736
- import * as React7 from "react";
1515
+ import * as React12 from "react";
737
1516
  import { AccessibilityInfo as AccessibilityInfo2, Animated as Animated3, Easing } from "react-native";
738
1517
  function useEntrance(animated, delay = 0, duration = 700) {
739
- const [value] = React7.useState(() => new Animated3.Value(animated ? 0 : 1));
740
- React7.useEffect(() => {
1518
+ const [value] = React12.useState(() => new Animated3.Value(animated ? 0 : 1));
1519
+ React12.useEffect(() => {
741
1520
  if (!animated) return;
742
1521
  let cancelled = false;
743
1522
  void AccessibilityInfo2.isReduceMotionEnabled().then((reduce) => {
@@ -753,17 +1532,17 @@ function useEntrance(animated, delay = 0, duration = 700) {
753
1532
  }
754
1533
 
755
1534
  // src/native/goal-gauge.tsx
756
- import { jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
1535
+ import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
757
1536
  function Cell({ lit, animate, order, animated, arcade }) {
758
1537
  const { theme } = useTheme();
759
1538
  const t = useEntrance(animated && animate, 300 + order * 100, 350);
760
1539
  const spentOpacity = arcade ? 0.14 : 1;
761
1540
  const opacity = !animate ? 1 : lit ? t.interpolate({ inputRange: [0, 1], outputRange: [0.25, 1] }) : t.interpolate({ inputRange: [0, 1], outputRange: [1, arcade ? 0.14 : 1] });
762
1541
  const color = lit || arcade ? theme.accent : theme.surface3;
763
- return /* @__PURE__ */ jsx10(
1542
+ return /* @__PURE__ */ jsx15(
764
1543
  Animated4.View,
765
1544
  {
766
- style: [styles9.cell, arcade ? styles9.cellArcade : null, { backgroundColor: color, opacity: lit || animate ? opacity : spentOpacity }]
1545
+ style: [styles14.cell, arcade ? styles14.cellArcade : null, { backgroundColor: color, opacity: lit || animate ? opacity : spentOpacity }]
767
1546
  }
768
1547
  );
769
1548
  }
@@ -773,8 +1552,8 @@ function GoalGauge({ label, segments, value, valueText, mode = "fill", showLabel
773
1552
  const lit = Math.min(total, Math.max(0, Math.round(value ?? total)));
774
1553
  const words = valueText ?? `${lit} / ${total}`;
775
1554
  const arcade = variant === "arcade";
776
- return /* @__PURE__ */ jsxs7(
777
- View6,
1555
+ return /* @__PURE__ */ jsxs12(
1556
+ View11,
778
1557
  {
779
1558
  accessible: true,
780
1559
  role: "meter",
@@ -784,22 +1563,22 @@ function GoalGauge({ label, segments, value, valueText, mode = "fill", showLabel
784
1563
  "aria-valuenow": lit,
785
1564
  "aria-valuetext": words,
786
1565
  ...props,
787
- style: [styles9.root, style],
1566
+ style: [styles14.root, style],
788
1567
  children: [
789
- showLabel ? /* @__PURE__ */ jsxs7(View6, { "aria-hidden": true, style: [styles9.head, arcade ? styles9.headArcade : null], children: [
790
- /* @__PURE__ */ jsx10(Txt, { variant: arcade ? "mono" : "caption", tone: "secondary", children: arcade ? label.toUpperCase() : label }),
791
- arcade ? null : /* @__PURE__ */ jsx10(Txt, { variant: "caption", children: words })
1568
+ showLabel ? /* @__PURE__ */ jsxs12(View11, { "aria-hidden": true, style: [styles14.head, arcade ? styles14.headArcade : null], children: [
1569
+ /* @__PURE__ */ jsx15(Txt, { variant: arcade ? "mono" : "caption", tone: "secondary", children: arcade ? label.toUpperCase() : label }),
1570
+ arcade ? null : /* @__PURE__ */ jsx15(Txt, { variant: "caption", children: words })
792
1571
  ] }) : null,
793
- /* @__PURE__ */ jsx10(View6, { "aria-hidden": true, style: [styles9.cells, arcade ? [styles9.cellsArcade, { borderColor: theme.borderSubtle, backgroundColor: theme.surface1 }] : null], children: Array.from({ length: total }, (_, i) => {
1572
+ /* @__PURE__ */ jsx15(View11, { "aria-hidden": true, style: [styles14.cells, arcade ? [styles14.cellsArcade, { borderColor: theme.borderSubtle, backgroundColor: theme.surface1 }] : null], children: Array.from({ length: total }, (_, i) => {
794
1573
  const on = i < lit;
795
1574
  const animate = mode === "fill" ? on : !on;
796
- return /* @__PURE__ */ jsx10(Cell, { lit: on, animate, order: mode === "fill" ? i : i - lit, animated, arcade }, i);
1575
+ return /* @__PURE__ */ jsx15(Cell, { lit: on, animate, order: mode === "fill" ? i : i - lit, animated, arcade }, i);
797
1576
  }) })
798
1577
  ]
799
1578
  }
800
1579
  );
801
1580
  }
802
- var styles9 = StyleSheet9.create({
1581
+ var styles14 = StyleSheet14.create({
803
1582
  root: { alignSelf: "stretch", gap: 8 },
804
1583
  head: { flexDirection: "row", justifyContent: "space-between", alignItems: "baseline", gap: 12 },
805
1584
  headArcade: { justifyContent: "center" },
@@ -810,8 +1589,8 @@ var styles9 = StyleSheet9.create({
810
1589
  });
811
1590
 
812
1591
  // src/native/KrizakaMark.tsx
813
- import { View as View7 } from "react-native";
814
- import Svg2, { Circle, Defs as Defs2, G as Group, LinearGradient as LinearGradient2, Path, RadialGradient, Stop as Stop2 } from "react-native-svg";
1592
+ import { View as View12 } from "react-native";
1593
+ import Svg4, { Circle, Defs as Defs2, G as Group, LinearGradient as LinearGradient2, Path as Path3, RadialGradient, Stop as Stop2 } from "react-native-svg";
815
1594
 
816
1595
  // src/marks/krizaka-geometry.ts
817
1596
  var KRIZAKA = {
@@ -833,13 +1612,13 @@ var KRIZAKA = {
833
1612
  };
834
1613
 
835
1614
  // src/native/mark-motion.ts
836
- import { useEffect as useEffect5, useState as useState7 } from "react";
1615
+ import { useEffect as useEffect6, useState as useState12 } from "react";
837
1616
  import { AccessibilityInfo as AccessibilityInfo3, Animated as Animated5, Easing as Easing2 } from "react-native";
838
1617
  var markA11y = (title) => title ? { accessible: true, accessibilityRole: "image", accessibilityLabel: title } : { accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants" };
839
1618
  function useMarkMotion(size, animated, spinMs = 3e4) {
840
- const [spin] = useState7(() => new Animated5.Value(0));
841
- const [pulse] = useState7(() => new Animated5.Value(0));
842
- useEffect5(() => {
1619
+ const [spin] = useState12(() => new Animated5.Value(0));
1620
+ const [pulse] = useState12(() => new Animated5.Value(0));
1621
+ useEffect6(() => {
843
1622
  if (!animated) return;
844
1623
  let loops = [];
845
1624
  let cancelled = false;
@@ -870,39 +1649,39 @@ function useMarkMotion(size, animated, spinMs = 3e4) {
870
1649
  }
871
1650
 
872
1651
  // src/native/KrizakaMark.tsx
873
- import { Fragment as Fragment2, jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
1652
+ import { Fragment as Fragment2, jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
874
1653
  function KrizakaMark({ size = 48, animated = true, title, neutral }) {
875
1654
  const { theme } = useTheme();
876
1655
  const { Animated: Animated14, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated);
877
1656
  const id = useSvgId("kzm");
878
1657
  const viewBox = size < 48 ? KRIZAKA.croppedViewBox : KRIZAKA.viewBox;
879
1658
  const stroke = neutral ?? theme.textMuted;
880
- const blue = /* @__PURE__ */ jsx11(LinearGradient2, { 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__ */ jsx11(Stop2, { offset, stopColor: color }, offset)) });
881
- const dot = (c) => /* @__PURE__ */ jsxs8(Fragment2, { children: [
882
- /* @__PURE__ */ jsx11(Circle, { cx: c.cx, cy: c.cy, r: c.r, fill: `url(#${id}b)` }),
883
- /* @__PURE__ */ jsx11(Circle, { cx: c.cx, cy: c.cy, r: c.inner, fill: KRIZAKA.highlight })
1659
+ const blue = /* @__PURE__ */ jsx16(LinearGradient2, { 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__ */ jsx16(Stop2, { offset, stopColor: color }, offset)) });
1660
+ const dot = (c) => /* @__PURE__ */ jsxs13(Fragment2, { children: [
1661
+ /* @__PURE__ */ jsx16(Circle, { cx: c.cx, cy: c.cy, r: c.r, fill: `url(#${id}b)` }),
1662
+ /* @__PURE__ */ jsx16(Circle, { cx: c.cx, cy: c.cy, r: c.inner, fill: KRIZAKA.highlight })
884
1663
  ] });
885
- return /* @__PURE__ */ jsxs8(View7, { style: { width: size, height: size }, ...markA11y(title), children: [
886
- /* @__PURE__ */ jsxs8(Svg2, { viewBox, style: layer, children: [
887
- /* @__PURE__ */ jsxs8(Defs2, { children: [
888
- /* @__PURE__ */ jsxs8(RadialGradient, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
889
- /* @__PURE__ */ jsx11(Stop2, { offset: "0%", stopColor: KRIZAKA.glow.color, stopOpacity: KRIZAKA.glow.opacity }),
890
- /* @__PURE__ */ jsx11(Stop2, { offset: "100%", stopColor: KRIZAKA.glow.color, stopOpacity: 0 })
1664
+ return /* @__PURE__ */ jsxs13(View12, { style: { width: size, height: size }, ...markA11y(title), children: [
1665
+ /* @__PURE__ */ jsxs13(Svg4, { viewBox, style: layer, children: [
1666
+ /* @__PURE__ */ jsxs13(Defs2, { children: [
1667
+ /* @__PURE__ */ jsxs13(RadialGradient, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
1668
+ /* @__PURE__ */ jsx16(Stop2, { offset: "0%", stopColor: KRIZAKA.glow.color, stopOpacity: KRIZAKA.glow.opacity }),
1669
+ /* @__PURE__ */ jsx16(Stop2, { offset: "100%", stopColor: KRIZAKA.glow.color, stopOpacity: 0 })
891
1670
  ] }),
892
- /* @__PURE__ */ jsxs8(LinearGradient2, { 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: [
893
- /* @__PURE__ */ jsx11(Stop2, { offset: "0%", stopColor: theme.textSecondary }),
894
- /* @__PURE__ */ jsx11(Stop2, { offset: "100%", stopColor: theme.textPrimary })
1671
+ /* @__PURE__ */ jsxs13(LinearGradient2, { 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: [
1672
+ /* @__PURE__ */ jsx16(Stop2, { offset: "0%", stopColor: theme.textSecondary }),
1673
+ /* @__PURE__ */ jsx16(Stop2, { offset: "100%", stopColor: theme.textPrimary })
895
1674
  ] }),
896
1675
  blue
897
1676
  ] }),
898
- size >= 48 ? /* @__PURE__ */ jsx11(Circle, { cx: 200, cy: 200, r: 190, fill: `url(#${id}g)` }) : null,
899
- /* @__PURE__ */ jsx11(Circle, { cx: 200, cy: 200, r: KRIZAKA.ring.r, stroke, strokeWidth: KRIZAKA.ring.width, opacity: 0.35, fill: "none" }),
900
- /* @__PURE__ */ jsx11(Group, { transform: `translate(${KRIZAKA.offset} ${KRIZAKA.offset})`, children: /* @__PURE__ */ jsx11(Path, { d: KRIZAKA.shield, stroke: `url(#${id}i)`, strokeWidth: KRIZAKA.stroke, strokeLinecap: "round", strokeLinejoin: "round", fill: "none" }) })
1677
+ size >= 48 ? /* @__PURE__ */ jsx16(Circle, { cx: 200, cy: 200, r: 190, fill: `url(#${id}g)` }) : null,
1678
+ /* @__PURE__ */ jsx16(Circle, { cx: 200, cy: 200, r: KRIZAKA.ring.r, stroke, strokeWidth: KRIZAKA.ring.width, opacity: 0.35, fill: "none" }),
1679
+ /* @__PURE__ */ jsx16(Group, { transform: `translate(${KRIZAKA.offset} ${KRIZAKA.offset})`, children: /* @__PURE__ */ jsx16(Path3, { d: KRIZAKA.shield, stroke: `url(#${id}i)`, strokeWidth: KRIZAKA.stroke, strokeLinecap: "round", strokeLinejoin: "round", fill: "none" }) })
901
1680
  ] }),
902
- /* @__PURE__ */ jsx11(Animated14.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsx11(Svg2, { viewBox, style: layer, children: /* @__PURE__ */ jsx11(Circle, { cx: 200, cy: 200, r: KRIZAKA.orbit.r, stroke, strokeWidth: KRIZAKA.orbit.width, strokeDasharray: KRIZAKA.orbit.dash, opacity: 0.6, fill: "none" }) }) }),
903
- /* @__PURE__ */ jsx11(Animated14.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs8(Svg2, { viewBox, style: layer, children: [
904
- /* @__PURE__ */ jsx11(Defs2, { children: blue }),
905
- /* @__PURE__ */ jsxs8(Group, { transform: `translate(${KRIZAKA.offset} ${KRIZAKA.offset})`, children: [
1681
+ /* @__PURE__ */ jsx16(Animated14.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsx16(Svg4, { viewBox, style: layer, children: /* @__PURE__ */ jsx16(Circle, { cx: 200, cy: 200, r: KRIZAKA.orbit.r, stroke, strokeWidth: KRIZAKA.orbit.width, strokeDasharray: KRIZAKA.orbit.dash, opacity: 0.6, fill: "none" }) }) }),
1682
+ /* @__PURE__ */ jsx16(Animated14.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs13(Svg4, { viewBox, style: layer, children: [
1683
+ /* @__PURE__ */ jsx16(Defs2, { children: blue }),
1684
+ /* @__PURE__ */ jsxs13(Group, { transform: `translate(${KRIZAKA.offset} ${KRIZAKA.offset})`, children: [
906
1685
  dot(KRIZAKA.node),
907
1686
  dot(KRIZAKA.core)
908
1687
  ] })
@@ -911,13 +1690,13 @@ function KrizakaMark({ size = 48, animated = true, title, neutral }) {
911
1690
  }
912
1691
 
913
1692
  // src/native/mascot-state.tsx
914
- import * as React9 from "react";
915
- import { AccessibilityInfo as AccessibilityInfo5, Animated as Animated7, Easing as Easing4, StyleSheet as StyleSheet10, View as View9 } from "react-native";
1693
+ import * as React14 from "react";
1694
+ import { AccessibilityInfo as AccessibilityInfo5, Animated as Animated7, Easing as Easing4, StyleSheet as StyleSheet15, View as View14 } from "react-native";
916
1695
 
917
1696
  // src/native/mascots.tsx
918
- import { useEffect as useEffect6, useState as useState8 } from "react";
919
- import { AccessibilityInfo as AccessibilityInfo4, Animated as Animated6, Easing as Easing3, View as View8 } from "react-native";
920
- import Svg3, { Circle as Circle2, Defs as Defs3, Ellipse, G, LinearGradient as LinearGradient3, Path as Path2, Rect as Rect2, Stop as Stop3 } from "react-native-svg";
1697
+ import { useEffect as useEffect7, useState as useState13 } from "react";
1698
+ import { AccessibilityInfo as AccessibilityInfo4, Animated as Animated6, Easing as Easing3, View as View13 } from "react-native";
1699
+ import Svg5, { Circle as Circle2, Defs as Defs3, Ellipse, G, LinearGradient as LinearGradient3, Path as Path4, Rect as Rect2, Stop as Stop3 } from "react-native-svg";
921
1700
 
922
1701
  // src/mascots/geometry.ts
923
1702
  var mirror = (d) => d.replace(/(-?\d+(?:\.\d+)?) (-?\d+(?:\.\d+)?)/g, (_, x, y) => `${120 - Number(x)} ${y}`);
@@ -1075,10 +1854,10 @@ var SHADE = "#000000";
1075
1854
  var PARCEL = ["#f59e0b", "#d97706", "#b45309"];
1076
1855
 
1077
1856
  // src/native/mascots.tsx
1078
- import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
1857
+ import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
1079
1858
  function useBob(animated) {
1080
- const [y] = useState8(() => new Animated6.Value(0));
1081
- useEffect6(() => {
1859
+ const [y] = useState13(() => new Animated6.Value(0));
1860
+ useEffect7(() => {
1082
1861
  if (!animated) return;
1083
1862
  let loop;
1084
1863
  let cancelled = false;
@@ -1109,56 +1888,56 @@ function Mascot({ bird = "owl", mood = "welcome", tone: tone2 = "brand", size =
1109
1888
  const look3 = mood === "thinking" ? 1.4 : 0;
1110
1889
  const rot = (deg, [x, y]) => `rotate(${deg} ${x} ${y})`;
1111
1890
  const [wl, wr] = g.wings;
1112
- return /* @__PURE__ */ jsx12(View8, { style: [{ width: size, height: size }, style], ...markA11y(title), children: /* @__PURE__ */ jsx12(Animated6.View, { style: { transform: [{ translateY: bob }] }, children: /* @__PURE__ */ jsxs9(Svg3, { width: size, height: size, viewBox: "0 0 120 120", children: [
1113
- /* @__PURE__ */ jsx12(Defs3, { children: /* @__PURE__ */ jsxs9(LinearGradient3, { id, x1: "0", y1: "0", x2: "0", y2: "1", children: [
1114
- /* @__PURE__ */ jsx12(Stop3, { offset: "0%", stopColor: p.from }),
1115
- /* @__PURE__ */ jsx12(Stop3, { offset: "100%", stopColor: p.to })
1891
+ return /* @__PURE__ */ jsx17(View13, { style: [{ width: size, height: size }, style], ...markA11y(title), children: /* @__PURE__ */ jsx17(Animated6.View, { style: { transform: [{ translateY: bob }] }, children: /* @__PURE__ */ jsxs14(Svg5, { width: size, height: size, viewBox: "0 0 120 120", children: [
1892
+ /* @__PURE__ */ jsx17(Defs3, { children: /* @__PURE__ */ jsxs14(LinearGradient3, { id, x1: "0", y1: "0", x2: "0", y2: "1", children: [
1893
+ /* @__PURE__ */ jsx17(Stop3, { offset: "0%", stopColor: p.from }),
1894
+ /* @__PURE__ */ jsx17(Stop3, { offset: "100%", stopColor: p.to })
1116
1895
  ] }) }),
1117
- /* @__PURE__ */ jsx12(Ellipse, { cx: g.shadow[0], cy: g.shadow[1], rx: g.shadow[2], ry: g.shadow[3], fill: SHADE, opacity: 0.14 }),
1118
- mood === "empty" && /* @__PURE__ */ jsx12(Path2, { d: MOOD_PARTS.tray, stroke: outline, strokeWidth: 1.6, strokeDasharray: "3 3", fill: "none" }),
1119
- g.legs.map((d) => /* @__PURE__ */ jsx12(Path2, { d, stroke: p.beak, strokeWidth: 2.6, strokeLinecap: "round", fill: "none" }, d)),
1120
- g.back?.map((d) => d.endsWith("Z") ? /* @__PURE__ */ jsx12(Path2, { d, fill: p.detail, ...line }, d) : /* @__PURE__ */ jsx12(Path2, { d, stroke: outline, strokeWidth: 1.4, fill: "none" }, d)),
1121
- g.parcel?.map((d, i) => /* @__PURE__ */ jsx12(Path2, { d, fill: PARCEL[i], ...line }, d)),
1122
- /* @__PURE__ */ jsx12(Path2, { d: g.body, fill: body, ...line }),
1123
- /* @__PURE__ */ jsx12(Path2, { d: g.belly, fill: LIGHT, opacity: 0.28 }),
1896
+ /* @__PURE__ */ jsx17(Ellipse, { cx: g.shadow[0], cy: g.shadow[1], rx: g.shadow[2], ry: g.shadow[3], fill: SHADE, opacity: 0.14 }),
1897
+ mood === "empty" && /* @__PURE__ */ jsx17(Path4, { d: MOOD_PARTS.tray, stroke: outline, strokeWidth: 1.6, strokeDasharray: "3 3", fill: "none" }),
1898
+ g.legs.map((d) => /* @__PURE__ */ jsx17(Path4, { d, stroke: p.beak, strokeWidth: 2.6, strokeLinecap: "round", fill: "none" }, d)),
1899
+ g.back?.map((d) => d.endsWith("Z") ? /* @__PURE__ */ jsx17(Path4, { d, fill: p.detail, ...line }, d) : /* @__PURE__ */ jsx17(Path4, { d, stroke: outline, strokeWidth: 1.4, fill: "none" }, d)),
1900
+ g.parcel?.map((d, i) => /* @__PURE__ */ jsx17(Path4, { d, fill: PARCEL[i], ...line }, d)),
1901
+ /* @__PURE__ */ jsx17(Path4, { d: g.body, fill: body, ...line }),
1902
+ /* @__PURE__ */ jsx17(Path4, { d: g.belly, fill: LIGHT, opacity: 0.28 }),
1124
1903
  [wl, wr].map((w, i) => {
1125
1904
  const turn = mood === "success" ? i === 0 ? 28 : -28 : mood === "welcome" && i === 1 ? -20 : 0;
1126
- return /* @__PURE__ */ jsxs9(G, { transform: turn ? rot(turn, w.pivot) : void 0, children: [
1127
- /* @__PURE__ */ jsx12(Path2, { d: w.d, fill: p.wing, ...line }),
1128
- /* @__PURE__ */ jsx12(Path2, { d: w.d, fill: SHADE, opacity: 0.16 })
1905
+ return /* @__PURE__ */ jsxs14(G, { transform: turn ? rot(turn, w.pivot) : void 0, children: [
1906
+ /* @__PURE__ */ jsx17(Path4, { d: w.d, fill: p.wing, ...line }),
1907
+ /* @__PURE__ */ jsx17(Path4, { d: w.d, fill: SHADE, opacity: 0.16 })
1129
1908
  ] }, i);
1130
1909
  }),
1131
- g.neck && /* @__PURE__ */ jsx12(Path2, { d: g.neck.d, stroke: body, strokeWidth: g.neck.width, strokeLinecap: "round", fill: "none" }),
1132
- g.head.r > 0 && /* @__PURE__ */ jsx12(Circle2, { cx: g.head.cx, cy: g.head.cy, r: g.head.r, fill: body, ...line }),
1133
- g.details.map((d) => /* @__PURE__ */ jsx12(Path2, { d, fill: p.detail, ...line }, d)),
1134
- g.visor && /* @__PURE__ */ jsx12(Rect2, { x: g.visor.x, y: g.visor.y, width: g.visor.w, height: g.visor.h, rx: 4, fill: theme.surface0, ...line }),
1910
+ g.neck && /* @__PURE__ */ jsx17(Path4, { d: g.neck.d, stroke: body, strokeWidth: g.neck.width, strokeLinecap: "round", fill: "none" }),
1911
+ g.head.r > 0 && /* @__PURE__ */ jsx17(Circle2, { cx: g.head.cx, cy: g.head.cy, r: g.head.r, fill: body, ...line }),
1912
+ g.details.map((d) => /* @__PURE__ */ jsx17(Path4, { d, fill: p.detail, ...line }, d)),
1913
+ g.visor && /* @__PURE__ */ jsx17(Rect2, { x: g.visor.x, y: g.visor.y, width: g.visor.w, height: g.visor.h, rx: 4, fill: theme.surface0, ...line }),
1135
1914
  g.eyes.at.map(
1136
- (at, i) => mood === "empty" && g.eyes.white > 0 ? /* @__PURE__ */ jsxs9(G, { children: [
1137
- /* @__PURE__ */ jsx12(Circle2, { cx: at[0], cy: at[1], r: g.eyes.white, fill: LIGHT, ...line }),
1138
- /* @__PURE__ */ jsx12(Circle2, { cx: at[0], cy: at[1] + g.eyes.pupil * 0.7, r: g.eyes.pupil, fill: SHADE }),
1139
- /* @__PURE__ */ jsx12(Path2, { d: upperLid(at, g.eyes.white), fill: p.detail, ...line })
1140
- ] }, i) : mood === "success" || mood === "empty" ? /* @__PURE__ */ jsx12(Path2, { d: mood === "success" ? archEye(at, eyeR * 0.85) : lidEye(at, eyeR * 0.8), stroke: g.visor ? p.eye : outline, strokeWidth: 2.2, strokeLinecap: "round", fill: "none" }, i) : /* @__PURE__ */ jsxs9(G, { children: [
1141
- g.eyes.white > 0 && /* @__PURE__ */ jsx12(Circle2, { cx: at[0], cy: at[1], r: g.eyes.white, fill: LIGHT, ...line }),
1142
- /* @__PURE__ */ jsx12(Circle2, { cx: at[0] + look3, cy: at[1] - look3, r: g.eyes.pupil, fill: g.visor ? p.eye : SHADE })
1915
+ (at, i) => mood === "empty" && g.eyes.white > 0 ? /* @__PURE__ */ jsxs14(G, { children: [
1916
+ /* @__PURE__ */ jsx17(Circle2, { cx: at[0], cy: at[1], r: g.eyes.white, fill: LIGHT, ...line }),
1917
+ /* @__PURE__ */ jsx17(Circle2, { cx: at[0], cy: at[1] + g.eyes.pupil * 0.7, r: g.eyes.pupil, fill: SHADE }),
1918
+ /* @__PURE__ */ jsx17(Path4, { d: upperLid(at, g.eyes.white), fill: p.detail, ...line })
1919
+ ] }, i) : mood === "success" || mood === "empty" ? /* @__PURE__ */ jsx17(Path4, { d: mood === "success" ? archEye(at, eyeR * 0.85) : lidEye(at, eyeR * 0.8), stroke: g.visor ? p.eye : outline, strokeWidth: 2.2, strokeLinecap: "round", fill: "none" }, i) : /* @__PURE__ */ jsxs14(G, { children: [
1920
+ g.eyes.white > 0 && /* @__PURE__ */ jsx17(Circle2, { cx: at[0], cy: at[1], r: g.eyes.white, fill: LIGHT, ...line }),
1921
+ /* @__PURE__ */ jsx17(Circle2, { cx: at[0] + look3, cy: at[1] - look3, r: g.eyes.pupil, fill: g.visor ? p.eye : SHADE })
1143
1922
  ] }, i)
1144
1923
  ),
1145
- g.glasses && g.eyes.at.map(([x, y]) => /* @__PURE__ */ jsx12(Circle2, { cx: x, cy: y, r: 6.5, fill: "none", stroke: outline, strokeWidth: 1.3 }, x)),
1146
- mood === "error" && g.eyes.at.map((at, i) => /* @__PURE__ */ jsx12(Path2, { d: brow(at, eyeR, g.eyes.at.length === 1 ? 1 : i === 0 ? -1 : 1), stroke: outline, strokeWidth: 2, strokeLinecap: "round" }, i)),
1147
- /* @__PURE__ */ jsx12(Path2, { d: g.beak, fill: p.beak, ...line }),
1148
- mood === "thinking" && MOOD_PARTS.dots.map(([cx, cy, r], i) => /* @__PURE__ */ jsx12(Circle2, { cx, cy, r, fill: theme.textSecondary, opacity: 0.5 + i * 0.25 }, cx)),
1149
- (mood === "success" || mood === "error") && /* @__PURE__ */ jsx12(Circle2, { cx: MOOD_PARTS.badge.cx, cy: MOOD_PARTS.badge.cy, r: MOOD_PARTS.badge.r, fill: mood === "success" ? theme.success : theme.danger }),
1150
- mood === "success" && /* @__PURE__ */ jsx12(Path2, { d: MOOD_PARTS.check, stroke: theme.surface0, strokeWidth: 2.6, strokeLinecap: "round", strokeLinejoin: "round", fill: "none" }),
1151
- mood === "error" && /* @__PURE__ */ jsx12(Path2, { d: MOOD_PARTS.bang.line, stroke: theme.surface0, strokeWidth: 2.8, strokeLinecap: "round" }),
1152
- mood === "error" && /* @__PURE__ */ jsx12(Circle2, { cx: MOOD_PARTS.bang.dot[0], cy: MOOD_PARTS.bang.dot[1], r: 1.6, fill: theme.surface0 })
1924
+ g.glasses && g.eyes.at.map(([x, y]) => /* @__PURE__ */ jsx17(Circle2, { cx: x, cy: y, r: 6.5, fill: "none", stroke: outline, strokeWidth: 1.3 }, x)),
1925
+ mood === "error" && g.eyes.at.map((at, i) => /* @__PURE__ */ jsx17(Path4, { d: brow(at, eyeR, g.eyes.at.length === 1 ? 1 : i === 0 ? -1 : 1), stroke: outline, strokeWidth: 2, strokeLinecap: "round" }, i)),
1926
+ /* @__PURE__ */ jsx17(Path4, { d: g.beak, fill: p.beak, ...line }),
1927
+ mood === "thinking" && MOOD_PARTS.dots.map(([cx, cy, r], i) => /* @__PURE__ */ jsx17(Circle2, { cx, cy, r, fill: theme.textSecondary, opacity: 0.5 + i * 0.25 }, cx)),
1928
+ (mood === "success" || mood === "error") && /* @__PURE__ */ jsx17(Circle2, { cx: MOOD_PARTS.badge.cx, cy: MOOD_PARTS.badge.cy, r: MOOD_PARTS.badge.r, fill: mood === "success" ? theme.success : theme.danger }),
1929
+ mood === "success" && /* @__PURE__ */ jsx17(Path4, { d: MOOD_PARTS.check, stroke: theme.surface0, strokeWidth: 2.6, strokeLinecap: "round", strokeLinejoin: "round", fill: "none" }),
1930
+ mood === "error" && /* @__PURE__ */ jsx17(Path4, { d: MOOD_PARTS.bang.line, stroke: theme.surface0, strokeWidth: 2.8, strokeLinecap: "round" }),
1931
+ mood === "error" && /* @__PURE__ */ jsx17(Circle2, { cx: MOOD_PARTS.bang.dot[0], cy: MOOD_PARTS.bang.dot[1], r: 1.6, fill: theme.surface0 })
1153
1932
  ] }) }) });
1154
1933
  }
1155
1934
 
1156
1935
  // src/native/mascot-state.tsx
1157
- import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
1936
+ import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
1158
1937
  var SIZE = { sm: 64, md: 96, lg: 128 };
1159
1938
  function useArrival(animated) {
1160
- const [value] = React9.useState(() => new Animated7.Value(animated ? 0 : 1));
1161
- React9.useEffect(() => {
1939
+ const [value] = React14.useState(() => new Animated7.Value(animated ? 0 : 1));
1940
+ React14.useEffect(() => {
1162
1941
  if (!animated) return;
1163
1942
  let cancelled = false;
1164
1943
  void AccessibilityInfo5.isReduceMotionEnabled().then((reduce) => {
@@ -1175,30 +1954,30 @@ function useArrival(animated) {
1175
1954
  function MascotState({ bird = "owl", mood = "empty", title, description, action, size = "md", layout = "stacked", tone: tone2, animated = true, style, ...props }) {
1176
1955
  const opacity = useArrival(animated);
1177
1956
  const inline = layout === "inline";
1178
- return /* @__PURE__ */ jsxs10(
1957
+ return /* @__PURE__ */ jsxs15(
1179
1958
  Animated7.View,
1180
1959
  {
1181
1960
  role: mood === "error" ? "alert" : "status",
1182
1961
  accessibilityLiveRegion: mood === "error" ? "assertive" : "polite",
1183
1962
  "aria-busy": mood === "thinking" ? true : void 0,
1184
1963
  ...props,
1185
- style: [inline ? styles10.inline : styles10.stacked, { opacity, transform: [{ translateY: opacity.interpolate({ inputRange: [0, 1], outputRange: [6, 0] }) }] }, style],
1964
+ style: [inline ? styles15.inline : styles15.stacked, { opacity, transform: [{ translateY: opacity.interpolate({ inputRange: [0, 1], outputRange: [6, 0] }) }] }, style],
1186
1965
  children: [
1187
- /* @__PURE__ */ jsx13(Mascot, { bird, mood, tone: tone2, size: SIZE[size], animated }),
1188
- /* @__PURE__ */ jsxs10(View9, { style: inline ? styles10.wordsInline : styles10.words, children: [
1189
- /* @__PURE__ */ jsx13(Txt, { variant: "label", role: "heading", style: inline ? null : styles10.center, children: title }),
1190
- description ? /* @__PURE__ */ jsx13(Txt, { tone: "secondary", style: inline ? null : styles10.center, children: description }) : null,
1191
- action ? /* @__PURE__ */ jsx13(View9, { style: [styles10.action, inline ? null : styles10.actionCentred], children: action }) : null
1966
+ /* @__PURE__ */ jsx18(Mascot, { bird, mood, tone: tone2, size: SIZE[size], animated }),
1967
+ /* @__PURE__ */ jsxs15(View14, { style: inline ? styles15.wordsInline : styles15.words, children: [
1968
+ /* @__PURE__ */ jsx18(Txt, { variant: "label", role: "heading", style: inline ? null : styles15.center, children: title }),
1969
+ description ? /* @__PURE__ */ jsx18(Txt, { tone: "secondary", style: inline ? null : styles15.center, children: description }) : null,
1970
+ action ? /* @__PURE__ */ jsx18(View14, { style: [styles15.action, inline ? null : styles15.actionCentred], children: action }) : null
1192
1971
  ] })
1193
1972
  ]
1194
1973
  }
1195
1974
  );
1196
1975
  }
1197
- var ErrorState = (props) => /* @__PURE__ */ jsx13(MascotState, { mood: "error", ...props });
1198
- var SuccessState = (props) => /* @__PURE__ */ jsx13(MascotState, { mood: "success", ...props });
1199
- var LoadingState = (props) => /* @__PURE__ */ jsx13(MascotState, { mood: "thinking", ...props });
1200
- var WelcomeState = (props) => /* @__PURE__ */ jsx13(MascotState, { mood: "welcome", ...props });
1201
- var styles10 = StyleSheet10.create({
1976
+ var ErrorState = (props) => /* @__PURE__ */ jsx18(MascotState, { mood: "error", ...props });
1977
+ var SuccessState = (props) => /* @__PURE__ */ jsx18(MascotState, { mood: "success", ...props });
1978
+ var LoadingState = (props) => /* @__PURE__ */ jsx18(MascotState, { mood: "thinking", ...props });
1979
+ var WelcomeState = (props) => /* @__PURE__ */ jsx18(MascotState, { mood: "welcome", ...props });
1980
+ var styles15 = StyleSheet15.create({
1202
1981
  stacked: { alignItems: "center", justifyContent: "center", gap: 12, paddingVertical: 40, paddingHorizontal: 24 },
1203
1982
  inline: { flexDirection: "row", alignItems: "center", gap: 16 },
1204
1983
  words: { alignItems: "center", gap: 6 },
@@ -1209,8 +1988,8 @@ var styles10 = StyleSheet10.create({
1209
1988
  });
1210
1989
 
1211
1990
  // src/native/OrazakaMark.tsx
1212
- import { View as View10 } from "react-native";
1213
- import Svg4, { Circle as Circle3, Defs as Defs4, LinearGradient as LinearGradient4, Path as Path3, RadialGradient as RadialGradient2, Stop as Stop4 } from "react-native-svg";
1991
+ import { View as View15 } from "react-native";
1992
+ import Svg6, { Circle as Circle3, Defs as Defs4, LinearGradient as LinearGradient4, Path as Path5, RadialGradient as RadialGradient2, Stop as Stop4 } from "react-native-svg";
1214
1993
 
1215
1994
  // src/marks/orazaka-geometry.ts
1216
1995
  var orange = marks.orazaka[marks.orazaka.length - 1][1];
@@ -1239,41 +2018,41 @@ var ORAZAKA = {
1239
2018
  };
1240
2019
 
1241
2020
  // src/native/OrazakaMark.tsx
1242
- import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
2021
+ import { jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
1243
2022
  function OrazakaMark({ size = 48, animated = true, title, neutral }) {
1244
2023
  const { theme } = useTheme();
1245
2024
  const { Animated: Animated14, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated);
1246
2025
  const id = useSvgId("ozm");
1247
2026
  const viewBox = size < 48 ? ORAZAKA.croppedViewBox : ORAZAKA.viewBox;
1248
2027
  const stroke = neutral ?? theme.textMuted;
1249
- const gradient = /* @__PURE__ */ jsx14(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__ */ jsx14(Stop4, { offset, stopColor: color }, offset)) });
2028
+ const gradient = /* @__PURE__ */ jsx19(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__ */ jsx19(Stop4, { offset, stopColor: color }, offset)) });
1250
2029
  const fill = `url(#${id}a)`;
1251
- return /* @__PURE__ */ jsxs11(View10, { style: { width: size, height: size }, ...markA11y(title), children: [
1252
- /* @__PURE__ */ jsxs11(Svg4, { viewBox, style: layer, children: [
1253
- /* @__PURE__ */ jsx14(Defs4, { children: /* @__PURE__ */ jsxs11(RadialGradient2, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
1254
- /* @__PURE__ */ jsx14(Stop4, { offset: "0%", stopColor: ORAZAKA.glow.color, stopOpacity: ORAZAKA.glow.opacity }),
1255
- /* @__PURE__ */ jsx14(Stop4, { offset: "100%", stopColor: ORAZAKA.glow.color, stopOpacity: 0 })
2030
+ return /* @__PURE__ */ jsxs16(View15, { style: { width: size, height: size }, ...markA11y(title), children: [
2031
+ /* @__PURE__ */ jsxs16(Svg6, { viewBox, style: layer, children: [
2032
+ /* @__PURE__ */ jsx19(Defs4, { children: /* @__PURE__ */ jsxs16(RadialGradient2, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
2033
+ /* @__PURE__ */ jsx19(Stop4, { offset: "0%", stopColor: ORAZAKA.glow.color, stopOpacity: ORAZAKA.glow.opacity }),
2034
+ /* @__PURE__ */ jsx19(Stop4, { offset: "100%", stopColor: ORAZAKA.glow.color, stopOpacity: 0 })
1256
2035
  ] }) }),
1257
- size >= 48 ? /* @__PURE__ */ jsx14(Circle3, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: 190, fill: `url(#${id}g)` }) : null,
1258
- /* @__PURE__ */ jsx14(Circle3, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.orbit.r, stroke, strokeWidth: ORAZAKA.orbit.width, strokeDasharray: ORAZAKA.orbit.dash, opacity: 0.6, fill: "none" }),
1259
- /* @__PURE__ */ jsx14(Circle3, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.ring.r, stroke, strokeWidth: ORAZAKA.ring.width, opacity: 0.35, fill: "none" })
2036
+ size >= 48 ? /* @__PURE__ */ jsx19(Circle3, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: 190, fill: `url(#${id}g)` }) : null,
2037
+ /* @__PURE__ */ jsx19(Circle3, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.orbit.r, stroke, strokeWidth: ORAZAKA.orbit.width, strokeDasharray: ORAZAKA.orbit.dash, opacity: 0.6, fill: "none" }),
2038
+ /* @__PURE__ */ jsx19(Circle3, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.ring.r, stroke, strokeWidth: ORAZAKA.ring.width, opacity: 0.35, fill: "none" })
1260
2039
  ] }),
1261
- /* @__PURE__ */ jsx14(Animated14.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs11(Svg4, { viewBox, style: layer, children: [
1262
- /* @__PURE__ */ jsx14(Defs4, { children: gradient }),
1263
- ORAZAKA.shards.map((d) => /* @__PURE__ */ jsx14(Path3, { d, fill, stroke: fill, strokeWidth: ORAZAKA.shardStroke, strokeLinejoin: "round" }, d))
2040
+ /* @__PURE__ */ jsx19(Animated14.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs16(Svg6, { viewBox, style: layer, children: [
2041
+ /* @__PURE__ */ jsx19(Defs4, { children: gradient }),
2042
+ ORAZAKA.shards.map((d) => /* @__PURE__ */ jsx19(Path5, { d, fill, stroke: fill, strokeWidth: ORAZAKA.shardStroke, strokeLinejoin: "round" }, d))
1264
2043
  ] }) }),
1265
- /* @__PURE__ */ jsx14(Animated14.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs11(Svg4, { viewBox, style: layer, children: [
1266
- /* @__PURE__ */ jsx14(Defs4, { children: gradient }),
1267
- /* @__PURE__ */ jsx14(Circle3, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.core.r, fill }),
1268
- /* @__PURE__ */ jsx14(Circle3, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.core.inner, fill: ORAZAKA.highlight })
2044
+ /* @__PURE__ */ jsx19(Animated14.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs16(Svg6, { viewBox, style: layer, children: [
2045
+ /* @__PURE__ */ jsx19(Defs4, { children: gradient }),
2046
+ /* @__PURE__ */ jsx19(Circle3, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.core.r, fill }),
2047
+ /* @__PURE__ */ jsx19(Circle3, { cx: ORAZAKA.center, cy: ORAZAKA.center, r: ORAZAKA.core.inner, fill: ORAZAKA.highlight })
1269
2048
  ] }) })
1270
2049
  ] });
1271
2050
  }
1272
2051
 
1273
2052
  // src/native/OrochiaMark.tsx
1274
- import { useEffect as useEffect8, useState as useState10 } from "react";
1275
- import { AccessibilityInfo as AccessibilityInfo6, Animated as Animated8, Easing as Easing5, View as View11 } from "react-native";
1276
- import Svg5, { Circle as Circle4, Defs as Defs5, Ellipse as Ellipse2, G as Group2, LinearGradient as LinearGradient5, Path as Path4, RadialGradient as RadialGradient3, Stop as Stop5 } from "react-native-svg";
2053
+ import { useEffect as useEffect9, useState as useState15 } from "react";
2054
+ import { AccessibilityInfo as AccessibilityInfo6, Animated as Animated8, Easing as Easing5, View as View16 } from "react-native";
2055
+ import Svg7, { Circle as Circle4, Defs as Defs5, Ellipse as Ellipse2, G as Group2, LinearGradient as LinearGradient5, Path as Path6, RadialGradient as RadialGradient3, Stop as Stop5 } from "react-native-svg";
1277
2056
 
1278
2057
  // src/marks/orochia-geometry.ts
1279
2058
  var OROCHIA = {
@@ -1300,14 +2079,14 @@ var OROCHIA = {
1300
2079
  };
1301
2080
 
1302
2081
  // src/native/OrochiaMark.tsx
1303
- import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
2082
+ import { jsx as jsx20, jsxs as jsxs17 } from "react/jsx-runtime";
1304
2083
  var CENTER = OROCHIA.offset + 180;
1305
2084
  function OrochiaMark({ size = 48, animated = true, title, neutral: neutralProp }) {
1306
2085
  const { theme } = useTheme();
1307
2086
  const neutral = neutralProp ?? theme.textMuted;
1308
- const [spin] = useState10(() => new Animated8.Value(0));
1309
- const [pulse] = useState10(() => new Animated8.Value(0));
1310
- useEffect8(() => {
2087
+ const [spin] = useState15(() => new Animated8.Value(0));
2088
+ const [pulse] = useState15(() => new Animated8.Value(0));
2089
+ useEffect9(() => {
1311
2090
  if (!animated) return;
1312
2091
  let loops = [];
1313
2092
  let cancelled = false;
@@ -1332,44 +2111,44 @@ function OrochiaMark({ size = 48, animated = true, title, neutral: neutralProp }
1332
2111
  const viewBox = size < 48 ? OROCHIA.croppedViewBox : OROCHIA.viewBox;
1333
2112
  const layer = { position: "absolute", width: size, height: size };
1334
2113
  const a11y = title ? { accessible: true, accessibilityRole: "image", accessibilityLabel: title } : { accessibilityElementsHidden: true, importantForAccessibility: "no-hide-descendants" };
1335
- const bodyGradient = /* @__PURE__ */ jsx15(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__ */ jsx15(Stop5, { offset, stopColor: color }, offset)) });
1336
- return /* @__PURE__ */ jsxs12(View11, { style: { width: size, height: size }, ...a11y, children: [
1337
- /* @__PURE__ */ jsxs12(Svg5, { viewBox, style: layer, children: [
1338
- /* @__PURE__ */ jsx15(Defs5, { children: /* @__PURE__ */ jsxs12(RadialGradient3, { id: "glow", cx: "50%", cy: "50%", r: "50%", children: [
1339
- /* @__PURE__ */ jsx15(Stop5, { offset: "0%", stopColor: OROCHIA.glow.color, stopOpacity: OROCHIA.glow.opacity }),
1340
- /* @__PURE__ */ jsx15(Stop5, { offset: "100%", stopColor: OROCHIA.glow.color, stopOpacity: 0 })
2114
+ const bodyGradient = /* @__PURE__ */ jsx20(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__ */ jsx20(Stop5, { offset, stopColor: color }, offset)) });
2115
+ return /* @__PURE__ */ jsxs17(View16, { style: { width: size, height: size }, ...a11y, children: [
2116
+ /* @__PURE__ */ jsxs17(Svg7, { viewBox, style: layer, children: [
2117
+ /* @__PURE__ */ jsx20(Defs5, { children: /* @__PURE__ */ jsxs17(RadialGradient3, { id: "glow", cx: "50%", cy: "50%", r: "50%", children: [
2118
+ /* @__PURE__ */ jsx20(Stop5, { offset: "0%", stopColor: OROCHIA.glow.color, stopOpacity: OROCHIA.glow.opacity }),
2119
+ /* @__PURE__ */ jsx20(Stop5, { offset: "100%", stopColor: OROCHIA.glow.color, stopOpacity: 0 })
1341
2120
  ] }) }),
1342
- /* @__PURE__ */ jsx15(Circle4, { cx: CENTER, cy: CENTER, r: 170, fill: "url(#glow)" }),
1343
- /* @__PURE__ */ jsx15(Circle4, { cx: CENTER, cy: CENTER, r: OROCHIA.ring.r, stroke: neutral, strokeWidth: OROCHIA.ring.width, opacity: 0.35, fill: "none" })
2121
+ /* @__PURE__ */ jsx20(Circle4, { cx: CENTER, cy: CENTER, r: 170, fill: "url(#glow)" }),
2122
+ /* @__PURE__ */ jsx20(Circle4, { cx: CENTER, cy: CENTER, r: OROCHIA.ring.r, stroke: neutral, strokeWidth: OROCHIA.ring.width, opacity: 0.35, fill: "none" })
1344
2123
  ] }),
1345
- /* @__PURE__ */ jsx15(Animated8.View, { style: [layer, { transform: [{ rotate: spin.interpolate({ inputRange: [0, 1], outputRange: ["0deg", "360deg"] }) }] }], children: /* @__PURE__ */ jsx15(Svg5, { viewBox, style: layer, children: /* @__PURE__ */ jsx15(Circle4, { cx: CENTER, cy: CENTER, r: OROCHIA.orbit.r, stroke: neutral, strokeWidth: OROCHIA.orbit.width, strokeDasharray: OROCHIA.orbit.dash, opacity: 0.6, fill: "none" }) }) }),
1346
- /* @__PURE__ */ jsxs12(Svg5, { viewBox, style: layer, children: [
1347
- /* @__PURE__ */ jsx15(Defs5, { children: bodyGradient }),
1348
- /* @__PURE__ */ jsxs12(Group2, { transform: `translate(${OROCHIA.offset} ${OROCHIA.offset})`, children: [
1349
- /* @__PURE__ */ jsx15(Path4, { d: OROCHIA.arc, stroke: "url(#body)", strokeWidth: 22, strokeLinecap: "round", fill: "none" }),
1350
- /* @__PURE__ */ jsx15(Path4, { d: OROCHIA.arc, stroke: OROCHIA.scales.color, strokeOpacity: OROCHIA.scales.opacity, strokeWidth: OROCHIA.scales.width, strokeLinecap: "round", strokeDasharray: OROCHIA.scales.dash, fill: "none" }),
1351
- /* @__PURE__ */ jsx15(Path4, { d: OROCHIA.neck, stroke: "url(#body)", strokeWidth: 14, strokeLinecap: "round", fill: "none" }),
1352
- /* @__PURE__ */ jsx15(Path4, { d: OROCHIA.tail, stroke: "url(#body)", strokeWidth: 6, strokeLinecap: "round", fill: "none" }),
1353
- /* @__PURE__ */ jsx15(Ellipse2, { cx: OROCHIA.head.cx, cy: OROCHIA.head.cy, rx: OROCHIA.head.rx, ry: OROCHIA.head.ry, rotation: OROCHIA.head.rotate, origin: `${OROCHIA.head.cx}, ${OROCHIA.head.cy}`, fill: "url(#body)" }),
1354
- /* @__PURE__ */ jsx15(Path4, { d: OROCHIA.tongue.d, stroke: OROCHIA.tongue.color, strokeWidth: 3, strokeLinecap: "round", fill: "none" })
2124
+ /* @__PURE__ */ jsx20(Animated8.View, { style: [layer, { transform: [{ rotate: spin.interpolate({ inputRange: [0, 1], outputRange: ["0deg", "360deg"] }) }] }], children: /* @__PURE__ */ jsx20(Svg7, { viewBox, style: layer, children: /* @__PURE__ */ jsx20(Circle4, { cx: CENTER, cy: CENTER, r: OROCHIA.orbit.r, stroke: neutral, strokeWidth: OROCHIA.orbit.width, strokeDasharray: OROCHIA.orbit.dash, opacity: 0.6, fill: "none" }) }) }),
2125
+ /* @__PURE__ */ jsxs17(Svg7, { viewBox, style: layer, children: [
2126
+ /* @__PURE__ */ jsx20(Defs5, { children: bodyGradient }),
2127
+ /* @__PURE__ */ jsxs17(Group2, { transform: `translate(${OROCHIA.offset} ${OROCHIA.offset})`, children: [
2128
+ /* @__PURE__ */ jsx20(Path6, { d: OROCHIA.arc, stroke: "url(#body)", strokeWidth: 22, strokeLinecap: "round", fill: "none" }),
2129
+ /* @__PURE__ */ jsx20(Path6, { d: OROCHIA.arc, stroke: OROCHIA.scales.color, strokeOpacity: OROCHIA.scales.opacity, strokeWidth: OROCHIA.scales.width, strokeLinecap: "round", strokeDasharray: OROCHIA.scales.dash, fill: "none" }),
2130
+ /* @__PURE__ */ jsx20(Path6, { d: OROCHIA.neck, stroke: "url(#body)", strokeWidth: 14, strokeLinecap: "round", fill: "none" }),
2131
+ /* @__PURE__ */ jsx20(Path6, { d: OROCHIA.tail, stroke: "url(#body)", strokeWidth: 6, strokeLinecap: "round", fill: "none" }),
2132
+ /* @__PURE__ */ jsx20(Ellipse2, { cx: OROCHIA.head.cx, cy: OROCHIA.head.cy, rx: OROCHIA.head.rx, ry: OROCHIA.head.ry, rotation: OROCHIA.head.rotate, origin: `${OROCHIA.head.cx}, ${OROCHIA.head.cy}`, fill: "url(#body)" }),
2133
+ /* @__PURE__ */ jsx20(Path6, { d: OROCHIA.tongue.d, stroke: OROCHIA.tongue.color, strokeWidth: 3, strokeLinecap: "round", fill: "none" })
1355
2134
  ] })
1356
2135
  ] }),
1357
- /* @__PURE__ */ jsx15(Animated8.View, { style: [layer, { opacity: pulse.interpolate({ inputRange: [0, 1], outputRange: [0.85, 1] }) }], children: /* @__PURE__ */ jsxs12(Svg5, { viewBox, style: layer, children: [
1358
- /* @__PURE__ */ jsx15(Defs5, { children: /* @__PURE__ */ jsx15(LinearGradient5, { id: "flame", x1: "50%", y1: "100%", x2: "50%", y2: "0%", children: OROCHIA.flameGradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx15(Stop5, { offset, stopColor: color }, offset)) }) }),
1359
- /* @__PURE__ */ jsxs12(Group2, { transform: `translate(${OROCHIA.offset} ${OROCHIA.offset})`, children: [
1360
- /* @__PURE__ */ jsx15(Circle4, { cx: OROCHIA.eye.cx, cy: OROCHIA.eye.cy, r: OROCHIA.eye.r, fill: OROCHIA.eye.color }),
1361
- /* @__PURE__ */ jsx15(Path4, { d: OROCHIA.flame.d, transform: `translate(${OROCHIA.flame.translate[0]} ${OROCHIA.flame.translate[1]}) scale(${OROCHIA.flame.scale})`, fill: "url(#flame)" })
2136
+ /* @__PURE__ */ jsx20(Animated8.View, { style: [layer, { opacity: pulse.interpolate({ inputRange: [0, 1], outputRange: [0.85, 1] }) }], children: /* @__PURE__ */ jsxs17(Svg7, { viewBox, style: layer, children: [
2137
+ /* @__PURE__ */ jsx20(Defs5, { children: /* @__PURE__ */ jsx20(LinearGradient5, { id: "flame", x1: "50%", y1: "100%", x2: "50%", y2: "0%", children: OROCHIA.flameGradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx20(Stop5, { offset, stopColor: color }, offset)) }) }),
2138
+ /* @__PURE__ */ jsxs17(Group2, { transform: `translate(${OROCHIA.offset} ${OROCHIA.offset})`, children: [
2139
+ /* @__PURE__ */ jsx20(Circle4, { cx: OROCHIA.eye.cx, cy: OROCHIA.eye.cy, r: OROCHIA.eye.r, fill: OROCHIA.eye.color }),
2140
+ /* @__PURE__ */ jsx20(Path6, { d: OROCHIA.flame.d, transform: `translate(${OROCHIA.flame.translate[0]} ${OROCHIA.flame.translate[1]}) scale(${OROCHIA.flame.scale})`, fill: "url(#flame)" })
1362
2141
  ] })
1363
2142
  ] }) })
1364
2143
  ] });
1365
2144
  }
1366
2145
 
1367
2146
  // src/native/pagination.tsx
1368
- import { Pressable as Pressable4, StyleSheet as StyleSheet11, Text as Text6, View as View12 } from "react-native";
1369
- import Svg6, { Path as Path5 } from "react-native-svg";
1370
- import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
1371
- function Chevron({ direction, color }) {
1372
- return /* @__PURE__ */ jsx16(Svg6, { 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__ */ jsx16(Path5, { d: direction === "left" ? "m15 6-6 6 6 6" : "m9 6 6 6-6 6" }) });
2147
+ import { Pressable as Pressable7, StyleSheet as StyleSheet16, Text as Text11, View as View17 } from "react-native";
2148
+ import Svg8, { Path as Path7 } from "react-native-svg";
2149
+ import { jsx as jsx21, jsxs as jsxs18 } from "react/jsx-runtime";
2150
+ function Chevron2({ direction, color }) {
2151
+ return /* @__PURE__ */ jsx21(Svg8, { 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__ */ jsx21(Path7, { d: direction === "left" ? "m15 6-6 6 6 6" : "m9 6 6 6-6 6" }) });
1373
2152
  }
1374
2153
  function Pagination({ page = 1, pageCount, onPageChange, hasPrevious, hasNext, onPrevious, onNext, status, disabled, labels, style }) {
1375
2154
  const { theme, radius: radius3 } = useTheme();
@@ -1378,8 +2157,8 @@ function Pagination({ page = 1, pageCount, onPageChange, hasPrevious, hasNext, o
1378
2157
  const current = Math.min(Math.max(1, page), count);
1379
2158
  const canPrevious = !disabled && (paged ? current > 1 : Boolean(hasPrevious));
1380
2159
  const canNext = !disabled && (paged ? current < count : Boolean(hasNext));
1381
- const button = (direction, enabled, onPress, label) => /* @__PURE__ */ jsx16(
1382
- Pressable4,
2160
+ const button = (direction, enabled, onPress, label) => /* @__PURE__ */ jsx21(
2161
+ Pressable7,
1383
2162
  {
1384
2163
  role: "button",
1385
2164
  "aria-label": label,
@@ -1388,29 +2167,29 @@ function Pagination({ page = 1, pageCount, onPageChange, hasPrevious, hasNext, o
1388
2167
  hitSlop: 6,
1389
2168
  onPress,
1390
2169
  style: ({ pressed }) => [
1391
- styles11.button,
2170
+ styles16.button,
1392
2171
  { borderRadius: radius3.sm, borderColor: theme.borderDefault, backgroundColor: theme.surface1, opacity: enabled ? pressed ? 0.8 : 1 : 0.4 }
1393
2172
  ],
1394
- children: /* @__PURE__ */ jsx16(Chevron, { direction, color: theme.textPrimary })
2173
+ children: /* @__PURE__ */ jsx21(Chevron2, { direction, color: theme.textPrimary })
1395
2174
  }
1396
2175
  );
1397
2176
  const text = status ?? (paged ? labels.compact(current, count) : null);
1398
- return /* @__PURE__ */ jsxs13(View12, { role: "navigation", style: [styles11.row, style], children: [
2177
+ return /* @__PURE__ */ jsxs18(View17, { role: "navigation", style: [styles16.row, style], children: [
1399
2178
  button("left", canPrevious, paged ? () => onPageChange?.(current - 1) : onPrevious, labels.previous),
1400
- text ? /* @__PURE__ */ jsx16(Text6, { "aria-live": "polite", style: [styles11.status, { color: theme.textSecondary }], children: text }) : null,
2179
+ text ? /* @__PURE__ */ jsx21(Text11, { "aria-live": "polite", style: [styles16.status, { color: theme.textSecondary }], children: text }) : null,
1401
2180
  button("right", canNext, paged ? () => onPageChange?.(current + 1) : onNext, labels.next)
1402
2181
  ] });
1403
2182
  }
1404
- var styles11 = StyleSheet11.create({
2183
+ var styles16 = StyleSheet16.create({
1405
2184
  row: { flexDirection: "row", alignItems: "center", justifyContent: "space-between", gap: 12 },
1406
- button: { width: 44, height: 44, alignItems: "center", justifyContent: "center", borderWidth: StyleSheet11.hairlineWidth },
2185
+ button: { width: 44, height: 44, alignItems: "center", justifyContent: "center", borderWidth: StyleSheet16.hairlineWidth },
1407
2186
  status: { fontSize: 13, fontWeight: "600", fontVariant: ["tabular-nums"] }
1408
2187
  });
1409
2188
 
1410
2189
  // src/native/phoenix.tsx
1411
- import { useEffect as useEffect9, useState as useState11 } from "react";
1412
- import { AccessibilityInfo as AccessibilityInfo7, Animated as Animated9, Easing as Easing6, View as View13 } from "react-native";
1413
- import Svg7, { Circle as Circle5, Defs as Defs6, LinearGradient as LinearGradient6, Path as Path6, RadialGradient as RadialGradient4, Stop as Stop6 } from "react-native-svg";
2190
+ import { useEffect as useEffect10, useState as useState16 } from "react";
2191
+ import { AccessibilityInfo as AccessibilityInfo7, Animated as Animated9, Easing as Easing6, View as View18 } from "react-native";
2192
+ import Svg9, { Circle as Circle5, Defs as Defs6, LinearGradient as LinearGradient6, Path as Path8, RadialGradient as RadialGradient4, Stop as Stop6 } from "react-native-svg";
1414
2193
 
1415
2194
  // src/mascots/phoenix-geometry.ts
1416
2195
  var PHOENIX = {
@@ -1433,10 +2212,10 @@ var PHOENIX_PALETTES = {
1433
2212
  };
1434
2213
 
1435
2214
  // src/native/phoenix.tsx
1436
- import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
2215
+ import { jsx as jsx22, jsxs as jsxs19 } from "react/jsx-runtime";
1437
2216
  function useFloat(animated) {
1438
- const [y] = useState11(() => new Animated9.Value(0));
1439
- useEffect9(() => {
2217
+ const [y] = useState16(() => new Animated9.Value(0));
2218
+ useEffect10(() => {
1440
2219
  if (!animated) return;
1441
2220
  let loop;
1442
2221
  let cancelled = false;
@@ -1458,36 +2237,36 @@ function Phoenix({ tone: tone2 = "own", size = 120, animated = true, title, styl
1458
2237
  const id = useSvgId("kzp");
1459
2238
  const y = useFloat(animated);
1460
2239
  const p = tone2 === "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;
1461
- return /* @__PURE__ */ jsx17(View13, { style: [{ width: size, height: size }, style], ...markA11y(title), children: /* @__PURE__ */ jsx17(Animated9.View, { style: { transform: [{ translateY: y }] }, children: /* @__PURE__ */ jsxs14(Svg7, { width: size, height: size, viewBox: "0 0 120 120", children: [
1462
- /* @__PURE__ */ jsxs14(Defs6, { children: [
1463
- /* @__PURE__ */ jsxs14(LinearGradient6, { id: `${id}l`, x1: "1", y1: "0", x2: "0", y2: "1", children: [
1464
- /* @__PURE__ */ jsx17(Stop6, { offset: "0%", stopColor: p.left[0] }),
1465
- /* @__PURE__ */ jsx17(Stop6, { offset: "100%", stopColor: p.left[1] })
2240
+ return /* @__PURE__ */ jsx22(View18, { style: [{ width: size, height: size }, style], ...markA11y(title), children: /* @__PURE__ */ jsx22(Animated9.View, { style: { transform: [{ translateY: y }] }, children: /* @__PURE__ */ jsxs19(Svg9, { width: size, height: size, viewBox: "0 0 120 120", children: [
2241
+ /* @__PURE__ */ jsxs19(Defs6, { children: [
2242
+ /* @__PURE__ */ jsxs19(LinearGradient6, { id: `${id}l`, x1: "1", y1: "0", x2: "0", y2: "1", children: [
2243
+ /* @__PURE__ */ jsx22(Stop6, { offset: "0%", stopColor: p.left[0] }),
2244
+ /* @__PURE__ */ jsx22(Stop6, { offset: "100%", stopColor: p.left[1] })
1466
2245
  ] }),
1467
- /* @__PURE__ */ jsxs14(LinearGradient6, { id: `${id}r`, x1: "0", y1: "0", x2: "1", y2: "1", children: [
1468
- /* @__PURE__ */ jsx17(Stop6, { offset: "0%", stopColor: p.right[0] }),
1469
- /* @__PURE__ */ jsx17(Stop6, { offset: "100%", stopColor: p.right[1] })
2246
+ /* @__PURE__ */ jsxs19(LinearGradient6, { id: `${id}r`, x1: "0", y1: "0", x2: "1", y2: "1", children: [
2247
+ /* @__PURE__ */ jsx22(Stop6, { offset: "0%", stopColor: p.right[0] }),
2248
+ /* @__PURE__ */ jsx22(Stop6, { offset: "100%", stopColor: p.right[1] })
1470
2249
  ] }),
1471
- /* @__PURE__ */ jsxs14(RadialGradient4, { id: `${id}c`, children: [
1472
- /* @__PURE__ */ jsx17(Stop6, { offset: "0%", stopColor: p.core[0] }),
1473
- /* @__PURE__ */ jsx17(Stop6, { offset: "100%", stopColor: p.core[1], stopOpacity: 0 })
2250
+ /* @__PURE__ */ jsxs19(RadialGradient4, { id: `${id}c`, children: [
2251
+ /* @__PURE__ */ jsx22(Stop6, { offset: "0%", stopColor: p.core[0] }),
2252
+ /* @__PURE__ */ jsx22(Stop6, { offset: "100%", stopColor: p.core[1], stopOpacity: 0 })
1474
2253
  ] })
1475
2254
  ] }),
1476
- /* @__PURE__ */ jsx17(Path6, { d: PHOENIX.wingL, fill: `url(#${id}l)` }),
1477
- /* @__PURE__ */ jsx17(Path6, { d: PHOENIX.wingR, fill: `url(#${id}r)` }),
1478
- /* @__PURE__ */ jsx17(Path6, { d: PHOENIX.tailL, fill: `url(#${id}l)`, opacity: 0.7 }),
1479
- /* @__PURE__ */ jsx17(Path6, { d: PHOENIX.tailR, fill: `url(#${id}r)`, opacity: 0.7 }),
1480
- /* @__PURE__ */ jsx17(Path6, { d: PHOENIX.body, fill: p.body, stroke: p.edge, strokeOpacity: 0.5 }),
1481
- /* @__PURE__ */ jsx17(Circle5, { cx: 60, cy: 58, r: 12, fill: `url(#${id}c)` }),
1482
- /* @__PURE__ */ jsx17(Circle5, { cx: 60, cy: 58, r: 3.5, fill: "#ffffff" }),
1483
- /* @__PURE__ */ jsx17(Path6, { d: PHOENIX.crest, stroke: p.crest, strokeWidth: 2, strokeLinecap: "round" })
2255
+ /* @__PURE__ */ jsx22(Path8, { d: PHOENIX.wingL, fill: `url(#${id}l)` }),
2256
+ /* @__PURE__ */ jsx22(Path8, { d: PHOENIX.wingR, fill: `url(#${id}r)` }),
2257
+ /* @__PURE__ */ jsx22(Path8, { d: PHOENIX.tailL, fill: `url(#${id}l)`, opacity: 0.7 }),
2258
+ /* @__PURE__ */ jsx22(Path8, { d: PHOENIX.tailR, fill: `url(#${id}r)`, opacity: 0.7 }),
2259
+ /* @__PURE__ */ jsx22(Path8, { d: PHOENIX.body, fill: p.body, stroke: p.edge, strokeOpacity: 0.5 }),
2260
+ /* @__PURE__ */ jsx22(Circle5, { cx: 60, cy: 58, r: 12, fill: `url(#${id}c)` }),
2261
+ /* @__PURE__ */ jsx22(Circle5, { cx: 60, cy: 58, r: 3.5, fill: "#ffffff" }),
2262
+ /* @__PURE__ */ jsx22(Path8, { d: PHOENIX.crest, stroke: p.crest, strokeWidth: 2, strokeLinecap: "round" })
1484
2263
  ] }) }) });
1485
2264
  }
1486
2265
 
1487
2266
  // src/native/YazakiaMark.tsx
1488
- import React12 from "react";
1489
- import { View as View14 } from "react-native";
1490
- import Svg8, { Circle as Circle6, Defs as Defs7, LinearGradient as LinearGradient7, Path as Path7, RadialGradient as RadialGradient5, Stop as Stop7 } from "react-native-svg";
2267
+ import React17 from "react";
2268
+ import { View as View19 } from "react-native";
2269
+ import Svg10, { Circle as Circle6, Defs as Defs7, LinearGradient as LinearGradient7, Path as Path9, RadialGradient as RadialGradient5, Stop as Stop7 } from "react-native-svg";
1491
2270
 
1492
2271
  // src/marks/yazakia-geometry.ts
1493
2272
  var turquoise = marks.yazakia[marks.yazakia.length - 1][1];
@@ -1517,54 +2296,54 @@ var YAZAKIA = {
1517
2296
  };
1518
2297
 
1519
2298
  // src/native/YazakiaMark.tsx
1520
- import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
2299
+ import { jsx as jsx23, jsxs as jsxs20 } from "react/jsx-runtime";
1521
2300
  function YazakiaMark({ size = 48, animated = true, title, neutral }) {
1522
2301
  const { theme } = useTheme();
1523
2302
  const { Animated: Animated14, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated);
1524
2303
  const id = useSvgId("yzm");
1525
2304
  const viewBox = size < 48 ? YAZAKIA.croppedViewBox : YAZAKIA.viewBox;
1526
2305
  const stroke = neutral ?? theme.textMuted;
1527
- const gradient = /* @__PURE__ */ jsx18(LinearGradient7, { id: `${id}a`, gradientUnits: "userSpaceOnUse", x1: YAZAKIA.gradient.x1, y1: YAZAKIA.gradient.y1, x2: YAZAKIA.gradient.x2, y2: YAZAKIA.gradient.y2, children: YAZAKIA.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx18(Stop7, { offset, stopColor: color }, offset)) });
2306
+ const gradient = /* @__PURE__ */ jsx23(LinearGradient7, { id: `${id}a`, gradientUnits: "userSpaceOnUse", x1: YAZAKIA.gradient.x1, y1: YAZAKIA.gradient.y1, x2: YAZAKIA.gradient.x2, y2: YAZAKIA.gradient.y2, children: YAZAKIA.gradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx23(Stop7, { offset, stopColor: color }, offset)) });
1528
2307
  const fill = `url(#${id}a)`;
1529
- return /* @__PURE__ */ jsxs15(View14, { style: { width: size, height: size }, ...markA11y(title), children: [
1530
- /* @__PURE__ */ jsxs15(Svg8, { viewBox, style: layer, children: [
1531
- /* @__PURE__ */ jsxs15(Defs7, { children: [
1532
- /* @__PURE__ */ jsxs15(RadialGradient5, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
1533
- /* @__PURE__ */ jsx18(Stop7, { offset: "0%", stopColor: YAZAKIA.glow.color, stopOpacity: YAZAKIA.glow.opacity }),
1534
- /* @__PURE__ */ jsx18(Stop7, { offset: "100%", stopColor: YAZAKIA.glow.color, stopOpacity: 0 })
2308
+ return /* @__PURE__ */ jsxs20(View19, { style: { width: size, height: size }, ...markA11y(title), children: [
2309
+ /* @__PURE__ */ jsxs20(Svg10, { viewBox, style: layer, children: [
2310
+ /* @__PURE__ */ jsxs20(Defs7, { children: [
2311
+ /* @__PURE__ */ jsxs20(RadialGradient5, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
2312
+ /* @__PURE__ */ jsx23(Stop7, { offset: "0%", stopColor: YAZAKIA.glow.color, stopOpacity: YAZAKIA.glow.opacity }),
2313
+ /* @__PURE__ */ jsx23(Stop7, { offset: "100%", stopColor: YAZAKIA.glow.color, stopOpacity: 0 })
1535
2314
  ] }),
1536
2315
  gradient
1537
2316
  ] }),
1538
- size >= 48 ? /* @__PURE__ */ jsx18(Circle6, { cx: YAZAKIA.center, cy: YAZAKIA.center, r: 190, fill: `url(#${id}g)` }) : null,
1539
- /* @__PURE__ */ jsx18(Circle6, { cx: YAZAKIA.center, cy: YAZAKIA.center, r: YAZAKIA.ring.r, stroke, strokeWidth: YAZAKIA.ring.width, opacity: 0.35, fill: "none" }),
1540
- YAZAKIA.voices.map((v, i) => /* @__PURE__ */ jsxs15(React12.Fragment, { children: [
1541
- /* @__PURE__ */ jsx18(Path7, { d: v.body, fill }),
1542
- /* @__PURE__ */ jsx18(Path7, { d: v.tail, fill }),
1543
- i === 0 ? /* @__PURE__ */ jsx18(Path7, { d: `${v.body} ${v.tail}`, fill: YAZAKIA.shade.color, opacity: YAZAKIA.shade.opacity }) : null
2317
+ size >= 48 ? /* @__PURE__ */ jsx23(Circle6, { cx: YAZAKIA.center, cy: YAZAKIA.center, r: 190, fill: `url(#${id}g)` }) : null,
2318
+ /* @__PURE__ */ jsx23(Circle6, { cx: YAZAKIA.center, cy: YAZAKIA.center, r: YAZAKIA.ring.r, stroke, strokeWidth: YAZAKIA.ring.width, opacity: 0.35, fill: "none" }),
2319
+ YAZAKIA.voices.map((v, i) => /* @__PURE__ */ jsxs20(React17.Fragment, { children: [
2320
+ /* @__PURE__ */ jsx23(Path9, { d: v.body, fill }),
2321
+ /* @__PURE__ */ jsx23(Path9, { d: v.tail, fill }),
2322
+ i === 0 ? /* @__PURE__ */ jsx23(Path9, { d: `${v.body} ${v.tail}`, fill: YAZAKIA.shade.color, opacity: YAZAKIA.shade.opacity }) : null
1544
2323
  ] }, v.body))
1545
2324
  ] }),
1546
- /* @__PURE__ */ jsx18(Animated14.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs15(Svg8, { viewBox, style: layer, children: [
1547
- /* @__PURE__ */ jsx18(Defs7, { children: gradient }),
1548
- /* @__PURE__ */ jsx18(Circle6, { cx: YAZAKIA.center, cy: YAZAKIA.center, r: YAZAKIA.orbit.r, stroke, strokeWidth: YAZAKIA.orbit.width, strokeDasharray: YAZAKIA.orbit.dash, opacity: 0.6, fill: "none" }),
1549
- YAZAKIA.pair.at.map(([cx, cy]) => /* @__PURE__ */ jsx18(Circle6, { cx, cy, r: YAZAKIA.pair.r, fill }, cx))
2325
+ /* @__PURE__ */ jsx23(Animated14.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs20(Svg10, { viewBox, style: layer, children: [
2326
+ /* @__PURE__ */ jsx23(Defs7, { children: gradient }),
2327
+ /* @__PURE__ */ jsx23(Circle6, { cx: YAZAKIA.center, cy: YAZAKIA.center, r: YAZAKIA.orbit.r, stroke, strokeWidth: YAZAKIA.orbit.width, strokeDasharray: YAZAKIA.orbit.dash, opacity: 0.6, fill: "none" }),
2328
+ YAZAKIA.pair.at.map(([cx, cy]) => /* @__PURE__ */ jsx23(Circle6, { cx, cy, r: YAZAKIA.pair.r, fill }, cx))
1550
2329
  ] }) }),
1551
- /* @__PURE__ */ jsx18(Animated14.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs15(Svg8, { viewBox, style: layer, children: [
1552
- /* @__PURE__ */ jsxs15(Defs7, { children: [
2330
+ /* @__PURE__ */ jsx23(Animated14.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs20(Svg10, { viewBox, style: layer, children: [
2331
+ /* @__PURE__ */ jsxs20(Defs7, { children: [
1553
2332
  gradient,
1554
- /* @__PURE__ */ jsxs15(LinearGradient7, { id: `${id}l`, gradientUnits: "userSpaceOnUse", x1: 0, y1: YAZAKIA.lens.y1, x2: 0, y2: YAZAKIA.lens.y2, children: [
1555
- /* @__PURE__ */ jsx18(Stop7, { offset: "0%", stopColor: YAZAKIA.highlight.color, stopOpacity: YAZAKIA.highlight.from }),
1556
- /* @__PURE__ */ jsx18(Stop7, { offset: "100%", stopColor: YAZAKIA.highlight.color, stopOpacity: YAZAKIA.highlight.to })
2333
+ /* @__PURE__ */ jsxs20(LinearGradient7, { id: `${id}l`, gradientUnits: "userSpaceOnUse", x1: 0, y1: YAZAKIA.lens.y1, x2: 0, y2: YAZAKIA.lens.y2, children: [
2334
+ /* @__PURE__ */ jsx23(Stop7, { offset: "0%", stopColor: YAZAKIA.highlight.color, stopOpacity: YAZAKIA.highlight.from }),
2335
+ /* @__PURE__ */ jsx23(Stop7, { offset: "100%", stopColor: YAZAKIA.highlight.color, stopOpacity: YAZAKIA.highlight.to })
1557
2336
  ] })
1558
2337
  ] }),
1559
- /* @__PURE__ */ jsx18(Path7, { d: YAZAKIA.lens.d, fill }),
1560
- /* @__PURE__ */ jsx18(Path7, { d: YAZAKIA.lens.d, fill: `url(#${id}l)` })
2338
+ /* @__PURE__ */ jsx23(Path9, { d: YAZAKIA.lens.d, fill }),
2339
+ /* @__PURE__ */ jsx23(Path9, { d: YAZAKIA.lens.d, fill: `url(#${id}l)` })
1561
2340
  ] }) })
1562
2341
  ] });
1563
2342
  }
1564
2343
 
1565
2344
  // src/native/YororisMark.tsx
1566
- import { View as View15 } from "react-native";
1567
- import Svg9, { Circle as Circle7, Defs as Defs8, LinearGradient as LinearGradient8, Path as Path8, RadialGradient as RadialGradient6, Stop as Stop8 } from "react-native-svg";
2345
+ import { View as View20 } from "react-native";
2346
+ import Svg11, { Circle as Circle7, Defs as Defs8, LinearGradient as LinearGradient8, Path as Path10, RadialGradient as RadialGradient6, Stop as Stop8 } from "react-native-svg";
1568
2347
 
1569
2348
  // src/marks/yororis-geometry.ts
1570
2349
  var sand = marks.yororis[0][1];
@@ -1600,65 +2379,65 @@ var YORORIS = {
1600
2379
  };
1601
2380
 
1602
2381
  // src/native/YororisMark.tsx
1603
- import { jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
2382
+ import { jsx as jsx24, jsxs as jsxs21 } from "react/jsx-runtime";
1604
2383
  function YororisMark({ size = 48, animated = true, title, neutral }) {
1605
2384
  const { theme } = useTheme();
1606
2385
  const { Animated: Animated14, layer, spinStyle, pulseStyle } = useMarkMotion(size, animated, 36e3);
1607
2386
  const id = useSvgId("yrm");
1608
2387
  const viewBox = size < 48 ? YORORIS.croppedViewBox : YORORIS.viewBox;
1609
2388
  const stroke = neutral ?? theme.textMuted;
1610
- const gradient = /* @__PURE__ */ jsx19(LinearGradient8, { 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__ */ jsx19(Stop8, { offset, stopColor: color }, offset)) });
2389
+ const gradient = /* @__PURE__ */ jsx24(LinearGradient8, { 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__ */ jsx24(Stop8, { offset, stopColor: color }, offset)) });
1611
2390
  const fill = `url(#${id}a)`;
1612
- return /* @__PURE__ */ jsxs16(View15, { style: { width: size, height: size }, ...markA11y(title), children: [
1613
- /* @__PURE__ */ jsxs16(Svg9, { viewBox, style: layer, children: [
1614
- /* @__PURE__ */ jsxs16(Defs8, { children: [
1615
- /* @__PURE__ */ jsxs16(RadialGradient6, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
1616
- /* @__PURE__ */ jsx19(Stop8, { offset: "0%", stopColor: YORORIS.glow.color, stopOpacity: YORORIS.glow.opacity }),
1617
- /* @__PURE__ */ jsx19(Stop8, { offset: "100%", stopColor: YORORIS.glow.color, stopOpacity: 0 })
2391
+ return /* @__PURE__ */ jsxs21(View20, { style: { width: size, height: size }, ...markA11y(title), children: [
2392
+ /* @__PURE__ */ jsxs21(Svg11, { viewBox, style: layer, children: [
2393
+ /* @__PURE__ */ jsxs21(Defs8, { children: [
2394
+ /* @__PURE__ */ jsxs21(RadialGradient6, { id: `${id}g`, cx: "50%", cy: "50%", r: "50%", children: [
2395
+ /* @__PURE__ */ jsx24(Stop8, { offset: "0%", stopColor: YORORIS.glow.color, stopOpacity: YORORIS.glow.opacity }),
2396
+ /* @__PURE__ */ jsx24(Stop8, { offset: "100%", stopColor: YORORIS.glow.color, stopOpacity: 0 })
1618
2397
  ] }),
1619
2398
  gradient
1620
2399
  ] }),
1621
- size >= 48 ? /* @__PURE__ */ jsx19(Circle7, { cx: YORORIS.center, cy: YORORIS.center, r: 190, fill: `url(#${id}g)` }) : null,
1622
- /* @__PURE__ */ jsx19(Circle7, { cx: YORORIS.center, cy: YORORIS.center, r: YORORIS.ring.r, stroke, strokeWidth: YORORIS.ring.width, opacity: 0.35, fill: "none" }),
1623
- /* @__PURE__ */ jsx19(Path8, { d: YORORIS.stem, stroke: fill, strokeWidth: YORORIS.stroke, strokeLinecap: "round", fill: "none" }),
1624
- YORORIS.leaves.map((d) => /* @__PURE__ */ jsx19(Path8, { d, fill }, d)),
1625
- /* @__PURE__ */ jsx19(Path8, { d: YORORIS.veins, stroke: YORORIS.vein.color, strokeOpacity: YORORIS.vein.opacity, strokeWidth: YORORIS.vein.width, strokeLinecap: "round", strokeDasharray: YORORIS.vein.dash, fill: "none" })
2400
+ size >= 48 ? /* @__PURE__ */ jsx24(Circle7, { cx: YORORIS.center, cy: YORORIS.center, r: 190, fill: `url(#${id}g)` }) : null,
2401
+ /* @__PURE__ */ jsx24(Circle7, { cx: YORORIS.center, cy: YORORIS.center, r: YORORIS.ring.r, stroke, strokeWidth: YORORIS.ring.width, opacity: 0.35, fill: "none" }),
2402
+ /* @__PURE__ */ jsx24(Path10, { d: YORORIS.stem, stroke: fill, strokeWidth: YORORIS.stroke, strokeLinecap: "round", fill: "none" }),
2403
+ YORORIS.leaves.map((d) => /* @__PURE__ */ jsx24(Path10, { d, fill }, d)),
2404
+ /* @__PURE__ */ jsx24(Path10, { d: YORORIS.veins, stroke: YORORIS.vein.color, strokeOpacity: YORORIS.vein.opacity, strokeWidth: YORORIS.vein.width, strokeLinecap: "round", strokeDasharray: YORORIS.vein.dash, fill: "none" })
1626
2405
  ] }),
1627
- /* @__PURE__ */ jsx19(Animated14.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs16(Svg9, { viewBox, style: layer, children: [
1628
- /* @__PURE__ */ jsx19(Defs8, { children: gradient }),
1629
- /* @__PURE__ */ jsx19(Circle7, { cx: YORORIS.center, cy: YORORIS.center, r: YORORIS.orbit.r, stroke, strokeWidth: YORORIS.orbit.width, strokeDasharray: YORORIS.orbit.dash, opacity: 0.6, fill: "none" }),
1630
- /* @__PURE__ */ jsx19(Circle7, { cx: YORORIS.moment.at[0], cy: YORORIS.moment.at[1], r: YORORIS.moment.r, fill })
2406
+ /* @__PURE__ */ jsx24(Animated14.View, { style: [layer, spinStyle], children: /* @__PURE__ */ jsxs21(Svg11, { viewBox, style: layer, children: [
2407
+ /* @__PURE__ */ jsx24(Defs8, { children: gradient }),
2408
+ /* @__PURE__ */ jsx24(Circle7, { cx: YORORIS.center, cy: YORORIS.center, r: YORORIS.orbit.r, stroke, strokeWidth: YORORIS.orbit.width, strokeDasharray: YORORIS.orbit.dash, opacity: 0.6, fill: "none" }),
2409
+ /* @__PURE__ */ jsx24(Circle7, { cx: YORORIS.moment.at[0], cy: YORORIS.moment.at[1], r: YORORIS.moment.r, fill })
1631
2410
  ] }) }),
1632
- /* @__PURE__ */ jsx19(Animated14.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs16(Svg9, { viewBox, style: layer, children: [
1633
- /* @__PURE__ */ jsx19(Defs8, { children: /* @__PURE__ */ jsx19(LinearGradient8, { id: `${id}c`, x1: "50%", y1: "100%", x2: "50%", y2: "0%", children: YORORIS.coreGradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx19(Stop8, { offset, stopColor: color }, offset)) }) }),
1634
- /* @__PURE__ */ jsx19(Circle7, { cx: YORORIS.core.cx, cy: YORORIS.core.cy, r: YORORIS.core.r, fill: `url(#${id}c)` }),
1635
- /* @__PURE__ */ jsx19(Circle7, { cx: YORORIS.core.cx, cy: YORORIS.core.cy, r: YORORIS.core.inner, fill: YORORIS.highlight })
2411
+ /* @__PURE__ */ jsx24(Animated14.View, { style: [layer, pulseStyle], children: /* @__PURE__ */ jsxs21(Svg11, { viewBox, style: layer, children: [
2412
+ /* @__PURE__ */ jsx24(Defs8, { children: /* @__PURE__ */ jsx24(LinearGradient8, { id: `${id}c`, x1: "50%", y1: "100%", x2: "50%", y2: "0%", children: YORORIS.coreGradient.stops.map(([offset, color]) => /* @__PURE__ */ jsx24(Stop8, { offset, stopColor: color }, offset)) }) }),
2413
+ /* @__PURE__ */ jsx24(Circle7, { cx: YORORIS.core.cx, cy: YORORIS.core.cy, r: YORORIS.core.r, fill: `url(#${id}c)` }),
2414
+ /* @__PURE__ */ jsx24(Circle7, { cx: YORORIS.core.cx, cy: YORORIS.core.cy, r: YORORIS.core.inner, fill: YORORIS.highlight })
1636
2415
  ] }) })
1637
2416
  ] });
1638
2417
  }
1639
2418
 
1640
2419
  // src/native/ProductMark.tsx
1641
- import { jsx as jsx20 } from "react/jsx-runtime";
2420
+ import { jsx as jsx25 } from "react/jsx-runtime";
1642
2421
  function ProductMark({ id, ...props }) {
1643
- if (id === "krizaka") return /* @__PURE__ */ jsx20(KrizakaMark, { ...props });
1644
- if (id === "orazaka") return /* @__PURE__ */ jsx20(OrazakaMark, { ...props });
1645
- if (id === "yazakia") return /* @__PURE__ */ jsx20(YazakiaMark, { ...props });
1646
- if (id === "yororis") return /* @__PURE__ */ jsx20(YororisMark, { ...props });
1647
- return /* @__PURE__ */ jsx20(OrochiaMark, { ...props });
2422
+ if (id === "krizaka") return /* @__PURE__ */ jsx25(KrizakaMark, { ...props });
2423
+ if (id === "orazaka") return /* @__PURE__ */ jsx25(OrazakaMark, { ...props });
2424
+ if (id === "yazakia") return /* @__PURE__ */ jsx25(YazakiaMark, { ...props });
2425
+ if (id === "yororis") return /* @__PURE__ */ jsx25(YororisMark, { ...props });
2426
+ return /* @__PURE__ */ jsx25(OrochiaMark, { ...props });
1648
2427
  }
1649
2428
 
1650
2429
  // src/native/profile-card.tsx
1651
- import * as React13 from "react";
1652
- import { Animated as Animated10, StyleSheet as StyleSheet12, View as View16 } from "react-native";
1653
- import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
2430
+ import * as React18 from "react";
2431
+ import { Animated as Animated10, StyleSheet as StyleSheet17, View as View21 } from "react-native";
2432
+ import { jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
1654
2433
  var ratioOf = (value, max = 100) => Math.min(1, Math.max(0, value / (max || 1)));
1655
2434
  function Bar({ label, ratio, words, animated, delay }) {
1656
2435
  const { theme } = useTheme();
1657
2436
  const t = useEntrance(animated, delay, 900);
1658
- const [width, setWidth] = React13.useState(0);
2437
+ const [width, setWidth] = React18.useState(0);
1659
2438
  const translateX = t.interpolate({ inputRange: [0, 1], outputRange: [-width * ratio, 0] });
1660
- return /* @__PURE__ */ jsx21(
1661
- View16,
2439
+ return /* @__PURE__ */ jsx26(
2440
+ View21,
1662
2441
  {
1663
2442
  accessible: true,
1664
2443
  role: "meter",
@@ -1668,42 +2447,42 @@ function Bar({ label, ratio, words, animated, delay }) {
1668
2447
  "aria-valuenow": Math.round(ratio * 100),
1669
2448
  "aria-valuetext": words,
1670
2449
  onLayout: (e) => setWidth(e.nativeEvent.layout.width),
1671
- style: [styles12.track, { backgroundColor: theme.surface3 }],
1672
- children: /* @__PURE__ */ jsx21(Animated10.View, { style: [styles12.fill, { width: `${ratio * 100}%`, backgroundColor: theme.accent, transform: [{ translateX }] }] })
2450
+ style: [styles17.track, { backgroundColor: theme.surface3 }],
2451
+ children: /* @__PURE__ */ jsx26(Animated10.View, { style: [styles17.fill, { width: `${ratio * 100}%`, backgroundColor: theme.accent, transform: [{ translateX }] }] })
1673
2452
  }
1674
2453
  );
1675
2454
  }
1676
2455
  function ProfileCard({ visual, name, statLabel, value = 100, valueText, stats, caption, children, animated = true, style, ...props }) {
1677
2456
  const { theme, radius: radius3 } = useTheme();
1678
2457
  const ratio = ratioOf(value);
1679
- return /* @__PURE__ */ jsxs17(View16, { ...props, style: [styles12.root, { backgroundColor: theme.surface1, borderColor: theme.borderSubtle, borderRadius: radius3.xl }, style], children: [
1680
- /* @__PURE__ */ jsx21(View16, { "aria-hidden": true, style: [styles12.disc, { backgroundColor: theme.surface2, borderColor: theme.accentSoft }], children: visual }),
1681
- /* @__PURE__ */ jsxs17(View16, { style: styles12.head, children: [
1682
- /* @__PURE__ */ jsx21(Txt, { variant: "title", style: styles12.name, children: name }),
1683
- statLabel ? /* @__PURE__ */ jsxs17(Txt, { variant: "caption", tone: "secondary", children: [
2458
+ return /* @__PURE__ */ jsxs22(View21, { ...props, style: [styles17.root, { backgroundColor: theme.surface1, borderColor: theme.borderSubtle, borderRadius: radius3.xl }, style], children: [
2459
+ /* @__PURE__ */ jsx26(View21, { "aria-hidden": true, style: [styles17.disc, { backgroundColor: theme.surface2, borderColor: theme.accentSoft }], children: visual }),
2460
+ /* @__PURE__ */ jsxs22(View21, { style: styles17.head, children: [
2461
+ /* @__PURE__ */ jsx26(Txt, { variant: "title", style: styles17.name, children: name }),
2462
+ statLabel ? /* @__PURE__ */ jsxs22(Txt, { variant: "caption", tone: "secondary", children: [
1684
2463
  statLabel,
1685
2464
  " ",
1686
- /* @__PURE__ */ jsx21(Txt, { variant: "caption", children: valueText ?? `${Math.round(ratio * 100)} %` })
2465
+ /* @__PURE__ */ jsx26(Txt, { variant: "caption", children: valueText ?? `${Math.round(ratio * 100)} %` })
1687
2466
  ] }) : null
1688
2467
  ] }),
1689
- statLabel ? /* @__PURE__ */ jsx21(Bar, { label: statLabel, ratio, words: valueText ?? `${Math.round(ratio * 100)} %`, animated, delay: 200 }) : null,
2468
+ statLabel ? /* @__PURE__ */ jsx26(Bar, { label: statLabel, ratio, words: valueText ?? `${Math.round(ratio * 100)} %`, animated, delay: 200 }) : null,
1690
2469
  stats?.map((s, i) => {
1691
2470
  const r = ratioOf(s.value, s.max);
1692
2471
  const words = s.valueText ?? `${Math.round(r * 100)} %`;
1693
- return /* @__PURE__ */ jsxs17(View16, { style: styles12.stat, children: [
1694
- /* @__PURE__ */ jsxs17(View16, { "aria-hidden": true, style: styles12.statHead, children: [
1695
- /* @__PURE__ */ jsx21(Txt, { variant: "caption", tone: "secondary", children: s.label }),
1696
- /* @__PURE__ */ jsx21(Txt, { variant: "caption", children: words })
2472
+ return /* @__PURE__ */ jsxs22(View21, { style: styles17.stat, children: [
2473
+ /* @__PURE__ */ jsxs22(View21, { "aria-hidden": true, style: styles17.statHead, children: [
2474
+ /* @__PURE__ */ jsx26(Txt, { variant: "caption", tone: "secondary", children: s.label }),
2475
+ /* @__PURE__ */ jsx26(Txt, { variant: "caption", children: words })
1697
2476
  ] }),
1698
- /* @__PURE__ */ jsx21(Bar, { label: s.label, ratio: r, words, animated, delay: 320 + i * 120 })
2477
+ /* @__PURE__ */ jsx26(Bar, { label: s.label, ratio: r, words, animated, delay: 320 + i * 120 })
1699
2478
  ] }, s.label);
1700
2479
  }),
1701
- caption ? /* @__PURE__ */ jsx21(Txt, { variant: "caption", tone: "secondary", style: styles12.caption, children: caption }) : null,
1702
- children ? /* @__PURE__ */ jsx21(View16, { style: styles12.extra, children }) : null
2480
+ caption ? /* @__PURE__ */ jsx26(Txt, { variant: "caption", tone: "secondary", style: styles17.caption, children: caption }) : null,
2481
+ children ? /* @__PURE__ */ jsx26(View21, { style: styles17.extra, children }) : null
1703
2482
  ] });
1704
2483
  }
1705
- var styles12 = StyleSheet12.create({
1706
- root: { alignItems: "center", gap: 12, padding: 20, borderWidth: StyleSheet12.hairlineWidth },
2484
+ var styles17 = StyleSheet17.create({
2485
+ root: { alignItems: "center", gap: 12, padding: 20, borderWidth: StyleSheet17.hairlineWidth },
1707
2486
  disc: { width: 104, height: 104, borderRadius: 52, borderWidth: 1, alignItems: "center", justifyContent: "center", overflow: "hidden" },
1708
2487
  head: { flexDirection: "row", alignSelf: "stretch", alignItems: "center", justifyContent: "space-between", gap: 8 },
1709
2488
  name: { flexShrink: 1, fontSize: 17 },
@@ -1716,10 +2495,10 @@ var styles12 = StyleSheet12.create({
1716
2495
  });
1717
2496
 
1718
2497
  // src/native/progress.tsx
1719
- import * as React14 from "react";
1720
- import { Animated as Animated11, Easing as Easing7, StyleSheet as StyleSheet13, View as View17 } from "react-native";
1721
- import Svg10, { Circle as Circle8, Defs as Defs9, LinearGradient as LinearGradient9, Rect as Rect3, Stop as Stop9 } from "react-native-svg";
1722
- import { jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
2498
+ import * as React19 from "react";
2499
+ import { Animated as Animated11, Easing as Easing7, StyleSheet as StyleSheet18, View as View22 } from "react-native";
2500
+ import Svg12, { Circle as Circle8, Defs as Defs9, LinearGradient as LinearGradient9, Rect as Rect3, Stop as Stop9 } from "react-native-svg";
2501
+ import { jsx as jsx27, jsxs as jsxs23 } from "react/jsx-runtime";
1723
2502
  var AnimatedCircle = Animated11.createAnimatedComponent(Circle8);
1724
2503
  var BAR = { sm: 4, md: 8, lg: 12 };
1725
2504
  var RING = { sm: 40, md: 80, lg: 144 };
@@ -1731,10 +2510,10 @@ function Progress({ variant = "bar", size = "md", value, max = 100, label, value
1731
2510
  const known = typeof value === "number" && Number.isFinite(value);
1732
2511
  const ratio = known ? Math.min(1, Math.max(0, value / (max || 1))) : 0;
1733
2512
  const percent = Math.round(ratio * 100);
1734
- const [progress] = React14.useState(() => new Animated11.Value(ratio));
1735
- const [spin] = React14.useState(() => new Animated11.Value(0));
1736
- const [track, setTrack] = React14.useState(0);
1737
- React14.useEffect(() => {
2513
+ const [progress] = React19.useState(() => new Animated11.Value(ratio));
2514
+ const [spin] = React19.useState(() => new Animated11.Value(0));
2515
+ const [track, setTrack] = React19.useState(0);
2516
+ React19.useEffect(() => {
1738
2517
  if (reduce) {
1739
2518
  progress.setValue(ratio);
1740
2519
  return;
@@ -1743,7 +2522,7 @@ function Progress({ variant = "bar", size = "md", value, max = 100, label, value
1743
2522
  animation.start();
1744
2523
  return () => animation.stop();
1745
2524
  }, [ratio, reduce, progress]);
1746
- React14.useEffect(() => {
2525
+ React19.useEffect(() => {
1747
2526
  if (known || reduce) return;
1748
2527
  const loop = Animated11.loop(Animated11.timing(spin, { toValue: 1, duration: 1200, easing: Easing7.linear, useNativeDriver: true }));
1749
2528
  loop.start();
@@ -1761,9 +2540,9 @@ function Progress({ variant = "bar", size = "md", value, max = 100, label, value
1761
2540
  "aria-valuenow": known ? Math.min(max, Math.max(0, value)) : void 0,
1762
2541
  "aria-valuetext": known ? valueText ?? `${percent}%` : valueText
1763
2542
  };
1764
- const gradient = /* @__PURE__ */ jsx22(Defs9, { children: /* @__PURE__ */ jsxs18(LinearGradient9, { id, x1: "0", y1: "0", x2: "1", y2: variant === "ring" ? "1" : "0", children: [
1765
- /* @__PURE__ */ jsx22(Stop9, { offset: "0", stopColor: theme.accent }),
1766
- /* @__PURE__ */ jsx22(Stop9, { offset: "1", stopColor: theme.accent2 })
2543
+ const gradient = /* @__PURE__ */ jsx27(Defs9, { children: /* @__PURE__ */ jsxs23(LinearGradient9, { id, x1: "0", y1: "0", x2: "1", y2: variant === "ring" ? "1" : "0", children: [
2544
+ /* @__PURE__ */ jsx27(Stop9, { offset: "0", stopColor: theme.accent }),
2545
+ /* @__PURE__ */ jsx27(Stop9, { offset: "1", stopColor: theme.accent2 })
1767
2546
  ] }) });
1768
2547
  if (variant === "ring") {
1769
2548
  const side = RING[size];
@@ -1772,11 +2551,11 @@ function Progress({ variant = "bar", size = "md", value, max = 100, label, value
1772
2551
  const circumference = 2 * Math.PI * r;
1773
2552
  const offset = known ? progress.interpolate({ inputRange: [0, 1], outputRange: [circumference, 0] }) : circumference * 0.75;
1774
2553
  const rotate = spin.interpolate({ inputRange: [0, 1], outputRange: ["0deg", "360deg"] });
1775
- return /* @__PURE__ */ jsxs18(View17, { ...a11y, style: [styles13.ring, { width: side, height: side }, style], children: [
1776
- /* @__PURE__ */ jsx22(Animated11.View, { style: [StyleSheet13.absoluteFill, { transform: [{ rotate: known ? "-90deg" : rotate }] }], children: /* @__PURE__ */ jsxs18(Svg10, { width: side, height: side, viewBox: "0 0 100 100", children: [
2554
+ return /* @__PURE__ */ jsxs23(View22, { ...a11y, style: [styles18.ring, { width: side, height: side }, style], children: [
2555
+ /* @__PURE__ */ jsx27(Animated11.View, { style: [StyleSheet18.absoluteFill, { transform: [{ rotate: known ? "-90deg" : rotate }] }], children: /* @__PURE__ */ jsxs23(Svg12, { width: side, height: side, viewBox: "0 0 100 100", children: [
1777
2556
  gradient,
1778
- /* @__PURE__ */ jsx22(Circle8, { cx: 50, cy: 50, r, fill: "none", stroke: theme.borderDefault, strokeWidth: stroke }),
1779
- /* @__PURE__ */ jsx22(
2557
+ /* @__PURE__ */ jsx27(Circle8, { cx: 50, cy: 50, r, fill: "none", stroke: theme.borderDefault, strokeWidth: stroke }),
2558
+ /* @__PURE__ */ jsx27(
1780
2559
  AnimatedCircle,
1781
2560
  {
1782
2561
  cx: 50,
@@ -1796,49 +2575,49 @@ function Progress({ variant = "bar", size = "md", value, max = 100, label, value
1796
2575
  }
1797
2576
  const width = known ? progress.interpolate({ inputRange: [0, 1], outputRange: ["0%", "100%"] }) : "40%";
1798
2577
  const translate = spin.interpolate({ inputRange: [0, 1], outputRange: [-0.4 * track, track] });
1799
- return /* @__PURE__ */ jsx22(
1800
- View17,
2578
+ return /* @__PURE__ */ jsx27(
2579
+ View22,
1801
2580
  {
1802
2581
  ...a11y,
1803
2582
  onLayout: known ? void 0 : (event) => setTrack(event.nativeEvent.layout.width),
1804
- style: [styles13.bar, { height: BAR[size], backgroundColor: theme.surface3 }, style],
1805
- children: /* @__PURE__ */ jsx22(Animated11.View, { style: [styles13.fill, { width }, known || reduce ? null : { transform: [{ translateX: translate }] }], children: /* @__PURE__ */ jsxs18(Svg10, { width: "100%", height: "100%", preserveAspectRatio: "none", children: [
2583
+ style: [styles18.bar, { height: BAR[size], backgroundColor: theme.surface3 }, style],
2584
+ children: /* @__PURE__ */ jsx27(Animated11.View, { style: [styles18.fill, { width }, known || reduce ? null : { transform: [{ translateX: translate }] }], children: /* @__PURE__ */ jsxs23(Svg12, { width: "100%", height: "100%", preserveAspectRatio: "none", children: [
1806
2585
  gradient,
1807
- /* @__PURE__ */ jsx22(Rect3, { x: 0, y: 0, width: "100%", height: "100%", fill: `url(#${id})` })
2586
+ /* @__PURE__ */ jsx27(Rect3, { x: 0, y: 0, width: "100%", height: "100%", fill: `url(#${id})` })
1808
2587
  ] }) })
1809
2588
  }
1810
2589
  );
1811
2590
  }
1812
- var styles13 = StyleSheet13.create({
2591
+ var styles18 = StyleSheet18.create({
1813
2592
  ring: { alignItems: "center", justifyContent: "center" },
1814
2593
  bar: { width: "100%", overflow: "hidden", borderRadius: 9999 },
1815
2594
  fill: { height: "100%", overflow: "hidden", borderRadius: 9999 }
1816
2595
  });
1817
2596
 
1818
2597
  // src/native/search-field.tsx
1819
- import * as React15 from "react";
1820
- import { Pressable as Pressable5, StyleSheet as StyleSheet14, TextInput, View as View18 } from "react-native";
1821
- import Svg11, { Circle as Circle9, Path as Path9 } from "react-native-svg";
1822
- import { jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
2598
+ import * as React20 from "react";
2599
+ import { Pressable as Pressable8, StyleSheet as StyleSheet19, TextInput as TextInput3, View as View23 } from "react-native";
2600
+ import Svg13, { Circle as Circle9, Path as Path11 } from "react-native-svg";
2601
+ import { jsx as jsx28, jsxs as jsxs24 } from "react/jsx-runtime";
1823
2602
  function SearchField({ label, value, defaultValue = "", onValueChange, onSearch, debounce = 300, onSubmit, clearLabel, style, placeholder, ...props }) {
1824
2603
  const { theme, radius: radius3 } = useTheme();
1825
- const [own, setOwn] = React15.useState(defaultValue);
2604
+ const [own, setOwn] = React20.useState(defaultValue);
1826
2605
  const query = value ?? own;
1827
- const timer2 = React15.useRef(void 0);
1828
- React15.useEffect(() => () => clearTimeout(timer2.current), []);
2606
+ const timer2 = React20.useRef(void 0);
2607
+ React20.useEffect(() => () => clearTimeout(timer2.current), []);
1829
2608
  const change = (next) => {
1830
2609
  if (value === void 0) setOwn(next);
1831
2610
  onValueChange?.(next);
1832
2611
  clearTimeout(timer2.current);
1833
2612
  if (onSearch) timer2.current = setTimeout(() => onSearch(next), debounce);
1834
2613
  };
1835
- return /* @__PURE__ */ jsxs19(View18, { style: [styles14.frame, { borderRadius: radius3.md, borderColor: theme.borderDefault, backgroundColor: theme.surface2 }, style], children: [
1836
- /* @__PURE__ */ jsxs19(Svg11, { width: 18, height: 18, viewBox: "0 0 24 24", fill: "none", stroke: theme.textSecondary, strokeWidth: 2, strokeLinecap: "round", "aria-hidden": true, children: [
1837
- /* @__PURE__ */ jsx23(Circle9, { cx: 11, cy: 11, r: 7 }),
1838
- /* @__PURE__ */ jsx23(Path9, { d: "m20 20-3.5-3.5" })
2614
+ return /* @__PURE__ */ jsxs24(View23, { style: [styles19.frame, { borderRadius: radius3.md, borderColor: theme.borderDefault, backgroundColor: theme.surface2 }, style], children: [
2615
+ /* @__PURE__ */ jsxs24(Svg13, { width: 18, height: 18, viewBox: "0 0 24 24", fill: "none", stroke: theme.textSecondary, strokeWidth: 2, strokeLinecap: "round", "aria-hidden": true, children: [
2616
+ /* @__PURE__ */ jsx28(Circle9, { cx: 11, cy: 11, r: 7 }),
2617
+ /* @__PURE__ */ jsx28(Path11, { d: "m20 20-3.5-3.5" })
1839
2618
  ] }),
1840
- /* @__PURE__ */ jsx23(
1841
- TextInput,
2619
+ /* @__PURE__ */ jsx28(
2620
+ TextInput3,
1842
2621
  {
1843
2622
  role: "searchbox",
1844
2623
  "aria-label": label,
@@ -1855,34 +2634,34 @@ function SearchField({ label, value, defaultValue = "", onValueChange, onSearch,
1855
2634
  onSearch?.(query);
1856
2635
  onSubmit?.(query);
1857
2636
  },
1858
- style: [styles14.input, { color: theme.textPrimary }],
2637
+ style: [styles19.input, { color: theme.textPrimary }],
1859
2638
  ...props
1860
2639
  }
1861
2640
  ),
1862
- query ? /* @__PURE__ */ jsx23(Pressable5, { role: "button", "aria-label": clearLabel, hitSlop: 10, onPress: () => change(""), style: styles14.clear, children: /* @__PURE__ */ jsx23(Svg11, { width: 16, height: 16, viewBox: "0 0 24 24", fill: "none", stroke: theme.textSecondary, strokeWidth: 2.4, strokeLinecap: "round", "aria-hidden": true, children: /* @__PURE__ */ jsx23(Path9, { d: "M18 6 6 18M6 6l12 12" }) }) }) : null
2641
+ query ? /* @__PURE__ */ jsx28(Pressable8, { role: "button", "aria-label": clearLabel, hitSlop: 10, onPress: () => change(""), style: styles19.clear, children: /* @__PURE__ */ jsx28(Svg13, { width: 16, height: 16, viewBox: "0 0 24 24", fill: "none", stroke: theme.textSecondary, strokeWidth: 2.4, strokeLinecap: "round", "aria-hidden": true, children: /* @__PURE__ */ jsx28(Path11, { d: "M18 6 6 18M6 6l12 12" }) }) }) : null
1863
2642
  ] });
1864
2643
  }
1865
- var styles14 = StyleSheet14.create({
1866
- frame: { flexDirection: "row", alignItems: "center", gap: 8, height: 44, paddingLeft: 12, paddingRight: 6, borderWidth: StyleSheet14.hairlineWidth },
2644
+ var styles19 = StyleSheet19.create({
2645
+ frame: { flexDirection: "row", alignItems: "center", gap: 8, height: 44, paddingLeft: 12, paddingRight: 6, borderWidth: StyleSheet19.hairlineWidth },
1867
2646
  input: { flex: 1, height: "100%", fontSize: 15, paddingVertical: 0 },
1868
2647
  clear: { width: 32, height: 32, alignItems: "center", justifyContent: "center" }
1869
2648
  });
1870
2649
 
1871
2650
  // src/native/segmented.tsx
1872
- import { Pressable as Pressable6, StyleSheet as StyleSheet15, Text as Text7, View as View19 } from "react-native";
1873
- import { jsx as jsx24 } from "react/jsx-runtime";
2651
+ import { Pressable as Pressable9, StyleSheet as StyleSheet20, Text as Text12, View as View24 } from "react-native";
2652
+ import { jsx as jsx29 } from "react/jsx-runtime";
1874
2653
  function Segmented({ options, value, onValueChange, size = "md", "aria-label": label, style }) {
1875
2654
  const { theme, radius: radius3 } = useTheme();
1876
- return /* @__PURE__ */ jsx24(
1877
- View19,
2655
+ return /* @__PURE__ */ jsx29(
2656
+ View24,
1878
2657
  {
1879
2658
  role: "tablist",
1880
2659
  "aria-label": label,
1881
- style: [styles15.track, { backgroundColor: theme.surface2, borderColor: theme.borderSubtle, borderRadius: radius3.md, height: size === "sm" ? 32 : 40 }, style],
2660
+ style: [styles20.track, { backgroundColor: theme.surface2, borderColor: theme.borderSubtle, borderRadius: radius3.md, height: size === "sm" ? 32 : 40 }, style],
1882
2661
  children: options.map((option) => {
1883
2662
  const selected = option.value === value;
1884
- return /* @__PURE__ */ jsx24(
1885
- Pressable6,
2663
+ return /* @__PURE__ */ jsx29(
2664
+ Pressable9,
1886
2665
  {
1887
2666
  role: "tab",
1888
2667
  "aria-selected": selected,
@@ -1892,12 +2671,12 @@ function Segmented({ options, value, onValueChange, size = "md", "aria-label": l
1892
2671
  if (!selected) onValueChange(option.value);
1893
2672
  },
1894
2673
  style: [
1895
- styles15.segment,
2674
+ styles20.segment,
1896
2675
  { borderRadius: radius3.sm },
1897
2676
  selected ? { backgroundColor: theme.surface0, borderColor: theme.borderDefault } : null,
1898
- option.disabled ? styles15.disabled : null
2677
+ option.disabled ? styles20.disabled : null
1899
2678
  ],
1900
- children: /* @__PURE__ */ jsx24(Text7, { numberOfLines: 1, style: [styles15.label, { color: selected ? theme.textPrimary : theme.textSecondary, fontSize: size === "sm" ? 12 : 13 }], children: option.label })
2679
+ children: /* @__PURE__ */ jsx29(Text12, { numberOfLines: 1, style: [styles20.label, { color: selected ? theme.textPrimary : theme.textSecondary, fontSize: size === "sm" ? 12 : 13 }], children: option.label })
1901
2680
  },
1902
2681
  option.value
1903
2682
  );
@@ -1905,17 +2684,17 @@ function Segmented({ options, value, onValueChange, size = "md", "aria-label": l
1905
2684
  }
1906
2685
  );
1907
2686
  }
1908
- var styles15 = StyleSheet15.create({
1909
- track: { flexDirection: "row", padding: 3, gap: 3, borderWidth: StyleSheet15.hairlineWidth },
1910
- segment: { flex: 1, alignItems: "center", justifyContent: "center", paddingHorizontal: 8, borderWidth: StyleSheet15.hairlineWidth, borderColor: "transparent" },
2687
+ var styles20 = StyleSheet20.create({
2688
+ track: { flexDirection: "row", padding: 3, gap: 3, borderWidth: StyleSheet20.hairlineWidth },
2689
+ segment: { flex: 1, alignItems: "center", justifyContent: "center", paddingHorizontal: 8, borderWidth: StyleSheet20.hairlineWidth, borderColor: "transparent" },
1911
2690
  label: { fontWeight: "600" },
1912
2691
  disabled: { opacity: 0.4 }
1913
2692
  });
1914
2693
 
1915
2694
  // src/native/skeleton.tsx
1916
- import * as React16 from "react";
2695
+ import * as React21 from "react";
1917
2696
  import { Animated as Animated12 } from "react-native";
1918
- import { jsx as jsx25 } from "react/jsx-runtime";
2697
+ import { jsx as jsx30 } from "react/jsx-runtime";
1919
2698
  var SHAPE = {
1920
2699
  text: { width: "100%", height: 12, radius: 4 },
1921
2700
  circle: { width: 40, height: 40, radius: 9999 },
@@ -1924,8 +2703,8 @@ var SHAPE = {
1924
2703
  function Skeleton({ shape = "text", width, height, style, testID }) {
1925
2704
  const { theme } = useTheme();
1926
2705
  const reduce = useReducedMotion();
1927
- const [opacity] = React16.useState(() => new Animated12.Value(1));
1928
- React16.useEffect(() => {
2706
+ const [opacity] = React21.useState(() => new Animated12.Value(1));
2707
+ React21.useEffect(() => {
1929
2708
  if (reduce) return;
1930
2709
  const loop = Animated12.loop(
1931
2710
  Animated12.sequence([
@@ -1941,7 +2720,7 @@ function Skeleton({ shape = "text", width, height, style, testID }) {
1941
2720
  }, [reduce, opacity]);
1942
2721
  const s = SHAPE[shape];
1943
2722
  const side = shape === "circle" ? width ?? height ?? s.width : void 0;
1944
- return /* @__PURE__ */ jsx25(
2723
+ return /* @__PURE__ */ jsx30(
1945
2724
  Animated12.View,
1946
2725
  {
1947
2726
  testID,
@@ -1956,10 +2735,10 @@ function Skeleton({ shape = "text", width, height, style, testID }) {
1956
2735
 
1957
2736
  // src/native/spinner.tsx
1958
2737
  import { ActivityIndicator as ActivityIndicator2 } from "react-native";
1959
- import { jsx as jsx26 } from "react/jsx-runtime";
2738
+ import { jsx as jsx31 } from "react/jsx-runtime";
1960
2739
  function Spinner({ label, size = "md", ...props }) {
1961
2740
  const { theme } = useTheme();
1962
- return /* @__PURE__ */ jsx26(
2741
+ return /* @__PURE__ */ jsx31(
1963
2742
  ActivityIndicator2,
1964
2743
  {
1965
2744
  accessible: true,
@@ -1974,9 +2753,9 @@ function Spinner({ label, size = "md", ...props }) {
1974
2753
  }
1975
2754
 
1976
2755
  // src/native/toast.tsx
1977
- import * as React17 from "react";
1978
- import { AccessibilityInfo as AccessibilityInfo8, Animated as Animated13, Pressable as Pressable7, StyleSheet as StyleSheet16, Text as Text8, View as View20 } from "react-native";
1979
- import { Fragment as Fragment3, jsx as jsx27, jsxs as jsxs20 } from "react/jsx-runtime";
2756
+ import * as React22 from "react";
2757
+ import { AccessibilityInfo as AccessibilityInfo8, Animated as Animated13, Pressable as Pressable10, StyleSheet as StyleSheet21, Text as Text13, View as View25 } from "react-native";
2758
+ import { Fragment as Fragment3, jsx as jsx32, jsxs as jsxs25 } from "react/jsx-runtime";
1980
2759
  var items = [];
1981
2760
  var listeners2 = /* @__PURE__ */ new Set();
1982
2761
  var counter = 0;
@@ -2011,76 +2790,76 @@ var toast = Object.assign(show, {
2011
2790
  function ToastView({ item, closeLabel, duration }) {
2012
2791
  const { theme, radius: radius3 } = useTheme();
2013
2792
  const reduce = useReducedMotion();
2014
- const [enter] = React17.useState(() => new Animated13.Value(reduce ? 1 : 0));
2015
- React17.useEffect(() => {
2793
+ const [enter] = React22.useState(() => new Animated13.Value(reduce ? 1 : 0));
2794
+ React22.useEffect(() => {
2016
2795
  if (reduce) enter.setValue(1);
2017
2796
  else Animated13.timing(enter, { toValue: 1, duration: 220, useNativeDriver: true }).start();
2018
2797
  }, [enter, reduce]);
2019
- React17.useEffect(() => {
2798
+ React22.useEffect(() => {
2020
2799
  AccessibilityInfo8.announceForAccessibility(item.description ? `${item.title}. ${item.description}` : item.title);
2021
2800
  }, [item.title, item.description]);
2022
2801
  const ms = item.duration ?? duration;
2023
- React17.useEffect(() => {
2802
+ React22.useEffect(() => {
2024
2803
  if (!Number.isFinite(ms)) return;
2025
2804
  const timer2 = setTimeout(() => dismiss(item.id), ms);
2026
2805
  return () => clearTimeout(timer2);
2027
2806
  }, [item.id, ms]);
2028
2807
  const edge = { success: theme.success, warning: theme.warning, error: theme.danger, info: theme.info, default: theme.borderDefault }[item.tone ?? "default"];
2029
- const text = /* @__PURE__ */ jsxs20(Fragment3, { children: [
2030
- item.icon ? /* @__PURE__ */ jsx27(View20, { "aria-hidden": true, children: item.icon }) : null,
2031
- /* @__PURE__ */ jsxs20(View20, { style: styles16.content, children: [
2032
- /* @__PURE__ */ jsx27(Txt, { variant: "label", numberOfLines: 2, children: item.title }),
2033
- item.description ? /* @__PURE__ */ jsx27(Txt, { variant: "caption", tone: "secondary", numberOfLines: 3, children: item.description }) : null
2808
+ const text = /* @__PURE__ */ jsxs25(Fragment3, { children: [
2809
+ item.icon ? /* @__PURE__ */ jsx32(View25, { "aria-hidden": true, children: item.icon }) : null,
2810
+ /* @__PURE__ */ jsxs25(View25, { style: styles21.content, children: [
2811
+ /* @__PURE__ */ jsx32(Txt, { variant: "label", numberOfLines: 2, children: item.title }),
2812
+ item.description ? /* @__PURE__ */ jsx32(Txt, { variant: "caption", tone: "secondary", numberOfLines: 3, children: item.description }) : null
2034
2813
  ] })
2035
2814
  ] });
2036
- const body = /* @__PURE__ */ jsxs20(Fragment3, { children: [
2037
- item.onPress ? /* @__PURE__ */ jsx27(
2038
- Pressable7,
2815
+ const body = /* @__PURE__ */ jsxs25(Fragment3, { children: [
2816
+ item.onPress ? /* @__PURE__ */ jsx32(
2817
+ Pressable10,
2039
2818
  {
2040
2819
  role: "button",
2041
2820
  onPress: () => {
2042
2821
  item.onPress?.();
2043
2822
  dismiss(item.id);
2044
2823
  },
2045
- style: ({ pressed }) => [styles16.main, { opacity: pressed ? 0.8 : 1 }],
2824
+ style: ({ pressed }) => [styles21.main, { opacity: pressed ? 0.8 : 1 }],
2046
2825
  children: text
2047
2826
  }
2048
- ) : /* @__PURE__ */ jsx27(View20, { style: styles16.main, children: text }),
2049
- item.action ? /* @__PURE__ */ jsx27(
2050
- Pressable7,
2827
+ ) : /* @__PURE__ */ jsx32(View25, { style: styles21.main, children: text }),
2828
+ item.action ? /* @__PURE__ */ jsx32(
2829
+ Pressable10,
2051
2830
  {
2052
2831
  role: "button",
2053
2832
  onPress: () => {
2054
2833
  item.action?.onPress();
2055
2834
  dismiss(item.id);
2056
2835
  },
2057
- style: [styles16.action, { backgroundColor: theme.accent, borderRadius: radius3.sm }],
2058
- children: /* @__PURE__ */ jsx27(Text8, { style: [styles16.actionLabel, { color: theme.onAccent }], children: item.action.label })
2836
+ style: [styles21.action, { backgroundColor: theme.accent, borderRadius: radius3.sm }],
2837
+ children: /* @__PURE__ */ jsx32(Text13, { style: [styles21.actionLabel, { color: theme.onAccent }], children: item.action.label })
2059
2838
  }
2060
2839
  ) : null,
2061
- /* @__PURE__ */ jsx27(Pressable7, { role: "button", "aria-label": closeLabel, hitSlop: 10, onPress: () => dismiss(item.id), style: styles16.close, children: /* @__PURE__ */ jsx27(Text8, { style: [styles16.cross, { color: theme.textSecondary }], children: "\xD7" }) })
2840
+ /* @__PURE__ */ jsx32(Pressable10, { role: "button", "aria-label": closeLabel, hitSlop: 10, onPress: () => dismiss(item.id), style: styles21.close, children: /* @__PURE__ */ jsx32(Text13, { style: [styles21.cross, { color: theme.textSecondary }], children: "\xD7" }) })
2062
2841
  ] });
2063
2842
  const frame = [
2064
- styles16.toast,
2843
+ styles21.toast,
2065
2844
  { backgroundColor: theme.surface2, borderColor: theme.borderDefault, borderLeftColor: edge, borderRadius: radius3.lg, shadowColor: theme.scrimStrong }
2066
2845
  ];
2067
2846
  const motion3 = { transform: [{ translateY: enter.interpolate({ inputRange: [0, 1], outputRange: [-8, 0] }) }] };
2068
- return /* @__PURE__ */ jsx27(Animated13.View, { "aria-live": "polite", style: motion3, children: /* @__PURE__ */ jsx27(View20, { style: frame, children: body }) });
2847
+ return /* @__PURE__ */ jsx32(Animated13.View, { "aria-live": "polite", style: motion3, children: /* @__PURE__ */ jsx32(View25, { style: frame, children: body }) });
2069
2848
  }
2070
2849
  function Toaster({ closeLabel, position = "top", offset = 12, duration = 6e3, max = 3 }) {
2071
- const all = React17.useSyncExternalStore(subscribe2, snapshot, snapshot);
2850
+ const all = React22.useSyncExternalStore(subscribe2, snapshot, snapshot);
2072
2851
  const shown = all.slice(-max);
2073
2852
  if (shown.length === 0) return null;
2074
- return /* @__PURE__ */ jsx27(View20, { pointerEvents: "box-none", style: [styles16.stack, position === "top" ? { top: offset } : { bottom: offset }], children: (position === "top" ? shown : [...shown].reverse()).map((item) => /* @__PURE__ */ jsx27(ToastView, { item, closeLabel, duration }, item.id)) });
2853
+ return /* @__PURE__ */ jsx32(View25, { pointerEvents: "box-none", style: [styles21.stack, position === "top" ? { top: offset } : { bottom: offset }], children: (position === "top" ? shown : [...shown].reverse()).map((item) => /* @__PURE__ */ jsx32(ToastView, { item, closeLabel, duration }, item.id)) });
2075
2854
  }
2076
- var styles16 = StyleSheet16.create({
2855
+ var styles21 = StyleSheet21.create({
2077
2856
  stack: { position: "absolute", left: 12, right: 12, gap: 8, zIndex: 100 },
2078
2857
  toast: {
2079
2858
  flexDirection: "row",
2080
2859
  alignItems: "center",
2081
2860
  gap: 10,
2082
2861
  padding: 12,
2083
- borderWidth: StyleSheet16.hairlineWidth,
2862
+ borderWidth: StyleSheet21.hairlineWidth,
2084
2863
  borderLeftWidth: 4,
2085
2864
  shadowOpacity: 0.3,
2086
2865
  shadowRadius: 16,
@@ -2100,6 +2879,7 @@ export {
2100
2879
  AvatarRoot,
2101
2880
  Badge,
2102
2881
  Button,
2882
+ Calendar,
2103
2883
  Card,
2104
2884
  CardBody,
2105
2885
  CardDescription,
@@ -2109,8 +2889,12 @@ export {
2109
2889
  CardOverlay,
2110
2890
  CardRoot,
2111
2891
  CardTitle,
2892
+ Checkbox,
2112
2893
  Chip,
2113
2894
  Countdown,
2895
+ DateField,
2896
+ DateWheel,
2897
+ DayStrip,
2114
2898
  EmptyState,
2115
2899
  ErrorState,
2116
2900
  GoalGauge,
@@ -2119,6 +2903,7 @@ export {
2119
2903
  LoadingState,
2120
2904
  Mascot,
2121
2905
  MascotState,
2906
+ MonthPicker,
2122
2907
  OrazakaMark,
2123
2908
  OrochiaMark,
2124
2909
  Pagination,
@@ -2131,18 +2916,39 @@ export {
2131
2916
  Skeleton,
2132
2917
  Spinner,
2133
2918
  SuccessState,
2919
+ TextField,
2134
2920
  ThemeProvider,
2921
+ TimePicker,
2135
2922
  Toaster,
2136
2923
  Txt,
2137
2924
  WelcomeState,
2925
+ Wheel,
2926
+ WheelDivider,
2927
+ WheelPicker,
2138
2928
  YazakiaMark,
2139
2929
  YororisMark,
2930
+ addDays,
2931
+ addMonths,
2932
+ ageOn,
2140
2933
  alpha,
2934
+ calendarLabels,
2935
+ composeDate,
2936
+ dateFieldLabels,
2937
+ datePartsOrder,
2938
+ daysInMonth,
2939
+ formatTime,
2940
+ isRealDate,
2941
+ latestBirthDate,
2942
+ monthNames,
2141
2943
  splitDuration,
2142
2944
  textStyles,
2945
+ timeSlots,
2946
+ timeToMinutes,
2143
2947
  toast,
2948
+ todayIso,
2144
2949
  useCountdown,
2145
2950
  useReducedMotion,
2146
- useTheme
2951
+ useTheme,
2952
+ uses12Hours
2147
2953
  };
2148
2954
  //# sourceMappingURL=native.js.map