@giddaa-housing/ui 3.4.0 → 3.6.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 (190) hide show
  1. package/css/components.css +13 -0
  2. package/css/generated/shared.css +1 -1
  3. package/dist/accordion.js +1 -1
  4. package/dist/activity-timeline.js +1 -1
  5. package/dist/alert.js +1 -1
  6. package/dist/auth-layout.js +1 -1
  7. package/dist/avatar.js +1 -1
  8. package/dist/badge.d.ts +5 -1
  9. package/dist/badge.js +20 -6
  10. package/dist/bar-chart.d.ts +1 -1
  11. package/dist/bar-chart.js +1 -1
  12. package/dist/breadcrumb.js +1 -1
  13. package/dist/bullet-chart.d.ts +1 -1
  14. package/dist/bullet-chart.js +1 -1
  15. package/dist/button-BS5KCibF.d.ts +33 -0
  16. package/dist/button-group.d.ts +1 -1
  17. package/dist/button-group.js +1 -1
  18. package/dist/button.d.ts +1 -1
  19. package/dist/button.js +50 -22
  20. package/dist/calendar.js +2 -2
  21. package/dist/call-card.js +1 -1
  22. package/dist/card.js +1 -1
  23. package/dist/carousel.d.ts +4 -2
  24. package/dist/carousel.js +13 -16
  25. package/dist/chart.d.ts +1 -1
  26. package/dist/chart.js +1 -1
  27. package/dist/chat.d.ts +1 -1
  28. package/dist/chat.js +1 -1
  29. package/dist/checkbox.d.ts +2 -2
  30. package/dist/checkbox.js +21 -7
  31. package/dist/collapsible.js +1 -1
  32. package/dist/combobox-CACVdp1R.js +430 -0
  33. package/dist/combobox.d.ts +9 -4
  34. package/dist/combobox.js +2 -309
  35. package/dist/cta.d.ts +1 -1
  36. package/dist/cta.js +1 -1
  37. package/dist/currency-selector.js +2 -2
  38. package/dist/data-table.d.ts +2 -2
  39. package/dist/data-table.js +1 -1
  40. package/dist/date-picker.d.ts +6 -5
  41. package/dist/date-picker.js +7 -17
  42. package/dist/details-card.js +1 -1
  43. package/dist/dialog.d.ts +3 -1
  44. package/dist/dialog.js +10 -6
  45. package/dist/dropdown-menu.d.ts +1 -1
  46. package/dist/dropdown-menu.js +1 -1
  47. package/dist/dropzone.js +1 -1
  48. package/dist/editorial-card.js +2 -4
  49. package/dist/empty-state.js +1 -1
  50. package/dist/field.d.ts +4 -1
  51. package/dist/field.js +29 -12
  52. package/dist/file-upload.js +1 -1
  53. package/dist/filter.js +1 -1
  54. package/dist/footer.d.ts +2 -2
  55. package/dist/footer.js +1 -1
  56. package/dist/funnel-chart.d.ts +1 -1
  57. package/dist/funnel-chart.js +1 -1
  58. package/dist/gallery-indicator.js +1 -1
  59. package/dist/heatmap-chart.d.ts +1 -1
  60. package/dist/icons-C9JXR5Xv.d.ts +111 -0
  61. package/dist/icons.d.ts +2 -93
  62. package/dist/icons.js +37 -1
  63. package/dist/image.d.ts +59 -0
  64. package/dist/image.js +53 -0
  65. package/dist/infinite-scroll.js +3 -29
  66. package/dist/infotip.js +1 -1
  67. package/dist/input-group.d.ts +6 -6
  68. package/dist/input-group.js +39 -14
  69. package/dist/input-otp.d.ts +2 -2
  70. package/dist/input-otp.js +32 -15
  71. package/dist/input-size-context-BMhves-J.d.ts +13 -0
  72. package/dist/input-size-context.d.ts +2 -2
  73. package/dist/input-size-context.js +9 -2
  74. package/dist/input.d.ts +20 -2
  75. package/dist/input.js +31 -12
  76. package/dist/item.js +1 -1
  77. package/dist/kpi-card.js +1 -1
  78. package/dist/label.js +1 -1
  79. package/dist/line-chart.d.ts +1 -1
  80. package/dist/line-chart.js +1 -1
  81. package/dist/list-item.js +1 -1
  82. package/dist/map-indicator.js +1 -1
  83. package/dist/mask-input.d.ts +1 -1
  84. package/dist/match.d.ts +5 -2
  85. package/dist/match.js +183 -27
  86. package/dist/media-gallery-hero.js +15 -10
  87. package/dist/media-player.js +5 -13
  88. package/dist/message.js +2 -12
  89. package/dist/mobile-sidebar.js +2 -1
  90. package/dist/multi-step-form.js +2 -2
  91. package/dist/number-input.d.ts +2 -2
  92. package/dist/number-input.js +3 -3
  93. package/dist/page-header.js +1 -1
  94. package/dist/pagination.d.ts +1 -1
  95. package/dist/pagination.js +1 -1
  96. package/dist/password-input.js +1 -1
  97. package/dist/phone-input.d.ts +2 -2
  98. package/dist/phone-input.js +16 -21
  99. package/dist/photo-gallery.js +6 -3
  100. package/dist/picker-BTXBrsl4.js +62 -0
  101. package/dist/picker-j3txxA5t.d.ts +14 -0
  102. package/dist/pie-chart.d.ts +1 -1
  103. package/dist/pie-chart.js +1 -1
  104. package/dist/popover-CNymD33m.d.ts +20 -0
  105. package/dist/popover.d.ts +1 -19
  106. package/dist/popover.js +1 -1
  107. package/dist/price-tag.d.ts +1 -1
  108. package/dist/price-tag.js +50 -22
  109. package/dist/progress.js +1 -1
  110. package/dist/property-listing-card.d.ts +68 -2
  111. package/dist/property-listing-card.js +115 -29
  112. package/dist/purchase-option-card.js +1 -1
  113. package/dist/radar-chart.d.ts +1 -1
  114. package/dist/radar-chart.js +1 -1
  115. package/dist/radio-group.d.ts +2 -2
  116. package/dist/radio-group.js +24 -10
  117. package/dist/review-block.js +1 -1
  118. package/dist/rich-text-editor.d.ts +1 -1
  119. package/dist/rich-text-editor.js +1 -1
  120. package/dist/scatter-chart.d.ts +1 -1
  121. package/dist/scatter-chart.js +1 -1
  122. package/dist/scroll-spy.d.ts +8 -2
  123. package/dist/scroll-spy.js +16 -16
  124. package/dist/search-input.js +1 -1
  125. package/dist/section-jumper.d.ts +31 -0
  126. package/dist/section-jumper.js +276 -0
  127. package/dist/select.d.ts +9 -4
  128. package/dist/select.js +113 -20
  129. package/dist/separator.js +1 -1
  130. package/dist/sheet.d.ts +3 -1
  131. package/dist/sheet.js +10 -6
  132. package/dist/sidebar.d.ts +2 -2
  133. package/dist/sidebar.js +4 -16
  134. package/dist/size-context-BVhHduLi.d.ts +33 -0
  135. package/dist/size-context.d.ts +2 -2
  136. package/dist/size-context.js +30 -1
  137. package/dist/skeleton.js +1 -1
  138. package/dist/slider.d.ts +5 -3
  139. package/dist/slider.js +26 -11
  140. package/dist/sonar.d.ts +1 -1
  141. package/dist/sonar.js +2 -2
  142. package/dist/sparkline.d.ts +1 -1
  143. package/dist/sparkline.js +1 -1
  144. package/dist/stepper.js +1 -1
  145. package/dist/styles.css +1622 -264
  146. package/dist/switch.d.ts +2 -2
  147. package/dist/switch.js +21 -7
  148. package/dist/table-card.js +1 -1
  149. package/dist/table.js +1 -1
  150. package/dist/tabs.d.ts +1 -1
  151. package/dist/tabs.js +1 -1
  152. package/dist/tag.d.ts +1 -1
  153. package/dist/tag.js +1 -1
  154. package/dist/testimonial-block.js +1 -1
  155. package/dist/textarea.d.ts +17 -1
  156. package/dist/textarea.js +24 -10
  157. package/dist/theme-switcher.js +1 -1
  158. package/dist/time-picker.d.ts +5 -4
  159. package/dist/time-picker.js +5 -7
  160. package/dist/toast.js +1 -1
  161. package/dist/tooltip.js +1 -1
  162. package/dist/top-navbar.js +1 -1
  163. package/dist/tree-map.d.ts +1 -1
  164. package/dist/tree-map.js +1 -1
  165. package/dist/utils/cn.d.ts +5 -0
  166. package/dist/utils/cn.js +33 -0
  167. package/dist/utils/format.d.ts +45 -0
  168. package/dist/utils/format.js +70 -0
  169. package/dist/utils/phone.d.ts +98 -0
  170. package/dist/utils/phone.js +93 -0
  171. package/dist/utils/use-intersection.d.ts +9 -0
  172. package/dist/utils/use-intersection.js +29 -0
  173. package/dist/utils/use-is-mobile.d.ts +5 -0
  174. package/dist/utils/use-is-mobile.js +16 -0
  175. package/dist/utils/use-reduced-motion.d.ts +5 -0
  176. package/dist/{use-reduced-motion-BDvOK14x.js → utils/use-reduced-motion.js} +2 -2
  177. package/dist/utils/use-uncontrolled.d.ts +11 -0
  178. package/dist/{use-uncontrolled-CLfM1XbB.js → utils/use-uncontrolled.js} +2 -2
  179. package/dist/video-player-dialog.d.ts +12 -2
  180. package/dist/video-player-dialog.js +50 -9
  181. package/dist/waterfall-chart.d.ts +1 -1
  182. package/dist/waterfall-chart.js +1 -1
  183. package/package.json +13 -1
  184. package/dist/button-DW5OijoR.d.ts +0 -17
  185. package/dist/cn-BI_4DMBf.js +0 -23
  186. package/dist/input-CfoEJ8A6.d.ts +0 -12
  187. package/dist/input-size-context-C-SFx9sx.d.ts +0 -10
  188. package/dist/picker-xSTzeYhc.js +0 -50
  189. package/dist/size-context-BX6kAdVj.d.ts +0 -11
  190. package/dist/textarea-IS_D8pXf.d.ts +0 -11
