@braintwopoint0/playback-commons 0.2.5 → 0.2.7
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/dist/api/index.d.ts +34 -0
- package/dist/api/index.js +26 -0
- package/dist/api/index.js.map +1 -0
- package/dist/ui/index.d.ts +40 -1
- package/dist/ui/index.js +367 -226
- package/dist/ui/index.js.map +1 -1
- package/package.json +5 -1
package/dist/ui/index.js
CHANGED
|
@@ -2203,8 +2203,144 @@ function SearchBar({ value, onChange, onClear, className, placeholder = "Search.
|
|
|
2203
2203
|
] });
|
|
2204
2204
|
}
|
|
2205
2205
|
|
|
2206
|
-
// src/ui/
|
|
2206
|
+
// src/ui/multi-select.tsx
|
|
2207
|
+
import * as React25 from "react";
|
|
2208
|
+
import { ChevronDown } from "lucide-react";
|
|
2207
2209
|
import { jsx as jsx32, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
2210
|
+
function MultiSelect({
|
|
2211
|
+
options,
|
|
2212
|
+
selected,
|
|
2213
|
+
onChange,
|
|
2214
|
+
placeholder = "Select...",
|
|
2215
|
+
searchPlaceholder = "Search...",
|
|
2216
|
+
emptyLabel = "No matches",
|
|
2217
|
+
searchThreshold = 5,
|
|
2218
|
+
clearable = true,
|
|
2219
|
+
className,
|
|
2220
|
+
contentClassName,
|
|
2221
|
+
"aria-label": ariaLabel
|
|
2222
|
+
}) {
|
|
2223
|
+
const [query, setQuery] = React25.useState("");
|
|
2224
|
+
const selectedSet = React25.useMemo(() => new Set(selected), [selected]);
|
|
2225
|
+
const filtered = React25.useMemo(() => {
|
|
2226
|
+
if (!query) return options;
|
|
2227
|
+
const q = query.toLowerCase();
|
|
2228
|
+
return options.filter((o) => o.label.toLowerCase().includes(q));
|
|
2229
|
+
}, [options, query]);
|
|
2230
|
+
function toggle(value) {
|
|
2231
|
+
if (selectedSet.has(value)) {
|
|
2232
|
+
onChange(selected.filter((v) => v !== value));
|
|
2233
|
+
} else {
|
|
2234
|
+
onChange([...selected, value]);
|
|
2235
|
+
}
|
|
2236
|
+
}
|
|
2237
|
+
const triggerLabel = (() => {
|
|
2238
|
+
if (selected.length === 0) return placeholder;
|
|
2239
|
+
if (selected.length === 1) {
|
|
2240
|
+
const match = options.find((o) => o.value === selected[0]);
|
|
2241
|
+
return match?.label ?? placeholder;
|
|
2242
|
+
}
|
|
2243
|
+
return `${selected.length} selected`;
|
|
2244
|
+
})();
|
|
2245
|
+
return /* @__PURE__ */ jsxs17(Popover, { children: [
|
|
2246
|
+
/* @__PURE__ */ jsx32(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs17(
|
|
2247
|
+
"button",
|
|
2248
|
+
{
|
|
2249
|
+
type: "button",
|
|
2250
|
+
"aria-label": ariaLabel,
|
|
2251
|
+
className: cn(
|
|
2252
|
+
"flex items-center justify-between gap-2 min-w-[180px] h-9 px-3 rounded-md",
|
|
2253
|
+
"bg-zinc-800 text-sm text-white border border-zinc-700",
|
|
2254
|
+
"hover:bg-zinc-700/80 transition-colors",
|
|
2255
|
+
"focus:outline-none focus-visible:ring-2 focus-visible:ring-white/20",
|
|
2256
|
+
className
|
|
2257
|
+
),
|
|
2258
|
+
children: [
|
|
2259
|
+
/* @__PURE__ */ jsx32(
|
|
2260
|
+
"span",
|
|
2261
|
+
{
|
|
2262
|
+
className: cn(
|
|
2263
|
+
"truncate text-left",
|
|
2264
|
+
selected.length === 0 && "text-zinc-400"
|
|
2265
|
+
),
|
|
2266
|
+
children: triggerLabel
|
|
2267
|
+
}
|
|
2268
|
+
),
|
|
2269
|
+
/* @__PURE__ */ jsx32(ChevronDown, { className: "h-4 w-4 opacity-50 flex-shrink-0" })
|
|
2270
|
+
]
|
|
2271
|
+
}
|
|
2272
|
+
) }),
|
|
2273
|
+
/* @__PURE__ */ jsxs17(
|
|
2274
|
+
PopoverContent,
|
|
2275
|
+
{
|
|
2276
|
+
className: cn("w-72 p-0", contentClassName),
|
|
2277
|
+
align: "start",
|
|
2278
|
+
onOpenAutoFocus: (e) => {
|
|
2279
|
+
if (options.length < searchThreshold) e.preventDefault();
|
|
2280
|
+
},
|
|
2281
|
+
children: [
|
|
2282
|
+
options.length >= searchThreshold && /* @__PURE__ */ jsx32("div", { className: "p-2 border-b border-zinc-800", children: /* @__PURE__ */ jsx32(
|
|
2283
|
+
Input,
|
|
2284
|
+
{
|
|
2285
|
+
type: "text",
|
|
2286
|
+
value: query,
|
|
2287
|
+
onChange: (e) => setQuery(e.target.value),
|
|
2288
|
+
placeholder: searchPlaceholder,
|
|
2289
|
+
className: "h-8 text-sm"
|
|
2290
|
+
}
|
|
2291
|
+
) }),
|
|
2292
|
+
/* @__PURE__ */ jsx32("div", { className: "max-h-64 overflow-auto py-1", children: filtered.length === 0 ? /* @__PURE__ */ jsx32("div", { className: "px-3 py-3 text-xs text-zinc-500 text-center", children: emptyLabel }) : filtered.map((opt) => {
|
|
2293
|
+
const isSelected = selectedSet.has(opt.value);
|
|
2294
|
+
return /* @__PURE__ */ jsxs17(
|
|
2295
|
+
"label",
|
|
2296
|
+
{
|
|
2297
|
+
className: cn(
|
|
2298
|
+
"w-full flex items-center gap-2.5 px-3 py-2 text-sm cursor-pointer transition-colors",
|
|
2299
|
+
"hover:bg-zinc-800/60",
|
|
2300
|
+
isSelected && "bg-zinc-800/40"
|
|
2301
|
+
),
|
|
2302
|
+
children: [
|
|
2303
|
+
/* @__PURE__ */ jsx32(
|
|
2304
|
+
Checkbox,
|
|
2305
|
+
{
|
|
2306
|
+
checked: isSelected,
|
|
2307
|
+
onCheckedChange: () => toggle(opt.value),
|
|
2308
|
+
"aria-label": opt.label
|
|
2309
|
+
}
|
|
2310
|
+
),
|
|
2311
|
+
/* @__PURE__ */ jsx32("span", { className: "flex-1 truncate text-zinc-100", children: opt.label }),
|
|
2312
|
+
opt.count !== void 0 && /* @__PURE__ */ jsx32("span", { className: "text-xs text-zinc-500 tabular-nums", children: opt.count })
|
|
2313
|
+
]
|
|
2314
|
+
},
|
|
2315
|
+
opt.value
|
|
2316
|
+
);
|
|
2317
|
+
}) }),
|
|
2318
|
+
clearable && selected.length > 0 && /* @__PURE__ */ jsxs17("div", { className: "px-3 py-2 border-t border-zinc-800 flex items-center justify-between", children: [
|
|
2319
|
+
/* @__PURE__ */ jsxs17("span", { className: "text-xs text-zinc-500 tabular-nums", children: [
|
|
2320
|
+
selected.length,
|
|
2321
|
+
" selected"
|
|
2322
|
+
] }),
|
|
2323
|
+
/* @__PURE__ */ jsx32(
|
|
2324
|
+
"button",
|
|
2325
|
+
{
|
|
2326
|
+
type: "button",
|
|
2327
|
+
onClick: () => {
|
|
2328
|
+
onChange([]);
|
|
2329
|
+
setQuery("");
|
|
2330
|
+
},
|
|
2331
|
+
className: "text-xs text-zinc-400 hover:text-white transition-colors",
|
|
2332
|
+
children: "Clear all"
|
|
2333
|
+
}
|
|
2334
|
+
)
|
|
2335
|
+
] })
|
|
2336
|
+
]
|
|
2337
|
+
}
|
|
2338
|
+
)
|
|
2339
|
+
] });
|
|
2340
|
+
}
|
|
2341
|
+
|
|
2342
|
+
// src/ui/data-row.tsx
|
|
2343
|
+
import { jsx as jsx33, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
2208
2344
|
var statusColors = {
|
|
2209
2345
|
green: "bg-emerald-400",
|
|
2210
2346
|
yellow: "bg-amber-400",
|
|
@@ -2212,7 +2348,7 @@ var statusColors = {
|
|
|
2212
2348
|
gray: "bg-zinc-500"
|
|
2213
2349
|
};
|
|
2214
2350
|
function DataRow({ status, primary, secondary, trailing, className, ...props }) {
|
|
2215
|
-
return /* @__PURE__ */
|
|
2351
|
+
return /* @__PURE__ */ jsxs18(
|
|
2216
2352
|
"div",
|
|
2217
2353
|
{
|
|
2218
2354
|
className: cn(
|
|
@@ -2221,12 +2357,12 @@ function DataRow({ status, primary, secondary, trailing, className, ...props })
|
|
|
2221
2357
|
),
|
|
2222
2358
|
...props,
|
|
2223
2359
|
children: [
|
|
2224
|
-
status && /* @__PURE__ */
|
|
2225
|
-
/* @__PURE__ */
|
|
2226
|
-
/* @__PURE__ */
|
|
2227
|
-
secondary && /* @__PURE__ */
|
|
2360
|
+
status && /* @__PURE__ */ jsx33("span", { className: cn("h-2 w-2 shrink-0 rounded-full", statusColors[status]) }),
|
|
2361
|
+
/* @__PURE__ */ jsxs18("div", { className: "min-w-0 flex-1", children: [
|
|
2362
|
+
/* @__PURE__ */ jsx33("p", { className: "truncate text-sm text-[var(--timberwolf)]", children: primary }),
|
|
2363
|
+
secondary && /* @__PURE__ */ jsx33("p", { className: "truncate text-xs text-muted-foreground", children: secondary })
|
|
2228
2364
|
] }),
|
|
2229
|
-
trailing && /* @__PURE__ */
|
|
2365
|
+
trailing && /* @__PURE__ */ jsx33("div", { className: "shrink-0", children: trailing })
|
|
2230
2366
|
]
|
|
2231
2367
|
}
|
|
2232
2368
|
);
|
|
@@ -2274,12 +2410,12 @@ var springBounce = {
|
|
|
2274
2410
|
var easeSmooth = [0.25, 0.46, 0.45, 0.94];
|
|
2275
2411
|
|
|
2276
2412
|
// src/ui/fade-in.tsx
|
|
2277
|
-
import * as
|
|
2278
|
-
import { jsx as
|
|
2413
|
+
import * as React26 from "react";
|
|
2414
|
+
import { jsx as jsx34 } from "react/jsx-runtime";
|
|
2279
2415
|
function FadeIn({ children, className, delay = 0, direction = "up", ...props }) {
|
|
2280
|
-
const ref =
|
|
2281
|
-
const [visible, setVisible] =
|
|
2282
|
-
|
|
2416
|
+
const ref = React26.useRef(null);
|
|
2417
|
+
const [visible, setVisible] = React26.useState(false);
|
|
2418
|
+
React26.useEffect(() => {
|
|
2283
2419
|
const el = ref.current;
|
|
2284
2420
|
if (!el) return;
|
|
2285
2421
|
const observer = new IntersectionObserver(
|
|
@@ -2294,7 +2430,7 @@ function FadeIn({ children, className, delay = 0, direction = "up", ...props })
|
|
|
2294
2430
|
observer.observe(el);
|
|
2295
2431
|
return () => observer.disconnect();
|
|
2296
2432
|
}, []);
|
|
2297
|
-
return /* @__PURE__ */
|
|
2433
|
+
return /* @__PURE__ */ jsx34(
|
|
2298
2434
|
"div",
|
|
2299
2435
|
{
|
|
2300
2436
|
ref,
|
|
@@ -2311,10 +2447,10 @@ function FadeIn({ children, className, delay = 0, direction = "up", ...props })
|
|
|
2311
2447
|
}
|
|
2312
2448
|
|
|
2313
2449
|
// src/ui/luma-spin.tsx
|
|
2314
|
-
import { Fragment as Fragment4, jsx as
|
|
2450
|
+
import { Fragment as Fragment4, jsx as jsx35, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
2315
2451
|
function LumaSpin() {
|
|
2316
|
-
return /* @__PURE__ */
|
|
2317
|
-
/* @__PURE__ */
|
|
2452
|
+
return /* @__PURE__ */ jsxs19(Fragment4, { children: [
|
|
2453
|
+
/* @__PURE__ */ jsx35(
|
|
2318
2454
|
"style",
|
|
2319
2455
|
{
|
|
2320
2456
|
dangerouslySetInnerHTML: {
|
|
@@ -2334,8 +2470,8 @@ function LumaSpin() {
|
|
|
2334
2470
|
}
|
|
2335
2471
|
}
|
|
2336
2472
|
),
|
|
2337
|
-
/* @__PURE__ */
|
|
2338
|
-
/* @__PURE__ */
|
|
2473
|
+
/* @__PURE__ */ jsxs19("div", { style: { position: "relative", width: 65, aspectRatio: "1" }, children: [
|
|
2474
|
+
/* @__PURE__ */ jsx35(
|
|
2339
2475
|
"span",
|
|
2340
2476
|
{
|
|
2341
2477
|
style: {
|
|
@@ -2347,7 +2483,7 @@ function LumaSpin() {
|
|
|
2347
2483
|
}
|
|
2348
2484
|
}
|
|
2349
2485
|
),
|
|
2350
|
-
/* @__PURE__ */
|
|
2486
|
+
/* @__PURE__ */ jsx35(
|
|
2351
2487
|
"span",
|
|
2352
2488
|
{
|
|
2353
2489
|
style: {
|
|
@@ -2364,10 +2500,10 @@ function LumaSpin() {
|
|
|
2364
2500
|
}
|
|
2365
2501
|
|
|
2366
2502
|
// src/ui/footer.tsx
|
|
2367
|
-
import * as
|
|
2503
|
+
import * as React27 from "react";
|
|
2368
2504
|
import Image2 from "next/image";
|
|
2369
2505
|
import Link2 from "next/link";
|
|
2370
|
-
import { jsx as
|
|
2506
|
+
import { jsx as jsx36, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
2371
2507
|
var DEFAULT_SOCIALS = [
|
|
2372
2508
|
{
|
|
2373
2509
|
label: "Instagram",
|
|
@@ -2393,8 +2529,8 @@ var DEFAULT_SOCIALS = [
|
|
|
2393
2529
|
function NewsletterForm({
|
|
2394
2530
|
onSubmit
|
|
2395
2531
|
}) {
|
|
2396
|
-
const [email, setEmail] =
|
|
2397
|
-
const [state, setState] =
|
|
2532
|
+
const [email, setEmail] = React27.useState("");
|
|
2533
|
+
const [state, setState] = React27.useState("idle");
|
|
2398
2534
|
const handle = async (e) => {
|
|
2399
2535
|
e.preventDefault();
|
|
2400
2536
|
const ok = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email.trim());
|
|
@@ -2410,7 +2546,7 @@ function NewsletterForm({
|
|
|
2410
2546
|
setState("error");
|
|
2411
2547
|
}
|
|
2412
2548
|
};
|
|
2413
|
-
return /* @__PURE__ */
|
|
2549
|
+
return /* @__PURE__ */ jsxs20(
|
|
2414
2550
|
"form",
|
|
2415
2551
|
{
|
|
2416
2552
|
onSubmit: handle,
|
|
@@ -2418,7 +2554,7 @@ function NewsletterForm({
|
|
|
2418
2554
|
"aria-label": "Subscribe to updates",
|
|
2419
2555
|
className: "w-full max-w-md",
|
|
2420
2556
|
children: [
|
|
2421
|
-
/* @__PURE__ */
|
|
2557
|
+
/* @__PURE__ */ jsx36(
|
|
2422
2558
|
"label",
|
|
2423
2559
|
{
|
|
2424
2560
|
htmlFor: "footer-newsletter",
|
|
@@ -2426,8 +2562,8 @@ function NewsletterForm({
|
|
|
2426
2562
|
children: "Stay in the loop"
|
|
2427
2563
|
}
|
|
2428
2564
|
),
|
|
2429
|
-
/* @__PURE__ */
|
|
2430
|
-
/* @__PURE__ */
|
|
2565
|
+
/* @__PURE__ */ jsxs20("div", { className: "flex flex-col sm:flex-row gap-2", children: [
|
|
2566
|
+
/* @__PURE__ */ jsx36(
|
|
2431
2567
|
"input",
|
|
2432
2568
|
{
|
|
2433
2569
|
id: "footer-newsletter",
|
|
@@ -2450,7 +2586,7 @@ function NewsletterForm({
|
|
|
2450
2586
|
)
|
|
2451
2587
|
}
|
|
2452
2588
|
),
|
|
2453
|
-
/* @__PURE__ */
|
|
2589
|
+
/* @__PURE__ */ jsx36(
|
|
2454
2590
|
"button",
|
|
2455
2591
|
{
|
|
2456
2592
|
type: "submit",
|
|
@@ -2459,7 +2595,7 @@ function NewsletterForm({
|
|
|
2459
2595
|
}
|
|
2460
2596
|
)
|
|
2461
2597
|
] }),
|
|
2462
|
-
/* @__PURE__ */
|
|
2598
|
+
/* @__PURE__ */ jsxs20(
|
|
2463
2599
|
"p",
|
|
2464
2600
|
{
|
|
2465
2601
|
id: "footer-newsletter-feedback",
|
|
@@ -2484,7 +2620,7 @@ function NewsletterForm({
|
|
|
2484
2620
|
function FooterLinkItem({ link }) {
|
|
2485
2621
|
const classes = "text-[14px] text-[rgba(214,213,201,0.64)] hover:text-[var(--timberwolf)] transition-colors rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--timberwolf)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--surface-0,#0a100d)]";
|
|
2486
2622
|
if (link.external) {
|
|
2487
|
-
return /* @__PURE__ */
|
|
2623
|
+
return /* @__PURE__ */ jsx36(
|
|
2488
2624
|
"a",
|
|
2489
2625
|
{
|
|
2490
2626
|
href: link.href,
|
|
@@ -2495,7 +2631,7 @@ function FooterLinkItem({ link }) {
|
|
|
2495
2631
|
}
|
|
2496
2632
|
);
|
|
2497
2633
|
}
|
|
2498
|
-
return /* @__PURE__ */
|
|
2634
|
+
return /* @__PURE__ */ jsx36(Link2, { href: link.href, className: classes, children: link.label });
|
|
2499
2635
|
}
|
|
2500
2636
|
function Footer({
|
|
2501
2637
|
columns,
|
|
@@ -2512,7 +2648,7 @@ function Footer({
|
|
|
2512
2648
|
className
|
|
2513
2649
|
} = {}) {
|
|
2514
2650
|
const hasColumns = columns && columns.length > 0;
|
|
2515
|
-
return /* @__PURE__ */
|
|
2651
|
+
return /* @__PURE__ */ jsxs20(
|
|
2516
2652
|
"footer",
|
|
2517
2653
|
{
|
|
2518
2654
|
id: "footer",
|
|
@@ -2522,12 +2658,12 @@ function Footer({
|
|
|
2522
2658
|
),
|
|
2523
2659
|
"aria-labelledby": "footer-heading",
|
|
2524
2660
|
children: [
|
|
2525
|
-
/* @__PURE__ */
|
|
2661
|
+
/* @__PURE__ */ jsxs20("h2", { id: "footer-heading", className: "sr-only", children: [
|
|
2526
2662
|
siteName,
|
|
2527
2663
|
" site footer"
|
|
2528
2664
|
] }),
|
|
2529
|
-
/* @__PURE__ */
|
|
2530
|
-
/* @__PURE__ */
|
|
2665
|
+
/* @__PURE__ */ jsxs20("div", { className: "mx-auto max-w-[1400px] px-6 sm:px-10", children: [
|
|
2666
|
+
/* @__PURE__ */ jsxs20(
|
|
2531
2667
|
"div",
|
|
2532
2668
|
{
|
|
2533
2669
|
className: cn(
|
|
@@ -2535,14 +2671,14 @@ function Footer({
|
|
|
2535
2671
|
newsletter ? "lg:grid-cols-[minmax(0,1fr)_minmax(0,1fr)] lg:items-end" : ""
|
|
2536
2672
|
),
|
|
2537
2673
|
children: [
|
|
2538
|
-
/* @__PURE__ */
|
|
2539
|
-
/* @__PURE__ */
|
|
2674
|
+
/* @__PURE__ */ jsxs20("div", { className: "flex flex-col gap-8", children: [
|
|
2675
|
+
/* @__PURE__ */ jsx36(
|
|
2540
2676
|
Link2,
|
|
2541
2677
|
{
|
|
2542
2678
|
href: "/",
|
|
2543
2679
|
className: "inline-flex items-center gap-3 rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--timberwolf)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--night)]",
|
|
2544
2680
|
"aria-label": `${siteName} home`,
|
|
2545
|
-
children: /* @__PURE__ */
|
|
2681
|
+
children: /* @__PURE__ */ jsx36(
|
|
2546
2682
|
Image2,
|
|
2547
2683
|
{
|
|
2548
2684
|
src: logoSrc,
|
|
@@ -2554,18 +2690,18 @@ function Footer({
|
|
|
2554
2690
|
)
|
|
2555
2691
|
}
|
|
2556
2692
|
),
|
|
2557
|
-
showTagline && tagline ? /* @__PURE__ */
|
|
2693
|
+
showTagline && tagline ? /* @__PURE__ */ jsx36("p", { className: "font-semibold text-[clamp(28px,3.6vw,44px)] leading-[1.05] tracking-[-0.035em] text-[var(--timberwolf)] max-w-[18ch]", children: tagline }) : null
|
|
2558
2694
|
] }),
|
|
2559
|
-
newsletter ? /* @__PURE__ */
|
|
2695
|
+
newsletter ? /* @__PURE__ */ jsx36("div", { className: "lg:justify-self-end w-full lg:max-w-md", children: /* @__PURE__ */ jsx36(NewsletterForm, { onSubmit: newsletterAction }) }) : null
|
|
2560
2696
|
]
|
|
2561
2697
|
}
|
|
2562
2698
|
),
|
|
2563
|
-
hasColumns ? /* @__PURE__ */
|
|
2564
|
-
/* @__PURE__ */
|
|
2565
|
-
/* @__PURE__ */
|
|
2699
|
+
hasColumns ? /* @__PURE__ */ jsx36("div", { className: "border-t border-[rgba(214,213,201,0.08)] py-14", children: /* @__PURE__ */ jsx36("div", { className: "grid grid-cols-2 gap-x-6 gap-y-10 md:grid-cols-4", children: columns.map((col) => /* @__PURE__ */ jsxs20("nav", { "aria-label": col.title, children: [
|
|
2700
|
+
/* @__PURE__ */ jsx36("p", { className: "text-[12px] uppercase tracking-[0.14em] text-[rgba(214,213,201,0.44)] mb-4", children: col.title }),
|
|
2701
|
+
/* @__PURE__ */ jsx36("ul", { className: "flex flex-col gap-3", children: col.links.map((link) => /* @__PURE__ */ jsx36("li", { children: /* @__PURE__ */ jsx36(FooterLinkItem, { link }) }, `${col.title}-${link.label}`)) })
|
|
2566
2702
|
] }, col.title)) }) }) : null,
|
|
2567
|
-
/* @__PURE__ */
|
|
2568
|
-
/* @__PURE__ */
|
|
2703
|
+
/* @__PURE__ */ jsxs20("div", { className: "border-t border-[rgba(214,213,201,0.08)] py-6 flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between", children: [
|
|
2704
|
+
/* @__PURE__ */ jsx36("ul", { className: "flex items-center gap-2", children: socials.map(({ label, href, src }) => /* @__PURE__ */ jsx36("li", { children: /* @__PURE__ */ jsx36(
|
|
2569
2705
|
"a",
|
|
2570
2706
|
{
|
|
2571
2707
|
href,
|
|
@@ -2573,7 +2709,7 @@ function Footer({
|
|
|
2573
2709
|
rel: "noopener noreferrer",
|
|
2574
2710
|
"aria-label": `${siteName} on ${label}`,
|
|
2575
2711
|
className: "inline-flex items-center justify-center h-9 w-9 rounded-full hover:bg-[var(--surface-1,#0f1512)] transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--timberwolf)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--night)]",
|
|
2576
|
-
children: /* @__PURE__ */
|
|
2712
|
+
children: /* @__PURE__ */ jsx36(
|
|
2577
2713
|
Image2,
|
|
2578
2714
|
{
|
|
2579
2715
|
src,
|
|
@@ -2585,14 +2721,14 @@ function Footer({
|
|
|
2585
2721
|
)
|
|
2586
2722
|
}
|
|
2587
2723
|
) }, label)) }),
|
|
2588
|
-
/* @__PURE__ */
|
|
2724
|
+
/* @__PURE__ */ jsxs20("p", { className: "text-[13px] text-[rgba(214,213,201,0.44)] order-last sm:order-none", children: [
|
|
2589
2725
|
"\xA9 ",
|
|
2590
2726
|
(/* @__PURE__ */ new Date()).getFullYear(),
|
|
2591
2727
|
" ",
|
|
2592
2728
|
siteName,
|
|
2593
2729
|
". All rights reserved."
|
|
2594
2730
|
] }),
|
|
2595
|
-
/* @__PURE__ */
|
|
2731
|
+
/* @__PURE__ */ jsx36(
|
|
2596
2732
|
"a",
|
|
2597
2733
|
{
|
|
2598
2734
|
href: creditHref,
|
|
@@ -2611,7 +2747,7 @@ function Footer({
|
|
|
2611
2747
|
|
|
2612
2748
|
// src/ui/footer-credits-bar.tsx
|
|
2613
2749
|
import Image3 from "next/image";
|
|
2614
|
-
import { Fragment as Fragment5, jsx as
|
|
2750
|
+
import { Fragment as Fragment5, jsx as jsx37, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
2615
2751
|
var DEFAULT_SOCIALS2 = [
|
|
2616
2752
|
{
|
|
2617
2753
|
label: "Instagram",
|
|
@@ -2643,7 +2779,7 @@ function FooterCreditsBar({
|
|
|
2643
2779
|
className
|
|
2644
2780
|
} = {}) {
|
|
2645
2781
|
const year = copyrightYear ?? (/* @__PURE__ */ new Date()).getFullYear();
|
|
2646
|
-
return /* @__PURE__ */
|
|
2782
|
+
return /* @__PURE__ */ jsxs21(
|
|
2647
2783
|
"div",
|
|
2648
2784
|
{
|
|
2649
2785
|
className: cn(
|
|
@@ -2652,8 +2788,8 @@ function FooterCreditsBar({
|
|
|
2652
2788
|
className
|
|
2653
2789
|
),
|
|
2654
2790
|
children: [
|
|
2655
|
-
/* @__PURE__ */
|
|
2656
|
-
/* @__PURE__ */
|
|
2791
|
+
/* @__PURE__ */ jsxs21("div", { className: "flex items-center gap-4 sm:justify-self-start", children: [
|
|
2792
|
+
/* @__PURE__ */ jsx37("ul", { className: "flex items-center gap-2", children: socials.map(({ label, href, src }) => /* @__PURE__ */ jsx37("li", { children: /* @__PURE__ */ jsx37(
|
|
2657
2793
|
"a",
|
|
2658
2794
|
{
|
|
2659
2795
|
href,
|
|
@@ -2665,7 +2801,7 @@ function FooterCreditsBar({
|
|
|
2665
2801
|
"hover:bg-[var(--surface-1,#0f1512)] transition-colors",
|
|
2666
2802
|
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--timberwolf)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--night)]"
|
|
2667
2803
|
),
|
|
2668
|
-
children: /* @__PURE__ */
|
|
2804
|
+
children: /* @__PURE__ */ jsx37(
|
|
2669
2805
|
Image3,
|
|
2670
2806
|
{
|
|
2671
2807
|
src,
|
|
@@ -2677,15 +2813,15 @@ function FooterCreditsBar({
|
|
|
2677
2813
|
)
|
|
2678
2814
|
}
|
|
2679
2815
|
) }, label)) }),
|
|
2680
|
-
showCredit ? /* @__PURE__ */
|
|
2681
|
-
/* @__PURE__ */
|
|
2816
|
+
showCredit ? /* @__PURE__ */ jsxs21(Fragment5, { children: [
|
|
2817
|
+
/* @__PURE__ */ jsx37(
|
|
2682
2818
|
"span",
|
|
2683
2819
|
{
|
|
2684
2820
|
"aria-hidden": true,
|
|
2685
2821
|
className: "h-5 w-px bg-[rgba(214,213,201,0.16)] flex-shrink-0"
|
|
2686
2822
|
}
|
|
2687
2823
|
),
|
|
2688
|
-
/* @__PURE__ */
|
|
2824
|
+
/* @__PURE__ */ jsx37(
|
|
2689
2825
|
"a",
|
|
2690
2826
|
{
|
|
2691
2827
|
href: creditHref,
|
|
@@ -2697,19 +2833,19 @@ function FooterCreditsBar({
|
|
|
2697
2833
|
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--timberwolf)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--night)]",
|
|
2698
2834
|
"whitespace-nowrap"
|
|
2699
2835
|
),
|
|
2700
|
-
children: /* @__PURE__ */
|
|
2836
|
+
children: /* @__PURE__ */ jsxs21("span", { "aria-hidden": true, children: [
|
|
2701
2837
|
"Built by",
|
|
2702
2838
|
" ",
|
|
2703
|
-
/* @__PURE__ */
|
|
2839
|
+
/* @__PURE__ */ jsxs21("span", { style: { fontFamily: "AvertaStd-Semibold" }, children: [
|
|
2704
2840
|
"BRAIN",
|
|
2705
|
-
/* @__PURE__ */
|
|
2841
|
+
/* @__PURE__ */ jsx37("span", { style: { fontFamily: "AvertaStd-Thin" }, children: "2.0" })
|
|
2706
2842
|
] })
|
|
2707
2843
|
] })
|
|
2708
2844
|
}
|
|
2709
2845
|
)
|
|
2710
2846
|
] }) : null
|
|
2711
2847
|
] }),
|
|
2712
|
-
/* @__PURE__ */
|
|
2848
|
+
/* @__PURE__ */ jsxs21("p", { className: "text-[13px] text-[rgba(214,213,201,0.44)] text-center sm:text-right sm:justify-self-end", children: [
|
|
2713
2849
|
"\xA9 ",
|
|
2714
2850
|
year,
|
|
2715
2851
|
" ",
|
|
@@ -2722,8 +2858,8 @@ function FooterCreditsBar({
|
|
|
2722
2858
|
}
|
|
2723
2859
|
|
|
2724
2860
|
// src/ui/newsletter-form.tsx
|
|
2725
|
-
import * as
|
|
2726
|
-
import { jsx as
|
|
2861
|
+
import * as React28 from "react";
|
|
2862
|
+
import { jsx as jsx38, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
2727
2863
|
function NewsletterForm2({
|
|
2728
2864
|
endpoint = "/api/newsletter/subscribe",
|
|
2729
2865
|
source = "footer",
|
|
@@ -2734,17 +2870,17 @@ function NewsletterForm2({
|
|
|
2734
2870
|
sendingLabel = "Subscribing\u2026",
|
|
2735
2871
|
className
|
|
2736
2872
|
}) {
|
|
2737
|
-
const [email, setEmail] =
|
|
2738
|
-
const [website, setWebsite] =
|
|
2739
|
-
const [state, setState] =
|
|
2740
|
-
const inFlight =
|
|
2873
|
+
const [email, setEmail] = React28.useState("");
|
|
2874
|
+
const [website, setWebsite] = React28.useState("");
|
|
2875
|
+
const [state, setState] = React28.useState("idle");
|
|
2876
|
+
const inFlight = React28.useRef(false);
|
|
2741
2877
|
const onSubmit = async (e) => {
|
|
2742
2878
|
e.preventDefault();
|
|
2743
2879
|
if (inFlight.current) return;
|
|
2744
2880
|
const trimmed = email.trim();
|
|
2745
2881
|
const ok = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(trimmed);
|
|
2746
2882
|
if (!ok) {
|
|
2747
|
-
setState("
|
|
2883
|
+
setState("invalid_format");
|
|
2748
2884
|
return;
|
|
2749
2885
|
}
|
|
2750
2886
|
inFlight.current = true;
|
|
@@ -2765,18 +2901,20 @@ function NewsletterForm2({
|
|
|
2765
2901
|
setEmail("");
|
|
2766
2902
|
} else if (res.status === 429) {
|
|
2767
2903
|
setState("rate_limited");
|
|
2904
|
+
} else if (res.status === 400) {
|
|
2905
|
+
setState("invalid_format");
|
|
2768
2906
|
} else {
|
|
2769
|
-
setState("
|
|
2907
|
+
setState("server_error");
|
|
2770
2908
|
}
|
|
2771
2909
|
} catch {
|
|
2772
|
-
setState("
|
|
2910
|
+
setState("server_error");
|
|
2773
2911
|
} finally {
|
|
2774
2912
|
inFlight.current = false;
|
|
2775
2913
|
}
|
|
2776
2914
|
};
|
|
2777
|
-
const feedbackId =
|
|
2778
|
-
const inputId =
|
|
2779
|
-
return /* @__PURE__ */
|
|
2915
|
+
const feedbackId = React28.useId();
|
|
2916
|
+
const inputId = React28.useId();
|
|
2917
|
+
return /* @__PURE__ */ jsxs22(
|
|
2780
2918
|
"form",
|
|
2781
2919
|
{
|
|
2782
2920
|
onSubmit,
|
|
@@ -2784,15 +2922,15 @@ function NewsletterForm2({
|
|
|
2784
2922
|
"aria-label": ariaLabel,
|
|
2785
2923
|
className: cn("w-full max-w-md", className),
|
|
2786
2924
|
children: [
|
|
2787
|
-
/* @__PURE__ */
|
|
2788
|
-
/* @__PURE__ */
|
|
2925
|
+
/* @__PURE__ */ jsx38("label", { htmlFor: inputId, className: "sr-only", children: "Email address" }),
|
|
2926
|
+
/* @__PURE__ */ jsxs22(
|
|
2789
2927
|
"div",
|
|
2790
2928
|
{
|
|
2791
2929
|
"aria-hidden": true,
|
|
2792
2930
|
className: "absolute left-[-10000px] top-auto h-px w-px overflow-hidden",
|
|
2793
2931
|
children: [
|
|
2794
|
-
/* @__PURE__ */
|
|
2795
|
-
/* @__PURE__ */
|
|
2932
|
+
/* @__PURE__ */ jsx38("label", { htmlFor: `${inputId}-website`, children: "Website" }),
|
|
2933
|
+
/* @__PURE__ */ jsx38(
|
|
2796
2934
|
"input",
|
|
2797
2935
|
{
|
|
2798
2936
|
type: "text",
|
|
@@ -2807,8 +2945,8 @@ function NewsletterForm2({
|
|
|
2807
2945
|
]
|
|
2808
2946
|
}
|
|
2809
2947
|
),
|
|
2810
|
-
/* @__PURE__ */
|
|
2811
|
-
/* @__PURE__ */
|
|
2948
|
+
/* @__PURE__ */ jsxs22("div", { className: "flex flex-col sm:flex-row gap-2", children: [
|
|
2949
|
+
/* @__PURE__ */ jsx38(
|
|
2812
2950
|
"input",
|
|
2813
2951
|
{
|
|
2814
2952
|
id: inputId,
|
|
@@ -2820,20 +2958,21 @@ function NewsletterForm2({
|
|
|
2820
2958
|
value: email,
|
|
2821
2959
|
onChange: (e) => {
|
|
2822
2960
|
setEmail(e.target.value);
|
|
2823
|
-
if (state === "
|
|
2961
|
+
if (state === "invalid_format" || state === "server_error" || state === "rate_limited")
|
|
2962
|
+
setState("idle");
|
|
2824
2963
|
},
|
|
2825
2964
|
placeholder,
|
|
2826
|
-
"aria-invalid": state === "
|
|
2965
|
+
"aria-invalid": state === "invalid_format",
|
|
2827
2966
|
"aria-describedby": feedbackId,
|
|
2828
2967
|
className: cn(
|
|
2829
2968
|
"w-full sm:flex-1 h-12 sm:h-11 rounded-full bg-[var(--surface-1,#0f1512)] border px-5 text-[16px] sm:text-[14px] text-[var(--timberwolf)] placeholder:text-[rgba(214,213,201,0.44)]",
|
|
2830
2969
|
"focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--timberwolf)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--night)]",
|
|
2831
2970
|
"disabled:opacity-60",
|
|
2832
|
-
state === "
|
|
2971
|
+
state === "invalid_format" || state === "server_error" ? "border-[rgba(237,106,106,0.5)]" : "border-[rgba(214,213,201,0.08)]"
|
|
2833
2972
|
)
|
|
2834
2973
|
}
|
|
2835
2974
|
),
|
|
2836
|
-
/* @__PURE__ */
|
|
2975
|
+
/* @__PURE__ */ jsx38(
|
|
2837
2976
|
"button",
|
|
2838
2977
|
{
|
|
2839
2978
|
type: "submit",
|
|
@@ -2843,7 +2982,7 @@ function NewsletterForm2({
|
|
|
2843
2982
|
}
|
|
2844
2983
|
)
|
|
2845
2984
|
] }),
|
|
2846
|
-
/* @__PURE__ */
|
|
2985
|
+
/* @__PURE__ */ jsxs22(
|
|
2847
2986
|
"p",
|
|
2848
2987
|
{
|
|
2849
2988
|
id: feedbackId,
|
|
@@ -2851,13 +2990,14 @@ function NewsletterForm2({
|
|
|
2851
2990
|
className: cn(
|
|
2852
2991
|
"mt-2 -ml-0.5 text-[13px] min-h-[1.25rem]",
|
|
2853
2992
|
state === "sent" && "text-[var(--timberwolf)]",
|
|
2854
|
-
(state === "
|
|
2993
|
+
(state === "invalid_format" || state === "server_error" || state === "rate_limited") && "text-[rgb(237,106,106)]",
|
|
2855
2994
|
(state === "idle" || state === "sending") && "text-[rgba(214,213,201,0.44)]"
|
|
2856
2995
|
),
|
|
2857
|
-
role: state === "
|
|
2996
|
+
role: state === "invalid_format" || state === "server_error" || state === "rate_limited" ? "alert" : void 0,
|
|
2858
2997
|
children: [
|
|
2859
2998
|
state === "sent" && "Thanks \u2014 we\u2019ll be in touch.",
|
|
2860
|
-
state === "
|
|
2999
|
+
state === "invalid_format" && "Please enter a valid email address.",
|
|
3000
|
+
state === "server_error" && "Could not subscribe right now. Please try again in a moment.",
|
|
2861
3001
|
state === "rate_limited" && "Too many attempts. Try again in a minute."
|
|
2862
3002
|
]
|
|
2863
3003
|
}
|
|
@@ -2869,14 +3009,14 @@ function NewsletterForm2({
|
|
|
2869
3009
|
|
|
2870
3010
|
// src/ui/site-footer.tsx
|
|
2871
3011
|
import Link3 from "next/link";
|
|
2872
|
-
import { jsx as
|
|
3012
|
+
import { jsx as jsx39, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
2873
3013
|
var INK_MUTED = "rgba(214,213,201,0.64)";
|
|
2874
3014
|
var INK_SUBTLE = "rgba(214,213,201,0.44)";
|
|
2875
3015
|
var LINE = "rgba(214,213,201,0.08)";
|
|
2876
3016
|
function FooterLinkItem2({ link }) {
|
|
2877
3017
|
const classes = "text-[14px] text-[rgba(214,213,201,0.64)] hover:text-[var(--timberwolf)] transition-colors rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--timberwolf)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--night)]";
|
|
2878
3018
|
if (link.external) {
|
|
2879
|
-
return /* @__PURE__ */
|
|
3019
|
+
return /* @__PURE__ */ jsx39(
|
|
2880
3020
|
"a",
|
|
2881
3021
|
{
|
|
2882
3022
|
href: link.href,
|
|
@@ -2887,7 +3027,7 @@ function FooterLinkItem2({ link }) {
|
|
|
2887
3027
|
}
|
|
2888
3028
|
);
|
|
2889
3029
|
}
|
|
2890
|
-
return /* @__PURE__ */
|
|
3030
|
+
return /* @__PURE__ */ jsx39(Link3, { href: link.href, className: classes, children: link.label });
|
|
2891
3031
|
}
|
|
2892
3032
|
function SiteFooter({
|
|
2893
3033
|
columns,
|
|
@@ -2898,7 +3038,7 @@ function SiteFooter({
|
|
|
2898
3038
|
newsletterTitle = "Updates from the Network.",
|
|
2899
3039
|
newsletterSubtitle = "Only when relevant. No spam."
|
|
2900
3040
|
}) {
|
|
2901
|
-
return /* @__PURE__ */
|
|
3041
|
+
return /* @__PURE__ */ jsxs23(
|
|
2902
3042
|
"footer",
|
|
2903
3043
|
{
|
|
2904
3044
|
id: "footer",
|
|
@@ -2906,14 +3046,14 @@ function SiteFooter({
|
|
|
2906
3046
|
style: { borderTopColor: LINE },
|
|
2907
3047
|
"aria-labelledby": "site-footer-heading",
|
|
2908
3048
|
children: [
|
|
2909
|
-
/* @__PURE__ */
|
|
3049
|
+
/* @__PURE__ */ jsxs23("h2", { id: "site-footer-heading", className: "sr-only", children: [
|
|
2910
3050
|
siteName,
|
|
2911
3051
|
" site footer"
|
|
2912
3052
|
] }),
|
|
2913
|
-
/* @__PURE__ */
|
|
2914
|
-
/* @__PURE__ */
|
|
2915
|
-
/* @__PURE__ */
|
|
2916
|
-
/* @__PURE__ */
|
|
3053
|
+
/* @__PURE__ */ jsxs23("div", { className: "mx-auto max-w-[1400px] px-6 sm:px-10", children: [
|
|
3054
|
+
/* @__PURE__ */ jsxs23("div", { className: "flex flex-col gap-6 pt-16 pb-10 md:flex-row md:items-start md:justify-between md:gap-10 md:pt-20", children: [
|
|
3055
|
+
/* @__PURE__ */ jsxs23("div", { className: "max-w-[36ch]", children: [
|
|
3056
|
+
/* @__PURE__ */ jsx39(
|
|
2917
3057
|
"p",
|
|
2918
3058
|
{
|
|
2919
3059
|
className: "text-[11px] uppercase tracking-[0.22em] font-semibold",
|
|
@@ -2921,8 +3061,8 @@ function SiteFooter({
|
|
|
2921
3061
|
children: newsletterLabel
|
|
2922
3062
|
}
|
|
2923
3063
|
),
|
|
2924
|
-
/* @__PURE__ */
|
|
2925
|
-
/* @__PURE__ */
|
|
3064
|
+
/* @__PURE__ */ jsx39("p", { className: "mt-3 text-[17px] md:text-[19px] leading-[1.35] tracking-[-0.01em] text-[var(--timberwolf)]", children: newsletterTitle }),
|
|
3065
|
+
/* @__PURE__ */ jsx39(
|
|
2926
3066
|
"p",
|
|
2927
3067
|
{
|
|
2928
3068
|
className: "mt-2 text-[13px] leading-[1.5]",
|
|
@@ -2931,7 +3071,7 @@ function SiteFooter({
|
|
|
2931
3071
|
}
|
|
2932
3072
|
)
|
|
2933
3073
|
] }),
|
|
2934
|
-
/* @__PURE__ */
|
|
3074
|
+
/* @__PURE__ */ jsx39("div", { className: "w-full md:max-w-md md:pt-1", children: /* @__PURE__ */ jsx39(
|
|
2935
3075
|
NewsletterForm2,
|
|
2936
3076
|
{
|
|
2937
3077
|
endpoint: newsletterEndpoint,
|
|
@@ -2939,8 +3079,8 @@ function SiteFooter({
|
|
|
2939
3079
|
}
|
|
2940
3080
|
) })
|
|
2941
3081
|
] }),
|
|
2942
|
-
/* @__PURE__ */
|
|
2943
|
-
/* @__PURE__ */
|
|
3082
|
+
/* @__PURE__ */ jsx39("div", { className: "border-t py-14", style: { borderTopColor: LINE }, children: /* @__PURE__ */ jsx39("div", { className: "grid grid-cols-2 gap-x-6 gap-y-10 md:grid-cols-4", children: columns.map((col) => /* @__PURE__ */ jsxs23("nav", { "aria-label": col.title, children: [
|
|
3083
|
+
/* @__PURE__ */ jsx39(
|
|
2944
3084
|
"p",
|
|
2945
3085
|
{
|
|
2946
3086
|
className: "text-[12px] uppercase tracking-[0.14em] mb-4",
|
|
@@ -2948,9 +3088,9 @@ function SiteFooter({
|
|
|
2948
3088
|
children: col.title
|
|
2949
3089
|
}
|
|
2950
3090
|
),
|
|
2951
|
-
/* @__PURE__ */
|
|
3091
|
+
/* @__PURE__ */ jsx39("ul", { className: "flex flex-col gap-3", children: col.links.map((link) => /* @__PURE__ */ jsx39("li", { children: /* @__PURE__ */ jsx39(FooterLinkItem2, { link }) }, `${col.title}-${link.label}`)) })
|
|
2952
3092
|
] }, col.title)) }) }),
|
|
2953
|
-
/* @__PURE__ */
|
|
3093
|
+
/* @__PURE__ */ jsx39(FooterCreditsBar, {})
|
|
2954
3094
|
] })
|
|
2955
3095
|
]
|
|
2956
3096
|
}
|
|
@@ -2958,7 +3098,7 @@ function SiteFooter({
|
|
|
2958
3098
|
}
|
|
2959
3099
|
|
|
2960
3100
|
// src/ui/sign-in-form.tsx
|
|
2961
|
-
import * as
|
|
3101
|
+
import * as React29 from "react";
|
|
2962
3102
|
import Link4 from "next/link";
|
|
2963
3103
|
import {
|
|
2964
3104
|
AlertCircle,
|
|
@@ -3025,7 +3165,7 @@ function createClient() {
|
|
|
3025
3165
|
}
|
|
3026
3166
|
|
|
3027
3167
|
// src/ui/sign-in-form.tsx
|
|
3028
|
-
import { Fragment as Fragment6, jsx as
|
|
3168
|
+
import { Fragment as Fragment6, jsx as jsx40, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
3029
3169
|
var COOLDOWN_THRESHOLD = 3;
|
|
3030
3170
|
var COOLDOWN_DURATION_MS = 3e4;
|
|
3031
3171
|
function SignInForm({
|
|
@@ -3037,15 +3177,15 @@ function SignInForm({
|
|
|
3037
3177
|
title = "Welcome back",
|
|
3038
3178
|
subtitle = "Sign in to access your account"
|
|
3039
3179
|
}) {
|
|
3040
|
-
const [email, setEmail] =
|
|
3041
|
-
const [password, setPassword] =
|
|
3042
|
-
const [showPassword, setShowPassword] =
|
|
3043
|
-
const [error, setError] =
|
|
3044
|
-
const [loading, setLoading] =
|
|
3045
|
-
const [consecutiveErrors, setConsecutiveErrors] =
|
|
3046
|
-
const [cooldownUntil, setCooldownUntil] =
|
|
3047
|
-
const [supabase] =
|
|
3048
|
-
|
|
3180
|
+
const [email, setEmail] = React29.useState("");
|
|
3181
|
+
const [password, setPassword] = React29.useState("");
|
|
3182
|
+
const [showPassword, setShowPassword] = React29.useState(false);
|
|
3183
|
+
const [error, setError] = React29.useState(initialError ?? "");
|
|
3184
|
+
const [loading, setLoading] = React29.useState(false);
|
|
3185
|
+
const [consecutiveErrors, setConsecutiveErrors] = React29.useState(0);
|
|
3186
|
+
const [cooldownUntil, setCooldownUntil] = React29.useState(null);
|
|
3187
|
+
const [supabase] = React29.useState(() => createClient());
|
|
3188
|
+
React29.useEffect(() => {
|
|
3049
3189
|
if (initialError) setError(initialError);
|
|
3050
3190
|
}, [initialError]);
|
|
3051
3191
|
const handleSubmit = async (e) => {
|
|
@@ -3089,29 +3229,29 @@ function SignInForm({
|
|
|
3089
3229
|
setLoading(false);
|
|
3090
3230
|
}
|
|
3091
3231
|
};
|
|
3092
|
-
return /* @__PURE__ */
|
|
3093
|
-
/* @__PURE__ */
|
|
3094
|
-
/* @__PURE__ */
|
|
3095
|
-
/* @__PURE__ */
|
|
3232
|
+
return /* @__PURE__ */ jsxs24("div", { className: "bg-card border border-border rounded-xl p-8 space-y-6", children: [
|
|
3233
|
+
/* @__PURE__ */ jsxs24("div", { className: "text-center", children: [
|
|
3234
|
+
/* @__PURE__ */ jsx40("h1", { className: "text-2xl font-bold text-[var(--timberwolf)] mb-2", children: title }),
|
|
3235
|
+
/* @__PURE__ */ jsx40("p", { className: "text-sm text-muted-foreground", children: subtitle })
|
|
3096
3236
|
] }),
|
|
3097
|
-
/* @__PURE__ */
|
|
3098
|
-
error && /* @__PURE__ */
|
|
3237
|
+
/* @__PURE__ */ jsxs24("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
|
|
3238
|
+
error && /* @__PURE__ */ jsx40(
|
|
3099
3239
|
"div",
|
|
3100
3240
|
{
|
|
3101
3241
|
id: "signin-error",
|
|
3102
3242
|
role: "alert",
|
|
3103
3243
|
"aria-live": "polite",
|
|
3104
3244
|
className: "bg-red-900/20 border border-red-700/30 rounded-lg p-3",
|
|
3105
|
-
children: /* @__PURE__ */
|
|
3106
|
-
/* @__PURE__ */
|
|
3107
|
-
/* @__PURE__ */
|
|
3245
|
+
children: /* @__PURE__ */ jsxs24("div", { className: "flex items-center gap-2 text-red-400 text-sm", children: [
|
|
3246
|
+
/* @__PURE__ */ jsx40(AlertCircle, { className: "h-4 w-4 flex-shrink-0" }),
|
|
3247
|
+
/* @__PURE__ */ jsx40("span", { children: error })
|
|
3108
3248
|
] })
|
|
3109
3249
|
}
|
|
3110
3250
|
),
|
|
3111
|
-
/* @__PURE__ */
|
|
3112
|
-
/* @__PURE__ */
|
|
3113
|
-
/* @__PURE__ */
|
|
3114
|
-
/* @__PURE__ */
|
|
3251
|
+
/* @__PURE__ */ jsxs24("div", { className: "space-y-2", children: [
|
|
3252
|
+
/* @__PURE__ */ jsx40(Label, { htmlFor: "email", className: "text-[var(--timberwolf)]", children: "Email" }),
|
|
3253
|
+
/* @__PURE__ */ jsxs24("div", { className: "relative", children: [
|
|
3254
|
+
/* @__PURE__ */ jsx40(
|
|
3115
3255
|
Input,
|
|
3116
3256
|
{
|
|
3117
3257
|
id: "email",
|
|
@@ -3126,13 +3266,13 @@ function SignInForm({
|
|
|
3126
3266
|
"aria-describedby": error ? "signin-error" : void 0
|
|
3127
3267
|
}
|
|
3128
3268
|
),
|
|
3129
|
-
/* @__PURE__ */
|
|
3269
|
+
/* @__PURE__ */ jsx40(Mail, { className: "h-4 w-4 absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground" })
|
|
3130
3270
|
] })
|
|
3131
3271
|
] }),
|
|
3132
|
-
/* @__PURE__ */
|
|
3133
|
-
/* @__PURE__ */
|
|
3134
|
-
/* @__PURE__ */
|
|
3135
|
-
/* @__PURE__ */
|
|
3272
|
+
/* @__PURE__ */ jsxs24("div", { className: "space-y-2", children: [
|
|
3273
|
+
/* @__PURE__ */ jsx40(Label, { htmlFor: "password", className: "text-[var(--timberwolf)]", children: "Password" }),
|
|
3274
|
+
/* @__PURE__ */ jsxs24("div", { className: "relative", children: [
|
|
3275
|
+
/* @__PURE__ */ jsx40(
|
|
3136
3276
|
Input,
|
|
3137
3277
|
{
|
|
3138
3278
|
id: "password",
|
|
@@ -3147,8 +3287,8 @@ function SignInForm({
|
|
|
3147
3287
|
"aria-describedby": error ? "signin-error" : void 0
|
|
3148
3288
|
}
|
|
3149
3289
|
),
|
|
3150
|
-
/* @__PURE__ */
|
|
3151
|
-
/* @__PURE__ */
|
|
3290
|
+
/* @__PURE__ */ jsx40(Lock, { className: "h-4 w-4 absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground" }),
|
|
3291
|
+
/* @__PURE__ */ jsx40(
|
|
3152
3292
|
"button",
|
|
3153
3293
|
{
|
|
3154
3294
|
type: "button",
|
|
@@ -3157,12 +3297,12 @@ function SignInForm({
|
|
|
3157
3297
|
disabled: loading,
|
|
3158
3298
|
"aria-label": showPassword ? "Hide password" : "Show password",
|
|
3159
3299
|
"aria-pressed": showPassword,
|
|
3160
|
-
children: showPassword ? /* @__PURE__ */
|
|
3300
|
+
children: showPassword ? /* @__PURE__ */ jsx40(EyeOff, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx40(Eye, { className: "h-4 w-4" })
|
|
3161
3301
|
}
|
|
3162
3302
|
)
|
|
3163
3303
|
] })
|
|
3164
3304
|
] }),
|
|
3165
|
-
forgotPasswordHref ? /* @__PURE__ */
|
|
3305
|
+
forgotPasswordHref ? /* @__PURE__ */ jsx40("div", { className: "flex justify-end -mt-1", children: /* @__PURE__ */ jsx40(
|
|
3166
3306
|
Link4,
|
|
3167
3307
|
{
|
|
3168
3308
|
href: forgotPasswordHref,
|
|
@@ -3170,23 +3310,23 @@ function SignInForm({
|
|
|
3170
3310
|
children: "Forgot your password?"
|
|
3171
3311
|
}
|
|
3172
3312
|
) }) : null,
|
|
3173
|
-
/* @__PURE__ */
|
|
3313
|
+
/* @__PURE__ */ jsx40(
|
|
3174
3314
|
Button,
|
|
3175
3315
|
{
|
|
3176
3316
|
type: "submit",
|
|
3177
3317
|
className: "w-full h-11 bg-[var(--timberwolf)] text-[var(--night)] hover:bg-[var(--ash-grey)]",
|
|
3178
3318
|
disabled: loading,
|
|
3179
|
-
children: loading ? /* @__PURE__ */
|
|
3180
|
-
/* @__PURE__ */
|
|
3319
|
+
children: loading ? /* @__PURE__ */ jsxs24(Fragment6, { children: [
|
|
3320
|
+
/* @__PURE__ */ jsx40(Loader2, { className: "h-4 w-4 mr-2 animate-spin" }),
|
|
3181
3321
|
"Signing in..."
|
|
3182
3322
|
] }) : "Sign in"
|
|
3183
3323
|
}
|
|
3184
3324
|
)
|
|
3185
3325
|
] }),
|
|
3186
|
-
signUpHref ? /* @__PURE__ */
|
|
3326
|
+
signUpHref ? /* @__PURE__ */ jsx40("div", { className: "text-center text-sm", children: /* @__PURE__ */ jsxs24("p", { className: "text-muted-foreground", children: [
|
|
3187
3327
|
"Don't have an account?",
|
|
3188
3328
|
" ",
|
|
3189
|
-
/* @__PURE__ */
|
|
3329
|
+
/* @__PURE__ */ jsx40(
|
|
3190
3330
|
Link4,
|
|
3191
3331
|
{
|
|
3192
3332
|
href: signUpHref,
|
|
@@ -3199,7 +3339,7 @@ function SignInForm({
|
|
|
3199
3339
|
}
|
|
3200
3340
|
|
|
3201
3341
|
// src/ui/forgot-password-form.tsx
|
|
3202
|
-
import * as
|
|
3342
|
+
import * as React30 from "react";
|
|
3203
3343
|
import Link5 from "next/link";
|
|
3204
3344
|
import {
|
|
3205
3345
|
AlertCircle as AlertCircle2,
|
|
@@ -3208,7 +3348,7 @@ import {
|
|
|
3208
3348
|
Loader2 as Loader22,
|
|
3209
3349
|
Mail as Mail2
|
|
3210
3350
|
} from "lucide-react";
|
|
3211
|
-
import { Fragment as Fragment7, jsx as
|
|
3351
|
+
import { Fragment as Fragment7, jsx as jsx41, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
3212
3352
|
var RESEND_COOLDOWN_MS = 3e4;
|
|
3213
3353
|
var COOLDOWN_STORAGE_KEY = "playback:pwreset-cooldown-until";
|
|
3214
3354
|
function ForgotPasswordForm({
|
|
@@ -3217,15 +3357,15 @@ function ForgotPasswordForm({
|
|
|
3217
3357
|
title = "Forgot password?",
|
|
3218
3358
|
subtitle = "Enter your email and we'll send you a reset link."
|
|
3219
3359
|
}) {
|
|
3220
|
-
const [email, setEmail] =
|
|
3221
|
-
const [error, setError] =
|
|
3222
|
-
const [loading, setLoading] =
|
|
3223
|
-
const [emailSent, setEmailSent] =
|
|
3224
|
-
const [cooldownUntil, setCooldownUntilState] =
|
|
3360
|
+
const [email, setEmail] = React30.useState("");
|
|
3361
|
+
const [error, setError] = React30.useState("");
|
|
3362
|
+
const [loading, setLoading] = React30.useState(false);
|
|
3363
|
+
const [emailSent, setEmailSent] = React30.useState(false);
|
|
3364
|
+
const [cooldownUntil, setCooldownUntilState] = React30.useState(
|
|
3225
3365
|
null
|
|
3226
3366
|
);
|
|
3227
|
-
const [now, setNow] =
|
|
3228
|
-
const [supabase] =
|
|
3367
|
+
const [now, setNow] = React30.useState(() => Date.now());
|
|
3368
|
+
const [supabase] = React30.useState(() => createClient());
|
|
3229
3369
|
const setCooldownUntil = (value) => {
|
|
3230
3370
|
setCooldownUntilState(value);
|
|
3231
3371
|
if (typeof window === "undefined") return;
|
|
@@ -3235,7 +3375,7 @@ function ForgotPasswordForm({
|
|
|
3235
3375
|
window.sessionStorage.setItem(COOLDOWN_STORAGE_KEY, String(value));
|
|
3236
3376
|
}
|
|
3237
3377
|
};
|
|
3238
|
-
|
|
3378
|
+
React30.useEffect(() => {
|
|
3239
3379
|
if (typeof window === "undefined") return;
|
|
3240
3380
|
const stored = window.sessionStorage.getItem(COOLDOWN_STORAGE_KEY);
|
|
3241
3381
|
if (!stored) return;
|
|
@@ -3246,7 +3386,7 @@ function ForgotPasswordForm({
|
|
|
3246
3386
|
}
|
|
3247
3387
|
setCooldownUntilState(parsed);
|
|
3248
3388
|
}, []);
|
|
3249
|
-
|
|
3389
|
+
React30.useEffect(() => {
|
|
3250
3390
|
if (!cooldownUntil) return;
|
|
3251
3391
|
const id = setInterval(() => setNow(Date.now()), 1e3);
|
|
3252
3392
|
return () => clearInterval(id);
|
|
@@ -3286,19 +3426,19 @@ function ForgotPasswordForm({
|
|
|
3286
3426
|
}
|
|
3287
3427
|
};
|
|
3288
3428
|
if (emailSent) {
|
|
3289
|
-
return /* @__PURE__ */
|
|
3290
|
-
/* @__PURE__ */
|
|
3291
|
-
/* @__PURE__ */
|
|
3292
|
-
/* @__PURE__ */
|
|
3293
|
-
/* @__PURE__ */
|
|
3429
|
+
return /* @__PURE__ */ jsxs25("div", { className: "bg-card border border-border rounded-xl p-8 space-y-6 text-center", children: [
|
|
3430
|
+
/* @__PURE__ */ jsx41("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx41("div", { className: "h-12 w-12 rounded-full bg-[var(--timberwolf)]/10 border border-[var(--timberwolf)]/20 flex items-center justify-center", children: /* @__PURE__ */ jsx41(CheckCircle, { className: "h-6 w-6 text-[var(--timberwolf)]" }) }) }),
|
|
3431
|
+
/* @__PURE__ */ jsxs25("div", { className: "space-y-2", children: [
|
|
3432
|
+
/* @__PURE__ */ jsx41("h1", { className: "text-2xl font-bold text-[var(--timberwolf)]", children: "Check your email" }),
|
|
3433
|
+
/* @__PURE__ */ jsxs25("p", { className: "text-sm text-muted-foreground", children: [
|
|
3294
3434
|
"We sent a reset link to",
|
|
3295
3435
|
" ",
|
|
3296
|
-
/* @__PURE__ */
|
|
3436
|
+
/* @__PURE__ */ jsx41("span", { className: "text-[var(--timberwolf)] font-medium", children: email }),
|
|
3297
3437
|
". If it's not in your inbox, check spam."
|
|
3298
3438
|
] })
|
|
3299
3439
|
] }),
|
|
3300
|
-
/* @__PURE__ */
|
|
3301
|
-
/* @__PURE__ */
|
|
3440
|
+
/* @__PURE__ */ jsxs25("div", { className: "space-y-3 pt-2", children: [
|
|
3441
|
+
/* @__PURE__ */ jsx41(
|
|
3302
3442
|
Button,
|
|
3303
3443
|
{
|
|
3304
3444
|
onClick: () => {
|
|
@@ -3312,36 +3452,36 @@ function ForgotPasswordForm({
|
|
|
3312
3452
|
children: cooldownSecondsLeft > 0 ? `Send another email in ${cooldownSecondsLeft}s` : "Send another email"
|
|
3313
3453
|
}
|
|
3314
3454
|
),
|
|
3315
|
-
/* @__PURE__ */
|
|
3316
|
-
/* @__PURE__ */
|
|
3455
|
+
/* @__PURE__ */ jsx41(Link5, { href: loginHref, className: "block", children: /* @__PURE__ */ jsxs25(Button, { className: "w-full h-11 bg-[var(--timberwolf)] text-[var(--night)] hover:bg-[var(--ash-grey)]", children: [
|
|
3456
|
+
/* @__PURE__ */ jsx41(ArrowLeft, { className: "h-4 w-4 mr-2" }),
|
|
3317
3457
|
"Back to sign in"
|
|
3318
3458
|
] }) })
|
|
3319
3459
|
] })
|
|
3320
3460
|
] });
|
|
3321
3461
|
}
|
|
3322
|
-
return /* @__PURE__ */
|
|
3323
|
-
/* @__PURE__ */
|
|
3324
|
-
/* @__PURE__ */
|
|
3325
|
-
/* @__PURE__ */
|
|
3462
|
+
return /* @__PURE__ */ jsxs25("div", { className: "bg-card border border-border rounded-xl p-8 space-y-6", children: [
|
|
3463
|
+
/* @__PURE__ */ jsxs25("div", { className: "text-center", children: [
|
|
3464
|
+
/* @__PURE__ */ jsx41("h1", { className: "text-2xl font-bold text-[var(--timberwolf)] mb-2", children: title }),
|
|
3465
|
+
/* @__PURE__ */ jsx41("p", { className: "text-sm text-muted-foreground", children: subtitle })
|
|
3326
3466
|
] }),
|
|
3327
|
-
/* @__PURE__ */
|
|
3328
|
-
error && /* @__PURE__ */
|
|
3467
|
+
/* @__PURE__ */ jsxs25("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
|
|
3468
|
+
error && /* @__PURE__ */ jsx41(
|
|
3329
3469
|
"div",
|
|
3330
3470
|
{
|
|
3331
3471
|
id: "forgot-error",
|
|
3332
3472
|
role: "alert",
|
|
3333
3473
|
"aria-live": "polite",
|
|
3334
3474
|
className: "bg-red-900/20 border border-red-700/30 rounded-lg p-3",
|
|
3335
|
-
children: /* @__PURE__ */
|
|
3336
|
-
/* @__PURE__ */
|
|
3337
|
-
/* @__PURE__ */
|
|
3475
|
+
children: /* @__PURE__ */ jsxs25("div", { className: "flex items-center gap-2 text-red-400 text-sm", children: [
|
|
3476
|
+
/* @__PURE__ */ jsx41(AlertCircle2, { className: "h-4 w-4 flex-shrink-0" }),
|
|
3477
|
+
/* @__PURE__ */ jsx41("span", { children: error })
|
|
3338
3478
|
] })
|
|
3339
3479
|
}
|
|
3340
3480
|
),
|
|
3341
|
-
/* @__PURE__ */
|
|
3342
|
-
/* @__PURE__ */
|
|
3343
|
-
/* @__PURE__ */
|
|
3344
|
-
/* @__PURE__ */
|
|
3481
|
+
/* @__PURE__ */ jsxs25("div", { className: "space-y-2", children: [
|
|
3482
|
+
/* @__PURE__ */ jsx41(Label, { htmlFor: "email", className: "text-[var(--timberwolf)]", children: "Email" }),
|
|
3483
|
+
/* @__PURE__ */ jsxs25("div", { className: "relative", children: [
|
|
3484
|
+
/* @__PURE__ */ jsx41(
|
|
3345
3485
|
Input,
|
|
3346
3486
|
{
|
|
3347
3487
|
id: "email",
|
|
@@ -3357,29 +3497,29 @@ function ForgotPasswordForm({
|
|
|
3357
3497
|
"aria-describedby": error ? "forgot-error" : void 0
|
|
3358
3498
|
}
|
|
3359
3499
|
),
|
|
3360
|
-
/* @__PURE__ */
|
|
3500
|
+
/* @__PURE__ */ jsx41(Mail2, { className: "h-4 w-4 absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground" })
|
|
3361
3501
|
] })
|
|
3362
3502
|
] }),
|
|
3363
|
-
/* @__PURE__ */
|
|
3503
|
+
/* @__PURE__ */ jsx41(
|
|
3364
3504
|
Button,
|
|
3365
3505
|
{
|
|
3366
3506
|
type: "submit",
|
|
3367
3507
|
className: "w-full h-11 bg-[var(--timberwolf)] text-[var(--night)] hover:bg-[var(--ash-grey)]",
|
|
3368
3508
|
disabled: loading || cooldownSecondsLeft > 0,
|
|
3369
|
-
children: loading ? /* @__PURE__ */
|
|
3370
|
-
/* @__PURE__ */
|
|
3509
|
+
children: loading ? /* @__PURE__ */ jsxs25(Fragment7, { children: [
|
|
3510
|
+
/* @__PURE__ */ jsx41(Loader22, { className: "h-4 w-4 mr-2 animate-spin" }),
|
|
3371
3511
|
"Sending email..."
|
|
3372
3512
|
] }) : cooldownSecondsLeft > 0 ? `Try again in ${cooldownSecondsLeft}s` : "Send reset link"
|
|
3373
3513
|
}
|
|
3374
3514
|
)
|
|
3375
3515
|
] }),
|
|
3376
|
-
/* @__PURE__ */
|
|
3516
|
+
/* @__PURE__ */ jsx41("div", { className: "text-center text-sm", children: /* @__PURE__ */ jsxs25(
|
|
3377
3517
|
Link5,
|
|
3378
3518
|
{
|
|
3379
3519
|
href: loginHref,
|
|
3380
3520
|
className: "inline-flex items-center gap-1.5 text-muted-foreground hover:text-[var(--timberwolf)] transition-colors",
|
|
3381
3521
|
children: [
|
|
3382
|
-
/* @__PURE__ */
|
|
3522
|
+
/* @__PURE__ */ jsx41(ArrowLeft, { className: "h-3.5 w-3.5" }),
|
|
3383
3523
|
"Back to sign in"
|
|
3384
3524
|
]
|
|
3385
3525
|
}
|
|
@@ -3388,7 +3528,7 @@ function ForgotPasswordForm({
|
|
|
3388
3528
|
}
|
|
3389
3529
|
|
|
3390
3530
|
// src/ui/reset-password-form.tsx
|
|
3391
|
-
import * as
|
|
3531
|
+
import * as React31 from "react";
|
|
3392
3532
|
import Link6 from "next/link";
|
|
3393
3533
|
import { useRouter } from "next/navigation";
|
|
3394
3534
|
import {
|
|
@@ -3399,7 +3539,7 @@ import {
|
|
|
3399
3539
|
Loader2 as Loader23,
|
|
3400
3540
|
Lock as Lock2
|
|
3401
3541
|
} from "lucide-react";
|
|
3402
|
-
import { Fragment as Fragment8, jsx as
|
|
3542
|
+
import { Fragment as Fragment8, jsx as jsx42, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
3403
3543
|
function ResetPasswordForm({
|
|
3404
3544
|
loginHref = "/auth/login",
|
|
3405
3545
|
initialError,
|
|
@@ -3407,19 +3547,19 @@ function ResetPasswordForm({
|
|
|
3407
3547
|
title = "Reset password",
|
|
3408
3548
|
subtitle = "Enter a new password for your account."
|
|
3409
3549
|
}) {
|
|
3410
|
-
const [password, setPassword] =
|
|
3411
|
-
const [confirmPassword, setConfirmPassword] =
|
|
3412
|
-
const [showPassword, setShowPassword] =
|
|
3413
|
-
const [showConfirmPassword, setShowConfirmPassword] =
|
|
3414
|
-
const [error, setError] =
|
|
3415
|
-
const [loading, setLoading] =
|
|
3416
|
-
const [passwordReset, setPasswordReset] =
|
|
3550
|
+
const [password, setPassword] = React31.useState("");
|
|
3551
|
+
const [confirmPassword, setConfirmPassword] = React31.useState("");
|
|
3552
|
+
const [showPassword, setShowPassword] = React31.useState(false);
|
|
3553
|
+
const [showConfirmPassword, setShowConfirmPassword] = React31.useState(false);
|
|
3554
|
+
const [error, setError] = React31.useState(initialError ?? "");
|
|
3555
|
+
const [loading, setLoading] = React31.useState(false);
|
|
3556
|
+
const [passwordReset, setPasswordReset] = React31.useState(false);
|
|
3417
3557
|
const router = useRouter();
|
|
3418
|
-
const [supabase] =
|
|
3419
|
-
|
|
3558
|
+
const [supabase] = React31.useState(() => createClient());
|
|
3559
|
+
React31.useEffect(() => {
|
|
3420
3560
|
if (initialError) setError(initialError);
|
|
3421
3561
|
}, [initialError]);
|
|
3422
|
-
|
|
3562
|
+
React31.useEffect(() => {
|
|
3423
3563
|
if (!passwordReset) return;
|
|
3424
3564
|
const id = setTimeout(() => {
|
|
3425
3565
|
router.push(loginHref);
|
|
@@ -3467,38 +3607,38 @@ function ResetPasswordForm({
|
|
|
3467
3607
|
}
|
|
3468
3608
|
};
|
|
3469
3609
|
if (passwordReset) {
|
|
3470
|
-
return /* @__PURE__ */
|
|
3471
|
-
/* @__PURE__ */
|
|
3472
|
-
/* @__PURE__ */
|
|
3473
|
-
/* @__PURE__ */
|
|
3474
|
-
/* @__PURE__ */
|
|
3610
|
+
return /* @__PURE__ */ jsxs26("div", { className: "bg-card border border-border rounded-xl p-8 space-y-6 text-center", children: [
|
|
3611
|
+
/* @__PURE__ */ jsx42("div", { className: "flex justify-center", children: /* @__PURE__ */ jsx42("div", { className: "h-12 w-12 rounded-full bg-[var(--timberwolf)]/10 border border-[var(--timberwolf)]/20 flex items-center justify-center", children: /* @__PURE__ */ jsx42(CheckCircle2, { className: "h-6 w-6 text-[var(--timberwolf)]" }) }) }),
|
|
3612
|
+
/* @__PURE__ */ jsxs26("div", { className: "space-y-2", children: [
|
|
3613
|
+
/* @__PURE__ */ jsx42("h1", { className: "text-2xl font-bold text-[var(--timberwolf)]", children: "Password updated" }),
|
|
3614
|
+
/* @__PURE__ */ jsx42("p", { className: "text-sm text-muted-foreground", children: "Redirecting you to sign in\u2026" })
|
|
3475
3615
|
] }),
|
|
3476
|
-
/* @__PURE__ */
|
|
3616
|
+
/* @__PURE__ */ jsx42(Link6, { href: loginHref, className: "block pt-2", children: /* @__PURE__ */ jsx42(Button, { className: "w-full h-11 bg-[var(--timberwolf)] text-[var(--night)] hover:bg-[var(--ash-grey)]", children: "Continue to sign in" }) })
|
|
3477
3617
|
] });
|
|
3478
3618
|
}
|
|
3479
|
-
return /* @__PURE__ */
|
|
3480
|
-
/* @__PURE__ */
|
|
3481
|
-
/* @__PURE__ */
|
|
3482
|
-
/* @__PURE__ */
|
|
3619
|
+
return /* @__PURE__ */ jsxs26("div", { className: "bg-card border border-border rounded-xl p-8 space-y-6", children: [
|
|
3620
|
+
/* @__PURE__ */ jsxs26("div", { className: "text-center", children: [
|
|
3621
|
+
/* @__PURE__ */ jsx42("h1", { className: "text-2xl font-bold text-[var(--timberwolf)] mb-2", children: title }),
|
|
3622
|
+
/* @__PURE__ */ jsx42("p", { className: "text-sm text-muted-foreground", children: subtitle })
|
|
3483
3623
|
] }),
|
|
3484
|
-
/* @__PURE__ */
|
|
3485
|
-
error && /* @__PURE__ */
|
|
3624
|
+
/* @__PURE__ */ jsxs26("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
|
|
3625
|
+
error && /* @__PURE__ */ jsx42(
|
|
3486
3626
|
"div",
|
|
3487
3627
|
{
|
|
3488
3628
|
id: "reset-error",
|
|
3489
3629
|
role: "alert",
|
|
3490
3630
|
"aria-live": "polite",
|
|
3491
3631
|
className: "bg-red-900/20 border border-red-700/30 rounded-lg p-3",
|
|
3492
|
-
children: /* @__PURE__ */
|
|
3493
|
-
/* @__PURE__ */
|
|
3494
|
-
/* @__PURE__ */
|
|
3632
|
+
children: /* @__PURE__ */ jsxs26("div", { className: "flex items-center gap-2 text-red-400 text-sm", children: [
|
|
3633
|
+
/* @__PURE__ */ jsx42(AlertCircle3, { className: "h-4 w-4 flex-shrink-0" }),
|
|
3634
|
+
/* @__PURE__ */ jsx42("span", { children: error })
|
|
3495
3635
|
] })
|
|
3496
3636
|
}
|
|
3497
3637
|
),
|
|
3498
|
-
/* @__PURE__ */
|
|
3499
|
-
/* @__PURE__ */
|
|
3500
|
-
/* @__PURE__ */
|
|
3501
|
-
/* @__PURE__ */
|
|
3638
|
+
/* @__PURE__ */ jsxs26("div", { className: "space-y-2", children: [
|
|
3639
|
+
/* @__PURE__ */ jsx42(Label, { htmlFor: "password", className: "text-[var(--timberwolf)]", children: "New password" }),
|
|
3640
|
+
/* @__PURE__ */ jsxs26("div", { className: "relative", children: [
|
|
3641
|
+
/* @__PURE__ */ jsx42(
|
|
3502
3642
|
Input,
|
|
3503
3643
|
{
|
|
3504
3644
|
id: "password",
|
|
@@ -3514,8 +3654,8 @@ function ResetPasswordForm({
|
|
|
3514
3654
|
"aria-describedby": error ? "reset-error" : void 0
|
|
3515
3655
|
}
|
|
3516
3656
|
),
|
|
3517
|
-
/* @__PURE__ */
|
|
3518
|
-
/* @__PURE__ */
|
|
3657
|
+
/* @__PURE__ */ jsx42(Lock2, { className: "h-4 w-4 absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground" }),
|
|
3658
|
+
/* @__PURE__ */ jsx42(
|
|
3519
3659
|
"button",
|
|
3520
3660
|
{
|
|
3521
3661
|
type: "button",
|
|
@@ -3524,13 +3664,13 @@ function ResetPasswordForm({
|
|
|
3524
3664
|
disabled: loading,
|
|
3525
3665
|
"aria-label": showPassword ? "Hide password" : "Show password",
|
|
3526
3666
|
"aria-pressed": showPassword,
|
|
3527
|
-
children: showPassword ? /* @__PURE__ */
|
|
3667
|
+
children: showPassword ? /* @__PURE__ */ jsx42(EyeOff2, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx42(Eye2, { className: "h-4 w-4" })
|
|
3528
3668
|
}
|
|
3529
3669
|
)
|
|
3530
3670
|
] })
|
|
3531
3671
|
] }),
|
|
3532
|
-
/* @__PURE__ */
|
|
3533
|
-
/* @__PURE__ */
|
|
3672
|
+
/* @__PURE__ */ jsxs26("div", { className: "space-y-2", children: [
|
|
3673
|
+
/* @__PURE__ */ jsx42(
|
|
3534
3674
|
Label,
|
|
3535
3675
|
{
|
|
3536
3676
|
htmlFor: "confirmPassword",
|
|
@@ -3538,8 +3678,8 @@ function ResetPasswordForm({
|
|
|
3538
3678
|
children: "Confirm new password"
|
|
3539
3679
|
}
|
|
3540
3680
|
),
|
|
3541
|
-
/* @__PURE__ */
|
|
3542
|
-
/* @__PURE__ */
|
|
3681
|
+
/* @__PURE__ */ jsxs26("div", { className: "relative", children: [
|
|
3682
|
+
/* @__PURE__ */ jsx42(
|
|
3543
3683
|
Input,
|
|
3544
3684
|
{
|
|
3545
3685
|
id: "confirmPassword",
|
|
@@ -3554,8 +3694,8 @@ function ResetPasswordForm({
|
|
|
3554
3694
|
"aria-describedby": error ? "reset-error" : void 0
|
|
3555
3695
|
}
|
|
3556
3696
|
),
|
|
3557
|
-
/* @__PURE__ */
|
|
3558
|
-
/* @__PURE__ */
|
|
3697
|
+
/* @__PURE__ */ jsx42(Lock2, { className: "h-4 w-4 absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground" }),
|
|
3698
|
+
/* @__PURE__ */ jsx42(
|
|
3559
3699
|
"button",
|
|
3560
3700
|
{
|
|
3561
3701
|
type: "button",
|
|
@@ -3564,26 +3704,26 @@ function ResetPasswordForm({
|
|
|
3564
3704
|
disabled: loading,
|
|
3565
3705
|
"aria-label": showConfirmPassword ? "Hide password" : "Show password",
|
|
3566
3706
|
"aria-pressed": showConfirmPassword,
|
|
3567
|
-
children: showConfirmPassword ? /* @__PURE__ */
|
|
3707
|
+
children: showConfirmPassword ? /* @__PURE__ */ jsx42(EyeOff2, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx42(Eye2, { className: "h-4 w-4" })
|
|
3568
3708
|
}
|
|
3569
3709
|
)
|
|
3570
3710
|
] })
|
|
3571
3711
|
] }),
|
|
3572
|
-
/* @__PURE__ */
|
|
3573
|
-
/* @__PURE__ */
|
|
3712
|
+
/* @__PURE__ */ jsx42("p", { className: "text-xs text-muted-foreground", children: "At least 8 characters with an uppercase letter, a lowercase letter, and a number." }),
|
|
3713
|
+
/* @__PURE__ */ jsx42(
|
|
3574
3714
|
Button,
|
|
3575
3715
|
{
|
|
3576
3716
|
type: "submit",
|
|
3577
3717
|
className: "w-full h-11 bg-[var(--timberwolf)] text-[var(--night)] hover:bg-[var(--ash-grey)]",
|
|
3578
3718
|
disabled: loading,
|
|
3579
|
-
children: loading ? /* @__PURE__ */
|
|
3580
|
-
/* @__PURE__ */
|
|
3719
|
+
children: loading ? /* @__PURE__ */ jsxs26(Fragment8, { children: [
|
|
3720
|
+
/* @__PURE__ */ jsx42(Loader23, { className: "h-4 w-4 mr-2 animate-spin" }),
|
|
3581
3721
|
"Updating password..."
|
|
3582
3722
|
] }) : "Update password"
|
|
3583
3723
|
}
|
|
3584
3724
|
)
|
|
3585
3725
|
] }),
|
|
3586
|
-
/* @__PURE__ */
|
|
3726
|
+
/* @__PURE__ */ jsx42("div", { className: "text-center text-sm", children: /* @__PURE__ */ jsx42(
|
|
3587
3727
|
Link6,
|
|
3588
3728
|
{
|
|
3589
3729
|
href: loginHref,
|
|
@@ -3646,6 +3786,7 @@ export {
|
|
|
3646
3786
|
Input,
|
|
3647
3787
|
Label,
|
|
3648
3788
|
LumaSpin,
|
|
3789
|
+
MultiSelect,
|
|
3649
3790
|
NewsletterForm2 as NewsletterForm,
|
|
3650
3791
|
PageShell,
|
|
3651
3792
|
Popover,
|