@giddaa-housing/ui 2.1.0 → 3.0.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 (50) hide show
  1. package/css/generated/shared.css +1 -1
  2. package/css/theme.css +24 -0
  3. package/dist/accordion.js +1 -1
  4. package/dist/{button-BZIeyUw6.d.ts → button-DW5OijoR.d.ts} +1 -1
  5. package/dist/button-group.d.ts +1 -1
  6. package/dist/button-group.js +2 -2
  7. package/dist/button.d.ts +1 -1
  8. package/dist/button.js +4 -3
  9. package/dist/call-card.d.ts +131 -0
  10. package/dist/call-card.js +300 -0
  11. package/dist/carousel.js +12 -9
  12. package/dist/chat.d.ts +208 -0
  13. package/dist/chat.js +528 -0
  14. package/dist/checkbox.js +1 -1
  15. package/dist/combobox.js +1 -1
  16. package/dist/cta.d.ts +1 -1
  17. package/dist/data-table.d.ts +1 -1
  18. package/dist/dialog.js +2 -2
  19. package/dist/dropdown-menu.js +1 -1
  20. package/dist/file-upload.js +3 -3
  21. package/dist/infinite-scroll.js +1 -1
  22. package/dist/infotip.js +1 -1
  23. package/dist/input-group.d.ts +1 -1
  24. package/dist/media-player.js +15 -8
  25. package/dist/message.d.ts +263 -0
  26. package/dist/message.js +524 -0
  27. package/dist/multi-step-form.js +10 -6
  28. package/dist/page-header.d.ts +6 -6
  29. package/dist/page-header.js +21 -7
  30. package/dist/pagination.d.ts +1 -1
  31. package/dist/popover.js +1 -1
  32. package/dist/price-tag.js +1 -1
  33. package/dist/property-listing-card.d.ts +1 -1
  34. package/dist/radio-group.js +1 -1
  35. package/dist/rich-text-editor.js +3 -3
  36. package/dist/select.js +1 -1
  37. package/dist/sheet.js +1 -1
  38. package/dist/sidebar.d.ts +1 -1
  39. package/dist/sidebar.js +5 -5
  40. package/dist/skeleton.js +1 -1
  41. package/dist/slider.js +3 -2
  42. package/dist/styles.css +1870 -162
  43. package/dist/switch.js +3 -3
  44. package/dist/tabs.js +2 -2
  45. package/dist/time-picker.js +85 -7
  46. package/dist/toast.js +1 -1
  47. package/dist/tooltip.d.ts +2 -1
  48. package/dist/tooltip.js +9 -2
  49. package/dist/use-reduced-motion-BDvOK14x.js +17 -0
  50. package/package.json +13 -1
package/dist/switch.js CHANGED
@@ -5,7 +5,7 @@ import { jsx } from "react/jsx-runtime";
5
5
  import { cva } from "class-variance-authority";
6
6
  import { Switch as Switch$1 } from "@base-ui/react/switch";
7
7
  //#region src/switch.tsx