@@ -1,14 +1,15 @@
1
1
  "use client";
2
2
  import { Play } from "./icons.js";
3
- import { t as cn } from "./cn-BI_4DMBf.js";
3
+ import { cn } from "./utils/cn.js";
4
4
  import { buttonVariants } from "./button.js";
5
5
  import { Carousel, CarouselContent, CarouselItem, useCarousel } from "./carousel.js";
6
6
  import { GalleryIndicator } from "./gallery-indicator.js";
7
+ import { Image } from "./image.js";
7
8
  import { ReviewBlock } from "./review-block.js";
8
9
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
10
  import { cva } from "class-variance-authority";
10
11
  //#region src/media-gallery-hero.tsx
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 mediaGalleryHeroVariants = cva("relative isolate h-[350px] w-full overflow-hidden rounded-none md:h-[380px] md:rounded-[40px] lg:h-[480px]");
12
13
  const mediaGalleryImagesVariants = cva("absolute inset-0 z-0 hidden size-full min-h-0 min-w-0 md:grid", {
13
14
  variants: { imageCount: {
14
15
  1: "",
@@ -42,7 +43,8 @@ function getMediaKey(image) {
42
43
  return image.id ?? image.src ?? image.alt ?? "placeholder";
43
44
  }
44
45
  function MediaGalleryTile({ className, image, index, isDesktopTile, onMediaClick, renderMedia }) {
45
- const content = renderMedia?.(image, index) ?? (image.src ? /* @__PURE__ */ jsx("img", {
46
+ const content = renderMedia?.(image, index) ?? (image.src ? /* @__PURE__ */ jsx(Image, {
47
+ slot: "media-gallery-hero-image",
46
48
  alt: image.alt ?? "",
47
49
  className: "size-full object-cover",
48
50
  draggable: false,
@@ -51,7 +53,7 @@ function MediaGalleryTile({ className, image, index, isDesktopTile, onMediaClick
51
53
  className: "text-gdt-sm font-medium text-fg-caption-placeholder",
52
54
  children: "Media"
53
55
  }));
54
- const tileClassName = cn("relative flex size-full min-h-0 min-w-0 items-center justify-center overflow-hidden rounded-[32px] bg-surface-raised md:rounded-[40px]", "[&>img]:size-full [&>img]:object-cover", isDesktopTile && "hidden md:flex", className);
56
+ const tileClassName = cn("relative flex size-full min-h-0 min-w-0 items-center justify-center overflow-hidden rounded-none bg-surface-raised md:rounded-[40px]", "[&>img]:size-full [&>img]:object-cover", isDesktopTile && "hidden md:flex", className);
55
57
  if (!onMediaClick) return /* @__PURE__ */ jsx("div", {
56
58
  className: tileClassName,
57
59
  "data-slot": "media-gallery-tile",
@@ -69,6 +71,7 @@ function MediaGalleryTile({ className, image, index, isDesktopTile, onMediaClick
69
71
  function MobileGalleryCounter({ total }) {
70
72
  const { selectedIndex } = useCarousel();
71
73
  return /* @__PURE__ */ jsx(GalleryIndicator, {
74
+ className: "h-[35px] lg:h-[45px]",
72
75
  currentPhoto: selectedIndex + 1,
73
76
  size: "sm",
74
77
  totalPhotos: total
@@ -77,17 +80,16 @@ function MobileGalleryCounter({ total }) {
77
80
  function MobileMediaCarousel({ currentMedia, images, mediaTotal, onMediaClick, renderMedia, showMobileIndicator }) {
78
81
  const carouselImages = images.length > 0 ? images : [{}];
79
82
  return /* @__PURE__ */ jsxs(Carousel, {
80
- className: "absolute inset-0 z-0 block size-full rounded-[32px] md:hidden",
83
+ className: "absolute inset-0 z-0 block size-full rounded-none md:hidden",
81
84
  imageSize: "full",
82
85
  opts: {
83
86
  align: "start",
84
- loop: carouselImages.length > 1,
85
87
  startIndex: Math.max(0, currentMedia - 1)
86
88
  },
87
89
  children: [/* @__PURE__ */ jsx(CarouselContent, { children: carouselImages.map((image, index) => /* @__PURE__ */ jsx(CarouselItem, {
88
90
  className: "h-full",
89
91
  children: /* @__PURE__ */ jsx(MediaGalleryTile, {
90
- className: "rounded-[32px]",
92
+ className: "rounded-none",
91
93
  image,
92
94
  index,
93
95
  onMediaClick,
@@ -135,7 +137,8 @@ function MediaGalleryVideo({ alt = "", autoPlay, className, controls, label = "P
135
137
  playsInline,
136
138
  poster,
137
139
  src
138
- }) : poster ? /* @__PURE__ */ jsx("img", {
140
+ }) : poster ? /* @__PURE__ */ jsx(Image, {
141
+ slot: "media-gallery-hero-poster",
139
142
  alt,
140
143
  className: "size-full object-cover",
141
144
  draggable: false,
@@ -145,7 +148,7 @@ function MediaGalleryVideo({ alt = "", autoPlay, className, controls, label = "P
145
148
  children: "Video"
146
149
  }));
147
150
  return /* @__PURE__ */ jsxs("div", {
148
- className: cn("absolute inset-0 z-0 flex size-full items-center justify-center overflow-hidden rounded-[32px] bg-surface-raised md:rounded-[40px]", "[&>img]:size-full [&>img]:object-cover [&>video]:size-full [&>video]:object-cover", className),
151
+ className: cn("absolute inset-0 z-0 flex size-full items-center justify-center overflow-hidden rounded-none bg-surface-raised md:rounded-[40px]", "[&>img]:size-full [&>img]:object-cover [&>video]:size-full [&>video]:object-cover", className),
149
152
  "data-slot": "media-gallery-video",
150
153
  ...props,
151
154
  children: [content, controls ? null : /* @__PURE__ */ jsx("button", {
@@ -153,7 +156,7 @@ function MediaGalleryVideo({ alt = "", autoPlay, className, controls, label = "P
153
156
  className: cn(buttonVariants({
154
157
  variant: "glass-overlay",
155
158
  size: "icon-xl"
156
- }), "absolute top-1/2 left-1/2 z-10 size-20 -translate-x-1/2 -translate-y-1/2 active:not-aria-[haspopup]:-translate-y-1/2 md:size-24"),
159
+ }), "absolute top-1/2 left-1/2 z-10 size-[35px] -translate-x-1/2 -translate-y-1/2 active:not-aria-[haspopup]:-translate-y-1/2 lg:size-[45px] [&>svg]:size-4 lg:[&>svg]:size-5"),
157
160
  "data-slot": "media-gallery-video-play",
158
161
  onClick: onPlayClick,
159
162
  type: "button",
@@ -184,6 +187,7 @@ function MediaGalleryIndicator({ "aria-label": ariaLabel, className, label, onCl
184
187
  ...props,
185
188
  children: /* @__PURE__ */ jsx(GalleryIndicator, {
186
189
  "aria-hidden": "true",
190
+ className: "h-[35px] lg:h-[45px]",
187
191
  label: indicatorLabel,
188
192
  size
189
193
  })
@@ -192,6 +196,7 @@ function MediaGalleryIndicator({ "aria-label": ariaLabel, className, label, onCl
192
196
  className: cn("absolute right-4 bottom-4 z-10 hidden md:block", className),
193
197
  "data-slot": "media-gallery-indicator",
194
198
  children: /* @__PURE__ */ jsx(GalleryIndicator, {
199
+ className: "h-[35px] lg:h-[45px]",
195
200
  label: indicatorLabel,
196
201
  size
197
202
  })
@@ -1,7 +1,8 @@
1
1
  "use client";
2
2
  import { Captions, CaptionsOff, Maximize, Minimize, Pause, PictureInPicture2, Play, RefreshCcw, Repeat2, RotateCcw, RotateCw, Settings, TriangleAlert, Volume1, Volume2, VolumeX } from "./icons.js";
3
- import { t as cn } from "./cn-BI_4DMBf.js";
3
+ import { cn } from "./utils/cn.js";
4
4
  import { DropdownMenu, DropdownMenuContent, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from "./dropdown-menu.js";
5
+ import { formatDuration } from "./utils/format.js";
5
6
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./tooltip.js";
6
7
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
8
  import * as React from "react";
@@ -35,15 +36,6 @@ function setRef(ref, value) {
35
36
  }
36
37
  if (ref) ref.current = value;
37
38
  }
38
- function formatTime(value) {
39
- if (!Number.isFinite(value)) return "0:00";
40
- const safeValue = Math.max(0, Math.floor(value ?? 0));
41
- const hours = Math.floor(safeValue / 3600);
42
- const minutes = Math.floor(safeValue % 3600 / 60);
43
- const seconds = safeValue % 60;
44
- if (hours > 0) return `${hours}:${String(minutes).padStart(2, "0")}:${String(seconds).padStart(2, "0")}`;
45
- return `${minutes}:${String(seconds).padStart(2, "0")}`;
46
- }
47
39
  function formatRate(value) {
48
40
  if (!value || value === 1) return "1x";
49
41
  return `${Number.parseFloat(value.toFixed(2))}x`;
@@ -590,7 +582,7 @@ function MediaPlayerTime({ className, showDuration = true, ...props }) {
590
582
  "data-slot": "media-player-time",
591
583
  className: cn("inline-flex shrink-0 items-center px-1 text-gdt-sm font-medium tabular-nums text-fg-on-brand/80", className),
592
584
  ...props,
593
- children: showDuration ? `${formatTime(currentTime)} / ${formatTime(duration)}` : formatTime(currentTime)
585
+ children: showDuration ? `${formatDuration(currentTime)} / ${formatDuration(duration)}` : formatDuration(currentTime)
594
586
  });
595
587
  }
596
588
  function MediaPlayerSeek({ className, disabled, onValueChange, "aria-label": ariaLabel, step = 5, withTime = true, ...props }) {
@@ -734,7 +726,7 @@ function MediaPlayerSeek({ className, disabled, onValueChange, "aria-label": ari
734
726
  }) : null,
735
727
  /* @__PURE__ */ jsx("span", {
736
728
  className: cn("px-2.5 py-1 text-gdt-xs font-bold tabular-nums", (previewImage || previewChapter?.text) && "pt-0.5 pb-1.5"),
737
- children: formatTime(previewValue)
729
+ children: formatDuration(previewValue)
738
730
  })
739
731
  ]
740
732
  }), portalContainer ?? document.body), /* @__PURE__ */ jsxs(Slider.Control, {
@@ -782,7 +774,7 @@ function MediaPlayerSeek({ className, disabled, onValueChange, "aria-label": ari
782
774
  ]
783
775
  }), /* @__PURE__ */ jsx(Slider.Thumb, {
784
776
  getAriaLabel: () => ariaLabel ?? "Media timeline",
785
- getAriaValueText: (_formatted, value) => `${formatTime(value)} of ${formatTime(max)}`,
777
+ getAriaValueText: (_formatted, value) => `${formatDuration(value)} of ${formatDuration(max)}`,
786
778
  className: cn("group/seek-thumb size-[14px] rounded-full outline-none", "transition-[inset-inline-start] duration-200 ease-linear data-[dragging]:transition-none"),
787
779
  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))]") })
788
780
  })]
package/dist/message.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { CheckCheck } from "./icons.js";
3
- import { t as cn } from "./cn-BI_4DMBf.js";
3
+ import { cn } from "./utils/cn.js";
4
+ import { formatTimestamp, toDateTimeAttribute } from "./utils/format.js";
4
5
  import { jsx, jsxs } from "react/jsx-runtime";
5
6
  import { mergeProps } from "@base-ui/react/merge-props";
6
7
  import { useRender } from "@base-ui/react/use-render";
@@ -13,17 +14,6 @@ function useMessageContext() {
13
14
  if (!context) throw new Error("Message parts must be rendered inside <Message>.");
14
15
  return context;
15
16
  }
16
- function toDateTimeAttribute(value) {
17
- return value instanceof Date ? value.toISOString() : value;
18
- }
19
- function formatTimestamp(value) {
20
- if (typeof value === "string") return value;
21
- return value.toLocaleTimeString([], {
22
- hour: "2-digit",
23
- minute: "2-digit",
24
- hour12: false
25
- });
26
- }
27
17
  /** Styles the bubble itself — the surface inside `Message`, not `Message`'s root. */
28
18
  const messageVariants = cva("relative flex w-fit min-w-0 flex-col shadow-1 *:data-[slot=message-media]:max-w-full", {
29
19
  variants: {
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { ChevronDown, Menu, X } from "./icons.js";
3
- import { t as cn } from "./cn-BI_4DMBf.js";
3
+ import { cn } from "./utils/cn.js";
4
4
  import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "./collapsible.js";
5
5
  import { Sheet, SheetBody, SheetClose, SheetContent, SheetFooter, SheetHeader, SheetTitle, SheetTrigger } from "./sheet.js";
6
6
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -27,6 +27,7 @@ function MobileSidebarContent({ className, showCloseButton = false, ...props })
27
27
  side: "right",
28
28
  size: "sm",
29
29
  showCloseButton,
30
+ popupClassName: "h-dvh w-[min(100vw,24.375rem)]",
30
31
  className: cn("h-dvh w-[min(100vw,24.375rem)] rounded-none border-y-0 border-r-0 bg-canvas [--sheet-padding-x:1.25rem] [--sheet-padding-top:0.8125rem]", className),
31
32
  ...props
32
33
  });
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { Check } from "./icons.js";
3
- import { t as cn } from "./cn-BI_4DMBf.js";
4
- import { t as useUncontrolled } from "./use-uncontrolled-CLfM1XbB.js";
3
+ import { cn } from "./utils/cn.js";
5
4
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./select.js";
5
+ import { useUncontrolled } from "./utils/use-uncontrolled.js";
6
6
  import { Progress, ProgressIndicator, ProgressTrack } from "./progress.js";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
8
  import * as React from "react";
@@ -1,4 +1,4 @@
1
- import { t as ComponentSize } from "./size-context-BX6kAdVj.js";
1
+ import { n as ComponentSizeValue } from "./size-context-BVhHduLi.js";
2
2
  import * as React from "react";
3
3
  import { NumberFieldRootProps } from "@base-ui/react/number-field";
4
4
  //#region src/number-input.d.ts
@@ -32,7 +32,7 @@ type NumberInputProps = Omit<NumberFieldRootProps, "format"> & {
32
32
  format?: Intl.NumberFormatOptions;
33
33
  formatPreset?: NumberInputFormatPreset;
34
34
  placeholder?: string;
35
- size?: ComponentSize;
35
+ size?: ComponentSizeValue;
36
36
  thousandSeparator?: boolean;
37
37
  };
38
38
  declare function NumberInput({ children, format, formatPreset, placeholder, size, thousandSeparator, ...props }: NumberInputProps): React.JSX.Element;
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { Minus, Plus } from "./icons.js";
3
- import { t as cn } from "./cn-BI_4DMBf.js";
4
- import { SizeProvider, useComponentSize } from "./size-context.js";
3
+ import { cn } from "./utils/cn.js";
4
+ import { SizeProvider, useComponentSize, useComponentSizeValue } from "./size-context.js";
5
5
  import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from "./input-group.js";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  import { NumberField } from "@base-ui/react/number-field";
@@ -25,7 +25,7 @@ const numberInputFormatPresets = {
25
25
  plain: { useGrouping: false }
26
26
  };
27
27
  function NumberInput({ children, format, formatPreset, placeholder, size, thousandSeparator, ...props }) {
28
- const resolvedSize = useComponentSize(size);
28
+ const resolvedSize = useComponentSizeValue(size);
29
29
  const resolvedFormat = format ?? (formatPreset ? numberInputFormatPresets[formatPreset] : void 0) ?? (thousandSeparator ? numberInputFormatPresets.decimal : void 0);
30
30
  return /* @__PURE__ */ jsx(SizeProvider, {
31
31
  size: resolvedSize,
@@ -1,4 +1,4 @@
1
- import { t as cn } from "./cn-BI_4DMBf.js";
1
+ import { cn } from "./utils/cn.js";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  //#region src/page-header.tsx
4
4
  function DashboardHeader({ hideBorder = false, className, ...props }) {
@@ -1,4 +1,4 @@
1
- import { n as ButtonLink, t as Button } from "./button-DW5OijoR.js";
1
+ import { n as ButtonLink, t as Button } from "./button-BS5KCibF.js";
2
2
  import * as React from "react";
3
3
  //#region src/pagination.d.ts
4
4
  declare function Pagination({ className, ...props }: React.ComponentProps<"nav">): React.JSX.Element;
@@ -1,5 +1,5 @@
1
1
  import { ChevronLeft, ChevronRight, MoreHorizontal } from "./icons.js";
2
- import { t as cn } from "./cn-BI_4DMBf.js";
2
+ import { cn } from "./utils/cn.js";
3
3
  import { Button, ButtonLink } from "./button.js";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { cva } from "class-variance-authority";
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import { Eye, EyeOff } from "./icons.js";
3
- import { t as cn } from "./cn-BI_4DMBf.js";
3
+ import { cn } from "./utils/cn.js";
4
4
  import { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from "./input-group.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import * as React from "react";
@@ -1,4 +1,4 @@
1
- import { t as ComponentSize } from "./size-context-BX6kAdVj.js";
1
+ import { n as ComponentSizeValue } from "./size-context-BVhHduLi.js";
2
2
  import * as React from "react";
3
3
  import { CountryCode } from "libphonenumber-js";
4
4
  //#region src/phone-input.d.ts
@@ -6,7 +6,7 @@ interface PhoneInputProps {
6
6
  value?: string;
7
7
  onChange?: (value: string | undefined) => void;
8
8
  defaultCountry?: CountryCode;
9
- size?: ComponentSize;
9
+ size?: ComponentSizeValue;
10
10
  disabled?: boolean;
11
11
  readOnly?: boolean;
12
12
  placeholder?: string;
@@ -1,21 +1,17 @@
1
1
  "use client";
2
2
  import { Check, ChevronDown, Search } from "./icons.js";
3
- import { t as cn } from "./cn-BI_4DMBf.js";
4
- import { useComponentSize } from "./size-context.js";
3
+ import { cn } from "./utils/cn.js";
4
+ import { resolveResponsiveComponentSize, useComponentSizeValue } from "./size-context.js";
5
5
  import { Separator } from "./separator.js";
6
6
  import { InputGroup, InputGroupAddon, InputGroupInput } from "./input-group.js";
7
7
  import { Popover, PopoverContent, PopoverTrigger } from "./popover.js";
8
+ import { getPhoneCountries } from "./utils/phone.js";
8
9
  import { jsx, jsxs } from "react/jsx-runtime";
9
10
  import * as React from "react";
10
- import { AsYouType, getCountries, getCountryCallingCode, parsePhoneNumber } from "libphonenumber-js";
11
+ import { AsYouType, getCountryCallingCode, parsePhoneNumberFromString } from "libphonenumber-js";
11
12
  import flags from "react-phone-number-input/flags";
12
13
  //#region src/phone-input.tsx
13
- const regionNames = typeof Intl !== "undefined" && "DisplayNames" in Intl ? new Intl.DisplayNames(["en"], { type: "region" }) : void 0;
14
- const COUNTRIES = getCountries().map((code) => ({
15
- code,
16
- name: regionNames?.of(code) ?? code,
17
- calling: getCountryCallingCode(code)
18
- })).sort((a, b) => a.name.localeCompare(b.name));
14
+ const COUNTRIES = getPhoneCountries();
19
15
  function getNationalDigits(value) {
20
16
  return value.replace(/\D/g, "");
21
17
  }
@@ -29,13 +25,11 @@ function toE164(digits, country) {
29
25
  }
30
26
  function parseValue(value) {
31
27
  if (!value) return { digits: "" };
32
- try {
33
- const parsed = parsePhoneNumber(value);
34
- if (parsed?.nationalNumber) return {
35
- country: parsed.country,
36
- digits: parsed.nationalNumber
37
- };
38
- } catch {}
28
+ const parsed = parsePhoneNumberFromString(value);
29
+ if (parsed?.nationalNumber) return {
30
+ country: parsed.country,
31
+ digits: parsed.nationalNumber
32
+ };
39
33
  return { digits: "" };
40
34
  }
41
35
  const flagSizeVariants = {
@@ -107,7 +101,7 @@ function CountryList({ items, country, onSelect }) {
107
101
  }),
108
102
  /* @__PURE__ */ jsxs("span", {
109
103
  className: "shrink-0 text-fg-secondary",
110
- children: ["+", entry.calling]
104
+ children: ["+", entry.callingCode]
111
105
  }),
112
106
  selected && /* @__PURE__ */ jsx(Check, { className: "size-4 shrink-0 text-fg-brand" })
113
107
  ]
@@ -124,7 +118,7 @@ function CountrySelect({ country, size, disabled, onSelect, finalFocusRef }) {
124
118
  const q = query.trim().toLowerCase();
125
119
  if (!q) return COUNTRIES;
126
120
  const normalized = q.replace(/^\+/, "");
127
- return COUNTRIES.filter((entry) => entry.name.toLowerCase().includes(q) || entry.calling.includes(normalized) || entry.code.toLowerCase().includes(q));
121
+ return COUNTRIES.filter((entry) => entry.name.toLowerCase().includes(q) || entry.callingCode.includes(normalized) || entry.code.toLowerCase().includes(q));
128
122
  }, [query]);
129
123
  function handleOpenChange(next) {
130
124
  setOpen(next);
@@ -174,7 +168,8 @@ function CountrySelect({ country, size, disabled, onSelect, finalFocusRef }) {
174
168
  });
175
169
  }
176
170
  function PhoneInput({ value, onChange, defaultCountry = "NG", size, disabled = false, readOnly = false, placeholder = "(0000) 000-0000", className, id, name, ref, "aria-invalid": ariaInvalid }) {
177
- const resolvedSize = useComponentSize(size);
171
+ const sizeValue = useComponentSizeValue(size);
172
+ const resolvedSize = resolveResponsiveComponentSize(sizeValue);
178
173
  const inputRef = React.useRef(null);
179
174
  const setInputRef = React.useCallback((node) => {
180
175
  inputRef.current = node;
@@ -207,14 +202,14 @@ function PhoneInput({ value, onChange, defaultCountry = "NG", size, disabled = f
207
202
  }
208
203
  const dividerStateClasses = cn("group-hover/input-group:bg-line-strong", "group-focus-within/input-group:bg-line-focus", "group-has-[[aria-invalid=true]]/input-group:bg-line-danger", "group-has-disabled/input-group:bg-line-subtle");
209
204
  return /* @__PURE__ */ jsxs(InputGroup, {
210
- size: resolvedSize,
205
+ size: sizeValue,
211
206
  className,
212
207
  children: [/* @__PURE__ */ jsxs(InputGroupAddon, {
213
208
  align: "inline-start",
214
209
  className: "gap-2 self-stretch py-0",
215
210
  children: [/* @__PURE__ */ jsx(CountrySelect, {
216
211
  country,
217
- size: resolvedSize,
212
+ size: resolvedSize.base,
218
213
  disabled,
219
214
  onSelect: handleCountrySelect,
220
215
  finalFocusRef: inputRef
@@ -1,8 +1,9 @@
1
1
  "use client";
2
2
  import { ChevronLeft, ChevronRight, Fullscreen, X } from "./icons.js";
3
- import { t as cn } from "./cn-BI_4DMBf.js";
3
+ import { cn } from "./utils/cn.js";
4
4
  import { Button } from "./button.js";
5
5
  import { Carousel, CarouselContent, CarouselItem } from "./carousel.js";
6
+ import { Image } from "./image.js";
6
7
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
7
8
  import * as React from "react";
8
9
  import { Dialog } from "@base-ui/react/dialog";
@@ -60,7 +61,8 @@ function GalleryFrame({ image, fit = "cover", className }) {
60
61
  return /* @__PURE__ */ jsx("div", {
61
62
  "data-slot": "photo-gallery-frame",
62
63
  className: cn("relative flex size-full items-center justify-center overflow-hidden", className),
63
- children: image?.src ? /* @__PURE__ */ jsx("img", {
64
+ children: image?.src ? /* @__PURE__ */ jsx(Image, {
65
+ slot: "photo-gallery-image",
64
66
  src: image.src,
65
67
  alt: image.alt ?? "Property image",
66
68
  className: cn(fit === "contain" ? "max-h-full max-w-full rounded-lg object-contain" : "size-full object-cover"),
@@ -168,7 +170,8 @@ function GalleryThumbnails({ images, selectedIndex, onSelect, colsClassName, cla
168
170
  onClick: () => onSelect(index),
169
171
  style: { width: "calc((100% - (var(--gallery-cols) - 1) * var(--gallery-gap)) / var(--gallery-cols))" },
170
172
  className: cn("relative aspect-4/3 shrink-0 overflow-hidden rounded-lg border-2 bg-surface-raised transition-[border-color,opacity] outline-none focus-visible:border-line-focus focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)]", isActive ? "border-line-focus" : "border-transparent opacity-80 hover:opacity-100"),
171
- children: image.src ? /* @__PURE__ */ jsx("img", {
173
+ children: image.src ? /* @__PURE__ */ jsx(Image, {
174
+ slot: "photo-gallery-thumbnail-image",
172
175
  src: image.src,
173
176
  alt: image.alt ?? `Property image ${index + 1}`,
174
177
  className: "size-full object-cover",
@@ -0,0 +1,62 @@
1
+ import { cn } from "./utils/cn.js";
2
+ import { responsiveValueClasses } from "./size-context.js";
3
+ import { Button } from "./button.js";
4
+ import { useInputComponentSizeValue } from "./input-size-context.js";
5
+ import { PopoverTrigger } from "./popover.js";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ import { cva } from "class-variance-authority";
8
+ //#region src/lib/picker.tsx
9
+ const pickerTriggerSizeVariants = {
10
+ sm: "h-8 px-3 text-gdt-xs [&_svg]:size-3.5",
11
+ md: "h-10 px-3.5 text-gdt-sm [&_svg]:size-4",
12
+ lg: "h-12 px-4 text-gdt-md [&_svg]:size-4.5",
13
+ xl: "h-14 px-4.5 text-gdt-lg [&_svg]:size-5"
14
+ };
15
+ const pickerTriggerVariants = cva("flex w-full items-center justify-between rounded-full border transition-[border-color,box-shadow] outline-none", {
16
+ variants: { size: pickerTriggerSizeVariants },
17
+ defaultVariants: { size: "md" }
18
+ });
19
+ function PickerTrigger({ icon: Icon, displayValue, placeholder, disabled, open, size, className }) {
20
+ const resolvedSize = responsiveValueClasses(useInputComponentSizeValue(size), responsivePickerTriggerSizes);
21
+ return /* @__PURE__ */ jsxs(PopoverTrigger, {
22
+ disabled,
23
+ "data-size": resolvedSize.base,
24
+ className: cn(pickerTriggerVariants({ size: null }), resolvedSize.className, disabled ? "cursor-not-allowed border-line-subtle bg-surface text-fg-caption-placeholder" : open ? "border-line-focus bg-canvas text-fg-primary inset-ring-1 inset-ring-line-focus" : "border-line bg-canvas text-fg-primary hover:border-line-strong", className),
25
+ children: [/* @__PURE__ */ jsx("span", {
26
+ className: cn("min-w-0 truncate", !displayValue && "text-fg-caption-placeholder"),
27
+ children: displayValue || placeholder
28
+ }), /* @__PURE__ */ jsx(Icon, { className: cn("ml-2 shrink-0", disabled ? "text-fg-caption-placeholder" : "text-fg-secondary") })]
29
+ });
30
+ }
31
+ const responsivePickerTriggerSizes = {
32
+ base: pickerTriggerSizeVariants,
33
+ md: {
34
+ sm: "md:h-8 md:px-3 md:text-gdt-xs md:[&_svg]:size-3.5",
35
+ md: "md:h-10 md:px-3.5 md:text-gdt-sm md:[&_svg]:size-4",
36
+ lg: "md:h-12 md:px-4 md:text-gdt-md md:[&_svg]:size-4.5",
37
+ xl: "md:h-14 md:px-4.5 md:text-gdt-lg md:[&_svg]:size-5"
38
+ },
39
+ lg: {
40
+ sm: "lg:h-8 lg:px-3 lg:text-gdt-xs lg:[&_svg]:size-3.5",
41
+ md: "lg:h-10 lg:px-3.5 lg:text-gdt-sm lg:[&_svg]:size-4",
42
+ lg: "lg:h-12 lg:px-4 lg:text-gdt-md lg:[&_svg]:size-4.5",
43
+ xl: "lg:h-14 lg:px-4.5 lg:text-gdt-lg lg:[&_svg]:size-5"
44
+ }
45
+ };
46
+ function PickerFooter({ secondaryLabel, onSecondary, onApply }) {
47
+ return /* @__PURE__ */ jsxs("div", {
48
+ className: "flex w-full items-center justify-between border-t border-line-subtle px-4 py-3",
49
+ children: [/* @__PURE__ */ jsx(Button, {
50
+ variant: "tertiary-outline",
51
+ size: "sm",
52
+ onClick: onSecondary,
53
+ children: secondaryLabel
54
+ }), /* @__PURE__ */ jsx(Button, {
55
+ size: "sm",
56
+ onClick: onApply,
57
+ children: "Apply"
58
+ })]
59
+ });
60
+ }
61
+ //#endregion
62
+ export { PickerTrigger as n, PickerFooter as t };
@@ -0,0 +1,14 @@
1
+ import "./input-size-context-BMhves-J.js";
2
+ import { r as PopoverContent } from "./popover-CNymD33m.js";
3
+ import "./icons-C9JXR5Xv.js";
4
+ import * as React from "react";
5
+ //#region src/lib/picker.d.ts
6
+ /**
7
+ * Where a picker's panel goes. Every one of these is a preference the
8
+ * positioner is free to overrule when the panel would otherwise overflow —
9
+ * which is the point, a calendar being tall enough that the room below a
10
+ * trigger often isn't the room it needs.
11
+ */
12
+ type PickerPlacementProps = Pick<React.ComponentProps<typeof PopoverContent>, "side" | "sideOffset" | "align" | "alignOffset" | "collisionAvoidance">;
13
+ //#endregion
14
+ export { PickerPlacementProps as t };
@@ -1,4 +1,4 @@
1
- import { t as ComponentSize } from "./size-context-BX6kAdVj.js";
1
+ import { t as ComponentSize } from "./size-context-BVhHduLi.js";
2
2
  import { ChartConfig } from "./chart.js";
3
3
  import * as React from "react";
4
4
  import { Pie, PieChart as PieChart$1 } from "recharts";
package/dist/pie-chart.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { t as cn } from "./cn-BI_4DMBf.js";
2
+ import { cn } from "./utils/cn.js";
3
3
  import { SizeProvider, useComponentSize } from "./size-context.js";
4
4
  import { ChartContainer } from "./chart.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -0,0 +1,20 @@
1
+ import { t as ComponentSize } from "./size-context-BVhHduLi.js";
2
+ import * as React from "react";
3
+ import { Popover } from "@base-ui/react/popover";
4
+ //#region src/popover.d.ts
5
+ declare function Popover$1({ ...props }: Popover.Root.Props): React.JSX.Element;
6
+ declare function PopoverTrigger({ ...props }: Popover.Trigger.Props): React.JSX.Element;
7
+ type PopoverContentProps = Popover.Popup.Props & Pick<Popover.Positioner.Props, "align" | "alignOffset" | "collisionAvoidance" | "side" | "sideOffset"> & {
8
+ showArrow?: boolean;
9
+ size?: ComponentSize;
10
+ };
11
+ declare function PopoverContent({ className, align, alignOffset, collisionAvoidance, side, sideOffset, showArrow, size, children, ...props }: PopoverContentProps): React.JSX.Element;
12
+ declare function PopoverHeader({ className, border, ...props }: React.ComponentProps<"div"> & {
13
+ border?: boolean;
14
+ }): React.JSX.Element;
15
+ declare function PopoverBody({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
16
+ declare function PopoverFooter({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
17
+ declare function PopoverTitle({ className, ...props }: Popover.Title.Props): React.JSX.Element;
18
+ declare function PopoverDescription({ className, ...props }: Popover.Description.Props): React.JSX.Element;
19
+ //#endregion
20
+ export { PopoverFooter as a, PopoverTrigger as c, PopoverDescription as i, PopoverBody as n, PopoverHeader as o, PopoverContent as r, PopoverTitle as s, Popover$1 as t };
package/dist/popover.d.ts CHANGED
@@ -1,20 +1,2 @@
1
- import { t as ComponentSize } from "./size-context-BX6kAdVj.js";
2
- import * as React from "react";
3
- import { Popover as Popover$1 } from "@base-ui/react/popover";
4
- //#region src/popover.d.ts
5
- declare function Popover({ ...props }: Popover$1.Root.Props): React.JSX.Element;
6
- declare function PopoverTrigger({ ...props }: Popover$1.Trigger.Props): React.JSX.Element;
7
- type PopoverContentProps = Popover$1.Popup.Props & Pick<Popover$1.Positioner.Props, "align" | "alignOffset" | "collisionAvoidance" | "side" | "sideOffset"> & {
8
- showArrow?: boolean;
9
- size?: ComponentSize;
10
- };
11
- declare function PopoverContent({ className, align, alignOffset, collisionAvoidance, side, sideOffset, showArrow, size, children, ...props }: PopoverContentProps): React.JSX.Element;
12
- declare function PopoverHeader({ className, border, ...props }: React.ComponentProps<"div"> & {
13
- border?: boolean;
14
- }): React.JSX.Element;
15
- declare function PopoverBody({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
16
- declare function PopoverFooter({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
17
- declare function PopoverTitle({ className, ...props }: Popover$1.Title.Props): React.JSX.Element;
18
- declare function PopoverDescription({ className, ...props }: Popover$1.Description.Props): React.JSX.Element;
19
- //#endregion
1
+ import { a as PopoverFooter, c as PopoverTrigger, i as PopoverDescription, n as PopoverBody, o as PopoverHeader, r as PopoverContent, s as PopoverTitle, t as Popover } from "./popover-CNymD33m.js";
20
2
  export { Popover, PopoverBody, PopoverContent, PopoverDescription, PopoverFooter, PopoverHeader, PopoverTitle, PopoverTrigger };
package/dist/popover.js CHANGED
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { t as cn } from "./cn-BI_4DMBf.js";
2
+ import { cn } from "./utils/cn.js";
3
3
  import { SizeProvider } from "./size-context.js";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  import { Popover as Popover$1 } from "@base-ui/react/popover";
@@ -85,7 +85,7 @@ type PriceTagProps<TOption extends PriceTagCurrencyOption = PriceTagCurrencyOpti
85
85
  monthlyPaymentLabel?: string;
86
86
  };
87
87
  /**
88
- * Pill-shaped price display, optionally a trigger for a currency dropdown.
88
+ * Rounded-box price display, optionally a trigger for a currency dropdown.
89
89
  *
90
90
  * Display only: it prints `value` and `description` as given and never
91
91
  * composes a sentence, picks a format, or decides that a line is too small to