@ship-it-ui/ui 0.0.9 → 0.0.11
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/index.cjs +1086 -468
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +298 -16
- package/dist/index.d.ts +298 -16
- package/dist/index.js +1060 -443
- package/dist/index.js.map +1 -1
- package/package.json +26 -26
package/dist/index.js
CHANGED
|
@@ -3080,6 +3080,7 @@ import {
|
|
|
3080
3080
|
forwardRef as forwardRef44,
|
|
3081
3081
|
useCallback as useCallback9,
|
|
3082
3082
|
useEffect as useEffect8,
|
|
3083
|
+
useLayoutEffect as useLayoutEffect2,
|
|
3083
3084
|
useRef as useRef8
|
|
3084
3085
|
} from "react";
|
|
3085
3086
|
import { Fragment, jsx as jsx45, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
@@ -3093,27 +3094,36 @@ var Carousel = forwardRef44(function Carousel2({
|
|
|
3093
3094
|
aspectRatio = 16 / 10,
|
|
3094
3095
|
showDots = true,
|
|
3095
3096
|
showArrows = true,
|
|
3097
|
+
loop = false,
|
|
3096
3098
|
className,
|
|
3097
3099
|
"aria-label": ariaLabel = "Carousel",
|
|
3098
3100
|
...props
|
|
3099
3101
|
}, ref) {
|
|
3102
|
+
const N = items.length;
|
|
3103
|
+
const isLooping = loop && N > 1;
|
|
3100
3104
|
const [active, setActive] = useControllableState({
|
|
3101
3105
|
value: indexProp,
|
|
3102
3106
|
defaultValue: defaultIndex ?? 0,
|
|
3103
3107
|
onChange: onIndexChange
|
|
3104
3108
|
});
|
|
3105
3109
|
const viewportRef = useRef8(null);
|
|
3110
|
+
const internalScrollRef = useRef8(false);
|
|
3111
|
+
const activeIdx = active ?? 0;
|
|
3112
|
+
const domIndexFor = useCallback9((real) => isLooping ? real + 1 : real, [isLooping]);
|
|
3106
3113
|
const goTo = useCallback9(
|
|
3107
3114
|
(i) => {
|
|
3108
|
-
const
|
|
3109
|
-
setActive(
|
|
3115
|
+
const next = isLooping ? (i % N + N) % N : Math.max(0, Math.min(N - 1, i));
|
|
3116
|
+
setActive(next);
|
|
3110
3117
|
const node = viewportRef.current;
|
|
3111
3118
|
if (node) {
|
|
3112
|
-
const slide = node.children[
|
|
3113
|
-
slide
|
|
3119
|
+
const slide = node.children[domIndexFor(next)];
|
|
3120
|
+
if (slide) {
|
|
3121
|
+
internalScrollRef.current = true;
|
|
3122
|
+
slide.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "start" });
|
|
3123
|
+
}
|
|
3114
3124
|
}
|
|
3115
3125
|
},
|
|
3116
|
-
[
|
|
3126
|
+
[N, isLooping, domIndexFor, setActive]
|
|
3117
3127
|
);
|
|
3118
3128
|
useEffect8(() => {
|
|
3119
3129
|
const node = viewportRef.current;
|
|
@@ -3121,13 +3131,59 @@ var Carousel = forwardRef44(function Carousel2({
|
|
|
3121
3131
|
const onScroll = () => {
|
|
3122
3132
|
const width = node.clientWidth;
|
|
3123
3133
|
if (width === 0) return;
|
|
3124
|
-
const
|
|
3125
|
-
if (
|
|
3134
|
+
const domIdx = Math.round(node.scrollLeft / width);
|
|
3135
|
+
if (!isLooping) {
|
|
3136
|
+
if (domIdx !== activeIdx) setActive(domIdx);
|
|
3137
|
+
return;
|
|
3138
|
+
}
|
|
3139
|
+
if (domIdx === 0) {
|
|
3140
|
+
const realTwin = node.children[N];
|
|
3141
|
+
if (realTwin) {
|
|
3142
|
+
internalScrollRef.current = true;
|
|
3143
|
+
realTwin.scrollIntoView({ behavior: "instant", block: "nearest", inline: "start" });
|
|
3144
|
+
}
|
|
3145
|
+
if (activeIdx !== N - 1) setActive(N - 1);
|
|
3146
|
+
return;
|
|
3147
|
+
}
|
|
3148
|
+
if (domIdx === N + 1) {
|
|
3149
|
+
const realTwin = node.children[1];
|
|
3150
|
+
if (realTwin) {
|
|
3151
|
+
internalScrollRef.current = true;
|
|
3152
|
+
realTwin.scrollIntoView({ behavior: "instant", block: "nearest", inline: "start" });
|
|
3153
|
+
}
|
|
3154
|
+
if (activeIdx !== 0) setActive(0);
|
|
3155
|
+
return;
|
|
3156
|
+
}
|
|
3157
|
+
const realIdx = domIdx - 1;
|
|
3158
|
+
if (realIdx !== activeIdx) setActive(realIdx);
|
|
3126
3159
|
};
|
|
3127
3160
|
node.addEventListener("scroll", onScroll, { passive: true });
|
|
3128
3161
|
return () => node.removeEventListener("scroll", onScroll);
|
|
3129
|
-
}, [
|
|
3130
|
-
|
|
3162
|
+
}, [activeIdx, isLooping, N, setActive]);
|
|
3163
|
+
useEffect8(() => {
|
|
3164
|
+
if (internalScrollRef.current) {
|
|
3165
|
+
internalScrollRef.current = false;
|
|
3166
|
+
return;
|
|
3167
|
+
}
|
|
3168
|
+
const node = viewportRef.current;
|
|
3169
|
+
if (!node) return;
|
|
3170
|
+
const width = node.clientWidth;
|
|
3171
|
+
if (width === 0) return;
|
|
3172
|
+
const targetDom = domIndexFor(activeIdx);
|
|
3173
|
+
const currentDom = Math.round(node.scrollLeft / width);
|
|
3174
|
+
if (currentDom === targetDom) return;
|
|
3175
|
+
const slide = node.children[targetDom];
|
|
3176
|
+
slide?.scrollIntoView({ behavior: "instant", block: "nearest", inline: "start" });
|
|
3177
|
+
}, [activeIdx, domIndexFor]);
|
|
3178
|
+
useLayoutEffect2(() => {
|
|
3179
|
+
if (!isLooping) return;
|
|
3180
|
+
const node = viewportRef.current;
|
|
3181
|
+
if (!node) return;
|
|
3182
|
+
const slide = node.children[domIndexFor(activeIdx)];
|
|
3183
|
+
if (!slide) return;
|
|
3184
|
+
internalScrollRef.current = true;
|
|
3185
|
+
slide.scrollIntoView({ behavior: "instant", block: "nearest", inline: "start" });
|
|
3186
|
+
}, [isLooping]);
|
|
3131
3187
|
return /* @__PURE__ */ jsxs38(
|
|
3132
3188
|
"div",
|
|
3133
3189
|
{
|
|
@@ -3139,34 +3195,58 @@ var Carousel = forwardRef44(function Carousel2({
|
|
|
3139
3195
|
...props,
|
|
3140
3196
|
children: [
|
|
3141
3197
|
/* @__PURE__ */ jsxs38("div", { className: "relative overflow-hidden rounded-md", children: [
|
|
3142
|
-
/* @__PURE__ */
|
|
3198
|
+
/* @__PURE__ */ jsxs38(
|
|
3143
3199
|
"div",
|
|
3144
3200
|
{
|
|
3145
3201
|
ref: viewportRef,
|
|
3146
3202
|
className: "flex w-full snap-x snap-mandatory overflow-x-auto scroll-smooth [scrollbar-width:none] [&::-webkit-scrollbar]:hidden",
|
|
3147
3203
|
"aria-live": "polite",
|
|
3148
|
-
children:
|
|
3149
|
-
|
|
3150
|
-
|
|
3151
|
-
|
|
3152
|
-
|
|
3153
|
-
|
|
3154
|
-
|
|
3155
|
-
|
|
3156
|
-
|
|
3157
|
-
|
|
3158
|
-
|
|
3159
|
-
|
|
3204
|
+
children: [
|
|
3205
|
+
isLooping && /* @__PURE__ */ jsx45(
|
|
3206
|
+
"div",
|
|
3207
|
+
{
|
|
3208
|
+
"aria-hidden": "true",
|
|
3209
|
+
tabIndex: -1,
|
|
3210
|
+
className: "w-full shrink-0 snap-start",
|
|
3211
|
+
style: { aspectRatio: String(aspectRatio) },
|
|
3212
|
+
children: renderItem(items[N - 1], N - 1)
|
|
3213
|
+
},
|
|
3214
|
+
"clone-start"
|
|
3215
|
+
),
|
|
3216
|
+
items.map((item, i) => /* @__PURE__ */ jsx45(
|
|
3217
|
+
"div",
|
|
3218
|
+
{
|
|
3219
|
+
className: "w-full shrink-0 snap-start",
|
|
3220
|
+
style: { aspectRatio: String(aspectRatio) },
|
|
3221
|
+
role: "group",
|
|
3222
|
+
"aria-roledescription": "slide",
|
|
3223
|
+
"aria-label": `${i + 1} of ${N}`,
|
|
3224
|
+
children: renderItem(item, i)
|
|
3225
|
+
},
|
|
3226
|
+
i
|
|
3227
|
+
)),
|
|
3228
|
+
isLooping && /* @__PURE__ */ jsx45(
|
|
3229
|
+
"div",
|
|
3230
|
+
{
|
|
3231
|
+
"aria-hidden": "true",
|
|
3232
|
+
tabIndex: -1,
|
|
3233
|
+
className: "w-full shrink-0 snap-start",
|
|
3234
|
+
style: { aspectRatio: String(aspectRatio) },
|
|
3235
|
+
children: renderItem(items[0], 0)
|
|
3236
|
+
},
|
|
3237
|
+
"clone-end"
|
|
3238
|
+
)
|
|
3239
|
+
]
|
|
3160
3240
|
}
|
|
3161
3241
|
),
|
|
3162
|
-
showArrows &&
|
|
3242
|
+
showArrows && N > 1 && /* @__PURE__ */ jsxs38(Fragment, { children: [
|
|
3163
3243
|
/* @__PURE__ */ jsx45(
|
|
3164
3244
|
"button",
|
|
3165
3245
|
{
|
|
3166
3246
|
type: "button",
|
|
3167
3247
|
"aria-label": "Previous slide",
|
|
3168
3248
|
onClick: () => goTo(activeIdx - 1),
|
|
3169
|
-
disabled: activeIdx === 0,
|
|
3249
|
+
disabled: !isLooping && activeIdx === 0,
|
|
3170
3250
|
className: "bg-panel/85 border-border text-text hover:bg-panel absolute top-1/2 left-2 inline-grid h-9 w-9 -translate-y-1/2 cursor-pointer place-items-center rounded-full border shadow-md backdrop-blur disabled:cursor-not-allowed disabled:opacity-40",
|
|
3171
3251
|
children: /* @__PURE__ */ jsx45(IconGlyph4, { name: "caretLeft", size: 16 })
|
|
3172
3252
|
}
|
|
@@ -3177,13 +3257,13 @@ var Carousel = forwardRef44(function Carousel2({
|
|
|
3177
3257
|
type: "button",
|
|
3178
3258
|
"aria-label": "Next slide",
|
|
3179
3259
|
onClick: () => goTo(activeIdx + 1),
|
|
3180
|
-
disabled: activeIdx ===
|
|
3260
|
+
disabled: !isLooping && activeIdx === N - 1,
|
|
3181
3261
|
className: "bg-panel/85 border-border text-text hover:bg-panel absolute top-1/2 right-2 inline-grid h-9 w-9 -translate-y-1/2 cursor-pointer place-items-center rounded-full border shadow-md backdrop-blur disabled:cursor-not-allowed disabled:opacity-40",
|
|
3182
3262
|
children: /* @__PURE__ */ jsx45(IconGlyph4, { name: "caretRight", size: 16 })
|
|
3183
3263
|
}
|
|
3184
3264
|
)
|
|
3185
3265
|
] }),
|
|
3186
|
-
showDots &&
|
|
3266
|
+
showDots && N > 1 && /*
|
|
3187
3267
|
* Plain `<button>` + `aria-current` rather than the tabs pattern
|
|
3188
3268
|
* (`role="tablist" / "tab"`). The APG carousel pattern recommends
|
|
3189
3269
|
* this lighter semantic; the viewport's `aria-live="polite"`
|
|
@@ -4256,19 +4336,28 @@ var Lightbox = forwardRef50(function Lightbox2({
|
|
|
4256
4336
|
index,
|
|
4257
4337
|
defaultIndex,
|
|
4258
4338
|
onIndexChange,
|
|
4339
|
+
loop = false,
|
|
4259
4340
|
title = "Photo viewer"
|
|
4260
4341
|
}, ref) {
|
|
4342
|
+
const N = items.length;
|
|
4343
|
+
const isLooping = loop && N > 1;
|
|
4261
4344
|
const [active, setActive] = useControllableState({
|
|
4262
4345
|
value: index,
|
|
4263
4346
|
defaultValue: defaultIndex ?? 0,
|
|
4264
4347
|
onChange: onIndexChange
|
|
4265
4348
|
});
|
|
4266
4349
|
const goPrev = useCallback11(() => {
|
|
4267
|
-
setActive((prev) =>
|
|
4268
|
-
|
|
4350
|
+
setActive((prev) => {
|
|
4351
|
+
const p = prev ?? 0;
|
|
4352
|
+
return isLooping ? (p - 1 + N) % N : Math.max(0, p - 1);
|
|
4353
|
+
});
|
|
4354
|
+
}, [setActive, isLooping, N]);
|
|
4269
4355
|
const goNext = useCallback11(() => {
|
|
4270
|
-
setActive((prev) =>
|
|
4271
|
-
|
|
4356
|
+
setActive((prev) => {
|
|
4357
|
+
const p = prev ?? 0;
|
|
4358
|
+
return isLooping ? (p + 1) % N : Math.min(N - 1, p + 1);
|
|
4359
|
+
});
|
|
4360
|
+
}, [setActive, isLooping, N]);
|
|
4272
4361
|
const onKey = useCallback11(
|
|
4273
4362
|
(e) => {
|
|
4274
4363
|
if (e.key === "ArrowLeft") {
|
|
@@ -4308,7 +4397,7 @@ var Lightbox = forwardRef50(function Lightbox2({
|
|
|
4308
4397
|
type: "button",
|
|
4309
4398
|
"aria-label": "Previous photo",
|
|
4310
4399
|
onClick: goPrev,
|
|
4311
|
-
disabled: activeIdx === 0,
|
|
4400
|
+
disabled: !isLooping && activeIdx === 0,
|
|
4312
4401
|
className: "absolute top-1/2 left-4 inline-grid h-11 w-11 -translate-y-1/2 cursor-pointer place-items-center rounded-full bg-white/10 text-white hover:bg-white/20 disabled:cursor-not-allowed disabled:opacity-40",
|
|
4313
4402
|
children: /* @__PURE__ */ jsx52(IconGlyph6, { name: "caretLeft", size: 20 })
|
|
4314
4403
|
}
|
|
@@ -4319,7 +4408,7 @@ var Lightbox = forwardRef50(function Lightbox2({
|
|
|
4319
4408
|
type: "button",
|
|
4320
4409
|
"aria-label": "Next photo",
|
|
4321
4410
|
onClick: goNext,
|
|
4322
|
-
disabled: activeIdx ===
|
|
4411
|
+
disabled: !isLooping && activeIdx === N - 1,
|
|
4323
4412
|
className: "absolute top-1/2 right-4 inline-grid h-11 w-11 -translate-y-1/2 cursor-pointer place-items-center rounded-full bg-white/10 text-white hover:bg-white/20 disabled:cursor-not-allowed disabled:opacity-40",
|
|
4324
4413
|
children: /* @__PURE__ */ jsx52(IconGlyph6, { name: "caretRight", size: 20 })
|
|
4325
4414
|
}
|
|
@@ -4349,10 +4438,32 @@ Lightbox.displayName = "Lightbox";
|
|
|
4349
4438
|
|
|
4350
4439
|
// src/patterns/ListingCard/ListingCard.tsx
|
|
4351
4440
|
import { IconGlyph as IconGlyph7 } from "@ship-it-ui/icons";
|
|
4352
|
-
import {
|
|
4441
|
+
import { cva as cva11 } from "class-variance-authority";
|
|
4442
|
+
import { forwardRef as forwardRef51, useState as useState13 } from "react";
|
|
4353
4443
|
import { jsx as jsx53, jsxs as jsxs46 } from "react/jsx-runtime";
|
|
4444
|
+
var hoverVariants = cva11("", {
|
|
4445
|
+
variants: {
|
|
4446
|
+
hoverEffect: {
|
|
4447
|
+
lift: "transition-[transform,box-shadow,border-color] duration-(--duration-micro) hover:-translate-y-px hover:shadow hover:border-border-strong",
|
|
4448
|
+
glow: "transition-[box-shadow,border-color] duration-(--duration-micro) hover:ring-[3px] hover:ring-accent-dim hover:border-accent",
|
|
4449
|
+
none: ""
|
|
4450
|
+
}
|
|
4451
|
+
}
|
|
4452
|
+
});
|
|
4453
|
+
var flagToneClass = {
|
|
4454
|
+
accent: "bg-accent-dim text-accent",
|
|
4455
|
+
purple: "bg-[color-mix(in_oklab,var(--color-purple),transparent_75%)] text-purple",
|
|
4456
|
+
pink: "bg-[color-mix(in_oklab,var(--color-pink),transparent_75%)] text-pink",
|
|
4457
|
+
ok: "bg-[color-mix(in_oklab,var(--color-ok),transparent_75%)] text-ok",
|
|
4458
|
+
warn: "bg-[color-mix(in_oklab,var(--color-warn),transparent_75%)] text-warn"
|
|
4459
|
+
};
|
|
4354
4460
|
var ListingCard = forwardRef51(function ListingCard2({
|
|
4461
|
+
variant = "default",
|
|
4355
4462
|
photos,
|
|
4463
|
+
renderPhoto,
|
|
4464
|
+
loop = true,
|
|
4465
|
+
onClick,
|
|
4466
|
+
hoverEffect,
|
|
4356
4467
|
title,
|
|
4357
4468
|
eyebrow,
|
|
4358
4469
|
rating,
|
|
@@ -4360,31 +4471,51 @@ var ListingCard = forwardRef51(function ListingCard2({
|
|
|
4360
4471
|
price,
|
|
4361
4472
|
priceUnit = "/day",
|
|
4362
4473
|
originalPrice,
|
|
4474
|
+
pricePrefix,
|
|
4363
4475
|
host,
|
|
4364
4476
|
distance,
|
|
4365
4477
|
verified,
|
|
4366
4478
|
href,
|
|
4367
4479
|
onFavorite,
|
|
4368
4480
|
favorited,
|
|
4369
|
-
width = 280,
|
|
4481
|
+
width = variant === "spec" ? 320 : 280,
|
|
4482
|
+
flag,
|
|
4483
|
+
category,
|
|
4484
|
+
meta,
|
|
4485
|
+
specs,
|
|
4486
|
+
cta,
|
|
4487
|
+
hidePhotoCounter,
|
|
4488
|
+
classNames: cls = {},
|
|
4370
4489
|
className,
|
|
4371
4490
|
...props
|
|
4372
4491
|
}, ref) {
|
|
4492
|
+
const [photoIndex, setPhotoIndex] = useState13(0);
|
|
4493
|
+
const isSpec = variant === "spec";
|
|
4494
|
+
const stretchedLinkSupported = !isSpec || !cta && !!href;
|
|
4495
|
+
const isInteractive = Boolean(onClick) || Boolean(href);
|
|
4496
|
+
const effectiveHover = hoverEffect ?? (isInteractive ? "lift" : "none");
|
|
4497
|
+
const hoverClass = hoverVariants({ hoverEffect: effectiveHover });
|
|
4373
4498
|
return /* @__PURE__ */ jsxs46(
|
|
4374
4499
|
Card,
|
|
4375
4500
|
{
|
|
4376
4501
|
ref,
|
|
4377
|
-
className: cn("relative overflow-hidden !p-0", className),
|
|
4502
|
+
className: cn("relative isolate overflow-hidden !p-0", hoverClass, cls.root, className),
|
|
4378
4503
|
style: { width },
|
|
4379
4504
|
...props,
|
|
4380
4505
|
children: [
|
|
4381
|
-
/* @__PURE__ */ jsxs46("div", { className: "relative", children: [
|
|
4506
|
+
/* @__PURE__ */ jsxs46("div", { className: cn("relative", cls.photos), children: [
|
|
4382
4507
|
/* @__PURE__ */ jsx53(
|
|
4383
4508
|
Carousel,
|
|
4384
4509
|
{
|
|
4385
4510
|
items: photos,
|
|
4511
|
+
loop,
|
|
4512
|
+
...isSpec ? {
|
|
4513
|
+
index: photoIndex,
|
|
4514
|
+
onIndexChange: setPhotoIndex,
|
|
4515
|
+
showDots: false
|
|
4516
|
+
} : {},
|
|
4386
4517
|
"aria-label": typeof title === "string" ? `${title} photos` : "Listing photos",
|
|
4387
|
-
renderItem: (src) => /* @__PURE__ */ jsx53(
|
|
4518
|
+
renderItem: (src, i) => renderPhoto ? renderPhoto(src, i) : /* @__PURE__ */ jsx53(
|
|
4388
4519
|
"img",
|
|
4389
4520
|
{
|
|
4390
4521
|
src,
|
|
@@ -4395,15 +4526,133 @@ var ListingCard = forwardRef51(function ListingCard2({
|
|
|
4395
4526
|
)
|
|
4396
4527
|
}
|
|
4397
4528
|
),
|
|
4398
|
-
verified && /* @__PURE__ */ jsx53("div", { className: "pointer-events-none absolute top-3 left-3 z-10", children: /* @__PURE__ */ jsxs46(Badge, { variant: "ok", size: "sm", children: [
|
|
4529
|
+
!isSpec && verified && /* @__PURE__ */ jsx53("div", { className: "pointer-events-none absolute top-3 left-3 z-10", children: /* @__PURE__ */ jsxs46(Badge, { variant: "ok", size: "sm", children: [
|
|
4399
4530
|
/* @__PURE__ */ jsx53(IconGlyph7, { name: "verified", size: 11 }),
|
|
4400
4531
|
" Verified host"
|
|
4401
|
-
] }) })
|
|
4532
|
+
] }) }),
|
|
4533
|
+
isSpec && flag && /* @__PURE__ */ jsx53("div", { className: "pointer-events-none absolute top-3 left-3 z-10", children: /* @__PURE__ */ jsxs46(
|
|
4534
|
+
"span",
|
|
4535
|
+
{
|
|
4536
|
+
className: cn(
|
|
4537
|
+
"inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-medium backdrop-blur",
|
|
4538
|
+
flagToneClass[flag.tone ?? "accent"],
|
|
4539
|
+
cls.flag
|
|
4540
|
+
),
|
|
4541
|
+
children: [
|
|
4542
|
+
flag.icon && /* @__PURE__ */ jsx53(IconGlyph7, { name: flag.icon, size: 11 }),
|
|
4543
|
+
flag.label
|
|
4544
|
+
]
|
|
4545
|
+
}
|
|
4546
|
+
) }),
|
|
4547
|
+
isSpec && !hidePhotoCounter && photos.length > 1 && /* @__PURE__ */ jsxs46(
|
|
4548
|
+
"div",
|
|
4549
|
+
{
|
|
4550
|
+
"aria-hidden": true,
|
|
4551
|
+
className: cn(
|
|
4552
|
+
"pointer-events-none absolute top-3 right-3 z-10 rounded-full bg-black/55 px-2.5 py-1 font-mono text-[11px] text-white backdrop-blur",
|
|
4553
|
+
cls.photoCounter
|
|
4554
|
+
),
|
|
4555
|
+
children: [
|
|
4556
|
+
photoIndex + 1,
|
|
4557
|
+
" / ",
|
|
4558
|
+
photos.length
|
|
4559
|
+
]
|
|
4560
|
+
}
|
|
4561
|
+
)
|
|
4402
4562
|
] }),
|
|
4403
|
-
/* @__PURE__ */ jsxs46("div", { className: "flex flex-col
|
|
4404
|
-
|
|
4405
|
-
|
|
4406
|
-
|
|
4563
|
+
isSpec ? /* @__PURE__ */ jsxs46("div", { className: cn("flex flex-col", cls.body), children: [
|
|
4564
|
+
/* @__PURE__ */ jsxs46("div", { className: cn("flex flex-col gap-2 p-4 pb-3", cls.header), children: [
|
|
4565
|
+
/* @__PURE__ */ jsxs46("div", { className: "flex items-start justify-between gap-2", children: [
|
|
4566
|
+
/* @__PURE__ */ jsx53("span", { className: cn("text-text text-[15px] leading-snug font-semibold", cls.title), children: title }),
|
|
4567
|
+
category && /* @__PURE__ */ jsx53(
|
|
4568
|
+
"span",
|
|
4569
|
+
{
|
|
4570
|
+
className: cn(
|
|
4571
|
+
"border-border bg-panel-2 text-text-muted shrink-0 rounded-full border px-2 py-0.5 text-[10px] tracking-wide uppercase",
|
|
4572
|
+
cls.category
|
|
4573
|
+
),
|
|
4574
|
+
children: category
|
|
4575
|
+
}
|
|
4576
|
+
)
|
|
4577
|
+
] }),
|
|
4578
|
+
meta && /* @__PURE__ */ jsx53("span", { className: cn("text-text-dim font-mono text-[11px] tracking-wide", cls.meta), children: meta }),
|
|
4579
|
+
specs && specs.length > 0 && /* @__PURE__ */ jsx53(
|
|
4580
|
+
"dl",
|
|
4581
|
+
{
|
|
4582
|
+
className: cn(
|
|
4583
|
+
"border-border mt-1 grid gap-2 border-t pt-3",
|
|
4584
|
+
specs.length === 2 && "grid-cols-2",
|
|
4585
|
+
specs.length === 3 && "grid-cols-3",
|
|
4586
|
+
specs.length >= 4 && "grid-cols-4",
|
|
4587
|
+
cls.specs
|
|
4588
|
+
),
|
|
4589
|
+
children: specs.map((s, i) => /* @__PURE__ */ jsxs46("div", { className: cn("flex flex-col gap-0.5", cls.specCell), children: [
|
|
4590
|
+
/* @__PURE__ */ jsx53(
|
|
4591
|
+
"dt",
|
|
4592
|
+
{
|
|
4593
|
+
className: cn(
|
|
4594
|
+
"text-text-dim text-[10px] tracking-wider uppercase",
|
|
4595
|
+
cls.specLabel
|
|
4596
|
+
),
|
|
4597
|
+
children: s.label
|
|
4598
|
+
}
|
|
4599
|
+
),
|
|
4600
|
+
/* @__PURE__ */ jsx53("dd", { className: cn("text-text text-[13px] font-medium", cls.specValue), children: s.value })
|
|
4601
|
+
] }, i))
|
|
4602
|
+
}
|
|
4603
|
+
)
|
|
4604
|
+
] }),
|
|
4605
|
+
/* @__PURE__ */ jsxs46(
|
|
4606
|
+
"div",
|
|
4607
|
+
{
|
|
4608
|
+
className: cn(
|
|
4609
|
+
"border-border bg-panel-2 relative z-10 flex items-center justify-between gap-2 border-t px-4 py-3",
|
|
4610
|
+
cls.footer
|
|
4611
|
+
),
|
|
4612
|
+
children: [
|
|
4613
|
+
/* @__PURE__ */ jsx53("div", { className: "flex flex-col leading-tight", children: /* @__PURE__ */ jsxs46("div", { className: "flex items-baseline gap-1.5", children: [
|
|
4614
|
+
pricePrefix && /* @__PURE__ */ jsx53("span", { className: "text-text-dim text-[11px]", children: pricePrefix }),
|
|
4615
|
+
originalPrice && /* @__PURE__ */ jsx53("span", { className: "text-text-dim decoration-sale text-[11px] line-through", children: originalPrice }),
|
|
4616
|
+
/* @__PURE__ */ jsx53("span", { className: cn("text-text text-[15px] font-semibold", cls.price), children: price }),
|
|
4617
|
+
/* @__PURE__ */ jsx53("span", { className: cn("text-text-dim text-[11px]", cls.priceUnit), children: priceUnit })
|
|
4618
|
+
] }) }),
|
|
4619
|
+
cta && (cta.href ? /* @__PURE__ */ jsx53(
|
|
4620
|
+
Button,
|
|
4621
|
+
{
|
|
4622
|
+
asChild: true,
|
|
4623
|
+
variant: "primary",
|
|
4624
|
+
size: "sm",
|
|
4625
|
+
disabled: cta.disabled,
|
|
4626
|
+
className: cls.cta,
|
|
4627
|
+
children: /* @__PURE__ */ jsx53("a", { href: cta.href, onClick: cta.onClick, children: cta.label })
|
|
4628
|
+
}
|
|
4629
|
+
) : /* @__PURE__ */ jsx53(
|
|
4630
|
+
Button,
|
|
4631
|
+
{
|
|
4632
|
+
variant: "primary",
|
|
4633
|
+
size: "sm",
|
|
4634
|
+
onClick: cta.onClick,
|
|
4635
|
+
disabled: cta.disabled,
|
|
4636
|
+
className: cls.cta,
|
|
4637
|
+
children: cta.label
|
|
4638
|
+
}
|
|
4639
|
+
))
|
|
4640
|
+
]
|
|
4641
|
+
}
|
|
4642
|
+
)
|
|
4643
|
+
] }) : /* @__PURE__ */ jsxs46("div", { className: cn("flex flex-col gap-1 p-3", cls.body), children: [
|
|
4644
|
+
eyebrow && /* @__PURE__ */ jsx53(
|
|
4645
|
+
"span",
|
|
4646
|
+
{
|
|
4647
|
+
className: cn(
|
|
4648
|
+
"text-text-dim font-mono text-[10px] tracking-wide uppercase",
|
|
4649
|
+
cls.eyebrow
|
|
4650
|
+
),
|
|
4651
|
+
children: eyebrow
|
|
4652
|
+
}
|
|
4653
|
+
),
|
|
4654
|
+
/* @__PURE__ */ jsxs46("div", { className: cn("flex items-start justify-between gap-2", cls.header), children: [
|
|
4655
|
+
/* @__PURE__ */ jsx53("span", { className: cn("text-text text-[14px] leading-snug font-semibold", cls.title), children: title }),
|
|
4407
4656
|
rating !== void 0 && /* @__PURE__ */ jsxs46("span", { className: "inline-flex shrink-0 items-center gap-1 text-[12px]", children: [
|
|
4408
4657
|
/* @__PURE__ */ jsx53(IconGlyph7, { name: "star", size: 12, className: "text-rating" }),
|
|
4409
4658
|
/* @__PURE__ */ jsx53("span", { className: "text-text font-medium", children: rating.toFixed(1) }),
|
|
@@ -4414,19 +4663,29 @@ var ListingCard = forwardRef51(function ListingCard2({
|
|
|
4414
4663
|
] })
|
|
4415
4664
|
] })
|
|
4416
4665
|
] }),
|
|
4417
|
-
(host || distance) && /* @__PURE__ */ jsxs46("div", { className: "text-text-dim flex items-center gap-2 text-[12px]", children: [
|
|
4666
|
+
(host || distance) && /* @__PURE__ */ jsxs46("div", { className: cn("text-text-dim flex items-center gap-2 text-[12px]", cls.meta), children: [
|
|
4418
4667
|
host && /* @__PURE__ */ jsx53("span", { children: host }),
|
|
4419
4668
|
host && distance && /* @__PURE__ */ jsx53("span", { "aria-hidden": true, children: "\xB7" }),
|
|
4420
4669
|
distance && /* @__PURE__ */ jsx53("span", { children: distance })
|
|
4421
4670
|
] }),
|
|
4422
|
-
/* @__PURE__ */ jsxs46("div", { className: "mt-2 flex items-baseline gap-2", children: [
|
|
4671
|
+
/* @__PURE__ */ jsxs46("div", { className: cn("mt-2 flex items-baseline gap-2", cls.footer), children: [
|
|
4423
4672
|
originalPrice && /* @__PURE__ */ jsx53("span", { className: "text-text-dim decoration-sale text-[12px] line-through", children: originalPrice }),
|
|
4424
|
-
/* @__PURE__ */ jsx53("span", { className: "text-text text-[15px] font-semibold", children: price }),
|
|
4425
|
-
/* @__PURE__ */ jsx53("span", { className: "text-text-dim text-[12px]", children: priceUnit })
|
|
4673
|
+
/* @__PURE__ */ jsx53("span", { className: cn("text-text text-[15px] font-semibold", cls.price), children: price }),
|
|
4674
|
+
/* @__PURE__ */ jsx53("span", { className: cn("text-text-dim text-[12px]", cls.priceUnit), children: priceUnit })
|
|
4426
4675
|
] }),
|
|
4427
|
-
rating !== void 0 && /* @__PURE__ */ jsx53(
|
|
4676
|
+
rating !== void 0 && /* @__PURE__ */ jsx53(
|
|
4677
|
+
Rating,
|
|
4678
|
+
{
|
|
4679
|
+
value: rating,
|
|
4680
|
+
max: 5,
|
|
4681
|
+
precision: "half",
|
|
4682
|
+
size: "sm",
|
|
4683
|
+
readOnly: true,
|
|
4684
|
+
className: "sr-only"
|
|
4685
|
+
}
|
|
4686
|
+
)
|
|
4428
4687
|
] }),
|
|
4429
|
-
href && /* @__PURE__ */ jsx53(
|
|
4688
|
+
href && stretchedLinkSupported && !onClick && /* @__PURE__ */ jsx53(
|
|
4430
4689
|
"a",
|
|
4431
4690
|
{
|
|
4432
4691
|
href,
|
|
@@ -4434,7 +4693,16 @@ var ListingCard = forwardRef51(function ListingCard2({
|
|
|
4434
4693
|
className: "absolute inset-0 z-0 no-underline"
|
|
4435
4694
|
}
|
|
4436
4695
|
),
|
|
4437
|
-
|
|
4696
|
+
onClick && /* @__PURE__ */ jsx53(
|
|
4697
|
+
"button",
|
|
4698
|
+
{
|
|
4699
|
+
type: "button",
|
|
4700
|
+
onClick,
|
|
4701
|
+
"aria-label": typeof title === "string" ? `View ${title}` : "View listing",
|
|
4702
|
+
className: "focus-visible:ring-accent-dim absolute inset-0 z-0 cursor-pointer bg-transparent outline-none focus-visible:ring-[3px]"
|
|
4703
|
+
}
|
|
4704
|
+
),
|
|
4705
|
+
!isSpec && onFavorite && /* @__PURE__ */ jsx53(
|
|
4438
4706
|
"button",
|
|
4439
4707
|
{
|
|
4440
4708
|
type: "button",
|
|
@@ -4444,7 +4712,8 @@ var ListingCard = forwardRef51(function ListingCard2({
|
|
|
4444
4712
|
className: cn(
|
|
4445
4713
|
"absolute top-3 right-3 z-20 inline-grid h-8 w-8 cursor-pointer place-items-center rounded-full",
|
|
4446
4714
|
"bg-panel/85 hover:bg-panel border-border border shadow-sm backdrop-blur",
|
|
4447
|
-
favorited ? "text-err" : "text-text-dim hover:text-text"
|
|
4715
|
+
favorited ? "text-err" : "text-text-dim hover:text-text",
|
|
4716
|
+
cls.favorite
|
|
4448
4717
|
),
|
|
4449
4718
|
children: /* @__PURE__ */ jsx53(IconGlyph7, { name: "heart", size: 16 })
|
|
4450
4719
|
}
|
|
@@ -4455,8 +4724,358 @@ var ListingCard = forwardRef51(function ListingCard2({
|
|
|
4455
4724
|
});
|
|
4456
4725
|
ListingCard.displayName = "ListingCard";
|
|
4457
4726
|
|
|
4727
|
+
// src/patterns/ListingDetail/ListingDetail.tsx
|
|
4728
|
+
import * as RadixDialog6 from "@radix-ui/react-dialog";
|
|
4729
|
+
import { IconGlyph as IconGlyph8 } from "@ship-it-ui/icons";
|
|
4730
|
+
import { forwardRef as forwardRef52, useState as useState14 } from "react";
|
|
4731
|
+
import { jsx as jsx54, jsxs as jsxs47 } from "react/jsx-runtime";
|
|
4732
|
+
function renderAction(action, variant) {
|
|
4733
|
+
if (action.href) {
|
|
4734
|
+
return /* @__PURE__ */ jsx54(Button, { asChild: true, variant, disabled: action.disabled, children: /* @__PURE__ */ jsx54("a", { href: action.href, onClick: action.onClick, children: action.label }) });
|
|
4735
|
+
}
|
|
4736
|
+
return /* @__PURE__ */ jsx54(Button, { variant, onClick: action.onClick, disabled: action.disabled, children: action.label });
|
|
4737
|
+
}
|
|
4738
|
+
var flagToneClass2 = {
|
|
4739
|
+
accent: "bg-accent-dim text-accent",
|
|
4740
|
+
purple: "bg-[color-mix(in_oklab,var(--color-purple),transparent_75%)] text-purple",
|
|
4741
|
+
pink: "bg-[color-mix(in_oklab,var(--color-pink),transparent_75%)] text-pink",
|
|
4742
|
+
ok: "bg-[color-mix(in_oklab,var(--color-ok),transparent_75%)] text-ok",
|
|
4743
|
+
warn: "bg-[color-mix(in_oklab,var(--color-warn),transparent_75%)] text-warn"
|
|
4744
|
+
};
|
|
4745
|
+
var ListingDetail = forwardRef52(function ListingDetail2({
|
|
4746
|
+
variant = "default",
|
|
4747
|
+
open,
|
|
4748
|
+
defaultOpen,
|
|
4749
|
+
onOpenChange,
|
|
4750
|
+
photos,
|
|
4751
|
+
renderPhoto,
|
|
4752
|
+
loop = true,
|
|
4753
|
+
title,
|
|
4754
|
+
eyebrow,
|
|
4755
|
+
description,
|
|
4756
|
+
rating,
|
|
4757
|
+
reviewCount,
|
|
4758
|
+
price,
|
|
4759
|
+
priceUnit = "/day",
|
|
4760
|
+
originalPrice,
|
|
4761
|
+
pricePrefix,
|
|
4762
|
+
host,
|
|
4763
|
+
features,
|
|
4764
|
+
primaryAction,
|
|
4765
|
+
secondaryAction,
|
|
4766
|
+
flag,
|
|
4767
|
+
category,
|
|
4768
|
+
meta,
|
|
4769
|
+
specs,
|
|
4770
|
+
cta,
|
|
4771
|
+
hidePhotoCounter,
|
|
4772
|
+
classNames: cls = {}
|
|
4773
|
+
}, ref) {
|
|
4774
|
+
const [galleryIndex, setGalleryIndex] = useState14(0);
|
|
4775
|
+
const [lightboxOpen, setLightboxOpen] = useState14(false);
|
|
4776
|
+
const isSpec = variant === "spec";
|
|
4777
|
+
const lightboxTitle = typeof title === "string" ? `${title} photos` : "Listing photos";
|
|
4778
|
+
return /* @__PURE__ */ jsxs47(RadixDialog6.Root, { open, defaultOpen, onOpenChange, children: [
|
|
4779
|
+
/* @__PURE__ */ jsxs47(RadixDialog6.Portal, { children: [
|
|
4780
|
+
/* @__PURE__ */ jsx54(
|
|
4781
|
+
RadixDialog6.Overlay,
|
|
4782
|
+
{
|
|
4783
|
+
className: cn(
|
|
4784
|
+
"z-overlay fixed inset-0 bg-black/55 backdrop-blur-[4px]",
|
|
4785
|
+
"data-[state=open]:animate-[ship-fade-in_150ms_ease]",
|
|
4786
|
+
cls.overlay
|
|
4787
|
+
)
|
|
4788
|
+
}
|
|
4789
|
+
),
|
|
4790
|
+
/* @__PURE__ */ jsxs47(
|
|
4791
|
+
RadixDialog6.Content,
|
|
4792
|
+
{
|
|
4793
|
+
ref,
|
|
4794
|
+
...description ? {} : { "aria-describedby": void 0 },
|
|
4795
|
+
className: cn(
|
|
4796
|
+
"z-modal fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2",
|
|
4797
|
+
"w-[calc(100%-32px)] max-w-[960px]",
|
|
4798
|
+
"max-h-[min(92vh,820px)] overflow-hidden",
|
|
4799
|
+
"bg-panel border-border-strong rounded-lg border shadow-lg outline-none",
|
|
4800
|
+
"data-[state=open]:animate-[ship-dialog-in_180ms_var(--easing-out)]",
|
|
4801
|
+
"flex flex-col",
|
|
4802
|
+
cls.content
|
|
4803
|
+
),
|
|
4804
|
+
children: [
|
|
4805
|
+
/* @__PURE__ */ jsxs47(
|
|
4806
|
+
"div",
|
|
4807
|
+
{
|
|
4808
|
+
className: cn(
|
|
4809
|
+
"grid grid-cols-1 gap-6 overflow-y-auto p-6 md:grid-cols-[1.1fr_1fr]",
|
|
4810
|
+
isSpec && cta && "pb-4",
|
|
4811
|
+
cls.grid
|
|
4812
|
+
),
|
|
4813
|
+
children: [
|
|
4814
|
+
/* @__PURE__ */ jsxs47("div", { className: cn("flex flex-col gap-3", cls.photos), children: [
|
|
4815
|
+
/* @__PURE__ */ jsxs47("div", { className: "relative overflow-hidden rounded-md", children: [
|
|
4816
|
+
/* @__PURE__ */ jsx54(
|
|
4817
|
+
Carousel,
|
|
4818
|
+
{
|
|
4819
|
+
items: photos,
|
|
4820
|
+
index: galleryIndex,
|
|
4821
|
+
onIndexChange: setGalleryIndex,
|
|
4822
|
+
loop,
|
|
4823
|
+
...isSpec ? { showDots: false } : {},
|
|
4824
|
+
"aria-label": typeof title === "string" ? `${title} photos` : "Listing photos",
|
|
4825
|
+
renderItem: (src, i) => renderPhoto ? renderPhoto(src, i, "gallery") : /* @__PURE__ */ jsx54(
|
|
4826
|
+
"img",
|
|
4827
|
+
{
|
|
4828
|
+
src,
|
|
4829
|
+
alt: "",
|
|
4830
|
+
className: "block h-full w-full object-cover",
|
|
4831
|
+
loading: "lazy"
|
|
4832
|
+
}
|
|
4833
|
+
)
|
|
4834
|
+
}
|
|
4835
|
+
),
|
|
4836
|
+
isSpec && flag ? /* @__PURE__ */ jsx54("div", { className: "pointer-events-none absolute top-3 left-3 z-10", children: /* @__PURE__ */ jsxs47(
|
|
4837
|
+
"span",
|
|
4838
|
+
{
|
|
4839
|
+
className: cn(
|
|
4840
|
+
"inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-medium backdrop-blur",
|
|
4841
|
+
flagToneClass2[flag.tone ?? "accent"],
|
|
4842
|
+
cls.flag
|
|
4843
|
+
),
|
|
4844
|
+
children: [
|
|
4845
|
+
flag.icon && /* @__PURE__ */ jsx54(IconGlyph8, { name: flag.icon, size: 11 }),
|
|
4846
|
+
flag.label
|
|
4847
|
+
]
|
|
4848
|
+
}
|
|
4849
|
+
) }) : null,
|
|
4850
|
+
/* @__PURE__ */ jsx54(
|
|
4851
|
+
"button",
|
|
4852
|
+
{
|
|
4853
|
+
type: "button",
|
|
4854
|
+
onClick: () => setLightboxOpen(true),
|
|
4855
|
+
"aria-label": "Open photo viewer",
|
|
4856
|
+
className: cn(
|
|
4857
|
+
"bg-panel/85 hover:bg-panel border-border text-text-muted hover:text-text focus-visible:ring-accent-dim absolute z-10 inline-grid h-8 w-8 cursor-pointer place-items-center rounded-full border shadow-sm backdrop-blur outline-none focus-visible:ring-[3px]",
|
|
4858
|
+
isSpec ? "right-3 bottom-3" : "top-3 left-3"
|
|
4859
|
+
),
|
|
4860
|
+
children: /* @__PURE__ */ jsx54(IconGlyph8, { name: "maximize", size: 14 })
|
|
4861
|
+
}
|
|
4862
|
+
),
|
|
4863
|
+
isSpec && !hidePhotoCounter && photos.length > 1 && /* @__PURE__ */ jsxs47(
|
|
4864
|
+
"div",
|
|
4865
|
+
{
|
|
4866
|
+
"aria-hidden": true,
|
|
4867
|
+
className: cn(
|
|
4868
|
+
"pointer-events-none absolute top-3 right-3 z-10 rounded-full bg-black/55 px-2.5 py-1 font-mono text-[11px] text-white backdrop-blur",
|
|
4869
|
+
cls.photoCounter
|
|
4870
|
+
),
|
|
4871
|
+
children: [
|
|
4872
|
+
galleryIndex + 1,
|
|
4873
|
+
" / ",
|
|
4874
|
+
photos.length
|
|
4875
|
+
]
|
|
4876
|
+
}
|
|
4877
|
+
)
|
|
4878
|
+
] }),
|
|
4879
|
+
!isSpec && features && features.length > 0 && /* @__PURE__ */ jsx54("ul", { className: cn("flex flex-wrap gap-2", cls.features), children: features.map((f, i) => /* @__PURE__ */ jsxs47(
|
|
4880
|
+
"li",
|
|
4881
|
+
{
|
|
4882
|
+
className: "border-border bg-panel-2 text-text-muted inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-[12px]",
|
|
4883
|
+
children: [
|
|
4884
|
+
/* @__PURE__ */ jsx54(IconGlyph8, { name: f.icon, size: 12 }),
|
|
4885
|
+
f.label
|
|
4886
|
+
]
|
|
4887
|
+
},
|
|
4888
|
+
i
|
|
4889
|
+
)) })
|
|
4890
|
+
] }),
|
|
4891
|
+
/* @__PURE__ */ jsxs47("div", { className: cn("flex flex-col gap-4", cls.info), children: [
|
|
4892
|
+
/* @__PURE__ */ jsxs47("header", { className: cn("flex flex-col gap-1.5", cls.header), children: [
|
|
4893
|
+
eyebrow && !isSpec && /* @__PURE__ */ jsx54("span", { className: "text-text-dim font-mono text-[10px] tracking-wide uppercase", children: eyebrow }),
|
|
4894
|
+
/* @__PURE__ */ jsxs47("div", { className: "flex items-start justify-between gap-3", children: [
|
|
4895
|
+
/* @__PURE__ */ jsx54(RadixDialog6.Title, { asChild: true, children: /* @__PURE__ */ jsx54(
|
|
4896
|
+
"h2",
|
|
4897
|
+
{
|
|
4898
|
+
className: cn("text-text text-[22px] leading-tight font-semibold", cls.title),
|
|
4899
|
+
children: title
|
|
4900
|
+
}
|
|
4901
|
+
) }),
|
|
4902
|
+
isSpec && category && /* @__PURE__ */ jsx54(
|
|
4903
|
+
"span",
|
|
4904
|
+
{
|
|
4905
|
+
className: cn(
|
|
4906
|
+
"border-border bg-panel-2 text-text-muted mt-1 shrink-0 rounded-full border px-2 py-0.5 text-[10px] tracking-wide uppercase",
|
|
4907
|
+
cls.category
|
|
4908
|
+
),
|
|
4909
|
+
children: category
|
|
4910
|
+
}
|
|
4911
|
+
)
|
|
4912
|
+
] }),
|
|
4913
|
+
isSpec && meta && /* @__PURE__ */ jsx54(
|
|
4914
|
+
"span",
|
|
4915
|
+
{
|
|
4916
|
+
className: cn("text-text-dim font-mono text-[12px] tracking-wide", cls.meta),
|
|
4917
|
+
children: meta
|
|
4918
|
+
}
|
|
4919
|
+
),
|
|
4920
|
+
rating !== void 0 && /* @__PURE__ */ jsxs47("div", { className: "text-text-muted mt-1 flex items-center gap-2 text-[13px]", children: [
|
|
4921
|
+
/* @__PURE__ */ jsx54(IconGlyph8, { name: "star", size: 13, className: "text-rating" }),
|
|
4922
|
+
/* @__PURE__ */ jsx54("span", { className: "text-text font-medium", children: rating.toFixed(2) }),
|
|
4923
|
+
reviewCount !== void 0 && /* @__PURE__ */ jsxs47("span", { children: [
|
|
4924
|
+
"(",
|
|
4925
|
+
reviewCount,
|
|
4926
|
+
" reviews)"
|
|
4927
|
+
] }),
|
|
4928
|
+
/* @__PURE__ */ jsx54(
|
|
4929
|
+
Rating,
|
|
4930
|
+
{
|
|
4931
|
+
value: rating,
|
|
4932
|
+
max: 5,
|
|
4933
|
+
precision: "half",
|
|
4934
|
+
size: "sm",
|
|
4935
|
+
readOnly: true,
|
|
4936
|
+
className: "sr-only"
|
|
4937
|
+
}
|
|
4938
|
+
)
|
|
4939
|
+
] })
|
|
4940
|
+
] }),
|
|
4941
|
+
isSpec && specs && specs.length > 0 && /* @__PURE__ */ jsx54(
|
|
4942
|
+
"dl",
|
|
4943
|
+
{
|
|
4944
|
+
className: cn(
|
|
4945
|
+
"border-border grid grid-cols-2 gap-3 border-t pt-4 sm:grid-cols-3",
|
|
4946
|
+
cls.specs
|
|
4947
|
+
),
|
|
4948
|
+
children: specs.map((s, i) => /* @__PURE__ */ jsxs47("div", { className: cn("flex flex-col gap-0.5", cls.specCell), children: [
|
|
4949
|
+
/* @__PURE__ */ jsx54(
|
|
4950
|
+
"dt",
|
|
4951
|
+
{
|
|
4952
|
+
className: cn(
|
|
4953
|
+
"text-text-dim text-[10px] tracking-wider uppercase",
|
|
4954
|
+
cls.specLabel
|
|
4955
|
+
),
|
|
4956
|
+
children: s.label
|
|
4957
|
+
}
|
|
4958
|
+
),
|
|
4959
|
+
/* @__PURE__ */ jsx54("dd", { className: cn("text-text text-[15px] font-semibold", cls.specValue), children: s.value })
|
|
4960
|
+
] }, i))
|
|
4961
|
+
}
|
|
4962
|
+
),
|
|
4963
|
+
host && /* @__PURE__ */ jsxs47(
|
|
4964
|
+
"div",
|
|
4965
|
+
{
|
|
4966
|
+
className: cn("border-border flex items-center gap-3 border-t pt-4", cls.host),
|
|
4967
|
+
children: [
|
|
4968
|
+
/* @__PURE__ */ jsx54(
|
|
4969
|
+
Avatar,
|
|
4970
|
+
{
|
|
4971
|
+
size: "md",
|
|
4972
|
+
name: typeof host.name === "string" ? host.name : "Host",
|
|
4973
|
+
src: host.avatarUrl
|
|
4974
|
+
}
|
|
4975
|
+
),
|
|
4976
|
+
/* @__PURE__ */ jsxs47("div", { className: "flex flex-col", children: [
|
|
4977
|
+
/* @__PURE__ */ jsxs47("div", { className: "text-text inline-flex items-center gap-1.5 text-[13px] font-medium", children: [
|
|
4978
|
+
/* @__PURE__ */ jsxs47("span", { children: [
|
|
4979
|
+
"Hosted by ",
|
|
4980
|
+
host.name
|
|
4981
|
+
] }),
|
|
4982
|
+
host.verified && /* @__PURE__ */ jsxs47(Badge, { variant: "ok", size: "sm", children: [
|
|
4983
|
+
/* @__PURE__ */ jsx54(IconGlyph8, { name: "verified", size: 11 }),
|
|
4984
|
+
" Verified"
|
|
4985
|
+
] })
|
|
4986
|
+
] }),
|
|
4987
|
+
host.meta && /* @__PURE__ */ jsx54("span", { className: "text-text-dim text-[12px]", children: host.meta })
|
|
4988
|
+
] })
|
|
4989
|
+
]
|
|
4990
|
+
}
|
|
4991
|
+
),
|
|
4992
|
+
description && /* @__PURE__ */ jsx54(RadixDialog6.Description, { asChild: true, children: /* @__PURE__ */ jsx54("p", { className: cn("text-text-muted text-[13px] leading-[1.6]", cls.description), children: description }) }),
|
|
4993
|
+
!isSpec && /* @__PURE__ */ jsxs47(
|
|
4994
|
+
"div",
|
|
4995
|
+
{
|
|
4996
|
+
className: cn(
|
|
4997
|
+
"border-border mt-auto flex flex-col gap-3 border-t pt-4",
|
|
4998
|
+
cls.footer
|
|
4999
|
+
),
|
|
5000
|
+
children: [
|
|
5001
|
+
/* @__PURE__ */ jsxs47("div", { className: "flex items-baseline gap-2", children: [
|
|
5002
|
+
originalPrice && /* @__PURE__ */ jsx54("span", { className: "text-text-dim decoration-sale text-[13px] line-through", children: originalPrice }),
|
|
5003
|
+
/* @__PURE__ */ jsx54("span", { className: cn("text-text text-[22px] font-semibold", cls.price), children: price }),
|
|
5004
|
+
/* @__PURE__ */ jsx54("span", { className: cn("text-text-dim text-[13px]", cls.priceUnit), children: priceUnit })
|
|
5005
|
+
] }),
|
|
5006
|
+
(primaryAction || secondaryAction) && /* @__PURE__ */ jsxs47("div", { className: "flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-end", children: [
|
|
5007
|
+
secondaryAction && renderAction(secondaryAction, "ghost"),
|
|
5008
|
+
primaryAction && renderAction(primaryAction, "primary")
|
|
5009
|
+
] })
|
|
5010
|
+
]
|
|
5011
|
+
}
|
|
5012
|
+
)
|
|
5013
|
+
] })
|
|
5014
|
+
]
|
|
5015
|
+
}
|
|
5016
|
+
),
|
|
5017
|
+
isSpec && (cta || price) && /* @__PURE__ */ jsxs47(
|
|
5018
|
+
"div",
|
|
5019
|
+
{
|
|
5020
|
+
className: cn(
|
|
5021
|
+
"border-border bg-panel-2 flex items-center justify-between gap-3 border-t px-6 py-4",
|
|
5022
|
+
cls.footer
|
|
5023
|
+
),
|
|
5024
|
+
children: [
|
|
5025
|
+
/* @__PURE__ */ jsxs47("div", { className: "flex items-baseline gap-2", children: [
|
|
5026
|
+
pricePrefix && /* @__PURE__ */ jsx54("span", { className: "text-text-dim text-[12px]", children: pricePrefix }),
|
|
5027
|
+
originalPrice && /* @__PURE__ */ jsx54("span", { className: "text-text-dim decoration-sale text-[13px] line-through", children: originalPrice }),
|
|
5028
|
+
/* @__PURE__ */ jsx54("span", { className: cn("text-text text-[20px] font-semibold", cls.price), children: price }),
|
|
5029
|
+
/* @__PURE__ */ jsx54("span", { className: cn("text-text-dim text-[13px]", cls.priceUnit), children: priceUnit })
|
|
5030
|
+
] }),
|
|
5031
|
+
cta && (cta.href ? /* @__PURE__ */ jsx54(Button, { asChild: true, variant: "primary", disabled: cta.disabled, className: cls.cta, children: /* @__PURE__ */ jsx54("a", { href: cta.href, onClick: cta.onClick, children: cta.label }) }) : /* @__PURE__ */ jsx54(
|
|
5032
|
+
Button,
|
|
5033
|
+
{
|
|
5034
|
+
variant: "primary",
|
|
5035
|
+
onClick: cta.onClick,
|
|
5036
|
+
disabled: cta.disabled,
|
|
5037
|
+
className: cls.cta,
|
|
5038
|
+
children: cta.label
|
|
5039
|
+
}
|
|
5040
|
+
))
|
|
5041
|
+
]
|
|
5042
|
+
}
|
|
5043
|
+
),
|
|
5044
|
+
/* @__PURE__ */ jsx54(RadixDialog6.Close, { asChild: true, children: /* @__PURE__ */ jsx54(
|
|
5045
|
+
"button",
|
|
5046
|
+
{
|
|
5047
|
+
type: "button",
|
|
5048
|
+
"aria-label": "Close listing details",
|
|
5049
|
+
className: cn(
|
|
5050
|
+
"bg-panel-2 hover:bg-panel-2/80 text-text-muted hover:text-text border-border focus-visible:ring-accent-dim absolute top-3 right-3 inline-grid h-9 w-9 cursor-pointer place-items-center rounded-full border outline-none focus-visible:ring-[3px]",
|
|
5051
|
+
cls.close
|
|
5052
|
+
),
|
|
5053
|
+
children: /* @__PURE__ */ jsx54(IconGlyph8, { name: "close", size: 16 })
|
|
5054
|
+
}
|
|
5055
|
+
) })
|
|
5056
|
+
]
|
|
5057
|
+
}
|
|
5058
|
+
)
|
|
5059
|
+
] }),
|
|
5060
|
+
/* @__PURE__ */ jsx54(
|
|
5061
|
+
Lightbox,
|
|
5062
|
+
{
|
|
5063
|
+
open: lightboxOpen,
|
|
5064
|
+
onOpenChange: setLightboxOpen,
|
|
5065
|
+
items: photos,
|
|
5066
|
+
index: galleryIndex,
|
|
5067
|
+
onIndexChange: setGalleryIndex,
|
|
5068
|
+
loop,
|
|
5069
|
+
title: lightboxTitle,
|
|
5070
|
+
renderItem: (src, i) => renderPhoto ? renderPhoto(src, i, "lightbox") : /* @__PURE__ */ jsx54("img", { src, alt: "", className: "max-h-[88vh] max-w-[92vw] object-contain" })
|
|
5071
|
+
}
|
|
5072
|
+
)
|
|
5073
|
+
] });
|
|
5074
|
+
});
|
|
5075
|
+
ListingDetail.displayName = "ListingDetail";
|
|
5076
|
+
|
|
4458
5077
|
// src/patterns/PhoneInput/PhoneInput.tsx
|
|
4459
|
-
import { forwardRef as
|
|
5078
|
+
import { forwardRef as forwardRef53, useEffect as useEffect14, useMemo as useMemo5, useRef as useRef12, useState as useState15 } from "react";
|
|
4460
5079
|
|
|
4461
5080
|
// src/patterns/PhoneInput/countries.ts
|
|
4462
5081
|
var phoneCountries = [
|
|
@@ -4500,7 +5119,7 @@ var phoneCountries = [
|
|
|
4500
5119
|
];
|
|
4501
5120
|
|
|
4502
5121
|
// src/patterns/PhoneInput/PhoneInput.tsx
|
|
4503
|
-
import { jsx as
|
|
5122
|
+
import { jsx as jsx55, jsxs as jsxs48 } from "react/jsx-runtime";
|
|
4504
5123
|
function parseE164(value, list) {
|
|
4505
5124
|
if (!value.startsWith("+")) return null;
|
|
4506
5125
|
const digits = value.slice(1);
|
|
@@ -4514,7 +5133,7 @@ function toE164(country, national) {
|
|
|
4514
5133
|
if (cleaned.length === 0) return "";
|
|
4515
5134
|
return `+${country.dialCode}${cleaned}`;
|
|
4516
5135
|
}
|
|
4517
|
-
var PhoneInput =
|
|
5136
|
+
var PhoneInput = forwardRef53(function PhoneInput2({
|
|
4518
5137
|
value,
|
|
4519
5138
|
defaultValue,
|
|
4520
5139
|
onValueChange,
|
|
@@ -4530,10 +5149,10 @@ var PhoneInput = forwardRef52(function PhoneInput2({
|
|
|
4530
5149
|
onChange: onValueChange
|
|
4531
5150
|
});
|
|
4532
5151
|
const parsed = useMemo5(() => parseE164(committed ?? "", countries), [committed, countries]);
|
|
4533
|
-
const [country, setCountry] =
|
|
5152
|
+
const [country, setCountry] = useState15(
|
|
4534
5153
|
parsed?.country ?? countries.find((c) => c.code === defaultCountry) ?? countries[0]
|
|
4535
5154
|
);
|
|
4536
|
-
const [national, setNational] =
|
|
5155
|
+
const [national, setNational] = useState15(parsed?.national ?? "");
|
|
4537
5156
|
const lastEmittedRef = useRef12(committed ?? "");
|
|
4538
5157
|
useEffect14(() => {
|
|
4539
5158
|
const current = committed ?? "";
|
|
@@ -4567,7 +5186,7 @@ var PhoneInput = forwardRef52(function PhoneInput2({
|
|
|
4567
5186
|
})),
|
|
4568
5187
|
[countries]
|
|
4569
5188
|
);
|
|
4570
|
-
return /* @__PURE__ */
|
|
5189
|
+
return /* @__PURE__ */ jsxs48(
|
|
4571
5190
|
"div",
|
|
4572
5191
|
{
|
|
4573
5192
|
className: cn(
|
|
@@ -4576,7 +5195,7 @@ var PhoneInput = forwardRef52(function PhoneInput2({
|
|
|
4576
5195
|
disabled && "opacity-50"
|
|
4577
5196
|
),
|
|
4578
5197
|
children: [
|
|
4579
|
-
/* @__PURE__ */
|
|
5198
|
+
/* @__PURE__ */ jsx55(
|
|
4580
5199
|
Select,
|
|
4581
5200
|
{
|
|
4582
5201
|
options: selectOptions,
|
|
@@ -4586,7 +5205,7 @@ var PhoneInput = forwardRef52(function PhoneInput2({
|
|
|
4586
5205
|
"aria-label": "Country"
|
|
4587
5206
|
}
|
|
4588
5207
|
),
|
|
4589
|
-
/* @__PURE__ */
|
|
5208
|
+
/* @__PURE__ */ jsx55(
|
|
4590
5209
|
"input",
|
|
4591
5210
|
{
|
|
4592
5211
|
ref,
|
|
@@ -4608,8 +5227,8 @@ var PhoneInput = forwardRef52(function PhoneInput2({
|
|
|
4608
5227
|
PhoneInput.displayName = "PhoneInput";
|
|
4609
5228
|
|
|
4610
5229
|
// src/patterns/PriceBreakdown/PriceBreakdown.tsx
|
|
4611
|
-
import { forwardRef as
|
|
4612
|
-
import { jsx as
|
|
5230
|
+
import { forwardRef as forwardRef54 } from "react";
|
|
5231
|
+
import { jsx as jsx56, jsxs as jsxs49 } from "react/jsx-runtime";
|
|
4613
5232
|
function PriceBreakdownRoot({
|
|
4614
5233
|
items,
|
|
4615
5234
|
total,
|
|
@@ -4619,30 +5238,30 @@ function PriceBreakdownRoot({
|
|
|
4619
5238
|
children,
|
|
4620
5239
|
...props
|
|
4621
5240
|
}, ref) {
|
|
4622
|
-
return /* @__PURE__ */
|
|
4623
|
-
items?.map((item, i) => /* @__PURE__ */
|
|
5241
|
+
return /* @__PURE__ */ jsxs49("div", { ref, className: cn("flex flex-col gap-2", className), ...props, children: [
|
|
5242
|
+
items?.map((item, i) => /* @__PURE__ */ jsx56(PriceBreakdownLine, { ...item }, i)),
|
|
4624
5243
|
children,
|
|
4625
|
-
total !== void 0 && /* @__PURE__ */
|
|
4626
|
-
/* @__PURE__ */
|
|
4627
|
-
/* @__PURE__ */
|
|
5244
|
+
total !== void 0 && /* @__PURE__ */ jsxs49("div", { className: "border-border mt-2 flex items-baseline justify-between border-t pt-3", children: [
|
|
5245
|
+
/* @__PURE__ */ jsx56("span", { className: "text-text text-[14px] font-semibold", children: totalLabel }),
|
|
5246
|
+
/* @__PURE__ */ jsxs49("span", { className: "text-text text-[16px] font-semibold", children: [
|
|
4628
5247
|
total,
|
|
4629
|
-
currency && /* @__PURE__ */
|
|
5248
|
+
currency && /* @__PURE__ */ jsx56("span", { className: "text-text-dim ml-1 text-[12px] font-normal", children: currency })
|
|
4630
5249
|
] })
|
|
4631
5250
|
] })
|
|
4632
5251
|
] });
|
|
4633
5252
|
}
|
|
4634
|
-
var PriceBreakdown =
|
|
5253
|
+
var PriceBreakdown = forwardRef54(PriceBreakdownRoot);
|
|
4635
5254
|
PriceBreakdown.displayName = "PriceBreakdown";
|
|
4636
|
-
var PriceBreakdownLine =
|
|
5255
|
+
var PriceBreakdownLine = forwardRef54(
|
|
4637
5256
|
function PriceBreakdownLine2({ label, subLabel, amount, originalAmount, discount, className }, ref) {
|
|
4638
|
-
return /* @__PURE__ */
|
|
4639
|
-
/* @__PURE__ */
|
|
4640
|
-
/* @__PURE__ */
|
|
4641
|
-
subLabel && /* @__PURE__ */
|
|
5257
|
+
return /* @__PURE__ */ jsxs49("div", { ref, className: cn("flex items-baseline justify-between gap-3", className), children: [
|
|
5258
|
+
/* @__PURE__ */ jsxs49("div", { className: "flex min-w-0 flex-col", children: [
|
|
5259
|
+
/* @__PURE__ */ jsx56("span", { className: "text-text text-[13px]", children: label }),
|
|
5260
|
+
subLabel && /* @__PURE__ */ jsx56("span", { className: "text-text-dim text-[11px]", children: subLabel })
|
|
4642
5261
|
] }),
|
|
4643
|
-
/* @__PURE__ */
|
|
4644
|
-
originalAmount && /* @__PURE__ */
|
|
4645
|
-
/* @__PURE__ */
|
|
5262
|
+
/* @__PURE__ */ jsxs49("div", { className: "inline-flex shrink-0 items-baseline gap-2", children: [
|
|
5263
|
+
originalAmount && /* @__PURE__ */ jsx56("span", { className: "text-text-dim decoration-sale text-[12px] line-through", children: originalAmount }),
|
|
5264
|
+
/* @__PURE__ */ jsx56(
|
|
4646
5265
|
"span",
|
|
4647
5266
|
{
|
|
4648
5267
|
className: cn("text-[13px] font-medium", discount ? "text-sale-text" : "text-text"),
|
|
@@ -4657,19 +5276,19 @@ PriceBreakdownLine.displayName = "PriceBreakdownLine";
|
|
|
4657
5276
|
PriceBreakdown.Line = PriceBreakdownLine;
|
|
4658
5277
|
|
|
4659
5278
|
// src/patterns/ReviewCard/ReviewCard.tsx
|
|
4660
|
-
import { IconGlyph as
|
|
4661
|
-
import { forwardRef as
|
|
4662
|
-
import { jsx as
|
|
4663
|
-
var ReviewCard =
|
|
4664
|
-
return /* @__PURE__ */
|
|
5279
|
+
import { IconGlyph as IconGlyph9 } from "@ship-it-ui/icons";
|
|
5280
|
+
import { forwardRef as forwardRef55 } from "react";
|
|
5281
|
+
import { jsx as jsx57, jsxs as jsxs50 } from "react/jsx-runtime";
|
|
5282
|
+
var ReviewCard = forwardRef55(function ReviewCard2({ author, authorAvatar, rating, date, body, photos, verified, subtitle, className, ...props }, ref) {
|
|
5283
|
+
return /* @__PURE__ */ jsxs50(
|
|
4665
5284
|
"article",
|
|
4666
5285
|
{
|
|
4667
5286
|
ref,
|
|
4668
5287
|
className: cn("border-border bg-panel flex flex-col gap-3 rounded-md border p-4", className),
|
|
4669
5288
|
...props,
|
|
4670
5289
|
children: [
|
|
4671
|
-
/* @__PURE__ */
|
|
4672
|
-
/* @__PURE__ */
|
|
5290
|
+
/* @__PURE__ */ jsxs50("header", { className: "flex items-start gap-3", children: [
|
|
5291
|
+
/* @__PURE__ */ jsx57(
|
|
4673
5292
|
Avatar,
|
|
4674
5293
|
{
|
|
4675
5294
|
src: authorAvatar,
|
|
@@ -4677,24 +5296,24 @@ var ReviewCard = forwardRef54(function ReviewCard2({ author, authorAvatar, ratin
|
|
|
4677
5296
|
size: "md"
|
|
4678
5297
|
}
|
|
4679
5298
|
),
|
|
4680
|
-
/* @__PURE__ */
|
|
4681
|
-
/* @__PURE__ */
|
|
4682
|
-
/* @__PURE__ */
|
|
4683
|
-
verified && /* @__PURE__ */
|
|
4684
|
-
/* @__PURE__ */
|
|
5299
|
+
/* @__PURE__ */ jsxs50("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
|
|
5300
|
+
/* @__PURE__ */ jsxs50("div", { className: "flex items-center gap-2", children: [
|
|
5301
|
+
/* @__PURE__ */ jsx57("span", { className: "text-text text-[14px] leading-tight font-semibold", children: author }),
|
|
5302
|
+
verified && /* @__PURE__ */ jsxs50(Badge, { variant: "ok", size: "sm", children: [
|
|
5303
|
+
/* @__PURE__ */ jsx57(IconGlyph9, { name: "verified", size: 11 }),
|
|
4685
5304
|
" Verified trip"
|
|
4686
5305
|
] })
|
|
4687
5306
|
] }),
|
|
4688
|
-
subtitle && /* @__PURE__ */
|
|
4689
|
-
/* @__PURE__ */
|
|
4690
|
-
/* @__PURE__ */
|
|
4691
|
-
/* @__PURE__ */
|
|
4692
|
-
/* @__PURE__ */
|
|
5307
|
+
subtitle && /* @__PURE__ */ jsx57("span", { className: "text-text-dim text-[11px]", children: subtitle }),
|
|
5308
|
+
/* @__PURE__ */ jsxs50("div", { className: "mt-1 flex items-center gap-2", children: [
|
|
5309
|
+
/* @__PURE__ */ jsx57(Rating, { value: rating, max: 5, precision: "half", size: "sm", readOnly: true }),
|
|
5310
|
+
/* @__PURE__ */ jsx57("span", { className: "text-text-dim text-[11px]", children: "\xB7" }),
|
|
5311
|
+
/* @__PURE__ */ jsx57("time", { className: "text-text-dim text-[11px]", children: date })
|
|
4693
5312
|
] })
|
|
4694
5313
|
] })
|
|
4695
5314
|
] }),
|
|
4696
|
-
/* @__PURE__ */
|
|
4697
|
-
photos && photos.length > 0 && /* @__PURE__ */
|
|
5315
|
+
/* @__PURE__ */ jsx57("p", { className: "text-text text-[13px] leading-relaxed", children: body }),
|
|
5316
|
+
photos && photos.length > 0 && /* @__PURE__ */ jsx57("div", { className: "flex gap-2 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden", children: photos.map((src, i) => /* @__PURE__ */ jsx57(
|
|
4698
5317
|
"img",
|
|
4699
5318
|
{
|
|
4700
5319
|
src,
|
|
@@ -4711,11 +5330,11 @@ var ReviewCard = forwardRef54(function ReviewCard2({ author, authorAvatar, ratin
|
|
|
4711
5330
|
ReviewCard.displayName = "ReviewCard";
|
|
4712
5331
|
|
|
4713
5332
|
// src/patterns/Dots/Dots.tsx
|
|
4714
|
-
import { forwardRef as
|
|
4715
|
-
import { jsx as
|
|
4716
|
-
var Dots =
|
|
5333
|
+
import { forwardRef as forwardRef56 } from "react";
|
|
5334
|
+
import { jsx as jsx58 } from "react/jsx-runtime";
|
|
5335
|
+
var Dots = forwardRef56(function Dots2({ total, current, onChange, className, "aria-label": ariaLabel = "Progress", ...props }, ref) {
|
|
4717
5336
|
const interactive = typeof onChange === "function";
|
|
4718
|
-
return /* @__PURE__ */
|
|
5337
|
+
return /* @__PURE__ */ jsx58(
|
|
4719
5338
|
"nav",
|
|
4720
5339
|
{
|
|
4721
5340
|
ref,
|
|
@@ -4729,7 +5348,7 @@ var Dots = forwardRef55(function Dots2({ total, current, onChange, className, "a
|
|
|
4729
5348
|
isActive ? "w-[18px] bg-accent" : "w-[6px] bg-panel-2"
|
|
4730
5349
|
);
|
|
4731
5350
|
if (interactive) {
|
|
4732
|
-
return /* @__PURE__ */
|
|
5351
|
+
return /* @__PURE__ */ jsx58(
|
|
4733
5352
|
"button",
|
|
4734
5353
|
{
|
|
4735
5354
|
type: "button",
|
|
@@ -4746,7 +5365,7 @@ var Dots = forwardRef55(function Dots2({ total, current, onChange, className, "a
|
|
|
4746
5365
|
i
|
|
4747
5366
|
);
|
|
4748
5367
|
}
|
|
4749
|
-
return /* @__PURE__ */
|
|
5368
|
+
return /* @__PURE__ */ jsx58("span", { "aria-hidden": true, className: sharedClass }, i);
|
|
4750
5369
|
})
|
|
4751
5370
|
}
|
|
4752
5371
|
);
|
|
@@ -4755,15 +5374,15 @@ Dots.displayName = "Dots";
|
|
|
4755
5374
|
|
|
4756
5375
|
// src/patterns/Dropzone/Dropzone.tsx
|
|
4757
5376
|
import {
|
|
4758
|
-
forwardRef as
|
|
4759
|
-
useState as
|
|
5377
|
+
forwardRef as forwardRef57,
|
|
5378
|
+
useState as useState16
|
|
4760
5379
|
} from "react";
|
|
4761
|
-
import { jsx as
|
|
5380
|
+
import { jsx as jsx59, jsxs as jsxs51 } from "react/jsx-runtime";
|
|
4762
5381
|
function listToArray(list) {
|
|
4763
5382
|
if (!list) return [];
|
|
4764
5383
|
return Array.from(list);
|
|
4765
5384
|
}
|
|
4766
|
-
var Dropzone =
|
|
5385
|
+
var Dropzone = forwardRef57(function Dropzone2({
|
|
4767
5386
|
onFiles,
|
|
4768
5387
|
accept,
|
|
4769
5388
|
multiple = true,
|
|
@@ -4774,7 +5393,7 @@ var Dropzone = forwardRef56(function Dropzone2({
|
|
|
4774
5393
|
className,
|
|
4775
5394
|
...props
|
|
4776
5395
|
}, ref) {
|
|
4777
|
-
const [isDragging, setIsDragging] =
|
|
5396
|
+
const [isDragging, setIsDragging] = useState16(false);
|
|
4778
5397
|
const onDragOver = (e) => {
|
|
4779
5398
|
if (disabled) return;
|
|
4780
5399
|
e.preventDefault();
|
|
@@ -4788,7 +5407,7 @@ var Dropzone = forwardRef56(function Dropzone2({
|
|
|
4788
5407
|
const files = listToArray(e.dataTransfer.files);
|
|
4789
5408
|
if (files.length) onFiles?.(files);
|
|
4790
5409
|
};
|
|
4791
|
-
return /* @__PURE__ */
|
|
5410
|
+
return /* @__PURE__ */ jsxs51(
|
|
4792
5411
|
"label",
|
|
4793
5412
|
{
|
|
4794
5413
|
ref,
|
|
@@ -4805,7 +5424,7 @@ var Dropzone = forwardRef56(function Dropzone2({
|
|
|
4805
5424
|
),
|
|
4806
5425
|
...props,
|
|
4807
5426
|
children: [
|
|
4808
|
-
/* @__PURE__ */
|
|
5427
|
+
/* @__PURE__ */ jsx59(
|
|
4809
5428
|
"input",
|
|
4810
5429
|
{
|
|
4811
5430
|
type: "file",
|
|
@@ -4821,7 +5440,7 @@ var Dropzone = forwardRef56(function Dropzone2({
|
|
|
4821
5440
|
}
|
|
4822
5441
|
}
|
|
4823
5442
|
),
|
|
4824
|
-
/* @__PURE__ */
|
|
5443
|
+
/* @__PURE__ */ jsx59(
|
|
4825
5444
|
"div",
|
|
4826
5445
|
{
|
|
4827
5446
|
"aria-hidden": true,
|
|
@@ -4829,8 +5448,8 @@ var Dropzone = forwardRef56(function Dropzone2({
|
|
|
4829
5448
|
children: icon
|
|
4830
5449
|
}
|
|
4831
5450
|
),
|
|
4832
|
-
/* @__PURE__ */
|
|
4833
|
-
description && /* @__PURE__ */
|
|
5451
|
+
/* @__PURE__ */ jsx59("div", { className: "mb-1 text-[13px] font-medium", children: title }),
|
|
5452
|
+
description && /* @__PURE__ */ jsx59("div", { className: "text-text-dim text-[11px]", children: description })
|
|
4834
5453
|
]
|
|
4835
5454
|
}
|
|
4836
5455
|
);
|
|
@@ -4838,10 +5457,10 @@ var Dropzone = forwardRef56(function Dropzone2({
|
|
|
4838
5457
|
Dropzone.displayName = "Dropzone";
|
|
4839
5458
|
|
|
4840
5459
|
// src/patterns/EmptyState/EmptyState.tsx
|
|
4841
|
-
import { cva as
|
|
4842
|
-
import { forwardRef as
|
|
4843
|
-
import { jsx as
|
|
4844
|
-
var plateStyles =
|
|
5460
|
+
import { cva as cva12 } from "class-variance-authority";
|
|
5461
|
+
import { forwardRef as forwardRef58 } from "react";
|
|
5462
|
+
import { jsx as jsx60, jsxs as jsxs52 } from "react/jsx-runtime";
|
|
5463
|
+
var plateStyles = cva12("grid h-12 w-12 place-items-center rounded-base text-[22px]", {
|
|
4845
5464
|
variants: {
|
|
4846
5465
|
tone: {
|
|
4847
5466
|
neutral: "bg-panel-2 text-text-muted",
|
|
@@ -4853,8 +5472,8 @@ var plateStyles = cva11("grid h-12 w-12 place-items-center rounded-base text-[22
|
|
|
4853
5472
|
},
|
|
4854
5473
|
defaultVariants: { tone: "neutral" }
|
|
4855
5474
|
});
|
|
4856
|
-
var EmptyState =
|
|
4857
|
-
return /* @__PURE__ */
|
|
5475
|
+
var EmptyState = forwardRef58(function EmptyState2({ icon, title, description, action, chips, tone, className, ...props }, ref) {
|
|
5476
|
+
return /* @__PURE__ */ jsxs52(
|
|
4858
5477
|
"div",
|
|
4859
5478
|
{
|
|
4860
5479
|
ref,
|
|
@@ -4864,10 +5483,10 @@ var EmptyState = forwardRef57(function EmptyState2({ icon, title, description, a
|
|
|
4864
5483
|
),
|
|
4865
5484
|
...props,
|
|
4866
5485
|
children: [
|
|
4867
|
-
icon != null && /* @__PURE__ */
|
|
4868
|
-
/* @__PURE__ */
|
|
4869
|
-
description && /* @__PURE__ */
|
|
4870
|
-
chips && chips.length > 0 && /* @__PURE__ */
|
|
5486
|
+
icon != null && /* @__PURE__ */ jsx60("span", { "aria-hidden": true, className: plateStyles({ tone: tone ?? "neutral" }), children: icon }),
|
|
5487
|
+
/* @__PURE__ */ jsx60("div", { className: "text-[14px] font-medium", children: title }),
|
|
5488
|
+
description && /* @__PURE__ */ jsx60("div", { className: "text-text-muted max-w-[260px] text-[12px] leading-[1.5]", children: description }),
|
|
5489
|
+
chips && chips.length > 0 && /* @__PURE__ */ jsx60("div", { className: "flex w-full flex-col gap-1", children: chips.map((c, i) => /* @__PURE__ */ jsx60(
|
|
4871
5490
|
"button",
|
|
4872
5491
|
{
|
|
4873
5492
|
type: "button",
|
|
@@ -4889,18 +5508,18 @@ var EmptyState = forwardRef57(function EmptyState2({ icon, title, description, a
|
|
|
4889
5508
|
EmptyState.displayName = "EmptyState";
|
|
4890
5509
|
|
|
4891
5510
|
// src/patterns/FileChip/FileChip.tsx
|
|
4892
|
-
import { forwardRef as
|
|
4893
|
-
import { jsx as
|
|
5511
|
+
import { forwardRef as forwardRef59 } from "react";
|
|
5512
|
+
import { jsx as jsx61, jsxs as jsxs53 } from "react/jsx-runtime";
|
|
4894
5513
|
function deriveExt(name) {
|
|
4895
5514
|
const dot = name.lastIndexOf(".");
|
|
4896
5515
|
if (dot < 0) return "FILE";
|
|
4897
5516
|
return name.slice(dot + 1).slice(0, 4).toUpperCase();
|
|
4898
5517
|
}
|
|
4899
|
-
var FileChip =
|
|
5518
|
+
var FileChip = forwardRef59(function FileChip2({ name, size, progress, icon, onRemove, failed, className, ...props }, ref) {
|
|
4900
5519
|
const ext = deriveExt(name);
|
|
4901
5520
|
const showProgress = typeof progress === "number";
|
|
4902
5521
|
const isComplete = showProgress && progress >= 100;
|
|
4903
|
-
return /* @__PURE__ */
|
|
5522
|
+
return /* @__PURE__ */ jsxs53(
|
|
4904
5523
|
"div",
|
|
4905
5524
|
{
|
|
4906
5525
|
ref,
|
|
@@ -4910,7 +5529,7 @@ var FileChip = forwardRef58(function FileChip2({ name, size, progress, icon, onR
|
|
|
4910
5529
|
),
|
|
4911
5530
|
...props,
|
|
4912
5531
|
children: [
|
|
4913
|
-
/* @__PURE__ */
|
|
5532
|
+
/* @__PURE__ */ jsx61(
|
|
4914
5533
|
"span",
|
|
4915
5534
|
{
|
|
4916
5535
|
"aria-hidden": true,
|
|
@@ -4918,17 +5537,17 @@ var FileChip = forwardRef58(function FileChip2({ name, size, progress, icon, onR
|
|
|
4918
5537
|
children: icon ?? ext
|
|
4919
5538
|
}
|
|
4920
5539
|
),
|
|
4921
|
-
/* @__PURE__ */
|
|
4922
|
-
/* @__PURE__ */
|
|
4923
|
-
/* @__PURE__ */
|
|
5540
|
+
/* @__PURE__ */ jsxs53("div", { className: "min-w-0 flex-1", children: [
|
|
5541
|
+
/* @__PURE__ */ jsx61("div", { className: "truncate text-[12px] font-medium", children: name }),
|
|
5542
|
+
/* @__PURE__ */ jsxs53("div", { className: cn("font-mono text-[10px]", failed ? "text-err" : "text-text-dim"), children: [
|
|
4924
5543
|
size,
|
|
4925
|
-
showProgress && !isComplete && /* @__PURE__ */
|
|
5544
|
+
showProgress && !isComplete && /* @__PURE__ */ jsxs53("span", { children: [
|
|
4926
5545
|
" \xB7 ",
|
|
4927
5546
|
Math.round(progress),
|
|
4928
5547
|
"%"
|
|
4929
5548
|
] })
|
|
4930
5549
|
] }),
|
|
4931
|
-
showProgress && !isComplete && /* @__PURE__ */
|
|
5550
|
+
showProgress && !isComplete && /* @__PURE__ */ jsx61("div", { className: "bg-panel mt-1 h-[2px] overflow-hidden rounded-full", children: /* @__PURE__ */ jsx61(
|
|
4932
5551
|
"div",
|
|
4933
5552
|
{
|
|
4934
5553
|
className: cn(
|
|
@@ -4939,7 +5558,7 @@ var FileChip = forwardRef58(function FileChip2({ name, size, progress, icon, onR
|
|
|
4939
5558
|
}
|
|
4940
5559
|
) })
|
|
4941
5560
|
] }),
|
|
4942
|
-
onRemove && /* @__PURE__ */
|
|
5561
|
+
onRemove && /* @__PURE__ */ jsx61(
|
|
4943
5562
|
"button",
|
|
4944
5563
|
{
|
|
4945
5564
|
type: "button",
|
|
@@ -4959,10 +5578,10 @@ var FileChip = forwardRef58(function FileChip2({ name, size, progress, icon, onR
|
|
|
4959
5578
|
FileChip.displayName = "FileChip";
|
|
4960
5579
|
|
|
4961
5580
|
// src/patterns/FilterPanel/FilterPanel.tsx
|
|
4962
|
-
import { forwardRef as
|
|
4963
|
-
import { jsx as
|
|
5581
|
+
import { forwardRef as forwardRef60, useCallback as useCallback12, useState as useState17 } from "react";
|
|
5582
|
+
import { jsx as jsx62, jsxs as jsxs54 } from "react/jsx-runtime";
|
|
4964
5583
|
var EMPTY = Object.freeze({});
|
|
4965
|
-
var FilterPanel =
|
|
5584
|
+
var FilterPanel = forwardRef60(function FilterPanel2({
|
|
4966
5585
|
facets,
|
|
4967
5586
|
value,
|
|
4968
5587
|
defaultValue,
|
|
@@ -4995,7 +5614,7 @@ var FilterPanel = forwardRef59(function FilterPanel2({
|
|
|
4995
5614
|
setSelection(EMPTY);
|
|
4996
5615
|
onReset?.();
|
|
4997
5616
|
}, [setSelection, onReset]);
|
|
4998
|
-
return /* @__PURE__ */
|
|
5617
|
+
return /* @__PURE__ */ jsxs54(
|
|
4999
5618
|
"div",
|
|
5000
5619
|
{
|
|
5001
5620
|
ref,
|
|
@@ -5007,10 +5626,10 @@ var FilterPanel = forwardRef59(function FilterPanel2({
|
|
|
5007
5626
|
),
|
|
5008
5627
|
...props,
|
|
5009
5628
|
children: [
|
|
5010
|
-
/* @__PURE__ */
|
|
5011
|
-
/* @__PURE__ */
|
|
5012
|
-
total > 0 && /* @__PURE__ */
|
|
5013
|
-
/* @__PURE__ */
|
|
5629
|
+
/* @__PURE__ */ jsxs54("div", { className: "flex items-center gap-2", children: [
|
|
5630
|
+
/* @__PURE__ */ jsx62("span", { className: "text-text-dim font-mono text-[10px] tracking-[1.4px] uppercase", children: title }),
|
|
5631
|
+
total > 0 && /* @__PURE__ */ jsx62(Badge, { size: "sm", variant: "accent", children: total }),
|
|
5632
|
+
/* @__PURE__ */ jsx62(
|
|
5014
5633
|
Button,
|
|
5015
5634
|
{
|
|
5016
5635
|
type: "button",
|
|
@@ -5023,7 +5642,7 @@ var FilterPanel = forwardRef59(function FilterPanel2({
|
|
|
5023
5642
|
}
|
|
5024
5643
|
)
|
|
5025
5644
|
] }),
|
|
5026
|
-
facets.map((facet) => /* @__PURE__ */
|
|
5645
|
+
facets.map((facet) => /* @__PURE__ */ jsx62(
|
|
5027
5646
|
FilterFacetGroup,
|
|
5028
5647
|
{
|
|
5029
5648
|
facet,
|
|
@@ -5040,12 +5659,12 @@ var FilterPanel = forwardRef59(function FilterPanel2({
|
|
|
5040
5659
|
FilterPanel.displayName = "FilterPanel";
|
|
5041
5660
|
function FilterFacetGroup({ facet, selected, counts, onToggle }) {
|
|
5042
5661
|
const collapsible = facet.collapsible ?? true;
|
|
5043
|
-
const [open, setOpen] =
|
|
5662
|
+
const [open, setOpen] = useState17(facet.defaultOpen ?? true);
|
|
5044
5663
|
const isOpen = !collapsible || open;
|
|
5045
5664
|
const selectedCount = selected.length;
|
|
5046
5665
|
const headingClass = "text-text-muted flex items-center gap-[6px] font-mono text-[10px] tracking-[1.4px] uppercase";
|
|
5047
|
-
return /* @__PURE__ */
|
|
5048
|
-
collapsible ? /* @__PURE__ */
|
|
5666
|
+
return /* @__PURE__ */ jsxs54("section", { className: "flex flex-col gap-1", children: [
|
|
5667
|
+
collapsible ? /* @__PURE__ */ jsxs54(
|
|
5049
5668
|
"button",
|
|
5050
5669
|
{
|
|
5051
5670
|
type: "button",
|
|
@@ -5058,20 +5677,20 @@ function FilterFacetGroup({ facet, selected, counts, onToggle }) {
|
|
|
5058
5677
|
"hover:text-text"
|
|
5059
5678
|
),
|
|
5060
5679
|
children: [
|
|
5061
|
-
/* @__PURE__ */
|
|
5062
|
-
selectedCount > 0 && /* @__PURE__ */
|
|
5063
|
-
/* @__PURE__ */
|
|
5680
|
+
/* @__PURE__ */ jsx62("span", { className: "flex-1 text-left", children: facet.label }),
|
|
5681
|
+
selectedCount > 0 && /* @__PURE__ */ jsx62(Badge, { size: "sm", variant: "neutral", children: selectedCount }),
|
|
5682
|
+
/* @__PURE__ */ jsx62("span", { "aria-hidden": true, className: "text-[10px] opacity-70", children: isOpen ? "\u25BE" : "\u25B8" })
|
|
5064
5683
|
]
|
|
5065
5684
|
}
|
|
5066
|
-
) : /* @__PURE__ */
|
|
5067
|
-
/* @__PURE__ */
|
|
5068
|
-
selectedCount > 0 && /* @__PURE__ */
|
|
5685
|
+
) : /* @__PURE__ */ jsxs54("div", { className: cn(headingClass, "px-1 py-[2px]"), children: [
|
|
5686
|
+
/* @__PURE__ */ jsx62("span", { className: "flex-1", children: facet.label }),
|
|
5687
|
+
selectedCount > 0 && /* @__PURE__ */ jsx62(Badge, { size: "sm", variant: "neutral", children: selectedCount })
|
|
5069
5688
|
] }),
|
|
5070
|
-
isOpen && /* @__PURE__ */
|
|
5689
|
+
isOpen && /* @__PURE__ */ jsx62("ul", { className: "m-0 flex list-none flex-col gap-[2px] p-0", children: facet.options.map((option) => {
|
|
5071
5690
|
const isSelected = selected.includes(option.value);
|
|
5072
5691
|
const count = counts?.[option.value];
|
|
5073
|
-
return /* @__PURE__ */
|
|
5074
|
-
/* @__PURE__ */
|
|
5692
|
+
return /* @__PURE__ */ jsxs54("li", { className: "flex items-center gap-2 px-1 py-[3px]", children: [
|
|
5693
|
+
/* @__PURE__ */ jsx62(
|
|
5075
5694
|
Checkbox,
|
|
5076
5695
|
{
|
|
5077
5696
|
checked: isSelected,
|
|
@@ -5079,25 +5698,25 @@ function FilterFacetGroup({ facet, selected, counts, onToggle }) {
|
|
|
5079
5698
|
label: option.label
|
|
5080
5699
|
}
|
|
5081
5700
|
),
|
|
5082
|
-
typeof count === "number" && /* @__PURE__ */
|
|
5701
|
+
typeof count === "number" && /* @__PURE__ */ jsx62("span", { className: "text-text-dim ml-auto font-mono text-[10px] tabular-nums", children: count })
|
|
5083
5702
|
] }, option.value);
|
|
5084
5703
|
}) })
|
|
5085
5704
|
] });
|
|
5086
5705
|
}
|
|
5087
5706
|
|
|
5088
5707
|
// src/patterns/HealthScore/HealthScore.tsx
|
|
5089
|
-
import { forwardRef as
|
|
5708
|
+
import { forwardRef as forwardRef62 } from "react";
|
|
5090
5709
|
|
|
5091
5710
|
// src/patterns/RadialProgress/RadialProgress.tsx
|
|
5092
|
-
import { forwardRef as
|
|
5093
|
-
import { jsx as
|
|
5711
|
+
import { forwardRef as forwardRef61 } from "react";
|
|
5712
|
+
import { jsx as jsx63, jsxs as jsxs55 } from "react/jsx-runtime";
|
|
5094
5713
|
var toneStrokeClass = {
|
|
5095
5714
|
accent: "stroke-accent",
|
|
5096
5715
|
ok: "stroke-ok",
|
|
5097
5716
|
warn: "stroke-warn",
|
|
5098
5717
|
err: "stroke-err"
|
|
5099
5718
|
};
|
|
5100
|
-
var RadialProgress =
|
|
5719
|
+
var RadialProgress = forwardRef61(
|
|
5101
5720
|
function RadialProgress2({
|
|
5102
5721
|
value,
|
|
5103
5722
|
max = 100,
|
|
@@ -5115,7 +5734,7 @@ var RadialProgress = forwardRef60(
|
|
|
5115
5734
|
const c = 2 * Math.PI * r;
|
|
5116
5735
|
const dash = pct / 100 * c;
|
|
5117
5736
|
const resolvedTone = tone ?? (clamped >= max ? "ok" : "accent");
|
|
5118
|
-
return /* @__PURE__ */
|
|
5737
|
+
return /* @__PURE__ */ jsxs55(
|
|
5119
5738
|
"div",
|
|
5120
5739
|
{
|
|
5121
5740
|
ref,
|
|
@@ -5128,8 +5747,8 @@ var RadialProgress = forwardRef60(
|
|
|
5128
5747
|
style: { width: size, height: size },
|
|
5129
5748
|
...props,
|
|
5130
5749
|
children: [
|
|
5131
|
-
/* @__PURE__ */
|
|
5132
|
-
/* @__PURE__ */
|
|
5750
|
+
/* @__PURE__ */ jsxs55("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, children: [
|
|
5751
|
+
/* @__PURE__ */ jsx63(
|
|
5133
5752
|
"circle",
|
|
5134
5753
|
{
|
|
5135
5754
|
cx: size / 2,
|
|
@@ -5140,7 +5759,7 @@ var RadialProgress = forwardRef60(
|
|
|
5140
5759
|
className: "stroke-panel-2"
|
|
5141
5760
|
}
|
|
5142
5761
|
),
|
|
5143
|
-
/* @__PURE__ */
|
|
5762
|
+
/* @__PURE__ */ jsx63(
|
|
5144
5763
|
"circle",
|
|
5145
5764
|
{
|
|
5146
5765
|
cx: size / 2,
|
|
@@ -5158,7 +5777,7 @@ var RadialProgress = forwardRef60(
|
|
|
5158
5777
|
}
|
|
5159
5778
|
)
|
|
5160
5779
|
] }),
|
|
5161
|
-
/* @__PURE__ */
|
|
5780
|
+
/* @__PURE__ */ jsx63("div", { className: "absolute inset-0 grid place-items-center font-mono text-[11px] font-medium tabular-nums", children: children ?? `${Math.round(pct)}%` })
|
|
5162
5781
|
]
|
|
5163
5782
|
}
|
|
5164
5783
|
);
|
|
@@ -5167,7 +5786,7 @@ var RadialProgress = forwardRef60(
|
|
|
5167
5786
|
RadialProgress.displayName = "RadialProgress";
|
|
5168
5787
|
|
|
5169
5788
|
// src/patterns/HealthScore/HealthScore.tsx
|
|
5170
|
-
import { jsx as
|
|
5789
|
+
import { jsx as jsx64, jsxs as jsxs56 } from "react/jsx-runtime";
|
|
5171
5790
|
function deltaTone(delta) {
|
|
5172
5791
|
if (delta > 0) return "ok";
|
|
5173
5792
|
if (delta < 0) return "err";
|
|
@@ -5184,7 +5803,7 @@ var toneTextClass = {
|
|
|
5184
5803
|
warn: "text-warn",
|
|
5185
5804
|
err: "text-err"
|
|
5186
5805
|
};
|
|
5187
|
-
var HealthScore =
|
|
5806
|
+
var HealthScore = forwardRef62(function HealthScore2({
|
|
5188
5807
|
value,
|
|
5189
5808
|
max = 100,
|
|
5190
5809
|
delta,
|
|
@@ -5199,7 +5818,7 @@ var HealthScore = forwardRef61(function HealthScore2({
|
|
|
5199
5818
|
const pct = max > 0 ? Math.round(Math.min(max, Math.max(0, value)) / max * 100) : 0;
|
|
5200
5819
|
const resolvedTone = tone ?? (pct >= 80 ? "ok" : pct >= 50 ? "accent" : "warn");
|
|
5201
5820
|
const indicatorTone = typeof delta === "number" ? deltaTone(delta) : "accent";
|
|
5202
|
-
const core = /* @__PURE__ */
|
|
5821
|
+
const core = /* @__PURE__ */ jsxs56(
|
|
5203
5822
|
"div",
|
|
5204
5823
|
{
|
|
5205
5824
|
ref,
|
|
@@ -5207,10 +5826,10 @@ var HealthScore = forwardRef61(function HealthScore2({
|
|
|
5207
5826
|
"aria-label": ariaLabel ?? `${pct}% health`,
|
|
5208
5827
|
...props,
|
|
5209
5828
|
children: [
|
|
5210
|
-
/* @__PURE__ */
|
|
5211
|
-
label && /* @__PURE__ */
|
|
5212
|
-
typeof delta === "number" && /* @__PURE__ */
|
|
5213
|
-
/* @__PURE__ */
|
|
5829
|
+
/* @__PURE__ */ jsx64(RadialProgress, { value, max, size, tone: resolvedTone }),
|
|
5830
|
+
label && /* @__PURE__ */ jsx64("div", { className: "text-text-muted mt-1 text-[12px] leading-tight", children: label }),
|
|
5831
|
+
typeof delta === "number" && /* @__PURE__ */ jsxs56("div", { className: cn("font-mono text-[11px] tabular-nums", toneTextClass[indicatorTone]), children: [
|
|
5832
|
+
/* @__PURE__ */ jsx64("span", { "aria-hidden": true, children: deltaGlyph(delta) }),
|
|
5214
5833
|
" ",
|
|
5215
5834
|
Math.abs(delta)
|
|
5216
5835
|
] })
|
|
@@ -5220,15 +5839,15 @@ var HealthScore = forwardRef61(function HealthScore2({
|
|
|
5220
5839
|
if (!breakdown || breakdown.length === 0) {
|
|
5221
5840
|
return core;
|
|
5222
5841
|
}
|
|
5223
|
-
return /* @__PURE__ */
|
|
5842
|
+
return /* @__PURE__ */ jsx64(
|
|
5224
5843
|
HoverCard,
|
|
5225
5844
|
{
|
|
5226
|
-
trigger: /* @__PURE__ */
|
|
5227
|
-
content: /* @__PURE__ */
|
|
5228
|
-
/* @__PURE__ */
|
|
5229
|
-
/* @__PURE__ */
|
|
5230
|
-
/* @__PURE__ */
|
|
5231
|
-
/* @__PURE__ */
|
|
5845
|
+
trigger: /* @__PURE__ */ jsx64("span", { className: "inline-flex", children: core }),
|
|
5846
|
+
content: /* @__PURE__ */ jsxs56("div", { className: "flex min-w-[180px] flex-col gap-2", children: [
|
|
5847
|
+
/* @__PURE__ */ jsx64("div", { className: "text-text-dim font-mono text-[9px] tracking-[1.4px] uppercase", children: "Breakdown" }),
|
|
5848
|
+
/* @__PURE__ */ jsx64("ul", { className: "m-0 flex list-none flex-col gap-1 p-0 text-[12px]", children: breakdown.map((entry, i) => /* @__PURE__ */ jsxs56("li", { className: "flex items-center gap-2", children: [
|
|
5849
|
+
/* @__PURE__ */ jsx64("span", { className: "text-text-muted flex-1 truncate", children: entry.label }),
|
|
5850
|
+
/* @__PURE__ */ jsx64(
|
|
5232
5851
|
"span",
|
|
5233
5852
|
{
|
|
5234
5853
|
className: cn(
|
|
@@ -5246,21 +5865,21 @@ var HealthScore = forwardRef61(function HealthScore2({
|
|
|
5246
5865
|
HealthScore.displayName = "HealthScore";
|
|
5247
5866
|
|
|
5248
5867
|
// src/patterns/LargeTitle/LargeTitle.tsx
|
|
5249
|
-
import { forwardRef as
|
|
5250
|
-
import { jsx as
|
|
5251
|
-
var LargeTitle =
|
|
5252
|
-
return /* @__PURE__ */
|
|
5868
|
+
import { forwardRef as forwardRef63 } from "react";
|
|
5869
|
+
import { jsx as jsx65, jsxs as jsxs57 } from "react/jsx-runtime";
|
|
5870
|
+
var LargeTitle = forwardRef63(function LargeTitle2({ title, eyebrow, trailing, className, ...props }, ref) {
|
|
5871
|
+
return /* @__PURE__ */ jsxs57(
|
|
5253
5872
|
"header",
|
|
5254
5873
|
{
|
|
5255
5874
|
ref,
|
|
5256
5875
|
className: cn("px-screen flex items-end justify-between gap-3 py-3 pb-4", className),
|
|
5257
5876
|
...props,
|
|
5258
5877
|
children: [
|
|
5259
|
-
/* @__PURE__ */
|
|
5260
|
-
eyebrow && /* @__PURE__ */
|
|
5261
|
-
/* @__PURE__ */
|
|
5878
|
+
/* @__PURE__ */ jsxs57("div", { className: "min-w-0 flex-1", children: [
|
|
5879
|
+
eyebrow && /* @__PURE__ */ jsx65("div", { className: "text-m-eyebrow text-accent mb-[6px] font-mono tracking-wide uppercase", children: eyebrow }),
|
|
5880
|
+
/* @__PURE__ */ jsx65("h1", { className: "text-m-h1 m-0 truncate leading-tight font-medium tracking-tight", children: title })
|
|
5262
5881
|
] }),
|
|
5263
|
-
trailing && /* @__PURE__ */
|
|
5882
|
+
trailing && /* @__PURE__ */ jsx65("div", { className: "shrink-0", children: trailing })
|
|
5264
5883
|
]
|
|
5265
5884
|
}
|
|
5266
5885
|
);
|
|
@@ -5269,10 +5888,10 @@ LargeTitle.displayName = "LargeTitle";
|
|
|
5269
5888
|
|
|
5270
5889
|
// src/patterns/Menubar/Menubar.tsx
|
|
5271
5890
|
import * as RadixMenubar from "@radix-ui/react-menubar";
|
|
5272
|
-
import { forwardRef as
|
|
5273
|
-
import { jsx as
|
|
5274
|
-
var Menubar =
|
|
5275
|
-
return /* @__PURE__ */
|
|
5891
|
+
import { forwardRef as forwardRef64 } from "react";
|
|
5892
|
+
import { jsx as jsx66, jsxs as jsxs58 } from "react/jsx-runtime";
|
|
5893
|
+
var Menubar = forwardRef64(function Menubar2({ className, ...props }, ref) {
|
|
5894
|
+
return /* @__PURE__ */ jsx66(
|
|
5276
5895
|
RadixMenubar.Root,
|
|
5277
5896
|
{
|
|
5278
5897
|
ref,
|
|
@@ -5286,9 +5905,9 @@ var Menubar = forwardRef63(function Menubar2({ className, ...props }, ref) {
|
|
|
5286
5905
|
});
|
|
5287
5906
|
Menubar.displayName = "Menubar";
|
|
5288
5907
|
var MenubarMenu = RadixMenubar.Menu;
|
|
5289
|
-
var MenubarTrigger =
|
|
5908
|
+
var MenubarTrigger = forwardRef64(
|
|
5290
5909
|
function MenubarTrigger2({ className, ...props }, ref) {
|
|
5291
|
-
return /* @__PURE__ */
|
|
5910
|
+
return /* @__PURE__ */ jsx66(
|
|
5292
5911
|
RadixMenubar.Trigger,
|
|
5293
5912
|
{
|
|
5294
5913
|
ref,
|
|
@@ -5305,9 +5924,9 @@ var MenubarTrigger = forwardRef63(
|
|
|
5305
5924
|
}
|
|
5306
5925
|
);
|
|
5307
5926
|
MenubarTrigger.displayName = "MenubarTrigger";
|
|
5308
|
-
var MenubarContent =
|
|
5927
|
+
var MenubarContent = forwardRef64(
|
|
5309
5928
|
function MenubarContent2({ className, sideOffset = 6, align = "start", ...props }, ref) {
|
|
5310
|
-
return /* @__PURE__ */
|
|
5929
|
+
return /* @__PURE__ */ jsx66(RadixMenubar.Portal, { children: /* @__PURE__ */ jsx66(
|
|
5311
5930
|
RadixMenubar.Content,
|
|
5312
5931
|
{
|
|
5313
5932
|
ref,
|
|
@@ -5329,24 +5948,24 @@ var itemBase3 = cn(
|
|
|
5329
5948
|
"data-[highlighted]:bg-panel-2",
|
|
5330
5949
|
"data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed"
|
|
5331
5950
|
);
|
|
5332
|
-
var MenubarItem =
|
|
5333
|
-
return /* @__PURE__ */
|
|
5951
|
+
var MenubarItem = forwardRef64(function MenubarItem2({ trailing, destructive, className, children, ...props }, ref) {
|
|
5952
|
+
return /* @__PURE__ */ jsxs58(
|
|
5334
5953
|
RadixMenubar.Item,
|
|
5335
5954
|
{
|
|
5336
5955
|
ref,
|
|
5337
5956
|
className: cn(itemBase3, destructive ? "text-err" : "text-text", className),
|
|
5338
5957
|
...props,
|
|
5339
5958
|
children: [
|
|
5340
|
-
/* @__PURE__ */
|
|
5341
|
-
trailing && /* @__PURE__ */
|
|
5959
|
+
/* @__PURE__ */ jsx66("span", { className: "flex-1", children }),
|
|
5960
|
+
trailing && /* @__PURE__ */ jsx66("span", { className: "text-text-dim font-mono text-[10px]", children: trailing })
|
|
5342
5961
|
]
|
|
5343
5962
|
}
|
|
5344
5963
|
);
|
|
5345
5964
|
});
|
|
5346
5965
|
MenubarItem.displayName = "MenubarItem";
|
|
5347
|
-
var MenubarSeparator =
|
|
5966
|
+
var MenubarSeparator = forwardRef64(
|
|
5348
5967
|
function MenubarSeparator2({ className, ...props }, ref) {
|
|
5349
|
-
return /* @__PURE__ */
|
|
5968
|
+
return /* @__PURE__ */ jsx66(
|
|
5350
5969
|
RadixMenubar.Separator,
|
|
5351
5970
|
{
|
|
5352
5971
|
ref,
|
|
@@ -5361,22 +5980,22 @@ MenubarSeparator.displayName = "MenubarSeparator";
|
|
|
5361
5980
|
// src/patterns/NavBar/NavBar.tsx
|
|
5362
5981
|
import * as RadixNav from "@radix-ui/react-navigation-menu";
|
|
5363
5982
|
import {
|
|
5364
|
-
forwardRef as
|
|
5983
|
+
forwardRef as forwardRef66,
|
|
5365
5984
|
useCallback as useCallback14,
|
|
5366
5985
|
useEffect as useEffect15,
|
|
5367
5986
|
useRef as useRef13,
|
|
5368
|
-
useState as
|
|
5987
|
+
useState as useState19
|
|
5369
5988
|
} from "react";
|
|
5370
5989
|
|
|
5371
5990
|
// src/patterns/Sidebar/Sidebar.tsx
|
|
5372
5991
|
import {
|
|
5373
|
-
forwardRef as
|
|
5992
|
+
forwardRef as forwardRef65,
|
|
5374
5993
|
useCallback as useCallback13,
|
|
5375
|
-
useState as
|
|
5994
|
+
useState as useState18
|
|
5376
5995
|
} from "react";
|
|
5377
|
-
import { Fragment as Fragment4, jsx as
|
|
5378
|
-
var Sidebar =
|
|
5379
|
-
return /* @__PURE__ */
|
|
5996
|
+
import { Fragment as Fragment4, jsx as jsx67, jsxs as jsxs59 } from "react/jsx-runtime";
|
|
5997
|
+
var Sidebar = forwardRef65(function Sidebar2({ width = 240, className, style, ...props }, ref) {
|
|
5998
|
+
return /* @__PURE__ */ jsx67(
|
|
5380
5999
|
"aside",
|
|
5381
6000
|
{
|
|
5382
6001
|
ref,
|
|
@@ -5390,12 +6009,12 @@ var Sidebar = forwardRef64(function Sidebar2({ width = 240, className, style, ..
|
|
|
5390
6009
|
);
|
|
5391
6010
|
});
|
|
5392
6011
|
Sidebar.displayName = "Sidebar";
|
|
5393
|
-
var NavItem =
|
|
6012
|
+
var NavItem = forwardRef65(
|
|
5394
6013
|
function NavItem2({ icon, label, active, badge, href, disabled, className, ...props }, ref) {
|
|
5395
|
-
const inner = /* @__PURE__ */
|
|
5396
|
-
icon && /* @__PURE__ */
|
|
5397
|
-
/* @__PURE__ */
|
|
5398
|
-
badge != null && /* @__PURE__ */
|
|
6014
|
+
const inner = /* @__PURE__ */ jsxs59(Fragment4, { children: [
|
|
6015
|
+
icon && /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "w-[14px] text-center opacity-80", children: icon }),
|
|
6016
|
+
/* @__PURE__ */ jsx67("span", { className: "flex-1 truncate", children: label }),
|
|
6017
|
+
badge != null && /* @__PURE__ */ jsx67(
|
|
5399
6018
|
"span",
|
|
5400
6019
|
{
|
|
5401
6020
|
className: cn(
|
|
@@ -5416,7 +6035,7 @@ var NavItem = forwardRef64(
|
|
|
5416
6035
|
);
|
|
5417
6036
|
if (href) {
|
|
5418
6037
|
const anchorProps = props;
|
|
5419
|
-
return /* @__PURE__ */
|
|
6038
|
+
return /* @__PURE__ */ jsx67(
|
|
5420
6039
|
"a",
|
|
5421
6040
|
{
|
|
5422
6041
|
ref,
|
|
@@ -5430,7 +6049,7 @@ var NavItem = forwardRef64(
|
|
|
5430
6049
|
);
|
|
5431
6050
|
}
|
|
5432
6051
|
const buttonProps = props;
|
|
5433
|
-
return /* @__PURE__ */
|
|
6052
|
+
return /* @__PURE__ */ jsx67(
|
|
5434
6053
|
"button",
|
|
5435
6054
|
{
|
|
5436
6055
|
ref,
|
|
@@ -5445,7 +6064,7 @@ var NavItem = forwardRef64(
|
|
|
5445
6064
|
}
|
|
5446
6065
|
);
|
|
5447
6066
|
NavItem.displayName = "NavItem";
|
|
5448
|
-
var NavSection =
|
|
6067
|
+
var NavSection = forwardRef65(function NavSection2({
|
|
5449
6068
|
label,
|
|
5450
6069
|
icon,
|
|
5451
6070
|
action,
|
|
@@ -5459,7 +6078,7 @@ var NavSection = forwardRef64(function NavSection2({
|
|
|
5459
6078
|
...props
|
|
5460
6079
|
}, ref) {
|
|
5461
6080
|
const isControlled = open !== void 0;
|
|
5462
|
-
const [internalOpen, setInternalOpen] =
|
|
6081
|
+
const [internalOpen, setInternalOpen] = useState18(defaultOpen);
|
|
5463
6082
|
const isOpen = !collapsible || (isControlled ? open : internalOpen);
|
|
5464
6083
|
const toggle = useCallback13(() => {
|
|
5465
6084
|
const next = !isOpen;
|
|
@@ -5467,8 +6086,8 @@ var NavSection = forwardRef64(function NavSection2({
|
|
|
5467
6086
|
onOpenChange?.(next);
|
|
5468
6087
|
}, [isOpen, isControlled, onOpenChange]);
|
|
5469
6088
|
const eyebrowClass = "text-text-dim flex items-center gap-[6px] px-2 pt-2 font-mono text-[9px] tracking-[1.4px] uppercase";
|
|
5470
|
-
return /* @__PURE__ */
|
|
5471
|
-
collapsible ? /* @__PURE__ */
|
|
6089
|
+
return /* @__PURE__ */ jsxs59("div", { ref, className: cn("flex flex-col gap-1", className), ...props, children: [
|
|
6090
|
+
collapsible ? /* @__PURE__ */ jsxs59(
|
|
5472
6091
|
"button",
|
|
5473
6092
|
{
|
|
5474
6093
|
type: "button",
|
|
@@ -5481,18 +6100,18 @@ var NavSection = forwardRef64(function NavSection2({
|
|
|
5481
6100
|
"hover:text-text-muted"
|
|
5482
6101
|
),
|
|
5483
6102
|
children: [
|
|
5484
|
-
icon != null && /* @__PURE__ */
|
|
5485
|
-
/* @__PURE__ */
|
|
6103
|
+
icon != null && /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "opacity-80", children: icon }),
|
|
6104
|
+
/* @__PURE__ */ jsx67("span", { className: "flex-1 text-left", children: label }),
|
|
5486
6105
|
action,
|
|
5487
|
-
/* @__PURE__ */
|
|
6106
|
+
/* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "text-[10px] opacity-70", children: isOpen ? "\u25BE" : "\u25B8" })
|
|
5488
6107
|
]
|
|
5489
6108
|
}
|
|
5490
|
-
) : /* @__PURE__ */
|
|
5491
|
-
icon != null && /* @__PURE__ */
|
|
5492
|
-
/* @__PURE__ */
|
|
6109
|
+
) : /* @__PURE__ */ jsxs59("div", { className: eyebrowClass, children: [
|
|
6110
|
+
icon != null && /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "opacity-80", children: icon }),
|
|
6111
|
+
/* @__PURE__ */ jsx67("span", { className: "flex-1", children: label }),
|
|
5493
6112
|
action
|
|
5494
6113
|
] }),
|
|
5495
|
-
isOpen && /* @__PURE__ */
|
|
6114
|
+
isOpen && /* @__PURE__ */ jsx67(
|
|
5496
6115
|
"div",
|
|
5497
6116
|
{
|
|
5498
6117
|
className: cn("flex flex-col gap-[2px]", indent > 0 && "border-border ml-2 border-l"),
|
|
@@ -5505,12 +6124,12 @@ var NavSection = forwardRef64(function NavSection2({
|
|
|
5505
6124
|
NavSection.displayName = "NavSection";
|
|
5506
6125
|
|
|
5507
6126
|
// src/patterns/NavBar/NavBar.tsx
|
|
5508
|
-
import { Fragment as Fragment5, jsx as
|
|
6127
|
+
import { Fragment as Fragment5, jsx as jsx68, jsxs as jsxs60 } from "react/jsx-runtime";
|
|
5509
6128
|
function isActiveTree(item, activeId) {
|
|
5510
6129
|
if (item.id === activeId) return true;
|
|
5511
6130
|
return item.children?.some((c) => isActiveTree(c, activeId)) ?? false;
|
|
5512
6131
|
}
|
|
5513
|
-
var NavBar =
|
|
6132
|
+
var NavBar = forwardRef66(function NavBar2({
|
|
5514
6133
|
orientation = "horizontal",
|
|
5515
6134
|
items,
|
|
5516
6135
|
brand,
|
|
@@ -5524,9 +6143,9 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5524
6143
|
...props
|
|
5525
6144
|
}, ref) {
|
|
5526
6145
|
const isControlled = value !== void 0;
|
|
5527
|
-
const [internalValue, setInternalValue] =
|
|
6146
|
+
const [internalValue, setInternalValue] = useState19(defaultValue);
|
|
5528
6147
|
const activeId = isControlled ? value : internalValue;
|
|
5529
|
-
const [drawerOpen, setDrawerOpen] =
|
|
6148
|
+
const [drawerOpen, setDrawerOpen] = useState19(false);
|
|
5530
6149
|
const select = useCallback14(
|
|
5531
6150
|
(id) => {
|
|
5532
6151
|
if (!isControlled) setInternalValue(id);
|
|
@@ -5546,7 +6165,7 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5546
6165
|
// drawer is open on a viewport that's resizing past `md`, both navs can
|
|
5547
6166
|
// sit in the DOM together. Identical accessible names would trip axe's
|
|
5548
6167
|
// `landmark-unique` rule.
|
|
5549
|
-
/* @__PURE__ */
|
|
6168
|
+
/* @__PURE__ */ jsx68("nav", { "aria-label": "Mobile navigation", className: "flex flex-col gap-1", children: items.map((item) => /* @__PURE__ */ jsx68(
|
|
5550
6169
|
VerticalItem,
|
|
5551
6170
|
{
|
|
5552
6171
|
item,
|
|
@@ -5556,14 +6175,14 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5556
6175
|
item.id
|
|
5557
6176
|
)) })
|
|
5558
6177
|
);
|
|
5559
|
-
const mobileBar = responsive ? /* @__PURE__ */
|
|
6178
|
+
const mobileBar = responsive ? /* @__PURE__ */ jsxs60(
|
|
5560
6179
|
"div",
|
|
5561
6180
|
{
|
|
5562
6181
|
className: cn(
|
|
5563
6182
|
"border-border bg-panel z-overlay sticky top-0 flex h-[52px] items-center gap-4 border-b px-5 md:hidden"
|
|
5564
6183
|
),
|
|
5565
6184
|
children: [
|
|
5566
|
-
/* @__PURE__ */
|
|
6185
|
+
/* @__PURE__ */ jsx68(
|
|
5567
6186
|
"button",
|
|
5568
6187
|
{
|
|
5569
6188
|
type: "button",
|
|
@@ -5573,15 +6192,15 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5573
6192
|
children: "\u2630"
|
|
5574
6193
|
}
|
|
5575
6194
|
),
|
|
5576
|
-
brand && /* @__PURE__ */
|
|
5577
|
-
actions && /* @__PURE__ */
|
|
6195
|
+
brand && /* @__PURE__ */ jsx68("div", { className: "flex flex-1 items-center text-[13px] font-medium whitespace-nowrap", children: brand }),
|
|
6196
|
+
actions && /* @__PURE__ */ jsx68("div", { className: "flex items-center gap-3", children: actions })
|
|
5578
6197
|
]
|
|
5579
6198
|
}
|
|
5580
6199
|
) : null;
|
|
5581
6200
|
if (orientation === "horizontal") {
|
|
5582
|
-
return /* @__PURE__ */
|
|
6201
|
+
return /* @__PURE__ */ jsxs60(Fragment5, { children: [
|
|
5583
6202
|
mobileBar,
|
|
5584
|
-
/* @__PURE__ */
|
|
6203
|
+
/* @__PURE__ */ jsxs60(
|
|
5585
6204
|
"header",
|
|
5586
6205
|
{
|
|
5587
6206
|
ref,
|
|
@@ -5592,10 +6211,10 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5592
6211
|
),
|
|
5593
6212
|
...props,
|
|
5594
6213
|
children: [
|
|
5595
|
-
brand && /* @__PURE__ */
|
|
5596
|
-
/* @__PURE__ */
|
|
5597
|
-
/* @__PURE__ */
|
|
5598
|
-
(item) => item.children?.length ? /* @__PURE__ */
|
|
6214
|
+
brand && /* @__PURE__ */ jsx68("div", { className: "shrink-0 text-[13px] font-medium whitespace-nowrap", children: brand }),
|
|
6215
|
+
/* @__PURE__ */ jsxs60(RadixNav.Root, { className: "relative flex-1", delayDuration: 120, children: [
|
|
6216
|
+
/* @__PURE__ */ jsx68(RadixNav.List, { className: "m-0! flex list-none! items-center gap-1 p-0! [&_li]:m-0!", children: items.map(
|
|
6217
|
+
(item) => item.children?.length ? /* @__PURE__ */ jsx68(
|
|
5599
6218
|
HorizontalDropdown,
|
|
5600
6219
|
{
|
|
5601
6220
|
item,
|
|
@@ -5604,7 +6223,7 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5604
6223
|
onActivate: handleItemActivate
|
|
5605
6224
|
},
|
|
5606
6225
|
item.id
|
|
5607
|
-
) : /* @__PURE__ */
|
|
6226
|
+
) : /* @__PURE__ */ jsx68(RadixNav.Item, { children: /* @__PURE__ */ jsx68(
|
|
5608
6227
|
HorizontalLink,
|
|
5609
6228
|
{
|
|
5610
6229
|
item,
|
|
@@ -5613,13 +6232,13 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5613
6232
|
}
|
|
5614
6233
|
) }, item.id)
|
|
5615
6234
|
) }),
|
|
5616
|
-
/* @__PURE__ */
|
|
6235
|
+
/* @__PURE__ */ jsx68("div", { className: "z-popover absolute top-full left-0 flex justify-start", children: /* @__PURE__ */ jsx68(RadixNav.Viewport, { className: "origin-top-left data-[state=open]:animate-[ship-fade-in_120ms_var(--easing-out)]" }) })
|
|
5617
6236
|
] }),
|
|
5618
|
-
actions && /* @__PURE__ */
|
|
6237
|
+
actions && /* @__PURE__ */ jsx68("div", { className: "flex items-center gap-3", children: actions })
|
|
5619
6238
|
]
|
|
5620
6239
|
}
|
|
5621
6240
|
),
|
|
5622
|
-
responsive && /* @__PURE__ */
|
|
6241
|
+
responsive && /* @__PURE__ */ jsx68(
|
|
5623
6242
|
Drawer,
|
|
5624
6243
|
{
|
|
5625
6244
|
open: drawerOpen,
|
|
@@ -5632,9 +6251,9 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5632
6251
|
)
|
|
5633
6252
|
] });
|
|
5634
6253
|
}
|
|
5635
|
-
return /* @__PURE__ */
|
|
6254
|
+
return /* @__PURE__ */ jsxs60(Fragment5, { children: [
|
|
5636
6255
|
mobileBar,
|
|
5637
|
-
/* @__PURE__ */
|
|
6256
|
+
/* @__PURE__ */ jsxs60(
|
|
5638
6257
|
"aside",
|
|
5639
6258
|
{
|
|
5640
6259
|
ref,
|
|
@@ -5647,8 +6266,8 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5647
6266
|
),
|
|
5648
6267
|
...props,
|
|
5649
6268
|
children: [
|
|
5650
|
-
brand && /* @__PURE__ */
|
|
5651
|
-
/* @__PURE__ */
|
|
6269
|
+
brand && /* @__PURE__ */ jsx68("div", { className: "px-2 py-1 text-[13px] font-medium", children: brand }),
|
|
6270
|
+
/* @__PURE__ */ jsx68("nav", { "aria-label": "Sidebar navigation", className: "flex flex-1 flex-col gap-1 overflow-y-auto", children: items.map((item) => /* @__PURE__ */ jsx68(
|
|
5652
6271
|
VerticalItem,
|
|
5653
6272
|
{
|
|
5654
6273
|
item,
|
|
@@ -5657,11 +6276,11 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5657
6276
|
},
|
|
5658
6277
|
item.id
|
|
5659
6278
|
)) }),
|
|
5660
|
-
actions && /* @__PURE__ */
|
|
6279
|
+
actions && /* @__PURE__ */ jsx68("div", { className: "border-border mt-auto flex flex-col gap-2 border-t pt-3", children: actions })
|
|
5661
6280
|
]
|
|
5662
6281
|
}
|
|
5663
6282
|
),
|
|
5664
|
-
responsive && /* @__PURE__ */
|
|
6283
|
+
responsive && /* @__PURE__ */ jsx68(
|
|
5665
6284
|
Drawer,
|
|
5666
6285
|
{
|
|
5667
6286
|
open: drawerOpen,
|
|
@@ -5690,13 +6309,13 @@ function HorizontalLink({ item, active, onActivate }) {
|
|
|
5690
6309
|
}
|
|
5691
6310
|
onActivate(item.id);
|
|
5692
6311
|
};
|
|
5693
|
-
const inner = /* @__PURE__ */
|
|
5694
|
-
item.icon != null && /* @__PURE__ */
|
|
5695
|
-
/* @__PURE__ */
|
|
5696
|
-
item.badge != null && /* @__PURE__ */
|
|
6312
|
+
const inner = /* @__PURE__ */ jsxs60(Fragment5, { children: [
|
|
6313
|
+
item.icon != null && /* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
|
|
6314
|
+
/* @__PURE__ */ jsx68("span", { children: item.label }),
|
|
6315
|
+
item.badge != null && /* @__PURE__ */ jsx68(ItemBadge, { active, children: item.badge })
|
|
5697
6316
|
] });
|
|
5698
6317
|
if (item.href) {
|
|
5699
|
-
return /* @__PURE__ */
|
|
6318
|
+
return /* @__PURE__ */ jsx68(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx68(
|
|
5700
6319
|
"a",
|
|
5701
6320
|
{
|
|
5702
6321
|
href: item.href,
|
|
@@ -5708,7 +6327,7 @@ function HorizontalLink({ item, active, onActivate }) {
|
|
|
5708
6327
|
}
|
|
5709
6328
|
) });
|
|
5710
6329
|
}
|
|
5711
|
-
return /* @__PURE__ */
|
|
6330
|
+
return /* @__PURE__ */ jsx68(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx68(
|
|
5712
6331
|
"button",
|
|
5713
6332
|
{
|
|
5714
6333
|
type: "button",
|
|
@@ -5721,8 +6340,8 @@ function HorizontalLink({ item, active, onActivate }) {
|
|
|
5721
6340
|
) });
|
|
5722
6341
|
}
|
|
5723
6342
|
function HorizontalDropdown({ item, active, activeId, onActivate }) {
|
|
5724
|
-
return /* @__PURE__ */
|
|
5725
|
-
/* @__PURE__ */
|
|
6343
|
+
return /* @__PURE__ */ jsxs60(RadixNav.Item, { children: [
|
|
6344
|
+
/* @__PURE__ */ jsxs60(
|
|
5726
6345
|
RadixNav.Trigger,
|
|
5727
6346
|
{
|
|
5728
6347
|
className: cn(
|
|
@@ -5734,9 +6353,9 @@ function HorizontalDropdown({ item, active, activeId, onActivate }) {
|
|
|
5734
6353
|
),
|
|
5735
6354
|
disabled: item.disabled,
|
|
5736
6355
|
children: [
|
|
5737
|
-
item.icon != null && /* @__PURE__ */
|
|
5738
|
-
/* @__PURE__ */
|
|
5739
|
-
/* @__PURE__ */
|
|
6356
|
+
item.icon != null && /* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
|
|
6357
|
+
/* @__PURE__ */ jsx68("span", { children: item.label }),
|
|
6358
|
+
/* @__PURE__ */ jsx68(
|
|
5740
6359
|
"span",
|
|
5741
6360
|
{
|
|
5742
6361
|
"aria-hidden": true,
|
|
@@ -5747,7 +6366,7 @@ function HorizontalDropdown({ item, active, activeId, onActivate }) {
|
|
|
5747
6366
|
]
|
|
5748
6367
|
}
|
|
5749
6368
|
),
|
|
5750
|
-
/* @__PURE__ */
|
|
6369
|
+
/* @__PURE__ */ jsx68(RadixNav.Content, { className: "border-border bg-panel min-w-[220px] rounded-xs border p-2 shadow-lg", children: /* @__PURE__ */ jsx68("ul", { className: "m-0! flex list-none! flex-col gap-[2px] p-0! [&_li]:m-0!", children: item.children.map((child) => /* @__PURE__ */ jsx68("li", { children: /* @__PURE__ */ jsx68(DropdownLink, { item: child, active: child.id === activeId, onActivate }) }, child.id)) }) })
|
|
5751
6370
|
] });
|
|
5752
6371
|
}
|
|
5753
6372
|
function DropdownLink({ item, active, onActivate }) {
|
|
@@ -5764,13 +6383,13 @@ function DropdownLink({ item, active, onActivate }) {
|
|
|
5764
6383
|
}
|
|
5765
6384
|
onActivate(item.id);
|
|
5766
6385
|
};
|
|
5767
|
-
const inner = /* @__PURE__ */
|
|
5768
|
-
item.icon != null && /* @__PURE__ */
|
|
5769
|
-
/* @__PURE__ */
|
|
5770
|
-
item.badge != null && /* @__PURE__ */
|
|
6386
|
+
const inner = /* @__PURE__ */ jsxs60(Fragment5, { children: [
|
|
6387
|
+
item.icon != null && /* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
|
|
6388
|
+
/* @__PURE__ */ jsx68("span", { className: "flex-1", children: item.label }),
|
|
6389
|
+
item.badge != null && /* @__PURE__ */ jsx68(ItemBadge, { active, children: item.badge })
|
|
5771
6390
|
] });
|
|
5772
6391
|
if (item.href) {
|
|
5773
|
-
return /* @__PURE__ */
|
|
6392
|
+
return /* @__PURE__ */ jsx68(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx68(
|
|
5774
6393
|
"a",
|
|
5775
6394
|
{
|
|
5776
6395
|
href: item.href,
|
|
@@ -5782,7 +6401,7 @@ function DropdownLink({ item, active, onActivate }) {
|
|
|
5782
6401
|
}
|
|
5783
6402
|
) });
|
|
5784
6403
|
}
|
|
5785
|
-
return /* @__PURE__ */
|
|
6404
|
+
return /* @__PURE__ */ jsx68(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx68(
|
|
5786
6405
|
"button",
|
|
5787
6406
|
{
|
|
5788
6407
|
type: "button",
|
|
@@ -5797,7 +6416,7 @@ function DropdownLink({ item, active, onActivate }) {
|
|
|
5797
6416
|
function VerticalItem({ item, activeId, onActivate }) {
|
|
5798
6417
|
const hasChildren = (item.children?.length ?? 0) > 0;
|
|
5799
6418
|
const treeActive = isActiveTree(item, activeId);
|
|
5800
|
-
const [open, setOpen] =
|
|
6419
|
+
const [open, setOpen] = useState19(treeActive);
|
|
5801
6420
|
const prevTreeActive = useRef13(treeActive);
|
|
5802
6421
|
useEffect15(() => {
|
|
5803
6422
|
if (treeActive && !prevTreeActive.current) setOpen(true);
|
|
@@ -5811,7 +6430,7 @@ function VerticalItem({ item, activeId, onActivate }) {
|
|
|
5811
6430
|
}
|
|
5812
6431
|
onActivate(item.id);
|
|
5813
6432
|
};
|
|
5814
|
-
return /* @__PURE__ */
|
|
6433
|
+
return /* @__PURE__ */ jsx68(
|
|
5815
6434
|
NavItem,
|
|
5816
6435
|
{
|
|
5817
6436
|
icon: item.icon,
|
|
@@ -5824,8 +6443,8 @@ function VerticalItem({ item, activeId, onActivate }) {
|
|
|
5824
6443
|
}
|
|
5825
6444
|
);
|
|
5826
6445
|
}
|
|
5827
|
-
return /* @__PURE__ */
|
|
5828
|
-
/* @__PURE__ */
|
|
6446
|
+
return /* @__PURE__ */ jsxs60("div", { className: "flex flex-col", children: [
|
|
6447
|
+
/* @__PURE__ */ jsxs60(
|
|
5829
6448
|
"button",
|
|
5830
6449
|
{
|
|
5831
6450
|
type: "button",
|
|
@@ -5841,18 +6460,18 @@ function VerticalItem({ item, activeId, onActivate }) {
|
|
|
5841
6460
|
item.disabled && "pointer-events-none opacity-50"
|
|
5842
6461
|
),
|
|
5843
6462
|
children: [
|
|
5844
|
-
item.icon != null && /* @__PURE__ */
|
|
5845
|
-
/* @__PURE__ */
|
|
5846
|
-
item.badge != null && /* @__PURE__ */
|
|
5847
|
-
/* @__PURE__ */
|
|
6463
|
+
item.icon != null && /* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "w-[14px] text-center opacity-80", children: item.icon }),
|
|
6464
|
+
/* @__PURE__ */ jsx68("span", { className: "flex-1 truncate", children: item.label }),
|
|
6465
|
+
item.badge != null && /* @__PURE__ */ jsx68(ItemBadge, { active: treeActive, children: item.badge }),
|
|
6466
|
+
/* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "text-[10px] opacity-60", children: open ? "\u25BE" : "\u25B8" })
|
|
5848
6467
|
]
|
|
5849
6468
|
}
|
|
5850
6469
|
),
|
|
5851
|
-
open && /* @__PURE__ */
|
|
6470
|
+
open && /* @__PURE__ */ jsx68("div", { className: "border-border mt-1 ml-[18px] flex flex-col gap-[2px] border-l pl-3", children: item.children.map((child) => /* @__PURE__ */ jsx68(VerticalItem, { item: child, activeId, onActivate }, child.id)) })
|
|
5852
6471
|
] });
|
|
5853
6472
|
}
|
|
5854
6473
|
function ItemBadge({ active, children }) {
|
|
5855
|
-
return /* @__PURE__ */
|
|
6474
|
+
return /* @__PURE__ */ jsx68(
|
|
5856
6475
|
"span",
|
|
5857
6476
|
{
|
|
5858
6477
|
className: cn(
|
|
@@ -5865,8 +6484,8 @@ function ItemBadge({ active, children }) {
|
|
|
5865
6484
|
}
|
|
5866
6485
|
|
|
5867
6486
|
// src/patterns/OnboardingChecklist/OnboardingChecklist.tsx
|
|
5868
|
-
import { forwardRef as
|
|
5869
|
-
import { Fragment as Fragment6, jsx as
|
|
6487
|
+
import { forwardRef as forwardRef67 } from "react";
|
|
6488
|
+
import { Fragment as Fragment6, jsx as jsx69, jsxs as jsxs61 } from "react/jsx-runtime";
|
|
5870
6489
|
var statusDot = {
|
|
5871
6490
|
pending: "off",
|
|
5872
6491
|
"in-progress": "sync",
|
|
@@ -5877,11 +6496,11 @@ var labelStateClass = {
|
|
|
5877
6496
|
"in-progress": "text-text",
|
|
5878
6497
|
done: "text-text-dim line-through"
|
|
5879
6498
|
};
|
|
5880
|
-
var OnboardingChecklist =
|
|
6499
|
+
var OnboardingChecklist = forwardRef67(
|
|
5881
6500
|
function OnboardingChecklist2({ items, onItemClick, title = "Get started", progressLabel, hideProgress, className, ...props }, ref) {
|
|
5882
6501
|
const total = items.length;
|
|
5883
6502
|
const done = items.filter((i) => i.status === "done").length;
|
|
5884
|
-
return /* @__PURE__ */
|
|
6503
|
+
return /* @__PURE__ */ jsxs61(
|
|
5885
6504
|
"section",
|
|
5886
6505
|
{
|
|
5887
6506
|
ref,
|
|
@@ -5892,11 +6511,11 @@ var OnboardingChecklist = forwardRef66(
|
|
|
5892
6511
|
),
|
|
5893
6512
|
...props,
|
|
5894
6513
|
children: [
|
|
5895
|
-
/* @__PURE__ */
|
|
5896
|
-
/* @__PURE__ */
|
|
5897
|
-
/* @__PURE__ */
|
|
6514
|
+
/* @__PURE__ */ jsxs61("header", { className: "flex items-center gap-2", children: [
|
|
6515
|
+
/* @__PURE__ */ jsx69("span", { className: "text-[14px] font-medium", children: title }),
|
|
6516
|
+
/* @__PURE__ */ jsx69("span", { className: "text-text-dim ml-auto font-mono text-[11px] tabular-nums", children: progressLabel ?? `${done} of ${total} complete` })
|
|
5898
6517
|
] }),
|
|
5899
|
-
!hideProgress && total > 0 && /* @__PURE__ */
|
|
6518
|
+
!hideProgress && total > 0 && /* @__PURE__ */ jsx69(
|
|
5900
6519
|
"div",
|
|
5901
6520
|
{
|
|
5902
6521
|
role: "progressbar",
|
|
@@ -5905,7 +6524,7 @@ var OnboardingChecklist = forwardRef66(
|
|
|
5905
6524
|
"aria-valuenow": done,
|
|
5906
6525
|
"aria-label": typeof title === "string" ? `${title} progress` : "Setup progress",
|
|
5907
6526
|
className: "bg-panel-2 h-[3px] w-full overflow-hidden rounded-full",
|
|
5908
|
-
children: /* @__PURE__ */
|
|
6527
|
+
children: /* @__PURE__ */ jsx69(
|
|
5909
6528
|
"span",
|
|
5910
6529
|
{
|
|
5911
6530
|
"aria-hidden": true,
|
|
@@ -5918,10 +6537,10 @@ var OnboardingChecklist = forwardRef66(
|
|
|
5918
6537
|
)
|
|
5919
6538
|
}
|
|
5920
6539
|
),
|
|
5921
|
-
/* @__PURE__ */
|
|
6540
|
+
/* @__PURE__ */ jsx69("ul", { className: "m-0 flex list-none flex-col gap-1 p-0", children: items.map((item) => {
|
|
5922
6541
|
const interactive = typeof onItemClick === "function";
|
|
5923
|
-
const labelBlock = /* @__PURE__ */
|
|
5924
|
-
/* @__PURE__ */
|
|
6542
|
+
const labelBlock = /* @__PURE__ */ jsxs61(Fragment6, { children: [
|
|
6543
|
+
/* @__PURE__ */ jsx69(
|
|
5925
6544
|
StatusDot,
|
|
5926
6545
|
{
|
|
5927
6546
|
state: statusDot[item.status],
|
|
@@ -5930,17 +6549,17 @@ var OnboardingChecklist = forwardRef66(
|
|
|
5930
6549
|
className: "mt-[3px]"
|
|
5931
6550
|
}
|
|
5932
6551
|
),
|
|
5933
|
-
/* @__PURE__ */
|
|
5934
|
-
/* @__PURE__ */
|
|
5935
|
-
item.description && /* @__PURE__ */
|
|
6552
|
+
/* @__PURE__ */ jsxs61("div", { className: "flex min-w-0 flex-1 flex-col gap-[2px]", children: [
|
|
6553
|
+
/* @__PURE__ */ jsx69("span", { className: cn("text-[13px]", labelStateClass[item.status]), children: item.label }),
|
|
6554
|
+
item.description && /* @__PURE__ */ jsx69("span", { className: "text-text-muted text-[12px] leading-[1.45]", children: item.description })
|
|
5936
6555
|
] })
|
|
5937
6556
|
] });
|
|
5938
6557
|
const labelRegionClass = cn(
|
|
5939
6558
|
"flex flex-1 items-start gap-3 rounded-md px-2 py-2 text-left transition-colors duration-(--duration-micro)",
|
|
5940
6559
|
interactive && "cursor-pointer outline-none hover:bg-panel-2 focus-visible:ring-[3px] focus-visible:ring-accent-dim"
|
|
5941
6560
|
);
|
|
5942
|
-
return /* @__PURE__ */
|
|
5943
|
-
interactive ? /* @__PURE__ */
|
|
6561
|
+
return /* @__PURE__ */ jsxs61("li", { className: "flex items-start gap-2", children: [
|
|
6562
|
+
interactive ? /* @__PURE__ */ jsx69(
|
|
5944
6563
|
"button",
|
|
5945
6564
|
{
|
|
5946
6565
|
type: "button",
|
|
@@ -5949,8 +6568,8 @@ var OnboardingChecklist = forwardRef66(
|
|
|
5949
6568
|
className: labelRegionClass,
|
|
5950
6569
|
children: labelBlock
|
|
5951
6570
|
}
|
|
5952
|
-
) : /* @__PURE__ */
|
|
5953
|
-
item.action && /* @__PURE__ */
|
|
6571
|
+
) : /* @__PURE__ */ jsx69("div", { className: labelRegionClass, children: labelBlock }),
|
|
6572
|
+
item.action && /* @__PURE__ */ jsx69("div", { className: "shrink-0 self-center", children: item.action })
|
|
5954
6573
|
] }, item.id);
|
|
5955
6574
|
}) })
|
|
5956
6575
|
]
|
|
@@ -5961,8 +6580,8 @@ var OnboardingChecklist = forwardRef66(
|
|
|
5961
6580
|
OnboardingChecklist.displayName = "OnboardingChecklist";
|
|
5962
6581
|
|
|
5963
6582
|
// src/patterns/Pagination/Pagination.tsx
|
|
5964
|
-
import { forwardRef as
|
|
5965
|
-
import { jsx as
|
|
6583
|
+
import { forwardRef as forwardRef68 } from "react";
|
|
6584
|
+
import { jsx as jsx70, jsxs as jsxs62 } from "react/jsx-runtime";
|
|
5966
6585
|
function buildRange(page, total, siblings) {
|
|
5967
6586
|
if (total <= 0) return [];
|
|
5968
6587
|
const items = [];
|
|
@@ -5975,9 +6594,9 @@ function buildRange(page, total, siblings) {
|
|
|
5975
6594
|
if (total > 1) items.push(total);
|
|
5976
6595
|
return items;
|
|
5977
6596
|
}
|
|
5978
|
-
var Pagination =
|
|
6597
|
+
var Pagination = forwardRef68(function Pagination2({ page, total, onPageChange, siblings = 1, className, ...props }, ref) {
|
|
5979
6598
|
const items = buildRange(page, total, siblings);
|
|
5980
|
-
return /* @__PURE__ */
|
|
6599
|
+
return /* @__PURE__ */ jsxs62(
|
|
5981
6600
|
"nav",
|
|
5982
6601
|
{
|
|
5983
6602
|
ref,
|
|
@@ -5985,7 +6604,7 @@ var Pagination = forwardRef67(function Pagination2({ page, total, onPageChange,
|
|
|
5985
6604
|
className: cn("inline-flex items-center gap-1", className),
|
|
5986
6605
|
...props,
|
|
5987
6606
|
children: [
|
|
5988
|
-
/* @__PURE__ */
|
|
6607
|
+
/* @__PURE__ */ jsx70(
|
|
5989
6608
|
IconButton,
|
|
5990
6609
|
{
|
|
5991
6610
|
size: "sm",
|
|
@@ -5998,7 +6617,7 @@ var Pagination = forwardRef67(function Pagination2({ page, total, onPageChange,
|
|
|
5998
6617
|
),
|
|
5999
6618
|
items.map((item, i) => {
|
|
6000
6619
|
if (item === "start-ellipsis" || item === "end-ellipsis") {
|
|
6001
|
-
return /* @__PURE__ */
|
|
6620
|
+
return /* @__PURE__ */ jsx70(
|
|
6002
6621
|
"span",
|
|
6003
6622
|
{
|
|
6004
6623
|
"aria-hidden": true,
|
|
@@ -6009,7 +6628,7 @@ var Pagination = forwardRef67(function Pagination2({ page, total, onPageChange,
|
|
|
6009
6628
|
);
|
|
6010
6629
|
}
|
|
6011
6630
|
const isActive = item === page;
|
|
6012
|
-
return /* @__PURE__ */
|
|
6631
|
+
return /* @__PURE__ */ jsx70(
|
|
6013
6632
|
"button",
|
|
6014
6633
|
{
|
|
6015
6634
|
type: "button",
|
|
@@ -6027,7 +6646,7 @@ var Pagination = forwardRef67(function Pagination2({ page, total, onPageChange,
|
|
|
6027
6646
|
item
|
|
6028
6647
|
);
|
|
6029
6648
|
}),
|
|
6030
|
-
/* @__PURE__ */
|
|
6649
|
+
/* @__PURE__ */ jsx70(
|
|
6031
6650
|
IconButton,
|
|
6032
6651
|
{
|
|
6033
6652
|
size: "sm",
|
|
@@ -6045,10 +6664,10 @@ var Pagination = forwardRef67(function Pagination2({ page, total, onPageChange,
|
|
|
6045
6664
|
Pagination.displayName = "Pagination";
|
|
6046
6665
|
|
|
6047
6666
|
// src/patterns/Progress/Progress.tsx
|
|
6048
|
-
import { cva as
|
|
6049
|
-
import { forwardRef as
|
|
6050
|
-
import { jsx as
|
|
6051
|
-
var trackStyles =
|
|
6667
|
+
import { cva as cva13 } from "class-variance-authority";
|
|
6668
|
+
import { forwardRef as forwardRef69 } from "react";
|
|
6669
|
+
import { jsx as jsx71, jsxs as jsxs63 } from "react/jsx-runtime";
|
|
6670
|
+
var trackStyles = cva13("w-full rounded-full bg-panel-2 overflow-hidden", {
|
|
6052
6671
|
variants: {
|
|
6053
6672
|
size: {
|
|
6054
6673
|
sm: "h-[3px]",
|
|
@@ -6058,7 +6677,7 @@ var trackStyles = cva12("w-full rounded-full bg-panel-2 overflow-hidden", {
|
|
|
6058
6677
|
},
|
|
6059
6678
|
defaultVariants: { size: "md" }
|
|
6060
6679
|
});
|
|
6061
|
-
var fillStyles =
|
|
6680
|
+
var fillStyles = cva13("h-full rounded-full transition-[width] duration-(--duration-step)", {
|
|
6062
6681
|
variants: {
|
|
6063
6682
|
tone: {
|
|
6064
6683
|
accent: "bg-accent",
|
|
@@ -6069,7 +6688,7 @@ var fillStyles = cva12("h-full rounded-full transition-[width] duration-(--durat
|
|
|
6069
6688
|
},
|
|
6070
6689
|
defaultVariants: { tone: "accent" }
|
|
6071
6690
|
});
|
|
6072
|
-
var Progress =
|
|
6691
|
+
var Progress = forwardRef69(function Progress2({
|
|
6073
6692
|
value = 0,
|
|
6074
6693
|
max = 100,
|
|
6075
6694
|
indeterminate = false,
|
|
@@ -6083,15 +6702,15 @@ var Progress = forwardRef68(function Progress2({
|
|
|
6083
6702
|
const clamped = Math.min(max, Math.max(0, value));
|
|
6084
6703
|
const pct = max > 0 ? clamped / max * 100 : 0;
|
|
6085
6704
|
const display = Math.round(pct);
|
|
6086
|
-
return /* @__PURE__ */
|
|
6087
|
-
label != null && /* @__PURE__ */
|
|
6088
|
-
/* @__PURE__ */
|
|
6089
|
-
showValue && !indeterminate && /* @__PURE__ */
|
|
6705
|
+
return /* @__PURE__ */ jsxs63("div", { ref, className: cn("flex w-full flex-col gap-2", className), ...props, children: [
|
|
6706
|
+
label != null && /* @__PURE__ */ jsxs63("div", { className: "flex text-[12px]", children: [
|
|
6707
|
+
/* @__PURE__ */ jsx71("span", { className: "text-text-muted", children: label }),
|
|
6708
|
+
showValue && !indeterminate && /* @__PURE__ */ jsxs63("span", { className: "text-text ml-auto font-mono tabular-nums", children: [
|
|
6090
6709
|
display,
|
|
6091
6710
|
"%"
|
|
6092
6711
|
] })
|
|
6093
6712
|
] }),
|
|
6094
|
-
/* @__PURE__ */
|
|
6713
|
+
/* @__PURE__ */ jsx71(
|
|
6095
6714
|
"div",
|
|
6096
6715
|
{
|
|
6097
6716
|
role: "progressbar",
|
|
@@ -6100,7 +6719,7 @@ var Progress = forwardRef68(function Progress2({
|
|
|
6100
6719
|
"aria-valuenow": indeterminate ? void 0 : display,
|
|
6101
6720
|
"aria-label": typeof label === "string" ? label : void 0,
|
|
6102
6721
|
className: trackStyles({ size }),
|
|
6103
|
-
children: indeterminate ? /* @__PURE__ */
|
|
6722
|
+
children: indeterminate ? /* @__PURE__ */ jsx71(
|
|
6104
6723
|
"span",
|
|
6105
6724
|
{
|
|
6106
6725
|
"aria-hidden": true,
|
|
@@ -6110,7 +6729,7 @@ var Progress = forwardRef68(function Progress2({
|
|
|
6110
6729
|
"animate-[ship-indeterminate_1.4s_linear_infinite]"
|
|
6111
6730
|
)
|
|
6112
6731
|
}
|
|
6113
|
-
) : /* @__PURE__ */
|
|
6732
|
+
) : /* @__PURE__ */ jsx71("span", { "aria-hidden": true, className: fillStyles({ tone }), style: { width: `${pct}%` } })
|
|
6114
6733
|
}
|
|
6115
6734
|
)
|
|
6116
6735
|
] });
|
|
@@ -6118,18 +6737,18 @@ var Progress = forwardRef68(function Progress2({
|
|
|
6118
6737
|
Progress.displayName = "Progress";
|
|
6119
6738
|
|
|
6120
6739
|
// src/patterns/PullToRefresh/PullToRefresh.tsx
|
|
6121
|
-
import { forwardRef as
|
|
6122
|
-
import { jsx as
|
|
6740
|
+
import { forwardRef as forwardRef70 } from "react";
|
|
6741
|
+
import { jsx as jsx72, jsxs as jsxs64 } from "react/jsx-runtime";
|
|
6123
6742
|
var labels = {
|
|
6124
6743
|
idle: "Pull to refresh",
|
|
6125
6744
|
pulling: "Pull to refresh",
|
|
6126
6745
|
ready: "Release to refresh",
|
|
6127
6746
|
loading: "Refreshing\u2026"
|
|
6128
6747
|
};
|
|
6129
|
-
var PullToRefresh =
|
|
6748
|
+
var PullToRefresh = forwardRef70(function PullToRefresh2({ state = "idle", label, className, ...props }, ref) {
|
|
6130
6749
|
const isLoading = state === "loading";
|
|
6131
6750
|
const transform = state === "ready" ? "rotate(180deg)" : state === "pulling" ? "rotate(90deg)" : "rotate(0deg)";
|
|
6132
|
-
return /* @__PURE__ */
|
|
6751
|
+
return /* @__PURE__ */ jsxs64(
|
|
6133
6752
|
"div",
|
|
6134
6753
|
{
|
|
6135
6754
|
ref,
|
|
@@ -6139,7 +6758,7 @@ var PullToRefresh = forwardRef69(function PullToRefresh2({ state = "idle", label
|
|
|
6139
6758
|
className: cn("text-text-muted flex flex-col items-center gap-[6px] py-3", className),
|
|
6140
6759
|
...props,
|
|
6141
6760
|
children: [
|
|
6142
|
-
/* @__PURE__ */
|
|
6761
|
+
/* @__PURE__ */ jsx72(
|
|
6143
6762
|
"div",
|
|
6144
6763
|
{
|
|
6145
6764
|
"aria-hidden": true,
|
|
@@ -6155,7 +6774,7 @@ var PullToRefresh = forwardRef69(function PullToRefresh2({ state = "idle", label
|
|
|
6155
6774
|
}
|
|
6156
6775
|
}
|
|
6157
6776
|
),
|
|
6158
|
-
/* @__PURE__ */
|
|
6777
|
+
/* @__PURE__ */ jsx72("span", { className: "text-m-eyebrow font-mono tracking-wide uppercase", children: label ?? labels[state] })
|
|
6159
6778
|
]
|
|
6160
6779
|
}
|
|
6161
6780
|
);
|
|
@@ -6163,8 +6782,8 @@ var PullToRefresh = forwardRef69(function PullToRefresh2({ state = "idle", label
|
|
|
6163
6782
|
PullToRefresh.displayName = "PullToRefresh";
|
|
6164
6783
|
|
|
6165
6784
|
// src/patterns/Sparkline/Sparkline.tsx
|
|
6166
|
-
import { forwardRef as
|
|
6167
|
-
import { jsx as
|
|
6785
|
+
import { forwardRef as forwardRef71, useMemo as useMemo6 } from "react";
|
|
6786
|
+
import { jsx as jsx73, jsxs as jsxs65 } from "react/jsx-runtime";
|
|
6168
6787
|
function buildPath(values, w, h) {
|
|
6169
6788
|
if (values.length === 0) return { line: "", area: "" };
|
|
6170
6789
|
const pad = 2;
|
|
@@ -6183,7 +6802,7 @@ function buildPath(values, w, h) {
|
|
|
6183
6802
|
)} L${pad.toFixed(2)},${(h - pad).toFixed(2)} Z`;
|
|
6184
6803
|
return { line, area };
|
|
6185
6804
|
}
|
|
6186
|
-
var Sparkline =
|
|
6805
|
+
var Sparkline = forwardRef71(function Sparkline2({
|
|
6187
6806
|
values,
|
|
6188
6807
|
width = 160,
|
|
6189
6808
|
height = 32,
|
|
@@ -6195,7 +6814,7 @@ var Sparkline = forwardRef70(function Sparkline2({
|
|
|
6195
6814
|
...props
|
|
6196
6815
|
}, ref) {
|
|
6197
6816
|
const { line, area } = useMemo6(() => buildPath(values, width, height), [values, width, height]);
|
|
6198
|
-
return /* @__PURE__ */
|
|
6817
|
+
return /* @__PURE__ */ jsxs65(
|
|
6199
6818
|
"svg",
|
|
6200
6819
|
{
|
|
6201
6820
|
ref,
|
|
@@ -6207,8 +6826,8 @@ var Sparkline = forwardRef70(function Sparkline2({
|
|
|
6207
6826
|
className: cn("inline-block", className),
|
|
6208
6827
|
...props,
|
|
6209
6828
|
children: [
|
|
6210
|
-
fill && /* @__PURE__ */
|
|
6211
|
-
/* @__PURE__ */
|
|
6829
|
+
fill && /* @__PURE__ */ jsx73("path", { d: area, fill: stroke, fillOpacity: 0.16, stroke: "none" }),
|
|
6830
|
+
/* @__PURE__ */ jsx73(
|
|
6212
6831
|
"path",
|
|
6213
6832
|
{
|
|
6214
6833
|
d: line,
|
|
@@ -6226,16 +6845,16 @@ var Sparkline = forwardRef70(function Sparkline2({
|
|
|
6226
6845
|
Sparkline.displayName = "Sparkline";
|
|
6227
6846
|
|
|
6228
6847
|
// src/patterns/Spinner/Spinner.tsx
|
|
6229
|
-
import { forwardRef as
|
|
6230
|
-
import { jsx as
|
|
6848
|
+
import { forwardRef as forwardRef72 } from "react";
|
|
6849
|
+
import { jsx as jsx74 } from "react/jsx-runtime";
|
|
6231
6850
|
var sizes = {
|
|
6232
6851
|
sm: { box: "h-3 w-3", border: "border-[2px]" },
|
|
6233
6852
|
md: { box: "h-4 w-4", border: "border-[2px]" },
|
|
6234
6853
|
lg: { box: "h-5 w-5", border: "border-[2px]" }
|
|
6235
6854
|
};
|
|
6236
|
-
var Spinner2 =
|
|
6855
|
+
var Spinner2 = forwardRef72(function Spinner3({ size = "md", label = "Loading", className, ...props }, ref) {
|
|
6237
6856
|
const s = sizes[size];
|
|
6238
|
-
return /* @__PURE__ */
|
|
6857
|
+
return /* @__PURE__ */ jsx74(
|
|
6239
6858
|
"span",
|
|
6240
6859
|
{
|
|
6241
6860
|
ref,
|
|
@@ -6243,7 +6862,7 @@ var Spinner2 = forwardRef71(function Spinner3({ size = "md", label = "Loading",
|
|
|
6243
6862
|
"aria-label": label,
|
|
6244
6863
|
className: cn("inline-block", className),
|
|
6245
6864
|
...props,
|
|
6246
|
-
children: /* @__PURE__ */
|
|
6865
|
+
children: /* @__PURE__ */ jsx74(
|
|
6247
6866
|
"span",
|
|
6248
6867
|
{
|
|
6249
6868
|
"aria-hidden": true,
|
|
@@ -6260,8 +6879,8 @@ var Spinner2 = forwardRef71(function Spinner3({ size = "md", label = "Loading",
|
|
|
6260
6879
|
Spinner2.displayName = "Spinner";
|
|
6261
6880
|
|
|
6262
6881
|
// src/patterns/Stepper/Stepper.tsx
|
|
6263
|
-
import { forwardRef as
|
|
6264
|
-
import { jsx as
|
|
6882
|
+
import { forwardRef as forwardRef73, Fragment as Fragment7 } from "react";
|
|
6883
|
+
import { jsx as jsx75, jsxs as jsxs66 } from "react/jsx-runtime";
|
|
6265
6884
|
var dotBase = "h-6 w-6 rounded-full grid place-items-center text-[11px] font-mono font-semibold border";
|
|
6266
6885
|
var dotStateClass = {
|
|
6267
6886
|
done: "bg-accent text-on-accent border-accent",
|
|
@@ -6278,8 +6897,8 @@ function stateFor(index, current) {
|
|
|
6278
6897
|
if (index === current) return "current";
|
|
6279
6898
|
return "upcoming";
|
|
6280
6899
|
}
|
|
6281
|
-
var Stepper =
|
|
6282
|
-
return /* @__PURE__ */
|
|
6900
|
+
var Stepper = forwardRef73(function Stepper2({ steps, current, className, ...props }, ref) {
|
|
6901
|
+
return /* @__PURE__ */ jsx75(
|
|
6283
6902
|
"ol",
|
|
6284
6903
|
{
|
|
6285
6904
|
ref,
|
|
@@ -6291,19 +6910,19 @@ var Stepper = forwardRef72(function Stepper2({ steps, current, className, ...pro
|
|
|
6291
6910
|
const id = typeof step === "string" ? void 0 : step.id;
|
|
6292
6911
|
const state = stateFor(i, current);
|
|
6293
6912
|
const connectorActive = i < current;
|
|
6294
|
-
return /* @__PURE__ */
|
|
6295
|
-
/* @__PURE__ */
|
|
6913
|
+
return /* @__PURE__ */ jsxs66(Fragment7, { children: [
|
|
6914
|
+
/* @__PURE__ */ jsxs66(
|
|
6296
6915
|
"li",
|
|
6297
6916
|
{
|
|
6298
6917
|
"aria-current": state === "current" ? "step" : void 0,
|
|
6299
6918
|
className: "flex items-center gap-2",
|
|
6300
6919
|
children: [
|
|
6301
|
-
/* @__PURE__ */
|
|
6302
|
-
/* @__PURE__ */
|
|
6920
|
+
/* @__PURE__ */ jsx75("span", { "aria-hidden": true, className: cn(dotBase, dotStateClass[state]), children: state === "done" ? "\u2713" : i + 1 }),
|
|
6921
|
+
/* @__PURE__ */ jsx75("span", { className: cn("text-[12px]", labelStateClass2[state]), children: label })
|
|
6303
6922
|
]
|
|
6304
6923
|
}
|
|
6305
6924
|
),
|
|
6306
|
-
i < steps.length - 1 && /* @__PURE__ */
|
|
6925
|
+
i < steps.length - 1 && /* @__PURE__ */ jsx75(
|
|
6307
6926
|
"span",
|
|
6308
6927
|
{
|
|
6309
6928
|
"aria-hidden": true,
|
|
@@ -6319,14 +6938,14 @@ Stepper.displayName = "Stepper";
|
|
|
6319
6938
|
|
|
6320
6939
|
// src/patterns/TabBar/TabBar.tsx
|
|
6321
6940
|
import {
|
|
6322
|
-
forwardRef as
|
|
6941
|
+
forwardRef as forwardRef74,
|
|
6323
6942
|
useCallback as useCallback15,
|
|
6324
|
-
useState as
|
|
6943
|
+
useState as useState20
|
|
6325
6944
|
} from "react";
|
|
6326
|
-
import { jsx as
|
|
6327
|
-
var TabBar =
|
|
6945
|
+
import { jsx as jsx76, jsxs as jsxs67 } from "react/jsx-runtime";
|
|
6946
|
+
var TabBar = forwardRef74(function TabBar2({ items, value, defaultValue, onValueChange, className, ...props }, ref) {
|
|
6328
6947
|
const isControlled = value !== void 0;
|
|
6329
|
-
const [internalValue, setInternalValue] =
|
|
6948
|
+
const [internalValue, setInternalValue] = useState20(defaultValue);
|
|
6330
6949
|
const activeId = isControlled ? value : internalValue;
|
|
6331
6950
|
const handleSelect = useCallback15(
|
|
6332
6951
|
(id, e) => {
|
|
@@ -6336,7 +6955,7 @@ var TabBar = forwardRef73(function TabBar2({ items, value, defaultValue, onValue
|
|
|
6336
6955
|
},
|
|
6337
6956
|
[isControlled, onValueChange]
|
|
6338
6957
|
);
|
|
6339
|
-
return /* @__PURE__ */
|
|
6958
|
+
return /* @__PURE__ */ jsx76(
|
|
6340
6959
|
"nav",
|
|
6341
6960
|
{
|
|
6342
6961
|
ref,
|
|
@@ -6351,7 +6970,7 @@ var TabBar = forwardRef73(function TabBar2({ items, value, defaultValue, onValue
|
|
|
6351
6970
|
children: items.map((item) => {
|
|
6352
6971
|
const isActive = item.id === activeId;
|
|
6353
6972
|
if (item.elevated) {
|
|
6354
|
-
return /* @__PURE__ */
|
|
6973
|
+
return /* @__PURE__ */ jsx76("div", { className: "grid place-items-center", children: /* @__PURE__ */ jsxs67(
|
|
6355
6974
|
"button",
|
|
6356
6975
|
{
|
|
6357
6976
|
type: "button",
|
|
@@ -6367,13 +6986,13 @@ var TabBar = forwardRef73(function TabBar2({ items, value, defaultValue, onValue
|
|
|
6367
6986
|
"disabled:cursor-not-allowed disabled:opacity-40"
|
|
6368
6987
|
),
|
|
6369
6988
|
children: [
|
|
6370
|
-
/* @__PURE__ */
|
|
6371
|
-
/* @__PURE__ */
|
|
6989
|
+
/* @__PURE__ */ jsx76("span", { "aria-hidden": true, children: item.icon }),
|
|
6990
|
+
/* @__PURE__ */ jsx76("span", { className: "sr-only", children: item.label })
|
|
6372
6991
|
]
|
|
6373
6992
|
}
|
|
6374
6993
|
) }, item.id);
|
|
6375
6994
|
}
|
|
6376
|
-
return /* @__PURE__ */
|
|
6995
|
+
return /* @__PURE__ */ jsxs67(
|
|
6377
6996
|
"button",
|
|
6378
6997
|
{
|
|
6379
6998
|
type: "button",
|
|
@@ -6388,9 +7007,9 @@ var TabBar = forwardRef73(function TabBar2({ items, value, defaultValue, onValue
|
|
|
6388
7007
|
isActive ? "text-accent-text" : "text-text-muted hover:text-text"
|
|
6389
7008
|
),
|
|
6390
7009
|
children: [
|
|
6391
|
-
/* @__PURE__ */
|
|
7010
|
+
/* @__PURE__ */ jsxs67("span", { className: "relative inline-flex", "aria-hidden": true, children: [
|
|
6392
7011
|
item.icon,
|
|
6393
|
-
item.badge != null && /* @__PURE__ */
|
|
7012
|
+
item.badge != null && /* @__PURE__ */ jsx76(
|
|
6394
7013
|
"span",
|
|
6395
7014
|
{
|
|
6396
7015
|
className: cn(
|
|
@@ -6401,9 +7020,9 @@ var TabBar = forwardRef73(function TabBar2({ items, value, defaultValue, onValue
|
|
|
6401
7020
|
}
|
|
6402
7021
|
)
|
|
6403
7022
|
] }),
|
|
6404
|
-
/* @__PURE__ */
|
|
7023
|
+
/* @__PURE__ */ jsxs67("span", { className: "text-[10px] font-medium tracking-tight", children: [
|
|
6405
7024
|
item.label,
|
|
6406
|
-
item.badge != null && /* @__PURE__ */
|
|
7025
|
+
item.badge != null && /* @__PURE__ */ jsxs67("span", { className: "sr-only", children: [
|
|
6407
7026
|
", ",
|
|
6408
7027
|
item.badge,
|
|
6409
7028
|
" unread"
|
|
@@ -6421,11 +7040,11 @@ TabBar.displayName = "TabBar";
|
|
|
6421
7040
|
|
|
6422
7041
|
// src/patterns/Tabs/Tabs.tsx
|
|
6423
7042
|
import * as RadixTabs from "@radix-ui/react-tabs";
|
|
6424
|
-
import { cva as
|
|
6425
|
-
import { createContext as createContext2, forwardRef as
|
|
6426
|
-
import { jsx as
|
|
7043
|
+
import { cva as cva14 } from "class-variance-authority";
|
|
7044
|
+
import { createContext as createContext2, forwardRef as forwardRef75, useContext as useContext2 } from "react";
|
|
7045
|
+
import { jsx as jsx77 } from "react/jsx-runtime";
|
|
6427
7046
|
var TabsVariantContext = createContext2("underline");
|
|
6428
|
-
var tabsListStyles =
|
|
7047
|
+
var tabsListStyles = cva14("", {
|
|
6429
7048
|
variants: {
|
|
6430
7049
|
variant: {
|
|
6431
7050
|
underline: "flex gap-6 border-b border-border",
|
|
@@ -6433,7 +7052,7 @@ var tabsListStyles = cva13("", {
|
|
|
6433
7052
|
}
|
|
6434
7053
|
}
|
|
6435
7054
|
});
|
|
6436
|
-
var tabsTriggerStyles =
|
|
7055
|
+
var tabsTriggerStyles = cva14(
|
|
6437
7056
|
"cursor-pointer outline-none transition-colors duration-(--duration-micro) focus-visible:ring-[3px] focus-visible:ring-accent-dim",
|
|
6438
7057
|
{
|
|
6439
7058
|
variants: {
|
|
@@ -6454,8 +7073,8 @@ var tabsTriggerStyles = cva13(
|
|
|
6454
7073
|
}
|
|
6455
7074
|
}
|
|
6456
7075
|
);
|
|
6457
|
-
var Tabs =
|
|
6458
|
-
return /* @__PURE__ */
|
|
7076
|
+
var Tabs = forwardRef75(function Tabs2({ variant = "underline", className, ...props }, ref) {
|
|
7077
|
+
return /* @__PURE__ */ jsx77(TabsVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx77(
|
|
6459
7078
|
RadixTabs.Root,
|
|
6460
7079
|
{
|
|
6461
7080
|
ref,
|
|
@@ -6465,14 +7084,14 @@ var Tabs = forwardRef74(function Tabs2({ variant = "underline", className, ...pr
|
|
|
6465
7084
|
) });
|
|
6466
7085
|
});
|
|
6467
7086
|
Tabs.displayName = "Tabs";
|
|
6468
|
-
var TabsList =
|
|
7087
|
+
var TabsList = forwardRef75(function TabsList2({ className, ...props }, ref) {
|
|
6469
7088
|
const variant = useContext2(TabsVariantContext);
|
|
6470
|
-
return /* @__PURE__ */
|
|
7089
|
+
return /* @__PURE__ */ jsx77(RadixTabs.List, { ref, className: cn(tabsListStyles({ variant }), className), ...props });
|
|
6471
7090
|
});
|
|
6472
7091
|
TabsList.displayName = "TabsList";
|
|
6473
|
-
var Tab =
|
|
7092
|
+
var Tab = forwardRef75(function Tab2({ className, ...props }, ref) {
|
|
6474
7093
|
const variant = useContext2(TabsVariantContext);
|
|
6475
|
-
return /* @__PURE__ */
|
|
7094
|
+
return /* @__PURE__ */ jsx77(
|
|
6476
7095
|
RadixTabs.Trigger,
|
|
6477
7096
|
{
|
|
6478
7097
|
ref,
|
|
@@ -6482,9 +7101,9 @@ var Tab = forwardRef74(function Tab2({ className, ...props }, ref) {
|
|
|
6482
7101
|
);
|
|
6483
7102
|
});
|
|
6484
7103
|
Tab.displayName = "Tab";
|
|
6485
|
-
var TabsContent =
|
|
7104
|
+
var TabsContent = forwardRef75(
|
|
6486
7105
|
function TabsContent2({ className, ...props }, ref) {
|
|
6487
|
-
return /* @__PURE__ */
|
|
7106
|
+
return /* @__PURE__ */ jsx77(
|
|
6488
7107
|
RadixTabs.Content,
|
|
6489
7108
|
{
|
|
6490
7109
|
ref,
|
|
@@ -6500,8 +7119,8 @@ var TabsContent = forwardRef74(
|
|
|
6500
7119
|
TabsContent.displayName = "TabsContent";
|
|
6501
7120
|
|
|
6502
7121
|
// src/patterns/Timeline/Timeline.tsx
|
|
6503
|
-
import { forwardRef as
|
|
6504
|
-
import { jsx as
|
|
7122
|
+
import { forwardRef as forwardRef76 } from "react";
|
|
7123
|
+
import { jsx as jsx78, jsxs as jsxs68 } from "react/jsx-runtime";
|
|
6505
7124
|
var ringClass = {
|
|
6506
7125
|
accent: "border-accent",
|
|
6507
7126
|
ok: "border-ok",
|
|
@@ -6509,8 +7128,8 @@ var ringClass = {
|
|
|
6509
7128
|
err: "border-err",
|
|
6510
7129
|
muted: "border-text-dim"
|
|
6511
7130
|
};
|
|
6512
|
-
var Timeline =
|
|
6513
|
-
return /* @__PURE__ */
|
|
7131
|
+
var Timeline = forwardRef76(function Timeline2({ events, className, children, ...props }, ref) {
|
|
7132
|
+
return /* @__PURE__ */ jsx78(
|
|
6514
7133
|
"ol",
|
|
6515
7134
|
{
|
|
6516
7135
|
ref,
|
|
@@ -6520,14 +7139,14 @@ var Timeline = forwardRef75(function Timeline2({ events, className, children, ..
|
|
|
6520
7139
|
className
|
|
6521
7140
|
),
|
|
6522
7141
|
...props,
|
|
6523
|
-
children: events ? events.map((e, i) => /* @__PURE__ */
|
|
7142
|
+
children: events ? events.map((e, i) => /* @__PURE__ */ jsx78(TimelineItem, { tone: e.tone, time: e.time, description: e.description, children: e.title }, i)) : children
|
|
6524
7143
|
}
|
|
6525
7144
|
);
|
|
6526
7145
|
});
|
|
6527
7146
|
Timeline.displayName = "Timeline";
|
|
6528
|
-
var TimelineItem =
|
|
6529
|
-
return /* @__PURE__ */
|
|
6530
|
-
/* @__PURE__ */
|
|
7147
|
+
var TimelineItem = forwardRef76(function TimelineItem2({ tone = "accent", description, time, className, children, ...props }, ref) {
|
|
7148
|
+
return /* @__PURE__ */ jsxs68("li", { ref, className: cn("relative mb-[18px] last:mb-0", className), ...props, children: [
|
|
7149
|
+
/* @__PURE__ */ jsx78(
|
|
6531
7150
|
"span",
|
|
6532
7151
|
{
|
|
6533
7152
|
"aria-hidden": true,
|
|
@@ -6537,15 +7156,15 @@ var TimelineItem = forwardRef75(function TimelineItem2({ tone = "accent", descri
|
|
|
6537
7156
|
)
|
|
6538
7157
|
}
|
|
6539
7158
|
),
|
|
6540
|
-
/* @__PURE__ */
|
|
6541
|
-
description && /* @__PURE__ */
|
|
6542
|
-
time && /* @__PURE__ */
|
|
7159
|
+
/* @__PURE__ */ jsx78("div", { className: "text-[13px] font-medium", children }),
|
|
7160
|
+
description && /* @__PURE__ */ jsx78("div", { className: "text-text-muted text-[12px]", children: description }),
|
|
7161
|
+
time && /* @__PURE__ */ jsx78("div", { className: "text-text-dim mt-[2px] font-mono text-[10px]", children: time })
|
|
6543
7162
|
] });
|
|
6544
7163
|
});
|
|
6545
7164
|
TimelineItem.displayName = "TimelineItem";
|
|
6546
7165
|
|
|
6547
7166
|
// src/patterns/Timeline/ActivityTimeline.tsx
|
|
6548
|
-
import { forwardRef as
|
|
7167
|
+
import { forwardRef as forwardRef77 } from "react";
|
|
6549
7168
|
|
|
6550
7169
|
// src/patterns/Timeline/formatRelative.ts
|
|
6551
7170
|
var SECOND = 1e3;
|
|
@@ -6580,7 +7199,7 @@ function formatRelative(input, now = /* @__PURE__ */ new Date()) {
|
|
|
6580
7199
|
}
|
|
6581
7200
|
|
|
6582
7201
|
// src/patterns/Timeline/ActivityTimeline.tsx
|
|
6583
|
-
import { jsx as
|
|
7202
|
+
import { jsx as jsx79, jsxs as jsxs69 } from "react/jsx-runtime";
|
|
6584
7203
|
var ringClass2 = {
|
|
6585
7204
|
accent: "border-accent",
|
|
6586
7205
|
ok: "border-ok",
|
|
@@ -6588,10 +7207,10 @@ var ringClass2 = {
|
|
|
6588
7207
|
err: "border-err",
|
|
6589
7208
|
muted: "border-text-dim"
|
|
6590
7209
|
};
|
|
6591
|
-
var ActivityTimeline =
|
|
7210
|
+
var ActivityTimeline = forwardRef77(
|
|
6592
7211
|
function ActivityTimeline2({ events, relativeNow, className, ...props }, ref) {
|
|
6593
7212
|
const now = relativeNow ?? /* @__PURE__ */ new Date();
|
|
6594
|
-
return /* @__PURE__ */
|
|
7213
|
+
return /* @__PURE__ */ jsx79(
|
|
6595
7214
|
"ol",
|
|
6596
7215
|
{
|
|
6597
7216
|
ref,
|
|
@@ -6604,8 +7223,8 @@ var ActivityTimeline = forwardRef76(
|
|
|
6604
7223
|
children: events.map((event) => {
|
|
6605
7224
|
const tone = event.tone ?? "accent";
|
|
6606
7225
|
const time = formatRelative(event.at, now);
|
|
6607
|
-
return /* @__PURE__ */
|
|
6608
|
-
/* @__PURE__ */
|
|
7226
|
+
return /* @__PURE__ */ jsxs69("li", { className: "relative mb-4 last:mb-0", children: [
|
|
7227
|
+
/* @__PURE__ */ jsx79(
|
|
6609
7228
|
"span",
|
|
6610
7229
|
{
|
|
6611
7230
|
"aria-hidden": true,
|
|
@@ -6615,16 +7234,16 @@ var ActivityTimeline = forwardRef76(
|
|
|
6615
7234
|
)
|
|
6616
7235
|
}
|
|
6617
7236
|
),
|
|
6618
|
-
/* @__PURE__ */
|
|
6619
|
-
event.icon && /* @__PURE__ */
|
|
6620
|
-
/* @__PURE__ */
|
|
6621
|
-
time && /* @__PURE__ */
|
|
7237
|
+
/* @__PURE__ */ jsxs69("div", { className: "flex items-baseline gap-2", children: [
|
|
7238
|
+
event.icon && /* @__PURE__ */ jsx79("span", { "aria-hidden": true, className: "text-text-muted font-mono text-[12px]", children: event.icon }),
|
|
7239
|
+
/* @__PURE__ */ jsx79("div", { className: "text-[13px] font-medium", children: event.title }),
|
|
7240
|
+
time && /* @__PURE__ */ jsx79("time", { className: "text-text-dim ml-auto font-mono text-[10px]", children: time })
|
|
6622
7241
|
] }),
|
|
6623
|
-
event.actor && /* @__PURE__ */
|
|
6624
|
-
event.actor.avatar && /* @__PURE__ */
|
|
6625
|
-
/* @__PURE__ */
|
|
7242
|
+
event.actor && /* @__PURE__ */ jsxs69("div", { className: "text-text-muted mt-[2px] flex items-center gap-[6px] text-[12px]", children: [
|
|
7243
|
+
event.actor.avatar && /* @__PURE__ */ jsx79("span", { "aria-hidden": true, className: "inline-flex", children: event.actor.avatar }),
|
|
7244
|
+
/* @__PURE__ */ jsx79("span", { children: event.actor.name })
|
|
6626
7245
|
] }),
|
|
6627
|
-
event.payload && /* @__PURE__ */
|
|
7246
|
+
event.payload && /* @__PURE__ */ jsx79("div", { className: "border-border bg-panel-2 mt-2 rounded-md border px-3 py-2 font-mono text-[11px] leading-[1.5]", children: event.payload })
|
|
6628
7247
|
] }, event.id);
|
|
6629
7248
|
})
|
|
6630
7249
|
}
|
|
@@ -6634,9 +7253,9 @@ var ActivityTimeline = forwardRef76(
|
|
|
6634
7253
|
ActivityTimeline.displayName = "ActivityTimeline";
|
|
6635
7254
|
|
|
6636
7255
|
// src/patterns/Topbar/Topbar.tsx
|
|
6637
|
-
import { forwardRef as
|
|
6638
|
-
import { jsx as
|
|
6639
|
-
var Topbar =
|
|
7256
|
+
import { forwardRef as forwardRef78 } from "react";
|
|
7257
|
+
import { jsx as jsx80, jsxs as jsxs70 } from "react/jsx-runtime";
|
|
7258
|
+
var Topbar = forwardRef78(function Topbar2({
|
|
6640
7259
|
title,
|
|
6641
7260
|
eyebrow,
|
|
6642
7261
|
leading,
|
|
@@ -6650,7 +7269,7 @@ var Topbar = forwardRef77(function Topbar2({
|
|
|
6650
7269
|
}, ref) {
|
|
6651
7270
|
const isTouch = density === "touch";
|
|
6652
7271
|
const backHandler = typeof back === "function" ? back : back ? onBack : void 0;
|
|
6653
|
-
return /* @__PURE__ */
|
|
7272
|
+
return /* @__PURE__ */ jsxs70(
|
|
6654
7273
|
"header",
|
|
6655
7274
|
{
|
|
6656
7275
|
ref,
|
|
@@ -6661,7 +7280,7 @@ var Topbar = forwardRef77(function Topbar2({
|
|
|
6661
7280
|
),
|
|
6662
7281
|
...props,
|
|
6663
7282
|
children: [
|
|
6664
|
-
isTouch && back && /* @__PURE__ */
|
|
7283
|
+
isTouch && back && /* @__PURE__ */ jsx80(
|
|
6665
7284
|
"button",
|
|
6666
7285
|
{
|
|
6667
7286
|
type: "button",
|
|
@@ -6675,7 +7294,7 @@ var Topbar = forwardRef77(function Topbar2({
|
|
|
6675
7294
|
"hover:bg-panel-2 h-touch w-touch",
|
|
6676
7295
|
"focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]"
|
|
6677
7296
|
),
|
|
6678
|
-
children: /* @__PURE__ */
|
|
7297
|
+
children: /* @__PURE__ */ jsx80(
|
|
6679
7298
|
"svg",
|
|
6680
7299
|
{
|
|
6681
7300
|
width: "20",
|
|
@@ -6685,15 +7304,15 @@ var Topbar = forwardRef77(function Topbar2({
|
|
|
6685
7304
|
stroke: "currentColor",
|
|
6686
7305
|
strokeWidth: "2",
|
|
6687
7306
|
"aria-hidden": true,
|
|
6688
|
-
children: /* @__PURE__ */
|
|
7307
|
+
children: /* @__PURE__ */ jsx80("path", { d: "m15 18-6-6 6-6" })
|
|
6689
7308
|
}
|
|
6690
7309
|
)
|
|
6691
7310
|
}
|
|
6692
7311
|
),
|
|
6693
7312
|
leading,
|
|
6694
|
-
(title || isTouch && eyebrow) && /* @__PURE__ */
|
|
6695
|
-
isTouch && eyebrow && /* @__PURE__ */
|
|
6696
|
-
title && /* @__PURE__ */
|
|
7313
|
+
(title || isTouch && eyebrow) && /* @__PURE__ */ jsxs70("div", { className: cn("min-w-0", isTouch && "flex-1"), children: [
|
|
7314
|
+
isTouch && eyebrow && /* @__PURE__ */ jsx80("div", { className: "text-m-eyebrow text-accent font-mono tracking-wide uppercase", children: eyebrow }),
|
|
7315
|
+
title && /* @__PURE__ */ jsx80(
|
|
6697
7316
|
"div",
|
|
6698
7317
|
{
|
|
6699
7318
|
className: cn(
|
|
@@ -6703,8 +7322,8 @@ var Topbar = forwardRef77(function Topbar2({
|
|
|
6703
7322
|
}
|
|
6704
7323
|
)
|
|
6705
7324
|
] }),
|
|
6706
|
-
!isTouch && /* @__PURE__ */
|
|
6707
|
-
actions && /* @__PURE__ */
|
|
7325
|
+
!isTouch && /* @__PURE__ */ jsx80("div", { className: "flex flex-1 items-center" }),
|
|
7326
|
+
actions && /* @__PURE__ */ jsx80("div", { className: cn("flex items-center", isTouch ? "gap-1" : "gap-3"), children: actions }),
|
|
6708
7327
|
children
|
|
6709
7328
|
]
|
|
6710
7329
|
}
|
|
@@ -6714,15 +7333,14 @@ Topbar.displayName = "Topbar";
|
|
|
6714
7333
|
|
|
6715
7334
|
// src/patterns/Tree/Tree.tsx
|
|
6716
7335
|
import {
|
|
6717
|
-
forwardRef as
|
|
7336
|
+
forwardRef as forwardRef79,
|
|
6718
7337
|
useCallback as useCallback16,
|
|
6719
|
-
useEffect as useEffect16,
|
|
6720
7338
|
useMemo as useMemo7,
|
|
6721
7339
|
useRef as useRef14,
|
|
6722
|
-
useState as
|
|
7340
|
+
useState as useState21
|
|
6723
7341
|
} from "react";
|
|
6724
7342
|
import { flushSync } from "react-dom";
|
|
6725
|
-
import { jsx as
|
|
7343
|
+
import { jsx as jsx81, jsxs as jsxs71 } from "react/jsx-runtime";
|
|
6726
7344
|
var EMPTY_SET2 = /* @__PURE__ */ new Set();
|
|
6727
7345
|
function flattenVisible(items, expanded, level, parentId, out) {
|
|
6728
7346
|
for (const item of items) {
|
|
@@ -6733,7 +7351,7 @@ function flattenVisible(items, expanded, level, parentId, out) {
|
|
|
6733
7351
|
}
|
|
6734
7352
|
}
|
|
6735
7353
|
}
|
|
6736
|
-
var Tree =
|
|
7354
|
+
var Tree = forwardRef79(function Tree2({
|
|
6737
7355
|
items,
|
|
6738
7356
|
expanded: expandedProp,
|
|
6739
7357
|
defaultExpanded,
|
|
@@ -6761,12 +7379,10 @@ var Tree = forwardRef78(function Tree2({
|
|
|
6761
7379
|
flattenVisible(items, expandedSet, 1, null, out);
|
|
6762
7380
|
return out;
|
|
6763
7381
|
}, [items, expandedSet]);
|
|
6764
|
-
const [activeId, setActiveId] =
|
|
6765
|
-
|
|
6766
|
-
|
|
6767
|
-
|
|
6768
|
-
}
|
|
6769
|
-
}, [activeId, flatVisible]);
|
|
7382
|
+
const [activeId, setActiveId] = useState21(null);
|
|
7383
|
+
if (activeId && !flatVisible.some((f) => f.id === activeId)) {
|
|
7384
|
+
setActiveId(null);
|
|
7385
|
+
}
|
|
6770
7386
|
const tabStopId = useMemo7(() => {
|
|
6771
7387
|
if (activeId && flatVisible.some((f) => f.id === activeId)) return activeId;
|
|
6772
7388
|
if (value && flatVisible.some((f) => f.id === value)) return value;
|
|
@@ -6915,7 +7531,7 @@ var Tree = forwardRef78(function Tree2({
|
|
|
6915
7531
|
toggle
|
|
6916
7532
|
]
|
|
6917
7533
|
);
|
|
6918
|
-
return /* @__PURE__ */
|
|
7534
|
+
return /* @__PURE__ */ jsx81(
|
|
6919
7535
|
"ul",
|
|
6920
7536
|
{
|
|
6921
7537
|
ref: setRefs,
|
|
@@ -6923,7 +7539,7 @@ var Tree = forwardRef78(function Tree2({
|
|
|
6923
7539
|
className: cn("flex flex-col gap-px text-[12px]", className),
|
|
6924
7540
|
onKeyDown: handleKeyDown,
|
|
6925
7541
|
...props,
|
|
6926
|
-
children: items.map((item) => /* @__PURE__ */
|
|
7542
|
+
children: items.map((item) => /* @__PURE__ */ jsx81(
|
|
6927
7543
|
TreeItemRow,
|
|
6928
7544
|
{
|
|
6929
7545
|
item,
|
|
@@ -6958,8 +7574,8 @@ function TreeItemRow({
|
|
|
6958
7574
|
const isExpanded = hasChildren && expanded.has(item.id);
|
|
6959
7575
|
const isSelected = selected === item.id;
|
|
6960
7576
|
const isTabStop = tabStopId === item.id;
|
|
6961
|
-
return /* @__PURE__ */
|
|
6962
|
-
/* @__PURE__ */
|
|
7577
|
+
return /* @__PURE__ */ jsxs71("li", { role: "none", children: [
|
|
7578
|
+
/* @__PURE__ */ jsxs71(
|
|
6963
7579
|
"div",
|
|
6964
7580
|
{
|
|
6965
7581
|
role: "treeitem",
|
|
@@ -6982,14 +7598,14 @@ function TreeItemRow({
|
|
|
6982
7598
|
isSelected ? "bg-accent-dim text-accent" : "text-text hover:bg-panel-2"
|
|
6983
7599
|
),
|
|
6984
7600
|
children: [
|
|
6985
|
-
/* @__PURE__ */
|
|
6986
|
-
item.icon && /* @__PURE__ */
|
|
6987
|
-
/* @__PURE__ */
|
|
7601
|
+
/* @__PURE__ */ jsx81("span", { "aria-hidden": true, className: "text-text-dim grid w-3 place-items-center text-[10px]", children: hasChildren ? isExpanded ? "\u25BE" : "\u25B8" : "" }),
|
|
7602
|
+
item.icon && /* @__PURE__ */ jsx81("span", { "aria-hidden": true, className: "text-[12px] opacity-80", children: item.icon }),
|
|
7603
|
+
/* @__PURE__ */ jsx81("span", { className: "flex-1 truncate", children: item.label }),
|
|
6988
7604
|
item.trailing
|
|
6989
7605
|
]
|
|
6990
7606
|
}
|
|
6991
7607
|
),
|
|
6992
|
-
hasChildren && isExpanded && /* @__PURE__ */
|
|
7608
|
+
hasChildren && isExpanded && /* @__PURE__ */ jsx81("ul", { role: "group", className: "flex flex-col gap-px", children: (item.children ?? []).map((child) => /* @__PURE__ */ jsx81(
|
|
6993
7609
|
TreeItemRow,
|
|
6994
7610
|
{
|
|
6995
7611
|
item: child,
|
|
@@ -7007,10 +7623,10 @@ function TreeItemRow({
|
|
|
7007
7623
|
}
|
|
7008
7624
|
|
|
7009
7625
|
// src/patterns/WizardDialog/WizardDialog.tsx
|
|
7010
|
-
import * as
|
|
7011
|
-
import { forwardRef as
|
|
7012
|
-
import { jsx as
|
|
7013
|
-
var WizardDialog =
|
|
7626
|
+
import * as RadixDialog7 from "@radix-ui/react-dialog";
|
|
7627
|
+
import { forwardRef as forwardRef80, useCallback as useCallback17, useMemo as useMemo8, useState as useState22 } from "react";
|
|
7628
|
+
import { jsx as jsx82, jsxs as jsxs72 } from "react/jsx-runtime";
|
|
7629
|
+
var WizardDialog = forwardRef80(function WizardDialog2({
|
|
7014
7630
|
open,
|
|
7015
7631
|
defaultOpen,
|
|
7016
7632
|
onOpenChange,
|
|
@@ -7026,7 +7642,7 @@ var WizardDialog = forwardRef79(function WizardDialog2({
|
|
|
7026
7642
|
cancelLabel,
|
|
7027
7643
|
onCancel
|
|
7028
7644
|
}, ref) {
|
|
7029
|
-
const [current, setCurrent] =
|
|
7645
|
+
const [current, setCurrent] = useState22(initialStep);
|
|
7030
7646
|
const total = steps.length;
|
|
7031
7647
|
const safeCurrent = Math.min(current, Math.max(0, total - 1));
|
|
7032
7648
|
const step = steps[safeCurrent];
|
|
@@ -7061,36 +7677,36 @@ var WizardDialog = forwardRef79(function WizardDialog2({
|
|
|
7061
7677
|
goNext();
|
|
7062
7678
|
}
|
|
7063
7679
|
};
|
|
7064
|
-
return /* @__PURE__ */
|
|
7680
|
+
return /* @__PURE__ */ jsx82(DialogRoot, { open, defaultOpen, onOpenChange, children: /* @__PURE__ */ jsxs72(
|
|
7065
7681
|
DialogContent,
|
|
7066
7682
|
{
|
|
7067
7683
|
ref,
|
|
7068
7684
|
width,
|
|
7069
7685
|
...description ? {} : { "aria-describedby": void 0 },
|
|
7070
7686
|
children: [
|
|
7071
|
-
title ? /* @__PURE__ */
|
|
7687
|
+
title ? /* @__PURE__ */ jsx82(WizardTitle, { children: title }) : (
|
|
7072
7688
|
// Radix Dialog requires a Title for assistive tech and warns in dev
|
|
7073
7689
|
// mode without one. Fall back to a visually-hidden generic title so
|
|
7074
7690
|
// the contract is met even when no title prop is supplied.
|
|
7075
|
-
/* @__PURE__ */
|
|
7691
|
+
/* @__PURE__ */ jsx82(RadixDialog7.Title, { className: "sr-only", children: "Wizard" })
|
|
7076
7692
|
),
|
|
7077
|
-
description && /* @__PURE__ */
|
|
7078
|
-
/* @__PURE__ */
|
|
7079
|
-
/* @__PURE__ */
|
|
7080
|
-
/* @__PURE__ */
|
|
7081
|
-
cancelLabel && /* @__PURE__ */
|
|
7082
|
-
/* @__PURE__ */
|
|
7083
|
-
/* @__PURE__ */
|
|
7693
|
+
description && /* @__PURE__ */ jsx82(WizardDescription, { children: description }),
|
|
7694
|
+
/* @__PURE__ */ jsx82("div", { className: "mb-5", children: /* @__PURE__ */ jsx82(Stepper, { steps: stepperSteps, current: safeCurrent }) }),
|
|
7695
|
+
/* @__PURE__ */ jsx82("div", { className: "mb-5", children: body }),
|
|
7696
|
+
/* @__PURE__ */ jsxs72("div", { className: "flex justify-end gap-2", children: [
|
|
7697
|
+
cancelLabel && /* @__PURE__ */ jsx82(Button, { type: "button", variant: "ghost", onClick: onCancel, children: cancelLabel }),
|
|
7698
|
+
/* @__PURE__ */ jsx82(Button, { type: "button", variant: "secondary", onClick: goBack, disabled: ctx.isFirst, children: backLabel }),
|
|
7699
|
+
/* @__PURE__ */ jsx82(Button, { type: "button", variant: "primary", onClick: handlePrimary, disabled: !canAdvance, children: ctx.isLast ? completeLabel : nextLabel })
|
|
7084
7700
|
] })
|
|
7085
7701
|
]
|
|
7086
7702
|
}
|
|
7087
7703
|
) });
|
|
7088
7704
|
});
|
|
7089
7705
|
function WizardTitle({ children }) {
|
|
7090
|
-
return /* @__PURE__ */
|
|
7706
|
+
return /* @__PURE__ */ jsx82(RadixDialog7.Title, { className: "mb-2 text-[16px] font-medium", children });
|
|
7091
7707
|
}
|
|
7092
7708
|
function WizardDescription({ children }) {
|
|
7093
|
-
return /* @__PURE__ */
|
|
7709
|
+
return /* @__PURE__ */ jsx82(RadixDialog7.Description, { className: "text-text-muted mb-4 text-[13px] leading-[1.55]", children });
|
|
7094
7710
|
}
|
|
7095
7711
|
WizardDialog.displayName = "WizardDialog";
|
|
7096
7712
|
export {
|
|
@@ -7167,6 +7783,7 @@ export {
|
|
|
7167
7783
|
LargeTitle,
|
|
7168
7784
|
Lightbox,
|
|
7169
7785
|
ListingCard,
|
|
7786
|
+
ListingDetail,
|
|
7170
7787
|
MenuCheckboxItem,
|
|
7171
7788
|
MenuItem,
|
|
7172
7789
|
MenuSeparator,
|