@giddaa-housing/ui 3.1.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/css/generated/shared.css +1 -1
  2. package/css/giddaa.css +12 -3
  3. package/css/theme.css +4 -1
  4. package/dist/accordion.js +3 -2
  5. package/dist/activity-timeline.js +2 -2
  6. package/dist/alert.js +4 -4
  7. package/dist/breadcrumb.js +3 -3
  8. package/dist/button.js +8 -4
  9. package/dist/calendar.js +3 -3
  10. package/dist/call-card.js +1 -1
  11. package/dist/carousel.js +3 -3
  12. package/dist/chart.js +1 -1
  13. package/dist/chat.js +1 -1
  14. package/dist/checkbox.js +2 -2
  15. package/dist/combobox.js +6 -6
  16. package/dist/cta.js +3 -3
  17. package/dist/currency-selector.d.ts +10 -8
  18. package/dist/currency-selector.js +247 -28
  19. package/dist/data-table.js +2 -2
  20. package/dist/date-picker.js +6 -6
  21. package/dist/dialog.js +2 -2
  22. package/dist/dropdown-menu.js +20 -20
  23. package/dist/dropzone.js +1 -1
  24. package/dist/editorial-card.d.ts +20 -11
  25. package/dist/editorial-card.js +67 -2
  26. package/dist/file-upload.js +1 -1
  27. package/dist/filter.js +1 -1
  28. package/dist/footer.d.ts +8 -3
  29. package/dist/footer.js +16 -5
  30. package/dist/icons.d.ts +93 -0
  31. package/dist/icons.js +905 -0
  32. package/dist/infinite-scroll.js +1 -1
  33. package/dist/input-otp.js +2 -2
  34. package/dist/kpi-card.js +1 -1
  35. package/dist/match.js +1 -1
  36. package/dist/media-gallery-hero.js +4 -4
  37. package/dist/media-player.js +59 -48
  38. package/dist/message.js +1 -1
  39. package/dist/mobile-sidebar.js +4 -4
  40. package/dist/multi-step-form.js +2 -2
  41. package/dist/number-input.js +3 -3
  42. package/dist/pagination.js +4 -4
  43. package/dist/password-input.js +1 -1
  44. package/dist/phone-input.js +4 -4
  45. package/dist/photo-gallery.js +3 -3
  46. package/dist/price-tag.js +1 -1
  47. package/dist/property-listing-card.js +1 -1
  48. package/dist/rich-text-editor.js +4 -4
  49. package/dist/scroll-spy.d.ts +61 -0
  50. package/dist/scroll-spy.js +295 -0
  51. package/dist/search-input.js +1 -1
  52. package/dist/select.js +6 -6
  53. package/dist/sheet.js +2 -2
  54. package/dist/sidebar.js +1 -1
  55. package/dist/stepper.js +2 -2
  56. package/dist/styles.css +239 -26
  57. package/dist/tabs.d.ts +13 -1
  58. package/dist/tabs.js +9 -2
  59. package/dist/tag.js +1 -1
  60. package/dist/testimonial-block.js +1 -1
  61. package/dist/theme-switcher.d.ts +31 -0
  62. package/dist/theme-switcher.js +78 -0
  63. package/dist/time-picker.js +2 -2
  64. package/dist/toast.d.ts +38 -10
  65. package/dist/toast.js +56 -52
  66. package/dist/top-navbar.js +3 -3
  67. package/dist/video-player-dialog.d.ts +57 -0
  68. package/dist/video-player-dialog.js +188 -0
  69. package/package.json +17 -2
@@ -1,6 +1,6 @@
1
1
  "use client";
2
+ import { Loader2 } from "./icons.js";
2
3
  import { t as cn } from "./cn-BI_4DMBf.js";
3
- import { Loader2 } from "lucide-react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
6
6
  //#region src/lib/use-intersection.ts
package/dist/input-otp.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
+ import { Minus } from "./icons.js";
2
3
  import { t as cn } from "./cn-BI_4DMBf.js";
3
4
  import { InputSizeProvider, useInputComponentSize } from "./input-size-context.js";
4
- import { MinusIcon } from "lucide-react";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  import { cva } from "class-variance-authority";
7
7
  import { OTPField } from "@base-ui/react/otp-field";
@@ -49,7 +49,7 @@ function InputOTPSeparator({ children, className, ...props }) {
49
49
  "data-slot": "input-otp-separator",
50
50
  className: cn("flex items-center justify-center px-1 text-fg-secondary [&_svg:not([class*='size-'])]:size-4", className),
51
51
  ...props,
52
- children: children ?? /* @__PURE__ */ jsx(MinusIcon, {})
52
+ children: children ?? /* @__PURE__ */ jsx(Minus, {})
53
53
  });
54
54
  }
55
55
  //#endregion
package/dist/kpi-card.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
+ import { ArrowDown, ArrowUp, ArrowUpRight } from "./icons.js";
2
3
  import { t as cn } from "./cn-BI_4DMBf.js";
3
4
  import { Skeleton } from "./skeleton.js";
4
- import { ArrowDown, ArrowUp, ArrowUpRight } from "lucide-react";
5
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
6
  import { mergeProps } from "@base-ui/react/merge-props";
7
7
  import { useRender } from "@base-ui/react/use-render";
