@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.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 clamped = Math.max(0, Math.min(items.length - 1, i));
3109
- setActive(clamped);
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[clamped];
3113
- slide?.scrollIntoView({ behavior: "smooth", block: "nearest", inline: "start" });
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
- [items.length, setActive]
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 i = Math.round(node.scrollLeft / width);
3125
- if (i !== active) setActive(i);
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
- }, [active, setActive]);
3130
- const activeIdx = active ?? 0;
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__ */ jsx45(
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: items.map((item, i) => /* @__PURE__ */ jsx45(
3149
- "div",
3150
- {
3151
- className: "w-full shrink-0 snap-start",
3152
- style: { aspectRatio: String(aspectRatio) },
3153
- role: "group",
3154
- "aria-roledescription": "slide",
3155
- "aria-label": `${i + 1} of ${items.length}`,
3156
- children: renderItem(item, i)
3157
- },
3158
- i
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 && items.length > 1 && /* @__PURE__ */ jsxs38(Fragment, { children: [
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 === items.length - 1,
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 && items.length > 1 && /*
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) => Math.max(0, (prev ?? 0) - 1));
4268
- }, [setActive]);
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) => Math.min(items.length - 1, (prev ?? 0) + 1));
4271
- }, [items.length, setActive]);
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 === items.length - 1,
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 { forwardRef as forwardRef51 } from "react";
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 gap-1 p-3", children: [
4404
- eyebrow && /* @__PURE__ */ jsx53("span", { className: "text-text-dim font-mono text-[10px] tracking-wide uppercase", children: eyebrow }),
4405
- /* @__PURE__ */ jsxs46("div", { className: "flex items-start justify-between gap-2", children: [
4406
- /* @__PURE__ */ jsx53("span", { className: "text-text text-[14px] leading-snug font-semibold", children: title }),
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(Rating, { value: rating, max: 5, precision: "half", size: "sm", readOnly: true, className: "sr-only" })
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
- onFavorite && /* @__PURE__ */ jsx53(
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 forwardRef52, useEffect as useEffect14, useMemo as useMemo5, useRef as useRef12, useState as useState13 } from "react";
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 jsx54, jsxs as jsxs47 } from "react/jsx-runtime";
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 = forwardRef52(function PhoneInput2({
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] = useState13(
5152
+ const [country, setCountry] = useState15(
4534
5153
  parsed?.country ?? countries.find((c) => c.code === defaultCountry) ?? countries[0]
4535
5154
  );
4536
- const [national, setNational] = useState13(parsed?.national ?? "");
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__ */ jsxs47(
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__ */ jsx54(
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__ */ jsx54(
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 forwardRef53 } from "react";
4612
- import { jsx as jsx55, jsxs as jsxs48 } from "react/jsx-runtime";
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__ */ jsxs48("div", { ref, className: cn("flex flex-col gap-2", className), ...props, children: [
4623
- items?.map((item, i) => /* @__PURE__ */ jsx55(PriceBreakdownLine, { ...item }, i)),
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__ */ jsxs48("div", { className: "border-border mt-2 flex items-baseline justify-between border-t pt-3", children: [
4626
- /* @__PURE__ */ jsx55("span", { className: "text-text text-[14px] font-semibold", children: totalLabel }),
4627
- /* @__PURE__ */ jsxs48("span", { className: "text-text text-[16px] font-semibold", children: [
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__ */ jsx55("span", { className: "text-text-dim ml-1 text-[12px] font-normal", children: currency })
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 = forwardRef53(PriceBreakdownRoot);
5253
+ var PriceBreakdown = forwardRef54(PriceBreakdownRoot);
4635
5254
  PriceBreakdown.displayName = "PriceBreakdown";
4636
- var PriceBreakdownLine = forwardRef53(
5255
+ var PriceBreakdownLine = forwardRef54(
4637
5256
  function PriceBreakdownLine2({ label, subLabel, amount, originalAmount, discount, className }, ref) {
4638
- return /* @__PURE__ */ jsxs48("div", { ref, className: cn("flex items-baseline justify-between gap-3", className), children: [
4639
- /* @__PURE__ */ jsxs48("div", { className: "flex min-w-0 flex-col", children: [
4640
- /* @__PURE__ */ jsx55("span", { className: "text-text text-[13px]", children: label }),
4641
- subLabel && /* @__PURE__ */ jsx55("span", { className: "text-text-dim text-[11px]", children: subLabel })
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__ */ jsxs48("div", { className: "inline-flex shrink-0 items-baseline gap-2", children: [
4644
- originalAmount && /* @__PURE__ */ jsx55("span", { className: "text-text-dim decoration-sale text-[12px] line-through", children: originalAmount }),
4645
- /* @__PURE__ */ jsx55(
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 IconGlyph8 } from "@ship-it-ui/icons";
4661
- import { forwardRef as forwardRef54 } from "react";
4662
- import { jsx as jsx56, jsxs as jsxs49 } from "react/jsx-runtime";
4663
- var ReviewCard = forwardRef54(function ReviewCard2({ author, authorAvatar, rating, date, body, photos, verified, subtitle, className, ...props }, ref) {
4664
- return /* @__PURE__ */ jsxs49(
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__ */ jsxs49("header", { className: "flex items-start gap-3", children: [
4672
- /* @__PURE__ */ jsx56(
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__ */ jsxs49("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
4681
- /* @__PURE__ */ jsxs49("div", { className: "flex items-center gap-2", children: [
4682
- /* @__PURE__ */ jsx56("span", { className: "text-text text-[14px] leading-tight font-semibold", children: author }),
4683
- verified && /* @__PURE__ */ jsxs49(Badge, { variant: "ok", size: "sm", children: [
4684
- /* @__PURE__ */ jsx56(IconGlyph8, { name: "verified", size: 11 }),
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__ */ jsx56("span", { className: "text-text-dim text-[11px]", children: subtitle }),
4689
- /* @__PURE__ */ jsxs49("div", { className: "mt-1 flex items-center gap-2", children: [
4690
- /* @__PURE__ */ jsx56(Rating, { value: rating, max: 5, precision: "half", size: "sm", readOnly: true }),
4691
- /* @__PURE__ */ jsx56("span", { className: "text-text-dim text-[11px]", children: "\xB7" }),
4692
- /* @__PURE__ */ jsx56("time", { className: "text-text-dim text-[11px]", children: date })
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__ */ jsx56("p", { className: "text-text text-[13px] leading-relaxed", children: body }),
4697
- photos && photos.length > 0 && /* @__PURE__ */ jsx56("div", { className: "flex gap-2 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden", children: photos.map((src, i) => /* @__PURE__ */ jsx56(
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 forwardRef55 } from "react";
4715
- import { jsx as jsx57 } from "react/jsx-runtime";
4716
- var Dots = forwardRef55(function Dots2({ total, current, onChange, className, "aria-label": ariaLabel = "Progress", ...props }, ref) {
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__ */ jsx57(
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__ */ jsx57(
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__ */ jsx57("span", { "aria-hidden": true, className: sharedClass }, i);
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 forwardRef56,
4759
- useState as useState14
5377
+ forwardRef as forwardRef57,
5378
+ useState as useState16
4760
5379
  } from "react";
4761
- import { jsx as jsx58, jsxs as jsxs50 } from "react/jsx-runtime";
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 = forwardRef56(function Dropzone2({
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] = useState14(false);
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__ */ jsxs50(
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__ */ jsx58(
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__ */ jsx58(
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__ */ jsx58("div", { className: "mb-1 text-[13px] font-medium", children: title }),
4833
- description && /* @__PURE__ */ jsx58("div", { className: "text-text-dim text-[11px]", children: description })
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 cva11 } from "class-variance-authority";
4842
- import { forwardRef as forwardRef57 } from "react";
4843
- import { jsx as jsx59, jsxs as jsxs51 } from "react/jsx-runtime";
4844
- var plateStyles = cva11("grid h-12 w-12 place-items-center rounded-base text-[22px]", {
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 = forwardRef57(function EmptyState2({ icon, title, description, action, chips, tone, className, ...props }, ref) {
4857
- return /* @__PURE__ */ jsxs51(
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__ */ jsx59("span", { "aria-hidden": true, className: plateStyles({ tone: tone ?? "neutral" }), children: icon }),
4868
- /* @__PURE__ */ jsx59("div", { className: "text-[14px] font-medium", children: title }),
4869
- description && /* @__PURE__ */ jsx59("div", { className: "text-text-muted max-w-[260px] text-[12px] leading-[1.5]", children: description }),
4870
- chips && chips.length > 0 && /* @__PURE__ */ jsx59("div", { className: "flex w-full flex-col gap-1", children: chips.map((c, i) => /* @__PURE__ */ jsx59(
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 forwardRef58 } from "react";
4893
- import { jsx as jsx60, jsxs as jsxs52 } from "react/jsx-runtime";
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 = forwardRef58(function FileChip2({ name, size, progress, icon, onRemove, failed, className, ...props }, ref) {
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__ */ jsxs52(
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__ */ jsx60(
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__ */ jsxs52("div", { className: "min-w-0 flex-1", children: [
4922
- /* @__PURE__ */ jsx60("div", { className: "truncate text-[12px] font-medium", children: name }),
4923
- /* @__PURE__ */ jsxs52("div", { className: cn("font-mono text-[10px]", failed ? "text-err" : "text-text-dim"), children: [
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__ */ jsxs52("span", { children: [
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__ */ jsx60("div", { className: "bg-panel mt-1 h-[2px] overflow-hidden rounded-full", children: /* @__PURE__ */ jsx60(
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__ */ jsx60(
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 forwardRef59, useCallback as useCallback12, useState as useState15 } from "react";
4963
- import { jsx as jsx61, jsxs as jsxs53 } from "react/jsx-runtime";
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 = forwardRef59(function FilterPanel2({
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__ */ jsxs53(
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__ */ jsxs53("div", { className: "flex items-center gap-2", children: [
5011
- /* @__PURE__ */ jsx61("span", { className: "text-text-dim font-mono text-[10px] tracking-[1.4px] uppercase", children: title }),
5012
- total > 0 && /* @__PURE__ */ jsx61(Badge, { size: "sm", variant: "accent", children: total }),
5013
- /* @__PURE__ */ jsx61(
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__ */ jsx61(
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] = useState15(facet.defaultOpen ?? true);
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__ */ jsxs53("section", { className: "flex flex-col gap-1", children: [
5048
- collapsible ? /* @__PURE__ */ jsxs53(
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__ */ jsx61("span", { className: "flex-1 text-left", children: facet.label }),
5062
- selectedCount > 0 && /* @__PURE__ */ jsx61(Badge, { size: "sm", variant: "neutral", children: selectedCount }),
5063
- /* @__PURE__ */ jsx61("span", { "aria-hidden": true, className: "text-[10px] opacity-70", children: isOpen ? "\u25BE" : "\u25B8" })
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__ */ jsxs53("div", { className: cn(headingClass, "px-1 py-[2px]"), children: [
5067
- /* @__PURE__ */ jsx61("span", { className: "flex-1", children: facet.label }),
5068
- selectedCount > 0 && /* @__PURE__ */ jsx61(Badge, { size: "sm", variant: "neutral", children: selectedCount })
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__ */ jsx61("ul", { className: "m-0 flex list-none flex-col gap-[2px] p-0", children: facet.options.map((option) => {
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__ */ jsxs53("li", { className: "flex items-center gap-2 px-1 py-[3px]", children: [
5074
- /* @__PURE__ */ jsx61(
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__ */ jsx61("span", { className: "text-text-dim ml-auto font-mono text-[10px] tabular-nums", children: count })
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 forwardRef61 } from "react";
5708
+ import { forwardRef as forwardRef62 } from "react";
5090
5709
 
5091
5710
  // src/patterns/RadialProgress/RadialProgress.tsx
5092
- import { forwardRef as forwardRef60 } from "react";
5093
- import { jsx as jsx62, jsxs as jsxs54 } from "react/jsx-runtime";
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 = forwardRef60(
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__ */ jsxs54(
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__ */ jsxs54("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, children: [
5132
- /* @__PURE__ */ jsx62(
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__ */ jsx62(
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__ */ jsx62("div", { className: "absolute inset-0 grid place-items-center font-mono text-[11px] font-medium tabular-nums", children: children ?? `${Math.round(pct)}%` })
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 jsx63, jsxs as jsxs55 } from "react/jsx-runtime";
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 = forwardRef61(function HealthScore2({
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__ */ jsxs55(
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__ */ jsx63(RadialProgress, { value, max, size, tone: resolvedTone }),
5211
- label && /* @__PURE__ */ jsx63("div", { className: "text-text-muted mt-1 text-[12px] leading-tight", children: label }),
5212
- typeof delta === "number" && /* @__PURE__ */ jsxs55("div", { className: cn("font-mono text-[11px] tabular-nums", toneTextClass[indicatorTone]), children: [
5213
- /* @__PURE__ */ jsx63("span", { "aria-hidden": true, children: deltaGlyph(delta) }),
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__ */ jsx63(
5842
+ return /* @__PURE__ */ jsx64(
5224
5843
  HoverCard,
5225
5844
  {
5226
- trigger: /* @__PURE__ */ jsx63("span", { className: "inline-flex", children: core }),
5227
- content: /* @__PURE__ */ jsxs55("div", { className: "flex min-w-[180px] flex-col gap-2", children: [
5228
- /* @__PURE__ */ jsx63("div", { className: "text-text-dim font-mono text-[9px] tracking-[1.4px] uppercase", children: "Breakdown" }),
5229
- /* @__PURE__ */ jsx63("ul", { className: "m-0 flex list-none flex-col gap-1 p-0 text-[12px]", children: breakdown.map((entry, i) => /* @__PURE__ */ jsxs55("li", { className: "flex items-center gap-2", children: [
5230
- /* @__PURE__ */ jsx63("span", { className: "text-text-muted flex-1 truncate", children: entry.label }),
5231
- /* @__PURE__ */ jsx63(
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 forwardRef62 } from "react";
5250
- import { jsx as jsx64, jsxs as jsxs56 } from "react/jsx-runtime";
5251
- var LargeTitle = forwardRef62(function LargeTitle2({ title, eyebrow, trailing, className, ...props }, ref) {
5252
- return /* @__PURE__ */ jsxs56(
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__ */ jsxs56("div", { className: "min-w-0 flex-1", children: [
5260
- eyebrow && /* @__PURE__ */ jsx64("div", { className: "text-m-eyebrow text-accent mb-[6px] font-mono tracking-wide uppercase", children: eyebrow }),
5261
- /* @__PURE__ */ jsx64("h1", { className: "text-m-h1 m-0 truncate leading-tight font-medium tracking-tight", children: title })
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__ */ jsx64("div", { className: "shrink-0", children: trailing })
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 forwardRef63 } from "react";
5273
- import { jsx as jsx65, jsxs as jsxs57 } from "react/jsx-runtime";
5274
- var Menubar = forwardRef63(function Menubar2({ className, ...props }, ref) {
5275
- return /* @__PURE__ */ jsx65(
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 = forwardRef63(
5908
+ var MenubarTrigger = forwardRef64(
5290
5909
  function MenubarTrigger2({ className, ...props }, ref) {
5291
- return /* @__PURE__ */ jsx65(
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 = forwardRef63(
5927
+ var MenubarContent = forwardRef64(
5309
5928
  function MenubarContent2({ className, sideOffset = 6, align = "start", ...props }, ref) {
5310
- return /* @__PURE__ */ jsx65(RadixMenubar.Portal, { children: /* @__PURE__ */ jsx65(
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 = forwardRef63(function MenubarItem2({ trailing, destructive, className, children, ...props }, ref) {
5333
- return /* @__PURE__ */ jsxs57(
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__ */ jsx65("span", { className: "flex-1", children }),
5341
- trailing && /* @__PURE__ */ jsx65("span", { className: "text-text-dim font-mono text-[10px]", children: trailing })
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 = forwardRef63(
5966
+ var MenubarSeparator = forwardRef64(
5348
5967
  function MenubarSeparator2({ className, ...props }, ref) {
5349
- return /* @__PURE__ */ jsx65(
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 forwardRef65,
5983
+ forwardRef as forwardRef66,
5365
5984
  useCallback as useCallback14,
5366
5985
  useEffect as useEffect15,
5367
5986
  useRef as useRef13,
5368
- useState as useState17
5987
+ useState as useState19
5369
5988
  } from "react";
5370
5989
 
5371
5990
  // src/patterns/Sidebar/Sidebar.tsx
5372
5991
  import {
5373
- forwardRef as forwardRef64,
5992
+ forwardRef as forwardRef65,
5374
5993
  useCallback as useCallback13,
5375
- useState as useState16
5994
+ useState as useState18
5376
5995
  } from "react";
5377
- import { Fragment as Fragment4, jsx as jsx66, jsxs as jsxs58 } from "react/jsx-runtime";
5378
- var Sidebar = forwardRef64(function Sidebar2({ width = 240, className, style, ...props }, ref) {
5379
- return /* @__PURE__ */ jsx66(
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 = forwardRef64(
6012
+ var NavItem = forwardRef65(
5394
6013
  function NavItem2({ icon, label, active, badge, href, disabled, className, ...props }, ref) {
5395
- const inner = /* @__PURE__ */ jsxs58(Fragment4, { children: [
5396
- icon && /* @__PURE__ */ jsx66("span", { "aria-hidden": true, className: "w-[14px] text-center opacity-80", children: icon }),
5397
- /* @__PURE__ */ jsx66("span", { className: "flex-1 truncate", children: label }),
5398
- badge != null && /* @__PURE__ */ jsx66(
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__ */ jsx66(
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__ */ jsx66(
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 = forwardRef64(function NavSection2({
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] = useState16(defaultOpen);
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__ */ jsxs58("div", { ref, className: cn("flex flex-col gap-1", className), ...props, children: [
5471
- collapsible ? /* @__PURE__ */ jsxs58(
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__ */ jsx66("span", { "aria-hidden": true, className: "opacity-80", children: icon }),
5485
- /* @__PURE__ */ jsx66("span", { className: "flex-1 text-left", children: label }),
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__ */ jsx66("span", { "aria-hidden": true, className: "text-[10px] opacity-70", children: isOpen ? "\u25BE" : "\u25B8" })
6106
+ /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "text-[10px] opacity-70", children: isOpen ? "\u25BE" : "\u25B8" })
5488
6107
  ]
5489
6108
  }
5490
- ) : /* @__PURE__ */ jsxs58("div", { className: eyebrowClass, children: [
5491
- icon != null && /* @__PURE__ */ jsx66("span", { "aria-hidden": true, className: "opacity-80", children: icon }),
5492
- /* @__PURE__ */ jsx66("span", { className: "flex-1", children: label }),
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__ */ jsx66(
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 jsx67, jsxs as jsxs59 } from "react/jsx-runtime";
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 = forwardRef65(function NavBar2({
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] = useState17(defaultValue);
6146
+ const [internalValue, setInternalValue] = useState19(defaultValue);
5528
6147
  const activeId = isControlled ? value : internalValue;
5529
- const [drawerOpen, setDrawerOpen] = useState17(false);
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__ */ jsx67("nav", { "aria-label": "Mobile navigation", className: "flex flex-col gap-1", children: items.map((item) => /* @__PURE__ */ jsx67(
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__ */ jsxs59(
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__ */ jsx67(
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__ */ jsx67("div", { className: "flex flex-1 items-center text-[13px] font-medium whitespace-nowrap", children: brand }),
5577
- actions && /* @__PURE__ */ jsx67("div", { className: "flex items-center gap-3", children: actions })
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__ */ jsxs59(Fragment5, { children: [
6201
+ return /* @__PURE__ */ jsxs60(Fragment5, { children: [
5583
6202
  mobileBar,
5584
- /* @__PURE__ */ jsxs59(
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__ */ jsx67("div", { className: "shrink-0 text-[13px] font-medium whitespace-nowrap", children: brand }),
5596
- /* @__PURE__ */ jsxs59(RadixNav.Root, { className: "relative flex-1", delayDuration: 120, children: [
5597
- /* @__PURE__ */ jsx67(RadixNav.List, { className: "m-0! flex list-none! items-center gap-1 p-0! [&_li]:m-0!", children: items.map(
5598
- (item) => item.children?.length ? /* @__PURE__ */ jsx67(
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__ */ jsx67(RadixNav.Item, { children: /* @__PURE__ */ jsx67(
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__ */ jsx67("div", { className: "z-popover absolute top-full left-0 flex justify-start", children: /* @__PURE__ */ jsx67(RadixNav.Viewport, { className: "origin-top-left data-[state=open]:animate-[ship-fade-in_120ms_var(--easing-out)]" }) })
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__ */ jsx67("div", { className: "flex items-center gap-3", children: actions })
6237
+ actions && /* @__PURE__ */ jsx68("div", { className: "flex items-center gap-3", children: actions })
5619
6238
  ]
5620
6239
  }
5621
6240
  ),
5622
- responsive && /* @__PURE__ */ jsx67(
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__ */ jsxs59(Fragment5, { children: [
6254
+ return /* @__PURE__ */ jsxs60(Fragment5, { children: [
5636
6255
  mobileBar,
5637
- /* @__PURE__ */ jsxs59(
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__ */ jsx67("div", { className: "px-2 py-1 text-[13px] font-medium", children: brand }),
5651
- /* @__PURE__ */ jsx67("nav", { "aria-label": "Sidebar navigation", className: "flex flex-1 flex-col gap-1 overflow-y-auto", children: items.map((item) => /* @__PURE__ */ jsx67(
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__ */ jsx67("div", { className: "border-border mt-auto flex flex-col gap-2 border-t pt-3", children: actions })
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__ */ jsx67(
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__ */ jsxs59(Fragment5, { children: [
5694
- item.icon != null && /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
5695
- /* @__PURE__ */ jsx67("span", { children: item.label }),
5696
- item.badge != null && /* @__PURE__ */ jsx67(ItemBadge, { active, children: item.badge })
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__ */ jsx67(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx67(
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__ */ jsx67(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx67(
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__ */ jsxs59(RadixNav.Item, { children: [
5725
- /* @__PURE__ */ jsxs59(
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__ */ jsx67("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
5738
- /* @__PURE__ */ jsx67("span", { children: item.label }),
5739
- /* @__PURE__ */ jsx67(
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__ */ jsx67(RadixNav.Content, { className: "border-border bg-panel min-w-[220px] rounded-xs border p-2 shadow-lg", children: /* @__PURE__ */ jsx67("ul", { className: "m-0! flex list-none! flex-col gap-[2px] p-0! [&_li]:m-0!", children: item.children.map((child) => /* @__PURE__ */ jsx67("li", { children: /* @__PURE__ */ jsx67(DropdownLink, { item: child, active: child.id === activeId, onActivate }) }, child.id)) }) })
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__ */ jsxs59(Fragment5, { children: [
5768
- item.icon != null && /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
5769
- /* @__PURE__ */ jsx67("span", { className: "flex-1", children: item.label }),
5770
- item.badge != null && /* @__PURE__ */ jsx67(ItemBadge, { active, children: item.badge })
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__ */ jsx67(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx67(
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__ */ jsx67(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx67(
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] = useState17(treeActive);
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__ */ jsx67(
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__ */ jsxs59("div", { className: "flex flex-col", children: [
5828
- /* @__PURE__ */ jsxs59(
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__ */ jsx67("span", { "aria-hidden": true, className: "w-[14px] text-center opacity-80", children: item.icon }),
5845
- /* @__PURE__ */ jsx67("span", { className: "flex-1 truncate", children: item.label }),
5846
- item.badge != null && /* @__PURE__ */ jsx67(ItemBadge, { active: treeActive, children: item.badge }),
5847
- /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "text-[10px] opacity-60", children: open ? "\u25BE" : "\u25B8" })
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__ */ jsx67("div", { className: "border-border mt-1 ml-[18px] flex flex-col gap-[2px] border-l pl-3", children: item.children.map((child) => /* @__PURE__ */ jsx67(VerticalItem, { item: child, activeId, onActivate }, child.id)) })
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__ */ jsx67(
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 forwardRef66 } from "react";
5869
- import { Fragment as Fragment6, jsx as jsx68, jsxs as jsxs60 } from "react/jsx-runtime";
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 = forwardRef66(
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__ */ jsxs60(
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__ */ jsxs60("header", { className: "flex items-center gap-2", children: [
5896
- /* @__PURE__ */ jsx68("span", { className: "text-[14px] font-medium", children: title }),
5897
- /* @__PURE__ */ jsx68("span", { className: "text-text-dim ml-auto font-mono text-[11px] tabular-nums", children: progressLabel ?? `${done} of ${total} complete` })
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__ */ jsx68(
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__ */ jsx68(
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__ */ jsx68("ul", { className: "m-0 flex list-none flex-col gap-1 p-0", children: items.map((item) => {
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__ */ jsxs60(Fragment6, { children: [
5924
- /* @__PURE__ */ jsx68(
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__ */ jsxs60("div", { className: "flex min-w-0 flex-1 flex-col gap-[2px]", children: [
5934
- /* @__PURE__ */ jsx68("span", { className: cn("text-[13px]", labelStateClass[item.status]), children: item.label }),
5935
- item.description && /* @__PURE__ */ jsx68("span", { className: "text-text-muted text-[12px] leading-[1.45]", children: item.description })
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__ */ jsxs60("li", { className: "flex items-start gap-2", children: [
5943
- interactive ? /* @__PURE__ */ jsx68(
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__ */ jsx68("div", { className: labelRegionClass, children: labelBlock }),
5953
- item.action && /* @__PURE__ */ jsx68("div", { className: "shrink-0 self-center", children: item.action })
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 forwardRef67 } from "react";
5965
- import { jsx as jsx69, jsxs as jsxs61 } from "react/jsx-runtime";
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 = forwardRef67(function Pagination2({ page, total, onPageChange, siblings = 1, className, ...props }, ref) {
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__ */ jsxs61(
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__ */ jsx69(
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__ */ jsx69(
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__ */ jsx69(
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__ */ jsx69(
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 cva12 } from "class-variance-authority";
6049
- import { forwardRef as forwardRef68 } from "react";
6050
- import { jsx as jsx70, jsxs as jsxs62 } from "react/jsx-runtime";
6051
- var trackStyles = cva12("w-full rounded-full bg-panel-2 overflow-hidden", {
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 = cva12("h-full rounded-full transition-[width] duration-(--duration-step)", {
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 = forwardRef68(function Progress2({
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__ */ jsxs62("div", { ref, className: cn("flex w-full flex-col gap-2", className), ...props, children: [
6087
- label != null && /* @__PURE__ */ jsxs62("div", { className: "flex text-[12px]", children: [
6088
- /* @__PURE__ */ jsx70("span", { className: "text-text-muted", children: label }),
6089
- showValue && !indeterminate && /* @__PURE__ */ jsxs62("span", { className: "text-text ml-auto font-mono tabular-nums", children: [
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__ */ jsx70(
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__ */ jsx70(
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__ */ jsx70("span", { "aria-hidden": true, className: fillStyles({ tone }), style: { width: `${pct}%` } })
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 forwardRef69 } from "react";
6122
- import { jsx as jsx71, jsxs as jsxs63 } from "react/jsx-runtime";
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 = forwardRef69(function PullToRefresh2({ state = "idle", label, className, ...props }, ref) {
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__ */ jsxs63(
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__ */ jsx71(
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__ */ jsx71("span", { className: "text-m-eyebrow font-mono tracking-wide uppercase", children: label ?? labels[state] })
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 forwardRef70, useMemo as useMemo6 } from "react";
6167
- import { jsx as jsx72, jsxs as jsxs64 } from "react/jsx-runtime";
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 = forwardRef70(function Sparkline2({
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__ */ jsxs64(
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__ */ jsx72("path", { d: area, fill: stroke, fillOpacity: 0.16, stroke: "none" }),
6211
- /* @__PURE__ */ jsx72(
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 forwardRef71 } from "react";
6230
- import { jsx as jsx73 } from "react/jsx-runtime";
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 = forwardRef71(function Spinner3({ size = "md", label = "Loading", className, ...props }, ref) {
6855
+ var Spinner2 = forwardRef72(function Spinner3({ size = "md", label = "Loading", className, ...props }, ref) {
6237
6856
  const s = sizes[size];
6238
- return /* @__PURE__ */ jsx73(
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__ */ jsx73(
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 forwardRef72, Fragment as Fragment7 } from "react";
6264
- import { jsx as jsx74, jsxs as jsxs65 } from "react/jsx-runtime";
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 = forwardRef72(function Stepper2({ steps, current, className, ...props }, ref) {
6282
- return /* @__PURE__ */ jsx74(
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__ */ jsxs65(Fragment7, { children: [
6295
- /* @__PURE__ */ jsxs65(
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__ */ jsx74("span", { "aria-hidden": true, className: cn(dotBase, dotStateClass[state]), children: state === "done" ? "\u2713" : i + 1 }),
6302
- /* @__PURE__ */ jsx74("span", { className: cn("text-[12px]", labelStateClass2[state]), children: label })
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__ */ jsx74(
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 forwardRef73,
6941
+ forwardRef as forwardRef74,
6323
6942
  useCallback as useCallback15,
6324
- useState as useState18
6943
+ useState as useState20
6325
6944
  } from "react";
6326
- import { jsx as jsx75, jsxs as jsxs66 } from "react/jsx-runtime";
6327
- var TabBar = forwardRef73(function TabBar2({ items, value, defaultValue, onValueChange, className, ...props }, ref) {
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] = useState18(defaultValue);
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__ */ jsx75(
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__ */ jsx75("div", { className: "grid place-items-center", children: /* @__PURE__ */ jsxs66(
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__ */ jsx75("span", { "aria-hidden": true, children: item.icon }),
6371
- /* @__PURE__ */ jsx75("span", { className: "sr-only", children: item.label })
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__ */ jsxs66(
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__ */ jsxs66("span", { className: "relative inline-flex", "aria-hidden": true, children: [
7010
+ /* @__PURE__ */ jsxs67("span", { className: "relative inline-flex", "aria-hidden": true, children: [
6392
7011
  item.icon,
6393
- item.badge != null && /* @__PURE__ */ jsx75(
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__ */ jsxs66("span", { className: "text-[10px] font-medium tracking-tight", children: [
7023
+ /* @__PURE__ */ jsxs67("span", { className: "text-[10px] font-medium tracking-tight", children: [
6405
7024
  item.label,
6406
- item.badge != null && /* @__PURE__ */ jsxs66("span", { className: "sr-only", children: [
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 cva13 } from "class-variance-authority";
6425
- import { createContext as createContext2, forwardRef as forwardRef74, useContext as useContext2 } from "react";
6426
- import { jsx as jsx76 } from "react/jsx-runtime";
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 = cva13("", {
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 = cva13(
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 = forwardRef74(function Tabs2({ variant = "underline", className, ...props }, ref) {
6458
- return /* @__PURE__ */ jsx76(TabsVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx76(
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 = forwardRef74(function TabsList2({ className, ...props }, ref) {
7087
+ var TabsList = forwardRef75(function TabsList2({ className, ...props }, ref) {
6469
7088
  const variant = useContext2(TabsVariantContext);
6470
- return /* @__PURE__ */ jsx76(RadixTabs.List, { ref, className: cn(tabsListStyles({ variant }), className), ...props });
7089
+ return /* @__PURE__ */ jsx77(RadixTabs.List, { ref, className: cn(tabsListStyles({ variant }), className), ...props });
6471
7090
  });
6472
7091
  TabsList.displayName = "TabsList";
6473
- var Tab = forwardRef74(function Tab2({ className, ...props }, ref) {
7092
+ var Tab = forwardRef75(function Tab2({ className, ...props }, ref) {
6474
7093
  const variant = useContext2(TabsVariantContext);
6475
- return /* @__PURE__ */ jsx76(
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 = forwardRef74(
7104
+ var TabsContent = forwardRef75(
6486
7105
  function TabsContent2({ className, ...props }, ref) {
6487
- return /* @__PURE__ */ jsx76(
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 forwardRef75 } from "react";
6504
- import { jsx as jsx77, jsxs as jsxs67 } from "react/jsx-runtime";
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 = forwardRef75(function Timeline2({ events, className, children, ...props }, ref) {
6513
- return /* @__PURE__ */ jsx77(
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__ */ jsx77(TimelineItem, { tone: e.tone, time: e.time, description: e.description, children: e.title }, i)) : children
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 = forwardRef75(function TimelineItem2({ tone = "accent", description, time, className, children, ...props }, ref) {
6529
- return /* @__PURE__ */ jsxs67("li", { ref, className: cn("relative mb-[18px] last:mb-0", className), ...props, children: [
6530
- /* @__PURE__ */ jsx77(
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__ */ jsx77("div", { className: "text-[13px] font-medium", children }),
6541
- description && /* @__PURE__ */ jsx77("div", { className: "text-text-muted text-[12px]", children: description }),
6542
- time && /* @__PURE__ */ jsx77("div", { className: "text-text-dim mt-[2px] font-mono text-[10px]", children: time })
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 forwardRef76 } from "react";
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 jsx78, jsxs as jsxs68 } from "react/jsx-runtime";
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 = forwardRef76(
7210
+ var ActivityTimeline = forwardRef77(
6592
7211
  function ActivityTimeline2({ events, relativeNow, className, ...props }, ref) {
6593
7212
  const now = relativeNow ?? /* @__PURE__ */ new Date();
6594
- return /* @__PURE__ */ jsx78(
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__ */ jsxs68("li", { className: "relative mb-4 last:mb-0", children: [
6608
- /* @__PURE__ */ jsx78(
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__ */ jsxs68("div", { className: "flex items-baseline gap-2", children: [
6619
- event.icon && /* @__PURE__ */ jsx78("span", { "aria-hidden": true, className: "text-text-muted font-mono text-[12px]", children: event.icon }),
6620
- /* @__PURE__ */ jsx78("div", { className: "text-[13px] font-medium", children: event.title }),
6621
- time && /* @__PURE__ */ jsx78("time", { className: "text-text-dim ml-auto font-mono text-[10px]", children: time })
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__ */ jsxs68("div", { className: "text-text-muted mt-[2px] flex items-center gap-[6px] text-[12px]", children: [
6624
- event.actor.avatar && /* @__PURE__ */ jsx78("span", { "aria-hidden": true, className: "inline-flex", children: event.actor.avatar }),
6625
- /* @__PURE__ */ jsx78("span", { children: event.actor.name })
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__ */ jsx78("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 })
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 forwardRef77 } from "react";
6638
- import { jsx as jsx79, jsxs as jsxs69 } from "react/jsx-runtime";
6639
- var Topbar = forwardRef77(function Topbar2({
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__ */ jsxs69(
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__ */ jsx79(
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__ */ jsx79(
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__ */ jsx79("path", { d: "m15 18-6-6 6-6" })
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__ */ jsxs69("div", { className: cn("min-w-0", isTouch && "flex-1"), children: [
6695
- isTouch && eyebrow && /* @__PURE__ */ jsx79("div", { className: "text-m-eyebrow text-accent font-mono tracking-wide uppercase", children: eyebrow }),
6696
- title && /* @__PURE__ */ jsx79(
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__ */ jsx79("div", { className: "flex flex-1 items-center" }),
6707
- actions && /* @__PURE__ */ jsx79("div", { className: cn("flex items-center", isTouch ? "gap-1" : "gap-3"), children: actions }),
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 forwardRef78,
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 useState19
7340
+ useState as useState21
6723
7341
  } from "react";
6724
7342
  import { flushSync } from "react-dom";
6725
- import { jsx as jsx80, jsxs as jsxs70 } from "react/jsx-runtime";
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 = forwardRef78(function Tree2({
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] = useState19(null);
6765
- useEffect16(() => {
6766
- if (activeId && !flatVisible.some((f) => f.id === activeId)) {
6767
- setActiveId(null);
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__ */ jsx80(
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__ */ jsx80(
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__ */ jsxs70("li", { role: "none", children: [
6962
- /* @__PURE__ */ jsxs70(
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__ */ jsx80("span", { "aria-hidden": true, className: "text-text-dim grid w-3 place-items-center text-[10px]", children: hasChildren ? isExpanded ? "\u25BE" : "\u25B8" : "" }),
6986
- item.icon && /* @__PURE__ */ jsx80("span", { "aria-hidden": true, className: "text-[12px] opacity-80", children: item.icon }),
6987
- /* @__PURE__ */ jsx80("span", { className: "flex-1 truncate", children: item.label }),
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__ */ jsx80("ul", { role: "group", className: "flex flex-col gap-px", children: (item.children ?? []).map((child) => /* @__PURE__ */ jsx80(
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 RadixDialog6 from "@radix-ui/react-dialog";
7011
- import { forwardRef as forwardRef79, useCallback as useCallback17, useMemo as useMemo8, useState as useState20 } from "react";
7012
- import { jsx as jsx81, jsxs as jsxs71 } from "react/jsx-runtime";
7013
- var WizardDialog = forwardRef79(function WizardDialog2({
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] = useState20(initialStep);
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__ */ jsx81(DialogRoot, { open, defaultOpen, onOpenChange, children: /* @__PURE__ */ jsxs71(
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__ */ jsx81(WizardTitle, { children: title }) : (
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__ */ jsx81(RadixDialog6.Title, { className: "sr-only", children: "Wizard" })
7691
+ /* @__PURE__ */ jsx82(RadixDialog7.Title, { className: "sr-only", children: "Wizard" })
7076
7692
  ),
7077
- description && /* @__PURE__ */ jsx81(WizardDescription, { children: description }),
7078
- /* @__PURE__ */ jsx81("div", { className: "mb-5", children: /* @__PURE__ */ jsx81(Stepper, { steps: stepperSteps, current: safeCurrent }) }),
7079
- /* @__PURE__ */ jsx81("div", { className: "mb-5", children: body }),
7080
- /* @__PURE__ */ jsxs71("div", { className: "flex justify-end gap-2", children: [
7081
- cancelLabel && /* @__PURE__ */ jsx81(Button, { type: "button", variant: "ghost", onClick: onCancel, children: cancelLabel }),
7082
- /* @__PURE__ */ jsx81(Button, { type: "button", variant: "secondary", onClick: goBack, disabled: ctx.isFirst, children: backLabel }),
7083
- /* @__PURE__ */ jsx81(Button, { type: "button", variant: "primary", onClick: handlePrimary, disabled: !canAdvance, children: ctx.isLast ? completeLabel : nextLabel })
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__ */ jsx81(RadixDialog6.Title, { className: "mb-2 text-[16px] font-medium", children });
7706
+ return /* @__PURE__ */ jsx82(RadixDialog7.Title, { className: "mb-2 text-[16px] font-medium", children });
7091
7707
  }
7092
7708
  function WizardDescription({ children }) {
7093
- return /* @__PURE__ */ jsx81(RadixDialog6.Description, { className: "text-text-muted mb-4 text-[13px] leading-[1.55]", children });
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,