@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.
- package/README.md +1 -1
- package/dist/achievement.js +1 -1
- package/dist/action-bar.js +1 -1
- package/dist/app-shell.js +1 -1
- package/dist/argument-card.js +2 -2
- package/dist/card-grid.js +1 -1
- package/dist/card.js +1 -1
- package/dist/choice-grid.js +1 -1
- package/dist/{chunk-OGJI5X4W.js → chunk-2PUDI7JS.js} +2 -2
- package/dist/chunk-4LOMIQVX.js +21 -0
- package/dist/chunk-4LOMIQVX.js.map +1 -0
- package/dist/{chunk-K3SWZXYT.js → chunk-DGQMDJXK.js} +2 -2
- package/dist/chunk-G3ETON2A.js +22 -0
- package/dist/chunk-G3ETON2A.js.map +1 -0
- package/dist/chunk-I5RVM5CW.js +27 -0
- package/dist/chunk-I5RVM5CW.js.map +1 -0
- package/dist/chunk-IZ7MV6HM.js +26 -0
- package/dist/chunk-IZ7MV6HM.js.map +1 -0
- package/dist/chunk-ZNMFG62E.js +20 -0
- package/dist/chunk-ZNMFG62E.js.map +1 -0
- package/dist/cn.d.ts +9 -1
- package/dist/cn.js +5 -3
- package/dist/code-block.js +1 -1
- package/dist/command.js +1 -1
- package/dist/confirm-button.js +1 -1
- package/dist/continue-prompt.js +1 -1
- package/dist/cta-panel.js +1 -1
- package/dist/data-table.js +2 -2
- package/dist/date-picker.d.ts +650 -61
- package/dist/date-picker.js +918 -122
- package/dist/date-picker.js.map +1 -1
- package/dist/decision-list.js +1 -1
- package/dist/dropdown-menu.js +1 -1
- package/dist/error-page.js +1 -1
- package/dist/field.js +1 -1
- package/dist/filter-bar.js +2 -2
- package/dist/form/server.d.ts +96 -0
- package/dist/form/server.js +82 -0
- package/dist/form/server.js.map +1 -0
- package/dist/form.d.ts +503 -0
- package/dist/form.js +760 -0
- package/dist/form.js.map +1 -0
- package/dist/gallery-page.js +1 -1
- package/dist/glow-card.js +1 -1
- package/dist/goal-gauge.js +1 -1
- package/dist/how-it-works-page.js +1 -1
- package/dist/landscape.js +1 -1
- package/dist/link-card.js +1 -1
- package/dist/longform-page.js +1 -1
- package/dist/marquee.js +1 -1
- package/dist/mascot-quote.js +1 -1
- package/dist/motion.css +18 -1
- package/dist/native/form.d.ts +376 -0
- package/dist/native/form.js +650 -0
- package/dist/native/form.js.map +1 -0
- package/dist/native.d.ts +351 -3
- package/dist/native.js +1205 -399
- package/dist/native.js.map +1 -1
- package/dist/nav-bar.js +1 -1
- package/dist/page-hero.js +2 -2
- package/dist/page.js +2 -2
- package/dist/popover.js +1 -1
- package/dist/pricing-page.js +1 -1
- package/dist/product-page.js +1 -1
- package/dist/profile-card.js +1 -1
- package/dist/promise-card.js +1 -1
- package/dist/scroll-stage.js +1 -1
- package/dist/stage-banner.js +1 -1
- package/dist/terminal-replay.js +1 -1
- package/dist/toast.js +1 -1
- package/dist/toc.js +1 -1
- package/dist/tooltip.js +1 -1
- package/package.json +50 -7
- package/registry/achievement.json +1 -1
- package/registry/action-bar.json +1 -1
- package/registry/alert.json +1 -1
- package/registry/app-shell.json +1 -1
- package/registry/argument-card.json +1 -1
- package/registry/audio-player.json +1 -1
- package/registry/auth-layout.json +1 -1
- package/registry/avatar.json +1 -1
- package/registry/badge.json +1 -1
- package/registry/button.json +1 -1
- package/registry/card-grid.json +1 -1
- package/registry/card.json +1 -1
- package/registry/catalogue-page.json +1 -1
- package/registry/changelog-page.json +1 -1
- package/registry/checkbox.json +89 -4
- package/registry/chip-link.json +1 -1
- package/registry/chip.json +1 -1
- package/registry/choice-grid.json +1 -1
- package/registry/cn.json +1 -1
- package/registry/code-block.json +1 -1
- package/registry/combobox.json +1 -1
- package/registry/command.json +1 -1
- package/registry/component-page.json +1 -1
- package/registry/confirm-button.json +1 -1
- package/registry/contact-page.json +1 -1
- package/registry/continue-prompt.json +1 -1
- package/registry/countdown.json +1 -1
- package/registry/cta-panel.json +1 -1
- package/registry/dashboard-layout.json +1 -1
- package/registry/data-table.json +1 -1
- package/registry/date-picker.json +1811 -236
- package/registry/decision-list.json +1 -1
- package/registry/detail-layout.json +1 -1
- package/registry/dialog.json +1 -1
- package/registry/docs-article-page.json +1 -1
- package/registry/docs-hub-page.json +1 -1
- package/registry/docs-layout.json +1 -1
- package/registry/dropdown-menu.json +1 -1
- package/registry/empty-state.json +1 -1
- package/registry/error-page.json +1 -1
- package/registry/examples/checkbox/native/terms.d.ts +4 -0
- package/registry/examples/checkbox/native/terms.dark.png +0 -0
- package/registry/examples/checkbox/native/terms.js +26 -0
- package/registry/examples/checkbox/native/terms.light.png +0 -0
- package/registry/examples/checkbox/native/terms.tsx +28 -0
- package/registry/examples/date-picker/birth-date-wheel.d.ts +4 -0
- package/registry/examples/date-picker/birth-date-wheel.js +13 -0
- package/registry/examples/date-picker/birth-date-wheel.tsx +11 -0
- package/registry/examples/date-picker/birth-date.d.ts +4 -0
- package/registry/examples/date-picker/birth-date.js +25 -0
- package/registry/examples/date-picker/birth-date.tsx +21 -0
- package/registry/examples/date-picker/calendar.js +1 -1
- package/registry/examples/date-picker/calendar.tsx +2 -6
- package/registry/examples/date-picker/day-strip.d.ts +4 -0
- package/registry/examples/date-picker/day-strip.js +28 -0
- package/registry/examples/date-picker/day-strip.tsx +27 -0
- package/registry/examples/date-picker/month-year.d.ts +4 -0
- package/registry/examples/date-picker/month-year.js +13 -0
- package/registry/examples/date-picker/month-year.tsx +10 -0
- package/registry/examples/date-picker/native/birth-date-wheel.d.ts +4 -0
- package/registry/examples/date-picker/native/birth-date-wheel.dark.png +0 -0
- package/registry/examples/date-picker/native/birth-date-wheel.js +13 -0
- package/registry/examples/date-picker/native/birth-date-wheel.light.png +0 -0
- package/registry/examples/date-picker/native/birth-date-wheel.tsx +9 -0
- package/registry/examples/date-picker/native/birth-date.d.ts +4 -0
- package/registry/examples/date-picker/native/birth-date.dark.png +0 -0
- package/registry/examples/date-picker/native/birth-date.js +30 -0
- package/registry/examples/date-picker/native/birth-date.light.png +0 -0
- package/registry/examples/date-picker/native/birth-date.tsx +27 -0
- package/registry/examples/date-picker/native/calendar.d.ts +4 -0
- package/registry/examples/date-picker/native/calendar.dark.png +0 -0
- package/registry/examples/date-picker/native/calendar.js +13 -0
- package/registry/examples/date-picker/native/calendar.light.png +0 -0
- package/registry/examples/date-picker/native/calendar.tsx +8 -0
- package/registry/examples/date-picker/native/day-strip.d.ts +4 -0
- package/registry/examples/date-picker/native/day-strip.dark.png +0 -0
- package/registry/examples/date-picker/native/day-strip.js +29 -0
- package/registry/examples/date-picker/native/day-strip.light.png +0 -0
- package/registry/examples/date-picker/native/day-strip.tsx +26 -0
- package/registry/examples/date-picker/native/month-year.d.ts +4 -0
- package/registry/examples/date-picker/native/month-year.dark.png +0 -0
- package/registry/examples/date-picker/native/month-year.js +13 -0
- package/registry/examples/date-picker/native/month-year.light.png +0 -0
- package/registry/examples/date-picker/native/month-year.tsx +8 -0
- package/registry/examples/date-picker/native/time-slots.d.ts +4 -0
- package/registry/examples/date-picker/native/time-slots.dark.png +0 -0
- package/registry/examples/date-picker/native/time-slots.js +15 -0
- package/registry/examples/date-picker/native/time-slots.light.png +0 -0
- package/registry/examples/date-picker/native/time-slots.tsx +15 -0
- package/registry/examples/date-picker/native/time-wheel.d.ts +4 -0
- package/registry/examples/date-picker/native/time-wheel.dark.png +0 -0
- package/registry/examples/date-picker/native/time-wheel.js +13 -0
- package/registry/examples/date-picker/native/time-wheel.light.png +0 -0
- package/registry/examples/date-picker/native/time-wheel.tsx +8 -0
- package/registry/examples/date-picker/time-slots.d.ts +4 -0
- package/registry/examples/date-picker/time-slots.js +26 -0
- package/registry/examples/date-picker/time-slots.tsx +25 -0
- package/registry/examples/date-picker/time-wheel.d.ts +4 -0
- package/registry/examples/date-picker/time-wheel.js +13 -0
- package/registry/examples/date-picker/time-wheel.tsx +10 -0
- package/registry/examples/date-picker/wheel.d.ts +4 -0
- package/registry/examples/date-picker/wheel.js +14 -0
- package/registry/examples/date-picker/wheel.tsx +16 -0
- package/registry/examples/field/native/default.d.ts +4 -0
- package/registry/examples/field/native/default.dark.png +0 -0
- package/registry/examples/field/native/default.js +29 -0
- package/registry/examples/field/native/default.light.png +0 -0
- package/registry/examples/field/native/default.tsx +23 -0
- package/registry/examples/form/amount.d.ts +4 -0
- package/registry/examples/form/amount.js +30 -0
- package/registry/examples/form/amount.tsx +36 -0
- package/registry/examples/form/audience.d.ts +4 -0
- package/registry/examples/form/audience.js +29 -0
- package/registry/examples/form/audience.tsx +31 -0
- package/registry/examples/form/native/amount.d.ts +4 -0
- package/registry/examples/form/native/amount.dark.png +0 -0
- package/registry/examples/form/native/amount.js +26 -0
- package/registry/examples/form/native/amount.light.png +0 -0
- package/registry/examples/form/native/amount.tsx +30 -0
- package/registry/examples/form/native/audience.d.ts +4 -0
- package/registry/examples/form/native/audience.dark.png +0 -0
- package/registry/examples/form/native/audience.js +24 -0
- package/registry/examples/form/native/audience.light.png +0 -0
- package/registry/examples/form/native/audience.tsx +24 -0
- package/registry/examples/form/native/profile.d.ts +4 -0
- package/registry/examples/form/native/profile.dark.png +0 -0
- package/registry/examples/form/native/profile.js +33 -0
- package/registry/examples/form/native/profile.light.png +0 -0
- package/registry/examples/form/native/profile.tsx +36 -0
- package/registry/examples/form/native/settings.d.ts +4 -0
- package/registry/examples/form/native/settings.dark.png +0 -0
- package/registry/examples/form/native/settings.js +25 -0
- package/registry/examples/form/native/settings.light.png +0 -0
- package/registry/examples/form/native/settings.tsx +23 -0
- package/registry/examples/form/native/sign-up.d.ts +4 -0
- package/registry/examples/form/native/sign-up.dark.png +0 -0
- package/registry/examples/form/native/sign-up.js +38 -0
- package/registry/examples/form/native/sign-up.light.png +0 -0
- package/registry/examples/form/native/sign-up.tsx +34 -0
- package/registry/examples/form/native/upload.d.ts +4 -0
- package/registry/examples/form/native/upload.dark.png +0 -0
- package/registry/examples/form/native/upload.js +23 -0
- package/registry/examples/form/native/upload.light.png +0 -0
- package/registry/examples/form/native/upload.tsx +22 -0
- package/registry/examples/form/profile.d.ts +4 -0
- package/registry/examples/form/profile.js +35 -0
- package/registry/examples/form/profile.tsx +40 -0
- package/registry/examples/form/report.d.ts +4 -0
- package/registry/examples/form/report.js +30 -0
- package/registry/examples/form/report.tsx +30 -0
- package/registry/examples/form/settings.d.ts +4 -0
- package/registry/examples/form/settings.js +30 -0
- package/registry/examples/form/settings.tsx +31 -0
- package/registry/examples/form/sign-up.d.ts +4 -0
- package/registry/examples/form/sign-up.js +38 -0
- package/registry/examples/form/sign-up.tsx +37 -0
- package/registry/examples/form/upload.d.ts +4 -0
- package/registry/examples/form/upload.js +32 -0
- package/registry/examples/form/upload.tsx +32 -0
- package/registry/field.json +104 -4
- package/registry/file-upload.json +1 -1
- package/registry/filter-bar.json +1 -1
- package/registry/form.json +2940 -0
- package/registry/gallery-page.json +1 -1
- package/registry/glow-card.json +1 -1
- package/registry/goal-gauge.json +1 -1
- package/registry/how-it-works-page.json +1 -1
- package/registry/image-cropper.json +1 -1
- package/registry/index.json +43 -10
- package/registry/iso.json +1 -1
- package/registry/kbd.json +1 -1
- package/registry/landing-page.json +1 -1
- package/registry/landscape.json +1 -1
- package/registry/legal-page.json +1 -1
- package/registry/link-card.json +1 -1
- package/registry/loader.json +1 -1
- package/registry/longform-page.json +1 -1
- package/registry/marketing-layout.json +1 -1
- package/registry/marquee.json +1 -1
- package/registry/mascot-quote.json +1 -1
- package/registry/mascot-state.json +2 -2
- package/registry/mascots.json +2 -2
- package/registry/media-capture.json +1 -1
- package/registry/meter.json +1 -1
- package/registry/nav-bar.json +1 -1
- package/registry/number-ticker.json +1 -1
- package/registry/page-header.json +1 -1
- package/registry/page-hero.json +1 -1
- package/registry/page.json +1 -1
- package/registry/pagination.json +1 -1
- package/registry/pointer-light.json +1 -1
- package/registry/popover.json +1 -1
- package/registry/pricing-page.json +1 -1
- package/registry/product-page.json +1 -1
- package/registry/profile-card.json +1 -1
- package/registry/progress.json +1 -1
- package/registry/promise-card.json +1 -1
- package/registry/radio-group.json +1 -1
- package/registry/scroll-stage.json +1 -1
- package/registry/search-field.json +1 -1
- package/registry/section-backdrop.json +1 -1
- package/registry/separator.json +1 -1
- package/registry/settings-layout.json +1 -1
- package/registry/skeleton.json +1 -1
- package/registry/slider.json +1 -1
- package/registry/slot.json +1 -1
- package/registry/spinner.json +1 -1
- package/registry/split-view.json +1 -1
- package/registry/stage-banner.json +1 -1
- package/registry/stat.json +1 -1
- package/registry/status-page.json +1 -1
- package/registry/stepper.json +1 -1
- package/registry/switch.json +1 -1
- package/registry/tabs.json +1 -1
- package/registry/tag-input.json +1 -1
- package/registry/terminal-replay.json +1 -1
- package/registry/theme.json +8 -1
- package/registry/toast.json +1 -1
- package/registry/toc.json +1 -1
- package/registry/tooltip.json +1 -1
- package/registry/video-player.json +1 -1
- package/registry/video-trimmer.json +1 -1
- package/registry/virtual.json +1 -1
- package/skills/date-picker/SKILL.md +43 -0
- package/skills/form/SKILL.md +44 -0
- package/dist/chunk-2USC2YT6.js +0 -17
- package/dist/chunk-2USC2YT6.js.map +0 -1
- package/dist/chunk-5AXLA4LK.js +0 -13
- package/dist/chunk-5AXLA4LK.js.map +0 -1
- package/dist/chunk-FJDSLNXK.js +0 -11
- package/dist/chunk-FJDSLNXK.js.map +0 -1
- package/dist/chunk-KNBYZGSQ.js +0 -11
- package/dist/chunk-KNBYZGSQ.js.map +0 -1
- package/dist/chunk-VCAAHCHL.js +0 -17
- package/dist/chunk-VCAAHCHL.js.map +0 -1
- /package/dist/{chunk-OGJI5X4W.js.map → chunk-2PUDI7JS.js.map} +0 -0
- /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/
|
|
699
|
+
// src/native/checkbox.tsx
|
|
576
700
|
import * as React5 from "react";
|
|
577
|
-
import { Pressable as Pressable3,
|
|
578
|
-
import
|
|
579
|
-
|
|
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__ */
|
|
582
|
-
return /* @__PURE__ */
|
|
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 =
|
|
767
|
+
const group = React6.useContext(ChipGroupContext);
|
|
586
768
|
const { theme, radius: radius3 } = useTheme();
|
|
587
|
-
const [own, setOwn] =
|
|
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__ */
|
|
599
|
-
/* @__PURE__ */
|
|
600
|
-
/* @__PURE__ */
|
|
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__ */
|
|
614
|
-
|
|
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 }) => [
|
|
623
|
-
children: /* @__PURE__ */
|
|
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] =
|
|
812
|
+
const [own, setOwn] = React6.useState(initial);
|
|
631
813
|
const current = props.value ?? own;
|
|
632
|
-
const context =
|
|
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__ */
|
|
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
|
|
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
|
|
662
|
-
import { Animated as Animated2, StyleSheet as
|
|
663
|
-
import { jsx as
|
|
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] =
|
|
672
|
-
|
|
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__ */
|
|
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: [
|
|
876
|
+
style: [styles8.root, style],
|
|
695
877
|
children: [
|
|
696
|
-
showLabel ? /* @__PURE__ */
|
|
697
|
-
parts.map(([value, unit], i) => /* @__PURE__ */
|
|
698
|
-
/* @__PURE__ */
|
|
699
|
-
/* @__PURE__ */
|
|
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
|
|
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
|
|
715
|
-
import { jsx as
|
|
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__ */
|
|
719
|
-
icon ? /* @__PURE__ */
|
|
720
|
-
/* @__PURE__ */
|
|
721
|
-
description ? /* @__PURE__ */
|
|
722
|
-
action ? /* @__PURE__ */
|
|
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
|
|
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
|
|
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
|
|
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] =
|
|
740
|
-
|
|
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
|
|
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__ */
|
|
1542
|
+
return /* @__PURE__ */ jsx15(
|
|
764
1543
|
Animated4.View,
|
|
765
1544
|
{
|
|
766
|
-
style: [
|
|
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__ */
|
|
777
|
-
|
|
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: [
|
|
1566
|
+
style: [styles14.root, style],
|
|
788
1567
|
children: [
|
|
789
|
-
showLabel ? /* @__PURE__ */
|
|
790
|
-
/* @__PURE__ */
|
|
791
|
-
arcade ? null : /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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
|
|
814
|
-
import
|
|
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
|
|
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] =
|
|
841
|
-
const [pulse] =
|
|
842
|
-
|
|
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
|
|
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__ */
|
|
881
|
-
const dot = (c) => /* @__PURE__ */
|
|
882
|
-
/* @__PURE__ */
|
|
883
|
-
/* @__PURE__ */
|
|
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__ */
|
|
886
|
-
/* @__PURE__ */
|
|
887
|
-
/* @__PURE__ */
|
|
888
|
-
/* @__PURE__ */
|
|
889
|
-
/* @__PURE__ */
|
|
890
|
-
/* @__PURE__ */
|
|
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__ */
|
|
893
|
-
/* @__PURE__ */
|
|
894
|
-
/* @__PURE__ */
|
|
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__ */
|
|
899
|
-
/* @__PURE__ */
|
|
900
|
-
/* @__PURE__ */
|
|
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__ */
|
|
903
|
-
/* @__PURE__ */
|
|
904
|
-
/* @__PURE__ */
|
|
905
|
-
/* @__PURE__ */
|
|
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
|
|
915
|
-
import { AccessibilityInfo as AccessibilityInfo5, Animated as Animated7, Easing as Easing4, StyleSheet as
|
|
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
|
|
919
|
-
import { AccessibilityInfo as AccessibilityInfo4, Animated as Animated6, Easing as Easing3, View as
|
|
920
|
-
import
|
|
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
|
|
1857
|
+
import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
1079
1858
|
function useBob(animated) {
|
|
1080
|
-
const [y] =
|
|
1081
|
-
|
|
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__ */
|
|
1113
|
-
/* @__PURE__ */
|
|
1114
|
-
/* @__PURE__ */
|
|
1115
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1118
|
-
mood === "empty" && /* @__PURE__ */
|
|
1119
|
-
g.legs.map((d) => /* @__PURE__ */
|
|
1120
|
-
g.back?.map((d) => d.endsWith("Z") ? /* @__PURE__ */
|
|
1121
|
-
g.parcel?.map((d, i) => /* @__PURE__ */
|
|
1122
|
-
/* @__PURE__ */
|
|
1123
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1127
|
-
/* @__PURE__ */
|
|
1128
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1132
|
-
g.head.r > 0 && /* @__PURE__ */
|
|
1133
|
-
g.details.map((d) => /* @__PURE__ */
|
|
1134
|
-
g.visor && /* @__PURE__ */
|
|
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__ */
|
|
1137
|
-
/* @__PURE__ */
|
|
1138
|
-
/* @__PURE__ */
|
|
1139
|
-
/* @__PURE__ */
|
|
1140
|
-
] }, i) : mood === "success" || mood === "empty" ? /* @__PURE__ */
|
|
1141
|
-
g.eyes.white > 0 && /* @__PURE__ */
|
|
1142
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1146
|
-
mood === "error" && g.eyes.at.map((at, i) => /* @__PURE__ */
|
|
1147
|
-
/* @__PURE__ */
|
|
1148
|
-
mood === "thinking" && MOOD_PARTS.dots.map(([cx, cy, r], i) => /* @__PURE__ */
|
|
1149
|
-
(mood === "success" || mood === "error") && /* @__PURE__ */
|
|
1150
|
-
mood === "success" && /* @__PURE__ */
|
|
1151
|
-
mood === "error" && /* @__PURE__ */
|
|
1152
|
-
mood === "error" && /* @__PURE__ */
|
|
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
|
|
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] =
|
|
1161
|
-
|
|
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__ */
|
|
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 ?
|
|
1964
|
+
style: [inline ? styles15.inline : styles15.stacked, { opacity, transform: [{ translateY: opacity.interpolate({ inputRange: [0, 1], outputRange: [6, 0] }) }] }, style],
|
|
1186
1965
|
children: [
|
|
1187
|
-
/* @__PURE__ */
|
|
1188
|
-
/* @__PURE__ */
|
|
1189
|
-
/* @__PURE__ */
|
|
1190
|
-
description ? /* @__PURE__ */
|
|
1191
|
-
action ? /* @__PURE__ */
|
|
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__ */
|
|
1198
|
-
var SuccessState = (props) => /* @__PURE__ */
|
|
1199
|
-
var LoadingState = (props) => /* @__PURE__ */
|
|
1200
|
-
var WelcomeState = (props) => /* @__PURE__ */
|
|
1201
|
-
var
|
|
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
|
|
1213
|
-
import
|
|
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
|
|
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__ */
|
|
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__ */
|
|
1252
|
-
/* @__PURE__ */
|
|
1253
|
-
/* @__PURE__ */
|
|
1254
|
-
/* @__PURE__ */
|
|
1255
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1258
|
-
/* @__PURE__ */
|
|
1259
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1262
|
-
/* @__PURE__ */
|
|
1263
|
-
ORAZAKA.shards.map((d) => /* @__PURE__ */
|
|
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__ */
|
|
1266
|
-
/* @__PURE__ */
|
|
1267
|
-
/* @__PURE__ */
|
|
1268
|
-
/* @__PURE__ */
|
|
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
|
|
1275
|
-
import { AccessibilityInfo as AccessibilityInfo6, Animated as Animated8, Easing as Easing5, View as
|
|
1276
|
-
import
|
|
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
|
|
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] =
|
|
1309
|
-
const [pulse] =
|
|
1310
|
-
|
|
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__ */
|
|
1336
|
-
return /* @__PURE__ */
|
|
1337
|
-
/* @__PURE__ */
|
|
1338
|
-
/* @__PURE__ */
|
|
1339
|
-
/* @__PURE__ */
|
|
1340
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1343
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1346
|
-
/* @__PURE__ */
|
|
1347
|
-
/* @__PURE__ */
|
|
1348
|
-
/* @__PURE__ */
|
|
1349
|
-
/* @__PURE__ */
|
|
1350
|
-
/* @__PURE__ */
|
|
1351
|
-
/* @__PURE__ */
|
|
1352
|
-
/* @__PURE__ */
|
|
1353
|
-
/* @__PURE__ */
|
|
1354
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1358
|
-
/* @__PURE__ */
|
|
1359
|
-
/* @__PURE__ */
|
|
1360
|
-
/* @__PURE__ */
|
|
1361
|
-
/* @__PURE__ */
|
|
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
|
|
1369
|
-
import
|
|
1370
|
-
import { jsx as
|
|
1371
|
-
function
|
|
1372
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
1382
|
-
|
|
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
|
-
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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:
|
|
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
|
|
1412
|
-
import { AccessibilityInfo as AccessibilityInfo7, Animated as Animated9, Easing as Easing6, View as
|
|
1413
|
-
import
|
|
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
|
|
2215
|
+
import { jsx as jsx22, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
1437
2216
|
function useFloat(animated) {
|
|
1438
|
-
const [y] =
|
|
1439
|
-
|
|
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__ */
|
|
1462
|
-
/* @__PURE__ */
|
|
1463
|
-
/* @__PURE__ */
|
|
1464
|
-
/* @__PURE__ */
|
|
1465
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1468
|
-
/* @__PURE__ */
|
|
1469
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1472
|
-
/* @__PURE__ */
|
|
1473
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1477
|
-
/* @__PURE__ */
|
|
1478
|
-
/* @__PURE__ */
|
|
1479
|
-
/* @__PURE__ */
|
|
1480
|
-
/* @__PURE__ */
|
|
1481
|
-
/* @__PURE__ */
|
|
1482
|
-
/* @__PURE__ */
|
|
1483
|
-
/* @__PURE__ */
|
|
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
|
|
1489
|
-
import { View as
|
|
1490
|
-
import
|
|
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
|
|
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__ */
|
|
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__ */
|
|
1530
|
-
/* @__PURE__ */
|
|
1531
|
-
/* @__PURE__ */
|
|
1532
|
-
/* @__PURE__ */
|
|
1533
|
-
/* @__PURE__ */
|
|
1534
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1539
|
-
/* @__PURE__ */
|
|
1540
|
-
YAZAKIA.voices.map((v, i) => /* @__PURE__ */
|
|
1541
|
-
/* @__PURE__ */
|
|
1542
|
-
/* @__PURE__ */
|
|
1543
|
-
i === 0 ? /* @__PURE__ */
|
|
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__ */
|
|
1547
|
-
/* @__PURE__ */
|
|
1548
|
-
/* @__PURE__ */
|
|
1549
|
-
YAZAKIA.pair.at.map(([cx, cy]) => /* @__PURE__ */
|
|
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__ */
|
|
1552
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1555
|
-
/* @__PURE__ */
|
|
1556
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1560
|
-
/* @__PURE__ */
|
|
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
|
|
1567
|
-
import
|
|
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
|
|
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__ */
|
|
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__ */
|
|
1613
|
-
/* @__PURE__ */
|
|
1614
|
-
/* @__PURE__ */
|
|
1615
|
-
/* @__PURE__ */
|
|
1616
|
-
/* @__PURE__ */
|
|
1617
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1622
|
-
/* @__PURE__ */
|
|
1623
|
-
/* @__PURE__ */
|
|
1624
|
-
YORORIS.leaves.map((d) => /* @__PURE__ */
|
|
1625
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1628
|
-
/* @__PURE__ */
|
|
1629
|
-
/* @__PURE__ */
|
|
1630
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1633
|
-
/* @__PURE__ */
|
|
1634
|
-
/* @__PURE__ */
|
|
1635
|
-
/* @__PURE__ */
|
|
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
|
|
2420
|
+
import { jsx as jsx25 } from "react/jsx-runtime";
|
|
1642
2421
|
function ProductMark({ id, ...props }) {
|
|
1643
|
-
if (id === "krizaka") return /* @__PURE__ */
|
|
1644
|
-
if (id === "orazaka") return /* @__PURE__ */
|
|
1645
|
-
if (id === "yazakia") return /* @__PURE__ */
|
|
1646
|
-
if (id === "yororis") return /* @__PURE__ */
|
|
1647
|
-
return /* @__PURE__ */
|
|
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
|
|
1652
|
-
import { Animated as Animated10, StyleSheet as
|
|
1653
|
-
import { jsx as
|
|
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] =
|
|
2437
|
+
const [width, setWidth] = React18.useState(0);
|
|
1659
2438
|
const translateX = t.interpolate({ inputRange: [0, 1], outputRange: [-width * ratio, 0] });
|
|
1660
|
-
return /* @__PURE__ */
|
|
1661
|
-
|
|
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: [
|
|
1672
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
1680
|
-
/* @__PURE__ */
|
|
1681
|
-
/* @__PURE__ */
|
|
1682
|
-
/* @__PURE__ */
|
|
1683
|
-
statLabel ? /* @__PURE__ */
|
|
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__ */
|
|
2465
|
+
/* @__PURE__ */ jsx26(Txt, { variant: "caption", children: valueText ?? `${Math.round(ratio * 100)} %` })
|
|
1687
2466
|
] }) : null
|
|
1688
2467
|
] }),
|
|
1689
|
-
statLabel ? /* @__PURE__ */
|
|
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__ */
|
|
1694
|
-
/* @__PURE__ */
|
|
1695
|
-
/* @__PURE__ */
|
|
1696
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2477
|
+
/* @__PURE__ */ jsx26(Bar, { label: s.label, ratio: r, words, animated, delay: 320 + i * 120 })
|
|
1699
2478
|
] }, s.label);
|
|
1700
2479
|
}),
|
|
1701
|
-
caption ? /* @__PURE__ */
|
|
1702
|
-
children ? /* @__PURE__ */
|
|
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
|
|
1706
|
-
root: { alignItems: "center", gap: 12, padding: 20, borderWidth:
|
|
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
|
|
1720
|
-
import { Animated as Animated11, Easing as Easing7, StyleSheet as
|
|
1721
|
-
import
|
|
1722
|
-
import { jsx as
|
|
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] =
|
|
1735
|
-
const [spin] =
|
|
1736
|
-
const [track, setTrack] =
|
|
1737
|
-
|
|
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
|
-
|
|
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__ */
|
|
1765
|
-
/* @__PURE__ */
|
|
1766
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1776
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1779
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1800
|
-
|
|
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: [
|
|
1805
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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
|
|
1820
|
-
import { Pressable as
|
|
1821
|
-
import
|
|
1822
|
-
import { jsx as
|
|
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] =
|
|
2604
|
+
const [own, setOwn] = React20.useState(defaultValue);
|
|
1826
2605
|
const query = value ?? own;
|
|
1827
|
-
const timer2 =
|
|
1828
|
-
|
|
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__ */
|
|
1836
|
-
/* @__PURE__ */
|
|
1837
|
-
/* @__PURE__ */
|
|
1838
|
-
/* @__PURE__ */
|
|
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__ */
|
|
1841
|
-
|
|
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: [
|
|
2637
|
+
style: [styles19.input, { color: theme.textPrimary }],
|
|
1859
2638
|
...props
|
|
1860
2639
|
}
|
|
1861
2640
|
),
|
|
1862
|
-
query ? /* @__PURE__ */
|
|
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
|
|
1866
|
-
frame: { flexDirection: "row", alignItems: "center", gap: 8, height: 44, paddingLeft: 12, paddingRight: 6, borderWidth:
|
|
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
|
|
1873
|
-
import { jsx as
|
|
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__ */
|
|
1877
|
-
|
|
2655
|
+
return /* @__PURE__ */ jsx29(
|
|
2656
|
+
View24,
|
|
1878
2657
|
{
|
|
1879
2658
|
role: "tablist",
|
|
1880
2659
|
"aria-label": label,
|
|
1881
|
-
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__ */
|
|
1885
|
-
|
|
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
|
-
|
|
2674
|
+
styles20.segment,
|
|
1896
2675
|
{ borderRadius: radius3.sm },
|
|
1897
2676
|
selected ? { backgroundColor: theme.surface0, borderColor: theme.borderDefault } : null,
|
|
1898
|
-
option.disabled ?
|
|
2677
|
+
option.disabled ? styles20.disabled : null
|
|
1899
2678
|
],
|
|
1900
|
-
children: /* @__PURE__ */
|
|
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
|
|
1909
|
-
track: { flexDirection: "row", padding: 3, gap: 3, borderWidth:
|
|
1910
|
-
segment: { flex: 1, alignItems: "center", justifyContent: "center", paddingHorizontal: 8, borderWidth:
|
|
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
|
|
2695
|
+
import * as React21 from "react";
|
|
1917
2696
|
import { Animated as Animated12 } from "react-native";
|
|
1918
|
-
import { jsx as
|
|
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] =
|
|
1928
|
-
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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
|
|
1978
|
-
import { AccessibilityInfo as AccessibilityInfo8, Animated as Animated13, Pressable as
|
|
1979
|
-
import { Fragment as Fragment3, jsx as
|
|
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] =
|
|
2015
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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__ */
|
|
2030
|
-
item.icon ? /* @__PURE__ */
|
|
2031
|
-
/* @__PURE__ */
|
|
2032
|
-
/* @__PURE__ */
|
|
2033
|
-
item.description ? /* @__PURE__ */
|
|
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__ */
|
|
2037
|
-
item.onPress ? /* @__PURE__ */
|
|
2038
|
-
|
|
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 }) => [
|
|
2824
|
+
style: ({ pressed }) => [styles21.main, { opacity: pressed ? 0.8 : 1 }],
|
|
2046
2825
|
children: text
|
|
2047
2826
|
}
|
|
2048
|
-
) : /* @__PURE__ */
|
|
2049
|
-
item.action ? /* @__PURE__ */
|
|
2050
|
-
|
|
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: [
|
|
2058
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
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
|
-
|
|
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__ */
|
|
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 =
|
|
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__ */
|
|
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
|
|
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:
|
|
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
|