package/dist/match.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
+ import { ChevronDown } from "./icons.js";
2
3
  import { t as cn } from "./cn-BI_4DMBf.js";
3
4
  import { CircularProgress } from "./progress.js";
4
- import { ChevronDown } from "lucide-react";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import { cva } from "class-variance-authority";
7
7
  //#region src/match.tsx
@@ -1,15 +1,15 @@
1
1
  "use client";
2
+ import { Play } from "./icons.js";
2
3
  import { t as cn } from "./cn-BI_4DMBf.js";
3
4
  import { buttonVariants } from "./button.js";
4
5
  import { Carousel, CarouselContent, CarouselItem, useCarousel } from "./carousel.js";
5
6
  import { GalleryIndicator } from "./gallery-indicator.js";
6
7
  import { ReviewBlock } from "./review-block.js";
7
- import { Play } from "lucide-react";
8
8
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
9
  import { cva } from "class-variance-authority";
10
10
  //#region src/media-gallery-hero.tsx
11
- const mediaGalleryHeroVariants = cva("relative isolate h-[350px] w-full overflow-hidden rounded-[32px] bg-surface-raised md:h-[380px] md:rounded-[40px] lg:h-[480px]");
12
- const mediaGalleryImagesVariants = cva("absolute inset-0 z-0 hidden size-full min-h-0 min-w-0 bg-surface-raised md:grid", {
11
+ const mediaGalleryHeroVariants = cva("relative isolate h-[350px] w-full overflow-hidden rounded-[32px] md:h-[380px] md:rounded-[40px] lg:h-[480px]");
12
+ const mediaGalleryImagesVariants = cva("absolute inset-0 z-0 hidden size-full min-h-0 min-w-0 md:grid", {
13
13
  variants: { imageCount: {
14
14
  1: "",
15
15
  2: "gap-2 grid-cols-[minmax(0,3fr)_minmax(0,2fr)]",
@@ -77,7 +77,7 @@ function MobileGalleryCounter({ total }) {
77
77
  function MobileMediaCarousel({ currentMedia, images, mediaTotal, onMediaClick, renderMedia, showMobileIndicator }) {
78
78
  const carouselImages = images.length > 0 ? images : [{}];
79
79
  return /* @__PURE__ */ jsxs(Carousel, {
80
- className: "absolute inset-0 z-0 block size-full rounded-[32px] bg-surface-raised md:hidden",
80
+ className: "absolute inset-0 z-0 block size-full rounded-[32px] md:hidden",
81
81
  imageSize: "full",
82
82
  opts: {
83
83
  align: "start",
@@ -1,8 +1,8 @@
1
1
  "use client";
2
+ import { Captions, CaptionsOff, Maximize, Minimize, Pause, PictureInPicture2, Play, RefreshCcw, Repeat2, RotateCcw, RotateCw, Settings, TriangleAlert, Volume1, Volume2, VolumeX } from "./icons.js";
2
3
  import { t as cn } from "./cn-BI_4DMBf.js";
3
4
  import { DropdownMenu, DropdownMenuContent, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from "./dropdown-menu.js";
4
5
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./tooltip.js";
5
- import { Captions, CaptionsOff, Maximize, Minimize, Pause, PictureInPicture2, Play, RefreshCcw, Repeat2, RotateCcw, RotateCw, Settings, TriangleAlert, Volume1, Volume2, VolumeX } from "lucide-react";
6
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
7
  import * as React from "react";
8
8
  import { Slider } from "@base-ui/react/slider";
@@ -20,6 +20,9 @@ const DEFAULT_PLAYBACK_RATES = [
20
20
  ];
21
21
  const CONTROLS_HIDE_DELAY = 2500;
22
22
  const SEEK_PREVIEW_WIDTH = 160;
23
+ const SEEK_CHAPTER_GAP = 3;
24
+ const SEEK_THUMB_SIZE = 14;
25
+ const SEEK_THUMB_INSET = SEEK_THUMB_SIZE / 2;
23
26
  const MediaPlayerContext = React.createContext({
24
27
  onMenuOpenChange: () => {},
25
28
  portalContainer: null,
@@ -73,11 +76,8 @@ function clamp(value, min, max) {
73
76
  }
74
77
  function getSeekValueFromPointer(event, min, max) {
75
78
  const rect = event.currentTarget.getBoundingClientRect();
76
- const percent = clamp((event.clientX - rect.left) / rect.width, 0, 1);
77
- return {
78
- percent: percent * 100,
79
- value: min + percent * (max - min)
80
- };
79
+ const travel = Math.max(rect.width - SEEK_THUMB_SIZE, 1);
80
+ return min + clamp((event.clientX - rect.left - SEEK_THUMB_INSET) / travel, 0, 1) * (max - min);
81
81
  }
82
82
  function MediaPlayer({ mediaStore, ...props }) {
83
83
  const audio = props.audio ?? (hasAudioChild(props.children) ? true : void 0);
@@ -272,7 +272,7 @@ function MediaPlayerVideo({ className, ref, ...props }) {
272
272
  setRef(ref, node);
273
273
  }, [ref]),
274
274
  "data-slot": "media-player-video",
275
- className: cn("block aspect-video size-full object-cover", "group-data-[fullscreen]/media-player:aspect-auto group-data-[fullscreen]/media-player:object-contain", className),
275
+ className: cn("block aspect-video size-full rounded-[inherit] object-cover", "group-data-[fullscreen]/media-player:aspect-auto group-data-[fullscreen]/media-player:object-contain", className),
276
276
  playsInline: true,
277
277
  ...props
278
278
  });
@@ -646,24 +646,28 @@ function MediaPlayerSeek({ className, disabled, onValueChange, "aria-label": ari
646
646
  detail: void 0
647
647
  });
648
648
  };
649
+ const toFraction = (value) => canSeek ? (clamp(value, min, max) - min) / (max - min) : 0;
650
+ const toTrackOffset = (fraction) => {
651
+ if (fraction <= 0) return "0px";
652
+ if (fraction >= 1) return "100%";
653
+ return `calc(${SEEK_THUMB_INSET}px + ${fraction} * (100% - ${SEEK_THUMB_SIZE}px))`;
654
+ };
649
655
  const previewValue = dragValue ?? hoverValue;
650
- const previewPercent = previewValue !== null && canSeek ? (clamp(previewValue, min, max) - min) / (max - min) * 100 : 0;
651
656
  const previewChapter = previewValue !== null ? chapterCues?.find((cue) => previewValue >= cue.startTime && previewValue < cue.endTime) : void 0;
652
657
  const previewCoordValues = previewCoords?.map(Number);
653
658
  const hasSpriteCoords = previewCoordValues?.length === 4 && (previewCoordValues[2] ?? 0) > 0;
654
659
  const previewScale = hasSpriteCoords ? SEEK_PREVIEW_WIDTH / (previewCoordValues?.[2] ?? 1) : 1;
655
660
  const previewClampPx = previewImage ? 84 : 32;
656
661
  const controlRect = withTime && previewValue !== null ? controlRef.current?.getBoundingClientRect() : void 0;
657
- const previewLeft = controlRect ? clamp(controlRect.left + previewPercent / 100 * controlRect.width, controlRect.left + previewClampPx, controlRect.right - previewClampPx) : 0;
658
- const segmentBounds = canSeek ? [
659
- min,
660
- ...(chapterCues ?? []).map((cue) => cue.startTime).filter((time) => time > min && time < max).sort((a, b) => a - b),
661
- max
662
- ] : [0, 1];
663
- const segments = segmentBounds.slice(0, -1).map((start, index) => ({
664
- start,
665
- end: segmentBounds[index + 1] ?? start
666
- }));
662
+ const previewLeft = controlRect ? clamp(controlRect.left + SEEK_THUMB_INSET + toFraction(previewValue ?? 0) * (controlRect.width - SEEK_THUMB_SIZE), controlRect.left + previewClampPx, controlRect.right - previewClampPx) : 0;
663
+ const playedFraction = toFraction(displayTime);
664
+ const chapterStops = canSeek ? (chapterCues ?? []).map((cue) => toFraction(cue.startTime)).filter((fraction) => fraction > 0 && fraction < 1).sort((a, b) => a - b).map(toTrackOffset) : [];
665
+ const trackMask = chapterStops.length ? `linear-gradient(to right, #000 0, ${chapterStops.flatMap((offset) => [
666
+ `#000 calc(${offset} - ${SEEK_CHAPTER_GAP / 2}px)`,
667
+ `transparent calc(${offset} - ${SEEK_CHAPTER_GAP / 2}px)`,
668
+ `transparent calc(${offset} + ${SEEK_CHAPTER_GAP / 2}px)`,
669
+ `#000 calc(${offset} + ${SEEK_CHAPTER_GAP / 2}px)`
670
+ ]).join(", ")}, #000 100%)` : void 0;
667
671
  return /* @__PURE__ */ jsxs(Slider.Root, {
668
672
  thumbAlignment: "edge",
669
673
  "data-slot": "media-player-seek",
@@ -735,45 +739,52 @@ function MediaPlayerSeek({ className, disabled, onValueChange, "aria-label": ari
735
739
  ]
736
740
  }), portalContainer ?? document.body), /* @__PURE__ */ jsxs(Slider.Control, {
737
741
  ref: controlRef,
738
- className: "flex h-8 w-full items-center",
742
+ className: "relative flex h-8 w-full items-center",
739
743
  onPointerLeave: () => {
740
744
  if (dragValue === null) clearPreview();
741
745
  },
742
746
  onPointerMove: (event) => {
743
747
  if (resolvedDisabled || dragValue !== null) return;
744
748
  const next = getSeekValueFromPointer(event, min, max);
745
- setHoverValue(next.value);
746
- previewAt(next.value);
749
+ setHoverValue(next);
750
+ previewAt(next);
747
751
  },
748
- children: [/* @__PURE__ */ jsx(Slider.Track, {
749
- className: "relative flex h-2 w-full items-center gap-[3px]",
750
- children: segments.map(({ start, end }) => {
751
- const span = end - start || 1;
752
- const fraction = (value) => clamp((clamp(value, start, end) - start) / span, 0, 1);
753
- const playedWidth = fraction(displayTime) * 100;
754
- return /* @__PURE__ */ jsxs("span", {
755
- "data-slot": "media-player-seek-segment",
756
- className: "relative h-full overflow-hidden rounded-full bg-line-subtle/65",
757
- style: { width: `${span / (max - min || 1) * 100}%` },
758
- children: [canSeek && buffered?.map(([bufferStart, bufferEnd]) => bufferEnd > start && bufferStart < end ? /* @__PURE__ */ jsx("span", {
759
- "data-slot": "media-player-seek-buffered",
760
- className: "absolute inset-y-0 bg-fg-on-brand/25",
761
- style: {
762
- left: `${fraction(bufferStart) * 100}%`,
763
- width: `${(fraction(bufferEnd) - fraction(bufferStart)) * 100}%`
764
- }
765
- }, `${bufferStart}-${bufferEnd}`) : null), /* @__PURE__ */ jsx("span", {
766
- "data-slot": "media-player-seek-progress",
767
- "data-dragging": dragValue !== null || void 0,
768
- className: "absolute inset-y-0 left-0 w-full origin-left bg-surface-brand transition-transform duration-200 ease-linear data-[dragging=true]:transition-none",
769
- style: { transform: `scaleX(${playedWidth / 100})` }
770
- })]
771
- }, start);
772
- })
752
+ children: [/* @__PURE__ */ jsxs(Slider.Track, {
753
+ className: "relative h-2 w-full overflow-hidden rounded-full bg-line-subtle/65",
754
+ style: trackMask ? {
755
+ maskImage: trackMask,
756
+ WebkitMaskImage: trackMask
757
+ } : void 0,
758
+ children: [
759
+ canSeek && buffered?.map(([bufferStart, bufferEnd]) => /* @__PURE__ */ jsx("span", {
760
+ "data-slot": "media-player-seek-buffered",
761
+ className: "absolute inset-y-0 bg-fg-on-brand/25",
762
+ style: {
763
+ left: toTrackOffset(toFraction(bufferStart)),
764
+ right: `calc(100% - ${toTrackOffset(toFraction(bufferEnd))})`
765
+ }
766
+ }, `${bufferStart}-${bufferEnd}`)),
767
+ /* @__PURE__ */ jsx("span", {
768
+ "data-slot": "media-player-seek-progress",
769
+ className: "absolute inset-y-0 left-0 bg-surface-brand",
770
+ style: { width: SEEK_THUMB_INSET }
771
+ }),
772
+ /* @__PURE__ */ jsx("span", {
773
+ "data-slot": "media-player-seek-progress",
774
+ "data-dragging": dragValue !== null || void 0,
775
+ className: "absolute inset-y-0 origin-left bg-surface-brand transition-transform duration-200 ease-linear data-[dragging=true]:transition-none",
776
+ style: {
777
+ left: SEEK_THUMB_INSET,
778
+ transform: `scaleX(${playedFraction})`,
779
+ width: `calc(100% - ${SEEK_THUMB_SIZE}px)`
780
+ }
781
+ })
782
+ ]
773
783
  }), /* @__PURE__ */ jsx(Slider.Thumb, {
774
784
  getAriaLabel: () => ariaLabel ?? "Media timeline",
775
785
  getAriaValueText: (_formatted, value) => `${formatTime(value)} of ${formatTime(max)}`,
776
- className: cn("size-3.5 -translate-x-1/2 rounded-full bg-surface-overlay shadow-2 ring-2 ring-surface-brand outline-none", "transition-[scale] duration-[var(--duration-motion-press)] ease-gdt-out data-[dragging]:scale-125 motion-reduce:data-[dragging]:scale-100 data-[dragging]:transition-none", "focus-visible:[filter:drop-shadow(0_0_0.25rem_var(--color-line-focus))]")
786
+ className: cn("group/seek-thumb size-[14px] rounded-full outline-none", "transition-[inset-inline-start] duration-200 ease-linear data-[dragging]:transition-none"),
787
+ children: /* @__PURE__ */ jsx("span", { className: cn("block size-full rounded-full border-2 border-surface-brand bg-surface-overlay shadow-2", "transition-[scale] duration-[var(--duration-motion-press)] ease-gdt-out group-data-[dragging]/seek-thumb:scale-125 motion-reduce:group-data-[dragging]/seek-thumb:scale-100", "group-has-[:focus-visible]/seek-thumb:[filter:drop-shadow(0_0_0.25rem_var(--color-line-focus))]") })
777
788
  })]
778
789
  })]
779
790
  });
@@ -888,7 +899,7 @@ function MediaPlayerError({ children, className, ...props }) {
888
899
  return /* @__PURE__ */ jsx("div", {
889
900
  "data-slot": "media-player-error",
890
901
  role: "alert",
891
- className: cn("absolute inset-0 z-20 flex flex-col items-center justify-center gap-1 bg-canvas/85 px-6 text-center text-fg-primary backdrop-blur-sm rounded-2xl", className),
902
+ className: cn("absolute inset-0 z-20 flex flex-col items-center justify-center gap-1 rounded-[inherit] bg-canvas/85 px-6 text-center text-fg-primary backdrop-blur-sm", className),
892
903
  ...props,
893
904
  children: children ?? /* @__PURE__ */ jsxs(Fragment, { children: [
894
905
  /* @__PURE__ */ jsx(TriangleAlert, {
package/dist/message.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use client";
2
+ import { CheckCheck } from "./icons.js";
2
3
  import { t as cn } from "./cn-BI_4DMBf.js";
3
- import { CheckCheck } from "lucide-react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { mergeProps } from "@base-ui/react/merge-props";
6
6
  import { useRender } from "@base-ui/react/use-render";
@@ -1,8 +1,8 @@
1
1
  "use client";
2
+ import { ChevronDown, Menu, X } from "./icons.js";
2
3
  import { t as cn } from "./cn-BI_4DMBf.js";
3
4
  import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "./collapsible.js";
4
5
  import { Sheet, SheetBody, SheetClose, SheetContent, SheetFooter, SheetHeader, SheetTitle, SheetTrigger } from "./sheet.js";
5
- import { ChevronDownIcon, MenuIcon, XIcon } from "lucide-react";
6
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
7
  import { mergeProps } from "@base-ui/react/merge-props";
8
8
  import { useRender } from "@base-ui/react/use-render";
@@ -15,7 +15,7 @@ function MobileSidebarTrigger({ className, children, ...props }) {
15
15
  "data-slot": "mobile-sidebar-trigger",
16
16
  className: cn("inline-flex size-10 items-center justify-center rounded-lg text-fg-secondary outline-none transition-[background-color,color,translate] duration-(--duration-motion-press) ease-gdt-out hover:bg-surface hover:text-fg-primary focus-visible:shadow-[0_0_0_2px_var(--color-line-focus)] active:translate-y-px motion-reduce:active:translate-y-0", className),
17
17
  ...props,
18
- children: children ?? /* @__PURE__ */ jsx(MenuIcon, {
18
+ children: children ?? /* @__PURE__ */ jsx(Menu, {
19
19
  "aria-hidden": "true",
20
20
  className: "size-6"
21
21
  })
@@ -50,7 +50,7 @@ function MobileSidebarClose({ className, children, ...props }) {
50
50
  "data-slot": "mobile-sidebar-close",
51
51
  className: cn("inline-flex size-8 shrink-0 items-center justify-center rounded-lg text-fg-primary outline-none transition-[background-color,translate] duration-(--duration-motion-press) ease-gdt-out hover:bg-surface focus-visible:shadow-[0_0_0_2px_var(--color-line-focus)] active:translate-y-px motion-reduce:active:translate-y-0", className),
52
52
  ...props,
53
- children: children ?? /* @__PURE__ */ jsx(XIcon, {
53
+ children: children ?? /* @__PURE__ */ jsx(X, {
54
54
  "aria-hidden": "true",
55
55
  className: "size-5"
56
56
  })
@@ -137,7 +137,7 @@ function MobileSidebarGroupTrigger({ active = false, icon, className, children,
137
137
  className: "min-w-0 truncate",
138
138
  children
139
139
  })]
140
- }), /* @__PURE__ */ jsx(ChevronDownIcon, {
140
+ }), /* @__PURE__ */ jsx(ChevronDown, {
141
141
  "aria-hidden": "true",
142
142
  className: "size-4 shrink-0 text-current transition-transform duration-(--duration-motion-press) ease-gdt-out group-data-[panel-open]/collapsible-trigger:rotate-180 motion-reduce:transition-none"
143
143
  })]
@@ -1,9 +1,9 @@
1
1
  "use client";
2
+ import { Check } from "./icons.js";
2
3
  import { t as cn } from "./cn-BI_4DMBf.js";
3
4
  import { t as useUncontrolled } from "./use-uncontrolled-CLfM1XbB.js";
4
5
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./select.js";
5
6
  import { Progress, ProgressIndicator, ProgressTrack } from "./progress.js";
6
- import { CheckIcon } from "lucide-react";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
8
  import * as React from "react";
9
9
  //#region src/multi-step-form.tsx
@@ -181,7 +181,7 @@ function MultiStepFormIndicator({ type = "stepper", progressValue, showNextLabel
181
181
  children: [/* @__PURE__ */ jsx("span", {
182
182
  className: "transition-opacity duration-[var(--duration-motion-press)] ease-gdt-out group-data-[state=complete]/multi-step-form-step:opacity-0",
183
183
  children: index + 1
184
- }), /* @__PURE__ */ jsx(CheckIcon, {
184
+ }), /* @__PURE__ */ jsx(Check, {
185
185
  "aria-hidden": "true",
186
186
  strokeWidth: 2.5,
187
187
  className: "absolute inset-0 m-auto size-4.5 scale-95 opacity-0 transition-[opacity,scale] duration-[var(--duration-motion-press)] ease-gdt-out motion-reduce:scale-100 group-data-[state=complete]/multi-step-form-step:scale-100 group-data-[state=complete]/multi-step-form-step:opacity-100"
@@ -1,8 +1,8 @@
1
1
  "use client";
2
+ import { Minus, Plus } from "./icons.js";
2
3
  import { t as cn } from "./cn-BI_4DMBf.js";
3
4
  import { SizeProvider, useComponentSize } from "./size-context.js";
4
5
  import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from "./input-group.js";
5
- import { MinusIcon, PlusIcon } from "lucide-react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  import { NumberField } from "@base-ui/react/number-field";
8
8
  //#region src/number-input.tsx
@@ -52,14 +52,14 @@ function NumberInputControl() {
52
52
  children: [/* @__PURE__ */ jsx(NumberField.Increment, {
53
53
  className: "w-full flex-1 rounded-none rounded-tr-full",
54
54
  render: /* @__PURE__ */ jsx(InputGroupButton, { variant: "tertiary" }),
55
- children: /* @__PURE__ */ jsx(PlusIcon, { className: cn("size-1.5", {
55
+ children: /* @__PURE__ */ jsx(Plus, { className: cn("size-1.5", {
56
56
  "size-3": size === "md",
57
57
  "size-3.5": size === "lg"
58
58
  }) })
59
59
  }), /* @__PURE__ */ jsx(NumberField.Decrement, {
60
60
  className: "w-full flex-1 rounded-none rounded-br-full",
61
61
  render: /* @__PURE__ */ jsx(InputGroupButton, { variant: "tertiary" }),
62
- children: /* @__PURE__ */ jsx(MinusIcon, { className: cn("size-1.5", {
62
+ children: /* @__PURE__ */ jsx(Minus, { className: cn("size-1.5", {
63
63
  "size-3": size === "md",
64
64
  "size-3.5": size === "lg"
65
65
  }) })
@@ -1,6 +1,6 @@
1
+ import { ChevronLeft, ChevronRight, MoreHorizontal } from "./icons.js";
1
2
  import { t as cn } from "./cn-BI_4DMBf.js";
2
3
  import { Button, ButtonLink } from "./button.js";
3
- import { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from "lucide-react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { cva } from "class-variance-authority";
6
6
  //#region src/pagination.tsx
@@ -103,7 +103,7 @@ function PaginationPrevious({ className, showLabel = true, text = "Previous", ..
103
103
  appearance: showLabel ? "control" : "icon",
104
104
  className: cn(showLabel ? "pl-1.5!" : "", className),
105
105
  ...props,
106
- children: [/* @__PURE__ */ jsx(ChevronLeftIcon, {
106
+ children: [/* @__PURE__ */ jsx(ChevronLeft, {
107
107
  "data-icon": "inline-start",
108
108
  className: "cn-rtl-flip"
109
109
  }), showLabel ? /* @__PURE__ */ jsx("span", {
@@ -121,7 +121,7 @@ function PaginationNext({ className, showLabel = true, text = "Next", ...props }
121
121
  children: [showLabel ? /* @__PURE__ */ jsx("span", {
122
122
  className: "hidden sm:block",
123
123
  children: text
124
- }) : null, /* @__PURE__ */ jsx(ChevronRightIcon, {
124
+ }) : null, /* @__PURE__ */ jsx(ChevronRight, {
125
125
  "data-icon": "inline-end",
126
126
  className: "cn-rtl-flip"
127
127
  })]
@@ -133,7 +133,7 @@ function PaginationEllipsis({ className, ...props }) {
133
133
  "data-slot": "pagination-ellipsis",
134
134
  className: cn("flex size-8 items-center justify-center text-fg-secondary [&_svg:not([class*='size-'])]:size-4", className),
135
135
  ...props,
136
- children: [/* @__PURE__ */ jsx(MoreHorizontalIcon, {}), /* @__PURE__ */ jsx("span", {
136
+ children: [/* @__PURE__ */ jsx(MoreHorizontal, {}), /* @__PURE__ */ jsx("span", {
137
137
  className: "sr-only",
138
138
  children: "More pages"
139
139
  })]
@@ -1,7 +1,7 @@
1
1
  "use client";
2
+ import { Eye, EyeOff } from "./icons.js";
2
3
  import { t as cn } from "./cn-BI_4DMBf.js";
3
4
  import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from "./input-group.js";
4
- import { Eye, EyeOff } from "lucide-react";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import * as React from "react";
7
7
  //#region src/password-input.tsx
@@ -1,10 +1,10 @@
1
1
  "use client";
2
+ import { Check, ChevronDown, Search } from "./icons.js";
2
3
  import { t as cn } from "./cn-BI_4DMBf.js";
3
4
  import { useComponentSize } from "./size-context.js";
4
5
  import { Separator } from "./separator.js";
5
6
  import { InputGroup, InputGroupAddon, InputGroupInput } from "./input-group.js";
6
7
  import { Popover, PopoverContent, PopoverTrigger } from "./popover.js";
7
- import { CheckIcon, ChevronDownIcon, SearchIcon } from "lucide-react";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  import * as React from "react";
10
10
  import { AsYouType, getCountries, getCountryCallingCode, parsePhoneNumber } from "libphonenumber-js";
@@ -109,7 +109,7 @@ function CountryList({ items, country, onSelect }) {
109
109
  className: "shrink-0 text-fg-secondary",
110
110
  children: ["+", entry.calling]
111
111
  }),
112
- selected && /* @__PURE__ */ jsx(CheckIcon, { className: "size-4 shrink-0 text-fg-brand" })
112
+ selected && /* @__PURE__ */ jsx(Check, { className: "size-4 shrink-0 text-fg-brand" })
113
113
  ]
114
114
  }, entry.code);
115
115
  })
@@ -147,7 +147,7 @@ function CountrySelect({ country, size, disabled, onSelect, finalFocusRef }) {
147
147
  size
148
148
  }),
149
149
  /* @__PURE__ */ jsxs("span", { children: ["+", getCountryCallingCode(country)] }),
150
- /* @__PURE__ */ jsx(ChevronDownIcon, { className: cn("text-fg-secondary transition-transform", open && "rotate-180", size === "lg" ? "size-4" : "size-3.5") })
150
+ /* @__PURE__ */ jsx(ChevronDown, { className: cn("text-fg-secondary transition-transform", open && "rotate-180", size === "lg" ? "size-4" : "size-3.5") })
151
151
  ]
152
152
  }), /* @__PURE__ */ jsxs(PopoverContent, {
153
153
  showArrow: false,
@@ -158,7 +158,7 @@ function CountrySelect({ country, size, disabled, onSelect, finalFocusRef }) {
158
158
  className: "w-72 gap-0 overflow-hidden p-0",
159
159
  children: [/* @__PURE__ */ jsxs("div", {
160
160
  className: "flex items-center gap-2 border-b border-line-subtle px-3.5 py-2.5",
161
- children: [/* @__PURE__ */ jsx(SearchIcon, { className: "size-4 shrink-0 text-fg-secondary" }), /* @__PURE__ */ jsx("input", {
161
+ children: [/* @__PURE__ */ jsx(Search, { className: "size-4 shrink-0 text-fg-secondary" }), /* @__PURE__ */ jsx("input", {
162
162
  ref: searchRef,
163
163
  value: query,
164
164
  onChange: (event) => setQuery(event.target.value),
@@ -1,8 +1,8 @@
1
1
  "use client";
2
+ import { ChevronLeft, ChevronRight, Fullscreen, X } from "./icons.js";
2
3
  import { t as cn } from "./cn-BI_4DMBf.js";
3
4
  import { Button } from "./button.js";
4
5
  import { Carousel, CarouselContent, CarouselItem } from "./carousel.js";
5
- import { ChevronLeftIcon, ChevronRightIcon, Fullscreen, XIcon } from "lucide-react";
6
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
7
  import * as React from "react";
8
8
  import { Dialog } from "@base-ui/react/dialog";
@@ -113,7 +113,7 @@ function GalleryButton({ className, variant = "ghost", ...rest }) {
113
113
  }
114
114
  /** Circular floating navigation button. Always present; the track loops. */
115
115
  function GalleryArrow({ side, onClick, className }) {
116
- const Icon = side === "prev" ? ChevronLeftIcon : ChevronRightIcon;
116
+ const Icon = side === "prev" ? ChevronLeft : ChevronRight;
117
117
  return /* @__PURE__ */ jsx(GalleryButton, {
118
118
  type: "button",
119
119
  "data-slot": `photo-gallery-${side}`,
@@ -272,7 +272,7 @@ function PhotoGalleryFullscreen({ images, open, onOpenChange, index, onIndexChan
272
272
  "data-slot": "photo-gallery-fullscreen-close",
273
273
  "aria-label": "Close gallery",
274
274
  render: /* @__PURE__ */ jsx(GalleryButton, {}),
275
- children: /* @__PURE__ */ jsx(XIcon, { className: "size-4 sm:size-5" })
275
+ children: /* @__PURE__ */ jsx(X, { className: "size-4 sm:size-5" })
276
276
  })]
277
277
  }),
278
278
  /* @__PURE__ */ jsxs(Carousel, {
package/dist/price-tag.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use client";
2
+ import { Check, ChevronDown } from "./icons.js";
2
3
  import { t as cn } from "./cn-BI_4DMBf.js";
3
- import { Check, ChevronDown } from "lucide-react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { cva } from "class-variance-authority";
6
6
  import { Popover } from "@base-ui/react/popover";
@@ -62,7 +62,7 @@ function PropertyListingCardMediaTop({ className, ...props }) {
62
62
  function PropertyListingCardOptionsBar({ className, render, ...props }) {
63
63
  return useRender({
64
64
  defaultTagName: "a",
65
- props: mergeProps({ className: cn("absolute inset-x-0 bottom-0 z-10 flex min-h-9.5 items-center justify-center gap-1 bg-black/80 px-4 py-1.5 text-center text-gdt-subtext font-extrabold tracking-wide text-white uppercase transition-[background-color] hover:bg-black/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-line-focus", className) }, props),
65
+ props: mergeProps({ className: cn("absolute inset-x-0 bottom-0 z-10 flex min-h-9.5 items-center justify-center gap-1 bg-black/70 px-4 py-1.5 text-center text-gdt-subtext font-extrabold tracking-wide text-white uppercase transition-[background-color] hover:bg-black/80 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-line-focus", "supports-backdrop-filter:bg-black/40 supports-backdrop-filter:backdrop-blur-[15px] supports-backdrop-filter:hover:bg-black/55", className) }, props),
66
66
  render,
67
67
  state: { slot: "property-listing-card-options-bar" }
68
68
  });
@@ -1,15 +1,15 @@
1
1
  "use client";
2
+ import { AlignCenter, AlignJustify, AlignLeft, AlignRight, Baseline, Bold, ChevronDown, Code2, Image as Image$1, Italic, Link2, List, ListOrdered, Quote, Redo2, Underline, Undo2 } from "./icons.js";
2
3
  import { t as cn } from "./cn-BI_4DMBf.js";
3
4
  import { useComponentSize } from "./size-context.js";
4
5
  import { Button } from "./button.js";
5
6
  import { Input } from "./input.js";
6
7
  import { DropdownMenu, DropdownMenuContent, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuTrigger } from "./dropdown-menu.js";
7
8
  import { Popover, PopoverContent, PopoverTrigger } from "./popover.js";
8
- import { AlignCenter, AlignJustify, AlignLeft, AlignRight, Baseline, Bold, ChevronDown, Code2, ImageIcon, Italic, Link2, List, ListOrdered, Quote, Redo2, Underline, Undo2 } from "lucide-react";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
10
10
  import * as React from "react";
11
11
  import { Color } from "@tiptap/extension-color";
12
- import { Image as Image$1 } from "@tiptap/extension-image";
12
+ import { Image } from "@tiptap/extension-image";
13
13
  import { Placeholder } from "@tiptap/extension-placeholder";
14
14
  import { TextAlign } from "@tiptap/extension-text-align";
15
15
  import { TextStyle } from "@tiptap/extension-text-style";
@@ -283,7 +283,7 @@ function ImageControl({ tokens, disabled, onInsert }) {
283
283
  title: "Insert image",
284
284
  onMouseDown: (event) => event.preventDefault(),
285
285
  className: toolbarControlClass(tokens, false),
286
- children: /* @__PURE__ */ jsx(ImageIcon, {})
286
+ children: /* @__PURE__ */ jsx(Image$1, {})
287
287
  }), /* @__PURE__ */ jsx(PopoverContent, {
288
288
  showArrow: false,
289
289
  align: "start",
@@ -387,7 +387,7 @@ const RichTextEditor = React.forwardRef(function RichTextEditor({ value, default
387
387
  TextStyle,
388
388
  Color,
389
389
  TextAlign.configure({ types: ["heading", "paragraph"] }),
390
- Image$1.configure({
390
+ Image.configure({
391
391
  inline: false,
392
392
  allowBase64: true
393
393
  }),
@@ -0,0 +1,61 @@
1
+ import { t as ComponentSize } from "./size-context-BX6kAdVj.js";
2
+ import { TabsListVariant } from "./tabs.js";
3
+ import * as React from "react";
4
+ //#region src/scroll-spy.d.ts
5
+ type ScrollSpyProps = Omit<React.ComponentProps<"div">, "onChange"> & {
6
+ orientation?: "horizontal" | "vertical";
7
+ /** Controlled active section. */
8
+ value?: string;
9
+ /** Active section before the first scroll measurement lands. */
10
+ defaultValue?: string;
11
+ onValueChange?: (value: string) => void;
12
+ /**
13
+ * Distance in px between the top of the scrollport and the line a section
14
+ * has to cross to become active. Set it to the height of a sticky header —
15
+ * it also becomes each section's `scroll-margin-top`, so scrolling lands
16
+ * the heading below the header rather than under it.
17
+ */
18
+ scrollOffset?: number;
19
+ };
20
+ /**
21
+ * `Tabs` for a page that shows everything at once: every section stays mounted
22
+ * and visible, the triggers scroll to their section, and the active trigger
23
+ * tracks whichever section the reader is currently on.
24
+ *
25
+ * The parts mirror the `Tabs` API — `ScrollSpy` / `ScrollSpyList` /
26
+ * `ScrollSpyTrigger` / `ScrollSpyContent`, matched by `value` — and the list
27
+ * takes the same `variant` and `size` as `TabsList`, so the two read as one
28
+ * family. Overflow ("More" dropdowns, per-breakpoint trigger counts) is the
29
+ * consuming app's job, exactly as it is with `Tabs`;
30
+ * `scrollSpyTriggerClassName` is exported so an overflow button can match the
31
+ * real triggers.
32
+ */
33
+ declare function ScrollSpy({ className, orientation, value, defaultValue, onValueChange, scrollOffset, children, ...props }: ScrollSpyProps): React.JSX.Element;
34
+ type ScrollSpyListProps = React.ComponentProps<"nav"> & {
35
+ variant?: TabsListVariant;
36
+ size?: ComponentSize;
37
+ /**
38
+ * Keep the active trigger visible as the reader scrolls. Opt in when the
39
+ * list itself scrolls — without it, a strip narrower than its triggers looks
40
+ * frozen once the active one passes out of view. No-op when nothing
41
+ * overflows, and it never scrolls anything but the list.
42
+ */
43
+ scrollActiveIntoView?: boolean;
44
+ };
45
+ declare function ScrollSpyList({ className, variant, size, children, scrollActiveIntoView, "aria-label": ariaLabel, ...props }: ScrollSpyListProps): React.JSX.Element;
46
+ /**
47
+ * Trigger styling, exported so an overflow "More" button outside the list can
48
+ * render the same look — the `Tabs` trigger classes verbatim, so the two
49
+ * components stay pixel-identical.
50
+ */
51
+ declare const scrollSpyTriggerClassName: string;
52
+ type ScrollSpyTriggerProps = Omit<React.ComponentProps<"button">, "value"> & {
53
+ value: string;
54
+ };
55
+ declare function ScrollSpyTrigger({ className, value, type, onClick, ...props }: ScrollSpyTriggerProps): React.JSX.Element;
56
+ type ScrollSpyContentProps = Omit<React.ComponentProps<"section">, "value"> & {
57
+ value: string;
58
+ };
59
+ declare function ScrollSpyContent({ className, value, style, tabIndex, ...props }: ScrollSpyContentProps): React.JSX.Element;
60
+ //#endregion
61
+ export { ScrollSpy, ScrollSpyContent, type ScrollSpyContentProps, ScrollSpyList, type ScrollSpyListProps, type ScrollSpyProps, ScrollSpyTrigger, type ScrollSpyTriggerProps, scrollSpyTriggerClassName };