8
- const switchVariants = cva("peer group/switch relative inline-flex shrink-0 items-center rounded-full border bg-clip-padding p-0.5 transition-[background-color,border-color,box-shadow,opacity] outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-line-focus focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] aria-invalid:border-line-danger aria-invalid:ring-3 aria-invalid:ring-line-danger/20 aria-invalid:focus-visible:border-line-danger aria-invalid:focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-danger)] data-checked:border-action-primary data-checked:bg-action-primary data-unchecked:border-line data-unchecked:bg-transparent data-[loading=true]:border-action-primary data-[loading=true]:bg-action-primary data-disabled:border-line-subtle! data-disabled:bg-transparent! data-disabled:cursor-not-allowed data-disabled:opacity-60 h-6 w-10 [--switch-spinner-size:0.75rem] [--switch-thumb-size:18px] [--switch-track-width:2.5rem] group-data-[size=sm]/field:h-5 group-data-[size=sm]/field:w-8 group-data-[size=sm]/field:[--switch-spinner-size:0.625rem] group-data-[size=sm]/field:[--switch-thumb-size:14px] group-data-[size=sm]/field:[--switch-track-width:2rem] group-data-[size=md]/field:h-6 group-data-[size=md]/field:w-10 group-data-[size=md]/field:[--switch-spinner-size:0.75rem] group-data-[size=md]/field:[--switch-thumb-size:18px] group-data-[size=md]/field:[--switch-track-width:2.5rem] group-data-[size=lg]/field:h-7 group-data-[size=lg]/field:w-12 group-data-[size=lg]/field:[--switch-spinner-size:0.875rem] group-data-[size=lg]/field:[--switch-thumb-size:22px] group-data-[size=lg]/field:[--switch-track-width:3rem]", { variants: { size: {
8
+ const switchVariants = cva("peer group/switch relative inline-flex shrink-0 items-center rounded-full border bg-clip-padding p-0.5 transition-[background-color,border-color,box-shadow,opacity,scale] duration-[var(--duration-motion-press)] ease-gdt-out active:scale-[0.97] motion-reduce:active:scale-100 outline-none after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:border-line-focus focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-focus)] aria-invalid:border-line-danger aria-invalid:ring-3 aria-invalid:ring-line-danger/20 aria-invalid:focus-visible:border-line-danger aria-invalid:focus-visible:shadow-[0px_0px_0px_2px_var(--color-line-danger)] data-checked:border-action-primary data-checked:bg-action-primary data-unchecked:border-line data-unchecked:bg-transparent data-[loading=true]:border-action-primary data-[loading=true]:bg-action-primary data-disabled:border-line-subtle! data-disabled:bg-transparent! data-disabled:cursor-not-allowed data-disabled:opacity-60 data-disabled:active:scale-100 h-6 w-10 [--switch-spinner-size:0.75rem] [--switch-thumb-size:18px] [--switch-track-width:2.5rem] group-data-[size=sm]/field:h-5 group-data-[size=sm]/field:w-8 group-data-[size=sm]/field:[--switch-spinner-size:0.625rem] group-data-[size=sm]/field:[--switch-thumb-size:14px] group-data-[size=sm]/field:[--switch-track-width:2rem] group-data-[size=md]/field:h-6 group-data-[size=md]/field:w-10 group-data-[size=md]/field:[--switch-spinner-size:0.75rem] group-data-[size=md]/field:[--switch-thumb-size:18px] group-data-[size=md]/field:[--switch-track-width:2.5rem] group-data-[size=lg]/field:h-7 group-data-[size=lg]/field:w-12 group-data-[size=lg]/field:[--switch-spinner-size:0.875rem] group-data-[size=lg]/field:[--switch-thumb-size:22px] group-data-[size=lg]/field:[--switch-track-width:3rem]", { variants: { size: {
9
9
  sm: "h-5 w-8 [--switch-spinner-size:0.625rem] [--switch-thumb-size:14px] [--switch-track-width:2rem]",
10
10
  md: "h-6 w-10 [--switch-spinner-size:0.75rem] [--switch-thumb-size:18px] [--switch-track-width:2.5rem]",
11
11
  lg: "h-7 w-12 [--switch-spinner-size:0.875rem] [--switch-thumb-size:22px] [--switch-track-width:3rem]"
@@ -38,11 +38,11 @@ function Switch({ className, disabled = false, loading = false, readOnly = false
38
38
  ...props,
39
39
  children: /* @__PURE__ */ jsx(Switch$1.Thumb, {
40
40
  "data-slot": "switch-thumb",
41
- className: cn("pointer-events-none grid size-(--switch-thumb-size) translate-x-0 place-items-center rounded-full bg-fg-on-brand text-fg-brand ring-0 transition-transform duration-200 ease-out data-checked:translate-x-[calc(var(--switch-track-width)-var(--switch-thumb-size)-4px)]", loading && "translate-x-[calc(var(--switch-track-width)-var(--switch-thumb-size)-4px)]", isDisabled && "translate-x-0! bg-line text-fg-caption-placeholder"),
41
+ className: cn("pointer-events-none grid size-(--switch-thumb-size) translate-x-0 place-items-center rounded-full bg-fg-on-brand text-fg-brand ring-0 transition-[translate] duration-200 ease-out motion-reduce:transition-none data-checked:translate-x-[calc(var(--switch-track-width)-var(--switch-thumb-size)-4px)]", loading && "translate-x-[calc(var(--switch-track-width)-var(--switch-thumb-size)-4px)]", isDisabled && "translate-x-0! bg-line text-fg-caption-placeholder"),
42
42
  children: loading && !isDisabled && /* @__PURE__ */ jsx("span", {
43
43
  "aria-hidden": "true",
44
44
  "data-slot": "switch-spinner",
45
- className: "size-(--switch-spinner-size) animate-spin rounded-full border-2 border-current border-r-transparent"
45
+ className: "size-(--switch-spinner-size) animate-spin rounded-full border-2 border-current border-r-transparent motion-reduce:animate-none"
46
46
  })
47
47
  })
48
48
  });
package/dist/tabs.js CHANGED
@@ -40,7 +40,7 @@ function TabsList({ className, variant = "underline", size, children, ...props }
40
40
  "data-size": resolvedSize,
41
41
  className: cn(tabsListVariants({ variant: resolvedVariant }), className),
42
42
  ...props,
43
- children: [children, /* @__PURE__ */ jsx(Tabs$1.Indicator, { className: cn("pointer-events-none absolute left-0 top-0 z-0 h-(--active-tab-height) w-(--active-tab-width) translate-x-(--active-tab-left) translate-y-(--active-tab-top) transition-[transform,width,height] duration-200 ease-in-out", "group-data-[variant=secondary]/tabs-list:hidden", "group-data-[variant=underline]/tabs-list:rounded-none group-data-[variant=underline]/tabs-list:bg-line-focus group-data-[variant=underline]/tabs-list:shadow-none", "group-data-[orientation=horizontal]/tabs:group-data-[variant=underline]/tabs-list:top-auto group-data-[orientation=horizontal]/tabs:group-data-[variant=underline]/tabs-list:bottom-[-1px] group-data-[orientation=horizontal]/tabs:group-data-[variant=underline]/tabs-list:h-0.5! group-data-[orientation=horizontal]/tabs:group-data-[variant=underline]/tabs-list:translate-y-0", "group-data-[orientation=vertical]/tabs:group-data-[variant=underline]/tabs-list:left-auto group-data-[orientation=vertical]/tabs:group-data-[variant=underline]/tabs-list:right-[-1px] group-data-[orientation=vertical]/tabs:group-data-[variant=underline]/tabs-list:w-0.5! group-data-[orientation=vertical]/tabs:group-data-[variant=underline]/tabs-list:translate-x-0") })]
43
+ children: [children, /* @__PURE__ */ jsx(Tabs$1.Indicator, { className: cn("pointer-events-none absolute left-0 top-0 z-0 h-(--active-tab-height) w-(--active-tab-width) translate-x-(--active-tab-left) translate-y-(--active-tab-top) transition-[translate,width,height] duration-200 ease-in-out motion-reduce:transition-none", "group-data-[variant=secondary]/tabs-list:hidden", "group-data-[variant=underline]/tabs-list:rounded-none group-data-[variant=underline]/tabs-list:bg-line-focus group-data-[variant=underline]/tabs-list:shadow-none", "group-data-[orientation=horizontal]/tabs:group-data-[variant=underline]/tabs-list:top-auto group-data-[orientation=horizontal]/tabs:group-data-[variant=underline]/tabs-list:bottom-[-1px] group-data-[orientation=horizontal]/tabs:group-data-[variant=underline]/tabs-list:h-0.5! group-data-[orientation=horizontal]/tabs:group-data-[variant=underline]/tabs-list:translate-y-0", "group-data-[orientation=vertical]/tabs:group-data-[variant=underline]/tabs-list:left-auto group-data-[orientation=vertical]/tabs:group-data-[variant=underline]/tabs-list:right-[-1px] group-data-[orientation=vertical]/tabs:group-data-[variant=underline]/tabs-list:w-0.5! group-data-[orientation=vertical]/tabs:group-data-[variant=underline]/tabs-list:translate-x-0") })]
44
44
  });
45
45
  }
46
46
  /**
@@ -99,7 +99,7 @@ function TabsCount({ className, count, abbreviate, max, loading, children, ...pr
99
99
  "data-slot": "tabs-count",
100
100
  "data-loading": loading || void 0,
101
101
  "aria-busy": loading || void 0,
102
- className: cn("inline-flex items-center justify-center rounded-full font-semibold leading-none transition-[background-color,color]", "group-data-[size=sm]/tabs-list:h-4 group-data-[size=sm]/tabs-list:min-w-4 group-data-[size=sm]/tabs-list:px-1 group-data-[size=sm]/tabs-list:text-[10px]", "group-data-[size=md]/tabs-list:h-5 group-data-[size=md]/tabs-list:min-w-5 group-data-[size=md]/tabs-list:px-1 group-data-[size=md]/tabs-list:text-[11px]", "group-data-[size=lg]/tabs-list:h-5 group-data-[size=lg]/tabs-list:min-w-5 group-data-[size=lg]/tabs-list:px-1.5 group-data-[size=lg]/tabs-list:text-gdt-xs", "group-data-[variant=underline]/tabs-list:bg-surface-raised group-data-[variant=underline]/tabs-list:text-fg-secondary group-data-[variant=underline]/tabs-list:group-data-[active]/tabs-trigger:bg-surface-brand-subtle group-data-[variant=underline]/tabs-list:group-data-[active]/tabs-trigger:text-fg-brand", "group-data-[variant=secondary]/tabs-list:bg-surface-overlay group-data-[variant=secondary]/tabs-list:text-fg-secondary group-data-[variant=secondary]/tabs-list:group-data-[active]/tabs-trigger:bg-surface-brand-subtle group-data-[variant=secondary]/tabs-list:group-data-[active]/tabs-trigger:text-fg-brand", "data-loading:animate-pulse", className),
102
+ className: cn("inline-flex items-center justify-center rounded-full font-semibold leading-none transition-[background-color,color]", "group-data-[size=sm]/tabs-list:h-4 group-data-[size=sm]/tabs-list:min-w-4 group-data-[size=sm]/tabs-list:px-1 group-data-[size=sm]/tabs-list:text-[10px]", "group-data-[size=md]/tabs-list:h-5 group-data-[size=md]/tabs-list:min-w-5 group-data-[size=md]/tabs-list:px-1 group-data-[size=md]/tabs-list:text-[11px]", "group-data-[size=lg]/tabs-list:h-5 group-data-[size=lg]/tabs-list:min-w-5 group-data-[size=lg]/tabs-list:px-1.5 group-data-[size=lg]/tabs-list:text-gdt-xs", "group-data-[variant=underline]/tabs-list:bg-surface-raised group-data-[variant=underline]/tabs-list:text-fg-secondary group-data-[variant=underline]/tabs-list:group-data-[active]/tabs-trigger:bg-surface-brand-subtle group-data-[variant=underline]/tabs-list:group-data-[active]/tabs-trigger:text-fg-brand", "group-data-[variant=secondary]/tabs-list:bg-surface-overlay group-data-[variant=secondary]/tabs-list:text-fg-secondary group-data-[variant=secondary]/tabs-list:group-data-[active]/tabs-trigger:bg-surface-brand-subtle group-data-[variant=secondary]/tabs-list:group-data-[active]/tabs-trigger:text-fg-brand", "data-loading:animate-pulse motion-reduce:data-loading:animate-none", className),
103
103
  ...props,
104
104
  children: content
105
105
  });
@@ -1,10 +1,37 @@
1
1
  "use client";
2
2
  import { t as cn } from "./cn-BI_4DMBf.js";
3
+ import { t as useReducedMotion } from "./use-reduced-motion-BDvOK14x.js";
3
4
  import { Popover, PopoverContent } from "./popover.js";
4
5
  import { n as PickerFooter, r as PickerTrigger, t as PICKER_COLLISION_AVOIDANCE } from "./picker-xSTzeYhc.js";
5
6
  import { ClockIcon } from "lucide-react";
6
7
  import { jsx, jsxs } from "react/jsx-runtime";
7
8
  import * as React from "react";
9
+ //#region src/lib/time-picker-paint.ts
10
+ function getPaintBounds(offset, itemCount, curveClamp) {
11
+ const bound = curveClamp + 1;
12
+ return {
13
+ low: Math.max(0, Math.floor(offset - bound)),
14
+ high: Math.min(itemCount - 1, Math.ceil(offset + bound))
15
+ };
16
+ }
17
+ function createRafScheduler(callback) {
18
+ let frame = null;
19
+ return {
20
+ schedule() {
21
+ if (frame !== null) return;
22
+ frame = requestAnimationFrame(() => {
23
+ frame = null;
24
+ callback();
25
+ });
26
+ },
27
+ cancel() {
28
+ if (frame === null) return;
29
+ cancelAnimationFrame(frame);
30
+ frame = null;
31
+ }
32
+ };
33
+ }
34
+ //#endregion
8
35
  //#region src/time-picker.tsx
9
36
  const ITEM_HEIGHT = 40;
10
37
  const VISIBLE_COUNT = 5;
@@ -56,18 +83,69 @@ function TimeColumn({ label, items, value, onChange }) {
56
83
  const isProgrammatic = React.useRef(false);
57
84
  const onChangeRef = React.useRef(onChange);
58
85
  onChangeRef.current = onChange;
86
+ const reducedMotion = useReducedMotion();
87
+ const reducedMotionRef = React.useRef(reducedMotion);
88
+ reducedMotionRef.current = reducedMotion;
89
+ const paintedIndexesRef = React.useRef(/* @__PURE__ */ new Set());
59
90
  const paintCurve = React.useCallback(() => {
60
91
  const el = scrollRef.current;
61
92
  if (!el) return;
62
93
  const offset = el.scrollTop / ITEM_HEIGHT;
63
- itemRefs.current.forEach((node, index) => {
64
- if (!node) return;
94
+ if (reducedMotionRef.current) {
95
+ const center = Math.round(offset);
96
+ const radius = Math.floor(VISIBLE_COUNT / 2);
97
+ const low = Math.max(0, center - radius);
98
+ const high = Math.min(itemRefs.current.length - 1, center + radius);
99
+ const nextPainted = /* @__PURE__ */ new Set();
100
+ for (let index = low; index <= high; index++) {
101
+ const node = itemRefs.current[index];
102
+ if (!node) continue;
103
+ node.style.opacity = index === center ? "1" : "0.55";
104
+ node.style.transform = "";
105
+ node.style.willChange = "";
106
+ nextPainted.add(index);
107
+ }
108
+ for (const index of paintedIndexesRef.current) {
109
+ if (nextPainted.has(index)) continue;
110
+ const node = itemRefs.current[index];
111
+ if (!node) continue;
112
+ node.style.opacity = "";
113
+ node.style.transform = "";
114
+ node.style.willChange = "";
115
+ }
116
+ paintedIndexesRef.current = nextPainted;
117
+ return;
118
+ }
119
+ const { low, high } = getPaintBounds(offset, itemRefs.current.length, CURVE_CLAMP);
120
+ const nextPainted = /* @__PURE__ */ new Set();
121
+ for (let index = low; index <= high; index++) {
122
+ const node = itemRefs.current[index];
123
+ if (!node) continue;
65
124
  const distance = index - offset;
66
125
  const abs = Math.min(Math.abs(distance), CURVE_CLAMP);
67
126
  const tilt = Math.max(Math.min(distance, CURVE_CLAMP), -3);
68
127
  node.style.opacity = String(Math.max(1 - abs * .28, .2));
69
128
  node.style.transform = `perspective(280px) rotateX(${tilt * -20}deg) scale(${1 - abs * .04})`;
70
- });
129
+ node.style.willChange = "transform, opacity";
130
+ nextPainted.add(index);
131
+ }
132
+ for (const index of paintedIndexesRef.current) {
133
+ if (nextPainted.has(index)) continue;
134
+ const node = itemRefs.current[index];
135
+ if (!node) continue;
136
+ node.style.opacity = "";
137
+ node.style.transform = "";
138
+ node.style.willChange = "";
139
+ }
140
+ paintedIndexesRef.current = nextPainted;
141
+ }, []);
142
+ const paintSchedulerRef = React.useRef(null);
143
+ if (!paintSchedulerRef.current) paintSchedulerRef.current = createRafScheduler(paintCurve);
144
+ const schedulePaintCurve = React.useCallback(() => {
145
+ paintSchedulerRef.current?.schedule();
146
+ }, []);
147
+ React.useEffect(() => {
148
+ return () => paintSchedulerRef.current?.cancel();
71
149
  }, []);
72
150
  React.useEffect(() => {
73
151
  const el = scrollRef.current;
@@ -88,7 +166,7 @@ function TimeColumn({ label, items, value, onChange }) {
88
166
  isProgrammatic.current = true;
89
167
  el.scrollTo({
90
168
  top: idx * ITEM_HEIGHT,
91
- behavior: "smooth"
169
+ behavior: reducedMotionRef.current ? "auto" : "smooth"
92
170
  });
93
171
  setTimeout(() => {
94
172
  isProgrammatic.current = false;
@@ -103,14 +181,14 @@ function TimeColumn({ label, items, value, onChange }) {
103
181
  onChangeRef.current(items[index]);
104
182
  el.scrollTo({
105
183
  top: index * ITEM_HEIGHT,
106
- behavior: "smooth"
184
+ behavior: reducedMotionRef.current ? "auto" : "smooth"
107
185
  });
108
186
  setTimeout(() => {
109
187
  isProgrammatic.current = false;
110
188
  }, 350);
111
189
  }
112
190
  function handleScroll() {
113
- paintCurve();
191
+ schedulePaintCurve();
114
192
  if (isProgrammatic.current) return;
115
193
  const el = scrollRef.current;
116
194
  if (!el) return;
@@ -150,7 +228,7 @@ function TimeColumn({ label, items, value, onChange }) {
150
228
  },
151
229
  onClick: () => selectIndex(index),
152
230
  style: { height: `${ITEM_HEIGHT}px` },
153
- className: "flex w-full cursor-pointer snap-center items-center justify-center select-none will-change-transform",
231
+ className: "flex w-full cursor-pointer snap-center items-center justify-center select-none",
154
232
  children: /* @__PURE__ */ jsx("span", {
155
233
  className: cn("text-gdt-sm font-medium transition-colors", dist === 0 ? "text-fg-on-brand" : dist === 1 ? "text-fg-secondary" : "text-fg-caption-placeholder"),
156
234
  children: item
package/dist/toast.js CHANGED
@@ -133,7 +133,7 @@ function ToastIcon({ type }) {
133
133
  ]
134
134
  });
135
135
  }
136
- const toastRootBaseClassName = "[--gap:12px] [--peek:12px] [--anchor-x:0px] [--anchor-y:0px] [--scale:calc(max(0,1-(var(--toast-placement-index)*0.04)))] [--shrink:calc(1-var(--scale))] [--height:var(--toast-placement-frontmost-height,var(--toast-height))] absolute z-[calc(1000-var(--toast-placement-index))] h-[var(--height)] min-h-[var(--height)] w-[min(335px,calc(100vw-32px))] overflow-visible rounded-lg border border-line bg-surface-overlay text-fg-primary shadow-[var(--elevation-e2-shadow)] pointer-events-auto select-none [transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)))_translateY(var(--collapsed-y))_scale(var(--scale))] [transition:transform_500ms_cubic-bezier(0.22,1,0.36,1),opacity_500ms,height_150ms] after:absolute after:left-0 after:h-[calc(var(--gap)+1px)] after:w-full after:pointer-events-auto after:content-[''] data-[expanded]:h-[var(--toast-height)] data-[expanded]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)))_translateY(var(--expanded-y))_scale(1)] data-[starting-style]:opacity-0 data-[starting-style]:[transform:translateX(var(--exit-x))_translateY(var(--exit-y))_scale(var(--scale))] data-[ending-style]:opacity-0 data-[limited]:opacity-0 [&[data-ending-style]:not([data-limited]):not([data-swipe-direction])]:[transform:translateX(var(--exit-x))_translateY(var(--exit-y))_scale(var(--scale))] data-[ending-style]:data-[swipe-direction=up]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)))_translateY(calc(var(--anchor-y)+var(--toast-swipe-movement-y)-150%))_scale(var(--scale))] data-[expanded]:data-[ending-style]:data-[swipe-direction=up]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)))_translateY(calc(var(--anchor-y)+var(--toast-swipe-movement-y)-150%))_scale(1)] data-[ending-style]:data-[swipe-direction=down]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)))_translateY(calc(var(--anchor-y)+var(--toast-swipe-movement-y)+150%))_scale(var(--scale))] data-[expanded]:data-[ending-style]:data-[swipe-direction=down]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)))_translateY(calc(var(--anchor-y)+var(--toast-swipe-movement-y)+150%))_scale(1)] data-[ending-style]:data-[swipe-direction=left]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)-150%))_translateY(var(--expanded-y))_scale(var(--scale))] data-[expanded]:data-[ending-style]:data-[swipe-direction=left]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)-150%))_translateY(var(--expanded-y))_scale(1)] data-[ending-style]:data-[swipe-direction=right]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)+150%))_translateY(var(--expanded-y))_scale(var(--scale))] data-[expanded]:data-[ending-style]:data-[swipe-direction=right]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)+150%))_translateY(var(--expanded-y))_scale(1)]";
136
+ const toastRootBaseClassName = "[--gap:12px] [--peek:12px] [--anchor-x:0px] [--anchor-y:0px] [--scale:calc(max(0,1-(var(--toast-placement-index)*0.04)))] [--shrink:calc(1-var(--scale))] [--height:var(--toast-placement-frontmost-height,var(--toast-height))] absolute z-[calc(1000-var(--toast-placement-index))] h-[var(--height)] min-h-[var(--height)] w-[min(335px,calc(100vw-32px))] overflow-visible rounded-lg border border-line bg-surface-overlay text-fg-primary shadow-[var(--elevation-e2-shadow)] pointer-events-auto select-none [transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)))_translateY(var(--collapsed-y))_scale(var(--scale))] [transition:transform_var(--duration-motion-surface)_var(--ease-gdt-out),opacity_var(--duration-motion-surface)_var(--ease-gdt-out)] motion-reduce:[transition:opacity_var(--duration-motion-surface)_var(--ease-gdt-out)] data-swiping:transition-none after:absolute after:left-0 after:h-[calc(var(--gap)+1px)] after:w-full after:pointer-events-auto after:content-[''] data-[expanded]:h-[var(--toast-height)] data-[expanded]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)))_translateY(var(--expanded-y))_scale(1)] data-[starting-style]:opacity-0 data-[starting-style]:[transform:translateX(var(--exit-x))_translateY(var(--exit-y))_scale(var(--scale))] data-[ending-style]:opacity-0 data-[limited]:opacity-0 [&[data-ending-style]:not([data-limited]):not([data-swipe-direction])]:[transform:translateX(var(--exit-x))_translateY(var(--exit-y))_scale(var(--scale))] data-[ending-style]:data-[swipe-direction=up]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)))_translateY(calc(var(--anchor-y)+var(--toast-swipe-movement-y)-150%))_scale(var(--scale))] data-[expanded]:data-[ending-style]:data-[swipe-direction=up]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)))_translateY(calc(var(--anchor-y)+var(--toast-swipe-movement-y)-150%))_scale(1)] data-[ending-style]:data-[swipe-direction=down]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)))_translateY(calc(var(--anchor-y)+var(--toast-swipe-movement-y)+150%))_scale(var(--scale))] data-[expanded]:data-[ending-style]:data-[swipe-direction=down]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)))_translateY(calc(var(--anchor-y)+var(--toast-swipe-movement-y)+150%))_scale(1)] data-[ending-style]:data-[swipe-direction=left]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)-150%))_translateY(var(--expanded-y))_scale(var(--scale))] data-[expanded]:data-[ending-style]:data-[swipe-direction=left]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)-150%))_translateY(var(--expanded-y))_scale(1)] data-[ending-style]:data-[swipe-direction=right]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)+150%))_translateY(var(--expanded-y))_scale(var(--scale))] data-[expanded]:data-[ending-style]:data-[swipe-direction=right]:[transform:translateX(calc(var(--anchor-x)+var(--toast-swipe-movement-x,0px)+150%))_translateY(var(--expanded-y))_scale(1)]";
137
137
  function getToastPlacement(item, isRtl = false) {
138
138
  const side = item.positionerProps?.side ?? DEFAULT_TOAST_SIDE;
139
139
  const align = item.positionerProps?.align ?? DEFAULT_TOAST_ALIGN;
package/dist/tooltip.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Tooltip as Tooltip$1 } from "@base-ui/react/tooltip";
2
2
  //#region src/tooltip.d.ts
3
+ declare function TooltipProvider({ delay, timeout, ...props }: Tooltip$1.Provider.Props): import("react").JSX.Element;
3
4
  declare function Tooltip({ ...props }: Tooltip$1.Root.Props): import("react").JSX.Element;
4
5
  declare function TooltipTrigger({ ...props }: Tooltip$1.Trigger.Props): import("react").JSX.Element;
5
6
  type TooltipContentProps = Tooltip$1.Popup.Props & Pick<Tooltip$1.Positioner.Props, "align" | "alignOffset" | "side" | "sideOffset"> & Pick<Tooltip$1.Portal.Props, "container"> & {
@@ -7,4 +8,4 @@ type TooltipContentProps = Tooltip$1.Popup.Props & Pick<Tooltip$1.Positioner.Pro
7
8
  };
8
9
  declare function TooltipContent({ className, container, side, sideOffset, align, alignOffset, showArrow, children, ...props }: TooltipContentProps): import("react").JSX.Element;
9
10
  //#endregion
10
- export { Tooltip, TooltipContent, TooltipTrigger };
11
+ export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
package/dist/tooltip.js CHANGED
@@ -3,6 +3,13 @@ import { t as cn } from "./cn-BI_4DMBf.js";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
4
  import { Tooltip as Tooltip$1 } from "@base-ui/react/tooltip";
5
5
  //#region src/tooltip.tsx
6
+ function TooltipProvider({ delay = 100, timeout = 400, ...props }) {
7
+ return /* @__PURE__ */ jsx(Tooltip$1.Provider, {
8
+ delay,
9
+ timeout,
10
+ ...props
11
+ });
12
+ }
6
13
  function Tooltip({ ...props }) {
7
14
  return /* @__PURE__ */ jsx(Tooltip$1.Root, {
8
15
  "data-slot": "tooltip",
@@ -27,7 +34,7 @@ function TooltipContent({ className, container, side = "top", sideOffset = 6, al
27
34
  className: "pointer-events-none isolate z-50",
28
35
  children: /* @__PURE__ */ jsxs(Tooltip$1.Popup, {
29
36
  "data-slot": "tooltip-content",
30
- className: cn("z-50 relative inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-[6px] border border-line bg-surface-overlay px-3 py-2 text-gdt-sm font-medium text-fg-primary shadow-2 duration-100 has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className),
37
+ className: cn("z-50 relative inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-[6px] border border-line bg-surface-overlay px-3 py-2 text-gdt-sm font-medium text-fg-primary shadow-2 transition-[opacity,scale,translate] duration-[var(--duration-motion-tooltip)] ease-gdt-out has-data-[slot=kbd]:pr-1.5 data-instant:transition-none data-starting-style:opacity-0 data-starting-style:scale-95 data-ending-style:opacity-0 data-ending-style:scale-95 data-[side=bottom]:data-starting-style:translate-y-2 data-[side=bottom]:data-ending-style:translate-y-2 data-[side=top]:data-starting-style:-translate-y-2 data-[side=top]:data-ending-style:-translate-y-2 data-[side=left]:data-starting-style:translate-x-2 data-[side=left]:data-ending-style:translate-x-2 data-[side=right]:data-starting-style:-translate-x-2 data-[side=right]:data-ending-style:-translate-x-2 data-[side=inline-end]:data-starting-style:-translate-x-2 data-[side=inline-end]:data-ending-style:-translate-x-2 data-[side=inline-start]:data-starting-style:translate-x-2 data-[side=inline-start]:data-ending-style:translate-x-2 motion-reduce:data-starting-style:scale-100 motion-reduce:data-ending-style:scale-100 motion-reduce:data-[side=bottom]:data-starting-style:translate-y-0 motion-reduce:data-[side=bottom]:data-ending-style:translate-y-0 motion-reduce:data-[side=top]:data-starting-style:translate-y-0 motion-reduce:data-[side=top]:data-ending-style:translate-y-0 motion-reduce:data-[side=left]:data-starting-style:translate-x-0 motion-reduce:data-[side=left]:data-ending-style:translate-x-0 motion-reduce:data-[side=right]:data-starting-style:translate-x-0 motion-reduce:data-[side=right]:data-ending-style:translate-x-0 motion-reduce:data-[side=inline-end]:data-starting-style:translate-x-0 motion-reduce:data-[side=inline-end]:data-ending-style:translate-x-0 motion-reduce:data-[side=inline-start]:data-starting-style:translate-x-0 motion-reduce:data-[side=inline-start]:data-ending-style:translate-x-0 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm", className),
31
38
  ...props,
32
39
  children: [children, showArrow ? /* @__PURE__ */ jsx(Tooltip$1.Arrow, { className: "relative block w-3 h-1.5 overflow-clip data-[side=bottom]:top-[-6px] data-[side=left]:right-[-9px] data-[side=left]:rotate-90 data-[side=right]:left-[-9px] data-[side=right]:-rotate-90 data-[side=top]:bottom-[-6px] data-[side=top]:rotate-180 before:content-[''] before:absolute before:bottom-0 before:left-1/2 before:w-[calc(6px*sqrt(2))] before:h-[calc(6px*sqrt(2))] before:bg-surface-overlay before:border before:border-line before:[transform:translate(-50%,50%)_rotate(45deg)]" }) : null]
33
40
  })
@@ -35,4 +42,4 @@ function TooltipContent({ className, container, side = "top", sideOffset = 6, al
35
42
  });
36
43
  }
37
44
  //#endregion
38
- export { Tooltip, TooltipContent, TooltipTrigger };
45
+ export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
@@ -0,0 +1,17 @@
1
+ import * as React from "react";
2
+ //#region src/lib/use-reduced-motion.ts
3
+ const QUERY = "(prefers-reduced-motion: reduce)";
4
+ function subscribeToReducedMotion(onChange) {
5
+ const media = window.matchMedia(QUERY);
6
+ const update = () => onChange(media.matches);
7
+ update();
8
+ media.addEventListener("change", update);
9
+ return () => media.removeEventListener("change", update);
10
+ }
11
+ function useReducedMotion() {
12
+ const [reduced, setReduced] = React.useState(false);
13
+ React.useEffect(() => subscribeToReducedMotion(setReduced), []);
14
+ return reduced;
15
+ }
16
+ //#endregion
17
+ export { useReducedMotion as t };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@giddaa-housing/ui",
3
- "version": "2.1.0",
3
+ "version": "3.0.0",
4
4
  "description": "Giddaa reusable UI component library.",
5
5
  "type": "module",
6
6
  "private": false,
@@ -65,6 +65,10 @@
65
65
  "types": "./dist/calendar.d.ts",
66
66
  "import": "./dist/calendar.js"
67
67
  },
68
+ "./call-card": {
69
+ "types": "./dist/call-card.d.ts",
70
+ "import": "./dist/call-card.js"
71
+ },
68
72
  "./card": {
69
73
  "types": "./dist/card.d.ts",
70
74
  "import": "./dist/card.js"
@@ -77,6 +81,10 @@
77
81
  "types": "./dist/chart.d.ts",
78
82
  "import": "./dist/chart.js"
79
83
  },
84
+ "./chat": {
85
+ "types": "./dist/chat.d.ts",
86
+ "import": "./dist/chat.js"
87
+ },
80
88
  "./checkbox": {
81
89
  "types": "./dist/checkbox.d.ts",
82
90
  "import": "./dist/checkbox.js"
@@ -217,6 +225,10 @@
217
225
  "types": "./dist/media-player.d.ts",
218
226
  "import": "./dist/media-player.js"
219
227
  },
228
+ "./message": {
229
+ "types": "./dist/message.d.ts",
230
+ "import": "./dist/message.js"
231
+ },
220
232
  "./multi-step-form": {
221
233
  "types": "./dist/multi-step-form.d.ts",
222
234
  "import": "./dist/multi-step-form.js"