@devalok/shilp-sutra 0.48.0 → 0.49.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 (185) hide show
  1. package/BREAKING.json +32 -0
  2. package/MIGRATION.md +891 -881
  3. package/dist/_chunks/badge-group.js +50 -63
  4. package/dist/_chunks/badge-group.js.map +1 -1
  5. package/dist/_chunks/chat.js +1 -1
  6. package/dist/_chunks/chat.js.map +1 -1
  7. package/dist/_chunks/field-state.js +8 -0
  8. package/dist/_chunks/field-state.js.map +1 -0
  9. package/dist/_chunks/popover.js +50 -47
  10. package/dist/_chunks/popover.js.map +1 -1
  11. package/dist/_chunks/primitives.js +155 -155
  12. package/dist/_chunks/primitives.js.map +1 -1
  13. package/dist/_chunks/shared.js +4 -4
  14. package/dist/_chunks/tiptap.js +10 -10
  15. package/dist/_chunks/use-calendar.js +1 -1
  16. package/dist/_chunks/use-calendar.js.map +1 -1
  17. package/dist/_chunks/use-controllable-open.js +15 -0
  18. package/dist/_chunks/use-controllable-open.js.map +1 -0
  19. package/dist/composed/command-palette.js +3 -3
  20. package/dist/composed/command-palette.js.map +1 -1
  21. package/dist/composed/confirm-dialog.js +3 -3
  22. package/dist/composed/confirm-dialog.js.map +1 -1
  23. package/dist/composed/date-picker/index.js +3 -3
  24. package/dist/composed/date-picker/index.js.map +1 -1
  25. package/dist/composed/error-boundary.js +1 -1
  26. package/dist/composed/error-boundary.js.map +1 -1
  27. package/dist/composed/index.d.ts +3 -1
  28. package/dist/composed/index.d.ts.map +1 -1
  29. package/dist/composed/index.js +4 -3
  30. package/dist/composed/loading-skeleton.js +15 -15
  31. package/dist/composed/loading-skeleton.js.map +1 -1
  32. package/dist/composed/page-header.d.ts.map +1 -1
  33. package/dist/composed/page-header.js +32 -45
  34. package/dist/composed/page-header.js.map +1 -1
  35. package/dist/composed/page-skeletons.js +19 -19
  36. package/dist/composed/page-skeletons.js.map +1 -1
  37. package/dist/composed/responsive-modal.d.ts +39 -0
  38. package/dist/composed/responsive-modal.d.ts.map +1 -0
  39. package/dist/composed/responsive-modal.js +212 -0
  40. package/dist/composed/responsive-modal.js.map +1 -0
  41. package/dist/composed/rich-chat-input.js +4 -4
  42. package/dist/composed/rich-text-editor.js +1 -1
  43. package/dist/composed/rich-text-editor.js.map +1 -1
  44. package/dist/composed/schedule-view.d.ts +1 -1
  45. package/dist/composed/schedule-view.d.ts.map +1 -1
  46. package/dist/composed/schedule-view.js +48 -54
  47. package/dist/composed/schedule-view.js.map +1 -1
  48. package/dist/composed/status-badge.d.ts +13 -11
  49. package/dist/composed/status-badge.d.ts.map +1 -1
  50. package/dist/composed/status-badge.js +54 -130
  51. package/dist/composed/status-badge.js.map +1 -1
  52. package/dist/shell/bottom-navbar.js +1 -1
  53. package/dist/shell/bottom-navbar.js.map +1 -1
  54. package/dist/shell/top-bar.js +1 -1
  55. package/dist/shell/top-bar.js.map +1 -1
  56. package/dist/tokens/semantic.css +8 -1
  57. package/dist/ui/accordion.js +9 -9
  58. package/dist/ui/alert-dialog.js +26 -26
  59. package/dist/ui/aspect-ratio.js +1 -1
  60. package/dist/ui/autocomplete.js +7 -7
  61. package/dist/ui/avatar.d.ts.map +1 -1
  62. package/dist/ui/avatar.js +87 -82
  63. package/dist/ui/avatar.js.map +1 -1
  64. package/dist/ui/badge.d.ts.map +1 -1
  65. package/dist/ui/breadcrumb.d.ts +0 -1
  66. package/dist/ui/breadcrumb.d.ts.map +1 -1
  67. package/dist/ui/breadcrumb.js +58 -35
  68. package/dist/ui/breadcrumb.js.map +1 -1
  69. package/dist/ui/button.js +3 -3
  70. package/dist/ui/checkbox.d.ts +4 -2
  71. package/dist/ui/checkbox.d.ts.map +1 -1
  72. package/dist/ui/checkbox.js +33 -28
  73. package/dist/ui/checkbox.js.map +1 -1
  74. package/dist/ui/collapsible.js +4 -4
  75. package/dist/ui/combobox.d.ts +3 -0
  76. package/dist/ui/combobox.d.ts.map +1 -1
  77. package/dist/ui/combobox.js +137 -132
  78. package/dist/ui/combobox.js.map +1 -1
  79. package/dist/ui/context-menu.js +46 -46
  80. package/dist/ui/dialog.d.ts.map +1 -1
  81. package/dist/ui/dialog.js +53 -50
  82. package/dist/ui/dialog.js.map +1 -1
  83. package/dist/ui/dot.d.ts +38 -0
  84. package/dist/ui/dot.d.ts.map +1 -0
  85. package/dist/ui/dot.js +92 -0
  86. package/dist/ui/dot.js.map +1 -0
  87. package/dist/ui/dropdown-menu.d.ts.map +1 -1
  88. package/dist/ui/dropdown-menu.js +70 -65
  89. package/dist/ui/dropdown-menu.js.map +1 -1
  90. package/dist/ui/hover-card.js +11 -11
  91. package/dist/ui/index.d.ts +3 -2
  92. package/dist/ui/index.d.ts.map +1 -1
  93. package/dist/ui/index.js +67 -67
  94. package/dist/ui/index.js.map +1 -1
  95. package/dist/ui/input-otp.js +1 -1
  96. package/dist/ui/input-otp.js.map +1 -1
  97. package/dist/ui/input.d.ts +4 -2
  98. package/dist/ui/input.d.ts.map +1 -1
  99. package/dist/ui/input.js +38 -37
  100. package/dist/ui/input.js.map +1 -1
  101. package/dist/ui/label.js +1 -1
  102. package/dist/ui/lib/field-state.d.ts +21 -0
  103. package/dist/ui/lib/field-state.d.ts.map +1 -0
  104. package/dist/ui/lib/use-controllable-open.d.ts +32 -0
  105. package/dist/ui/lib/use-controllable-open.d.ts.map +1 -0
  106. package/dist/ui/link.js +1 -1
  107. package/dist/ui/number-input.d.ts +4 -2
  108. package/dist/ui/number-input.d.ts.map +1 -1
  109. package/dist/ui/number-input.js +51 -50
  110. package/dist/ui/number-input.js.map +1 -1
  111. package/dist/ui/pagination.js +1 -1
  112. package/dist/ui/popover.d.ts.map +1 -1
  113. package/dist/ui/progress.d.ts +66 -42
  114. package/dist/ui/progress.d.ts.map +1 -1
  115. package/dist/ui/progress.js +144 -40
  116. package/dist/ui/progress.js.map +1 -1
  117. package/dist/ui/radio.d.ts +6 -2
  118. package/dist/ui/radio.d.ts.map +1 -1
  119. package/dist/ui/radio.js +44 -33
  120. package/dist/ui/radio.js.map +1 -1
  121. package/dist/ui/select.d.ts +1 -1
  122. package/dist/ui/select.d.ts.map +1 -1
  123. package/dist/ui/select.js +58 -57
  124. package/dist/ui/select.js.map +1 -1
  125. package/dist/ui/separator.js +2 -2
  126. package/dist/ui/separator.js.map +1 -1
  127. package/dist/ui/sheet.d.ts.map +1 -1
  128. package/dist/ui/sheet.js +59 -56
  129. package/dist/ui/sheet.js.map +1 -1
  130. package/dist/ui/sidebar.js +5 -5
  131. package/dist/ui/sidebar.js.map +1 -1
  132. package/dist/ui/slider.js +6 -6
  133. package/dist/ui/slider.js.map +1 -1
  134. package/dist/ui/stat-card.d.ts.map +1 -1
  135. package/dist/ui/stat-card.js +122 -125
  136. package/dist/ui/stat-card.js.map +1 -1
  137. package/dist/ui/surface.js +1 -1
  138. package/dist/ui/switch.d.ts +3 -1
  139. package/dist/ui/switch.d.ts.map +1 -1
  140. package/dist/ui/switch.js +32 -27
  141. package/dist/ui/switch.js.map +1 -1
  142. package/dist/ui/textarea.d.ts +3 -3
  143. package/dist/ui/textarea.d.ts.map +1 -1
  144. package/dist/ui/textarea.js +18 -17
  145. package/dist/ui/textarea.js.map +1 -1
  146. package/dist/ui/toast.js +2 -2
  147. package/dist/ui/toast.js.map +1 -1
  148. package/dist/ui/toggle-group.js +1 -1
  149. package/dist/ui/toggle.js +1 -1
  150. package/dist/ui/tooltip.d.ts.map +1 -1
  151. package/dist/ui/tooltip.js +36 -33
  152. package/dist/ui/tooltip.js.map +1 -1
  153. package/docs/components/ai/ai-command-provider.md +46 -0
  154. package/docs/components/ai/block-renderer.md +59 -0
  155. package/docs/components/ai/command-bar.md +78 -0
  156. package/docs/components/ai/conversation.md +59 -0
  157. package/docs/components/ai/devadoot-icon.md +41 -0
  158. package/docs/components/composed/page-header.md +1 -1
  159. package/docs/components/composed/responsive-modal.md +66 -0
  160. package/docs/components/composed/schedule-view.md +6 -2
  161. package/docs/components/ui/breadcrumb.md +1 -1
  162. package/docs/components/ui/checkbox.md +4 -1
  163. package/docs/components/ui/combobox.md +4 -0
  164. package/docs/components/ui/dot.md +61 -0
  165. package/docs/components/ui/progress.md +54 -16
  166. package/docs/components/ui/radio.md +6 -2
  167. package/docs/components/ui/select.md +9 -5
  168. package/docs/components/ui/switch.md +4 -1
  169. package/docs/components/ui/table.md +2 -1
  170. package/llms.txt +11 -3
  171. package/make-kit/components/form.md +2 -2
  172. package/make-kit/components/icon.md +2 -2
  173. package/make-kit/components/overview.md +2 -2
  174. package/make-kit/components/select.md +1 -1
  175. package/make-kit/components/table.md +1 -1
  176. package/mcp-manifest.json +2656 -1068
  177. package/mcp-manifest.schema.json +18 -0
  178. package/package.json +11 -6
  179. package/skill/SKILL.md +1 -1
  180. package/skill/references/components.md +11 -3
  181. package/dist/ui/status-dot.d.ts +0 -27
  182. package/dist/ui/status-dot.d.ts.map +0 -1
  183. package/dist/ui/status-dot.js +0 -68
  184. package/dist/ui/status-dot.js.map +0 -1
  185. package/docs/components/ui/status-dot.md +0 -35
@@ -1,54 +1,41 @@
1
1
  import { cn as e } from "../ui/lib/utils.js";
2
- import * as t from "react";
3
- import { jsx as n, jsxs as r } from "react/jsx-runtime";
2
+ import { Breadcrumb as t, BreadcrumbItem as n, BreadcrumbLink as r, BreadcrumbList as i, BreadcrumbPage as a, BreadcrumbSeparator as o } from "../ui/breadcrumb.js";
3
+ import * as s from "react";
4
+ import { jsx as c, jsxs as l } from "react/jsx-runtime";
4
5
  //#region src/composed/page-header.tsx
5
- var i = t.forwardRef(({ title: i, subtitle: a, actions: o, breadcrumbs: s, titleClassName: c, className: l, ...u }, d) => {
6
- let f = i ?? s?.[s.length - 1]?.label ?? "";
7
- return /* @__PURE__ */ r("div", {
8
- ref: d,
9
- className: e("flex flex-col gap-ds-05 border-b border-surface-border-strong pb-ds-06", l),
10
- ...u,
11
- children: [s && s.length > 0 && /* @__PURE__ */ n("nav", {
12
- "aria-label": "Breadcrumb",
13
- className: "flex items-center gap-ds-02b",
14
- children: s.map((i, a) => /* @__PURE__ */ r(t.Fragment, { children: [a > 0 && /* @__PURE__ */ n("svg", {
15
- width: 16,
16
- height: 16,
17
- viewBox: "0 0 24 24",
18
- fill: "none",
19
- stroke: "currentColor",
20
- strokeWidth: 1.5,
21
- strokeLinecap: "round",
22
- strokeLinejoin: "round",
23
- "aria-hidden": "true",
24
- className: "text-surface-fg-subtle",
25
- children: /* @__PURE__ */ n("path", { d: "M9 6l6 6l-6 6" })
26
- }), i.href ? /* @__PURE__ */ n("a", {
27
- href: i.href,
28
- className: "text-ds-sm text-surface-fg-subtle transition-colors hover:text-surface-fg-muted focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 rounded-control-inner",
29
- children: i.label
30
- }) : /* @__PURE__ */ n("span", {
31
- className: e("text-ds-sm", a === s.length - 1 ? "text-surface-fg" : "text-surface-fg-subtle"),
32
- children: i.label
33
- })] }, a))
34
- }), (f || a || o) && /* @__PURE__ */ r("div", {
35
- className: "flex items-start justify-between gap-ds-05",
36
- children: [/* @__PURE__ */ r("div", {
37
- className: "flex flex-col gap-ds-02b",
38
- children: [f && /* @__PURE__ */ n("h1", {
39
- className: e("text-ds-2xl font-semibold text-surface-fg", c),
40
- children: f
41
- }), a && /* @__PURE__ */ n("p", {
6
+ var u = s.forwardRef(({ title: u, subtitle: d, actions: f, breadcrumbs: p, titleClassName: m, className: h, ...g }, _) => {
7
+ let v = u ?? p?.[p.length - 1]?.label ?? "";
8
+ return /* @__PURE__ */ l("div", {
9
+ ref: _,
10
+ className: e("flex flex-col gap-ds-05 border-b border-surface-border-strong pb-ds-06", h),
11
+ ...g,
12
+ children: [p && p.length > 0 && /* @__PURE__ */ c(t, {
13
+ className: "text-ds-sm",
14
+ children: /* @__PURE__ */ c(i, { children: p.map((e, t) => {
15
+ let i = t === p.length - 1;
16
+ return /* @__PURE__ */ l(s.Fragment, { children: [t > 0 && /* @__PURE__ */ c(o, {}), /* @__PURE__ */ c(n, { children: e.href && !i ? /* @__PURE__ */ c(r, {
17
+ href: e.href,
18
+ children: e.label
19
+ }) : /* @__PURE__ */ c(a, { children: e.label }) })] }, t);
20
+ }) })
21
+ }), (v || d || f) && /* @__PURE__ */ l("div", {
22
+ className: "flex flex-wrap items-start justify-between gap-ds-05",
23
+ children: [/* @__PURE__ */ l("div", {
24
+ className: "flex min-w-0 flex-col gap-ds-02b",
25
+ children: [v && /* @__PURE__ */ c("h1", {
26
+ className: e("text-ds-2xl font-semibold text-surface-fg", m),
27
+ children: v
28
+ }), d && /* @__PURE__ */ c("p", {
42
29
  className: "text-ds-md text-surface-fg-subtle line-clamp-2",
43
- children: a
30
+ children: d
44
31
  })]
45
- }), o && /* @__PURE__ */ n("div", {
46
- className: "flex shrink-0 items-center gap-ds-03",
47
- children: o
32
+ }), f && /* @__PURE__ */ c("div", {
33
+ className: "flex flex-wrap items-center gap-ds-03",
34
+ children: f
48
35
  })]
49
36
  })]
50
37
  });
51
38
  });
52
- i.displayName = "PageHeader";
39
+ u.displayName = "PageHeader";
53
40
  //#endregion
54
- export { i as PageHeader };
41
+ export { u as PageHeader };
@@ -1 +1 @@
1
- {"version":3,"file":"page-header.js","names":[],"sources":["../../src/composed/page-header.tsx"],"sourcesContent":["// @server-safe\nimport * as React from 'react'\n\nimport { cn } from '../ui/lib/utils'\n\nexport interface Breadcrumb {\n label: string\n href?: string\n}\n\nexport interface PageHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n title?: string\n subtitle?: string\n actions?: React.ReactNode\n breadcrumbs?: Breadcrumb[]\n titleClassName?: string\n}\n\nconst PageHeader = React.forwardRef<HTMLDivElement, PageHeaderProps>(\n (\n { title, subtitle, actions, breadcrumbs, titleClassName, className, ...props },\n ref,\n ) => {\n const resolvedTitle =\n title ?? breadcrumbs?.[breadcrumbs.length - 1]?.label ?? ''\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-col gap-ds-05 border-b border-surface-border-strong pb-ds-06',\n className,\n )}\n {...props}\n >\n {breadcrumbs && breadcrumbs.length > 0 && (\n <nav aria-label=\"Breadcrumb\" className=\"flex items-center gap-ds-02b\">\n {breadcrumbs.map((crumb, index) => (\n <React.Fragment key={index}>\n {index > 0 && (\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"text-surface-fg-subtle\"\n >\n <path d=\"M9 6l6 6l-6 6\" />\n </svg>\n )}\n {crumb.href ? (\n <a\n href={crumb.href}\n className=\"text-ds-sm text-surface-fg-subtle transition-colors hover:text-surface-fg-muted focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 rounded-control-inner\"\n >\n {crumb.label}\n </a>\n ) : (\n <span\n className={cn(\n 'text-ds-sm',\n index === breadcrumbs.length - 1\n ? 'text-surface-fg'\n : 'text-surface-fg-subtle',\n )}\n >\n {crumb.label}\n </span>\n )}\n </React.Fragment>\n ))}\n </nav>\n )}\n\n {(resolvedTitle || subtitle || actions) && (\n <div className=\"flex items-start justify-between gap-ds-05\">\n <div className=\"flex flex-col gap-ds-02b\">\n {resolvedTitle && (\n <h1\n className={cn(\n 'text-ds-2xl font-semibold text-surface-fg',\n titleClassName,\n )}\n >\n {resolvedTitle}\n </h1>\n )}\n {subtitle && (\n <p className=\"text-ds-md text-surface-fg-subtle line-clamp-2\">\n {subtitle}\n </p>\n )}\n </div>\n\n {actions && (\n <div className=\"flex shrink-0 items-center gap-ds-03\">{actions}</div>\n )}\n </div>\n )}\n </div>\n )\n },\n)\nPageHeader.displayName = 'PageHeader'\n\nexport { PageHeader }\n"],"mappings":";;;;AAkBA,IAAM,IAAa,EAAM,YAErB,EAAE,UAAO,aAAU,YAAS,gBAAa,mBAAgB,cAAW,GAAG,KACvE,MACG;CACH,IAAM,IACJ,KAAS,IAAc,EAAY,SAAS,IAAI,SAAS;AAE3D,QACE,kBAAC,OAAD;EACO;EACL,WAAW,EACT,0EACA,EACD;EACD,GAAI;YANN,CAQG,KAAe,EAAY,SAAS,KACnC,kBAAC,OAAD;GAAK,cAAW;GAAa,WAAU;aACpC,EAAY,KAAK,GAAO,MACvB,kBAAC,EAAM,UAAP,EAAA,UAAA,CACG,IAAQ,KACP,kBAAC,OAAD;IACE,OAAO;IACP,QAAQ;IACR,SAAQ;IACR,MAAK;IACL,QAAO;IACP,aAAa;IACb,eAAc;IACd,gBAAe;IACf,eAAY;IACZ,WAAU;cAEV,kBAAC,QAAD,EAAM,GAAE,iBAAkB,CAAA;IACtB,CAAA,EAEP,EAAM,OACL,kBAAC,KAAD;IACE,MAAM,EAAM;IACZ,WAAU;cAET,EAAM;IACL,CAAA,GAEJ,kBAAC,QAAD;IACE,WAAW,EACT,cACA,MAAU,EAAY,SAAS,IAC3B,oBACA,yBACL;cAEA,EAAM;IACF,CAAA,CAEM,EAAA,EApCI,EAoCJ,CACjB;GACE,CAAA,GAGN,KAAiB,KAAY,MAC7B,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,KACC,kBAAC,MAAD;KACE,WAAW,EACT,6CACA,EACD;eAEA;KACE,CAAA,EAEN,KACC,kBAAC,KAAD;KAAG,WAAU;eACV;KACC,CAAA,CAEF;OAEL,KACC,kBAAC,OAAD;IAAK,WAAU;cAAwC;IAAc,CAAA,CAEnE;KAEJ;;EAGX;AACD,EAAW,cAAc"}
1
+ {"version":3,"file":"page-header.js","names":[],"sources":["../../src/composed/page-header.tsx"],"sourcesContent":["// @server-safe\nimport * as React from 'react'\n\nimport {\n Breadcrumb as BreadcrumbNav,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from '../ui/breadcrumb'\nimport { cn } from '../ui/lib/utils'\n\nexport interface Breadcrumb {\n label: string\n href?: string\n}\n\nexport interface PageHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n title?: string\n subtitle?: string\n actions?: React.ReactNode\n breadcrumbs?: Breadcrumb[]\n titleClassName?: string\n}\n\nconst PageHeader = React.forwardRef<HTMLDivElement, PageHeaderProps>(\n (\n { title, subtitle, actions, breadcrumbs, titleClassName, className, ...props },\n ref,\n ) => {\n const resolvedTitle =\n title ?? breadcrumbs?.[breadcrumbs.length - 1]?.label ?? ''\n\n return (\n <div\n ref={ref}\n className={cn(\n 'flex flex-col gap-ds-05 border-b border-surface-border-strong pb-ds-06',\n className,\n )}\n {...props}\n >\n {breadcrumbs && breadcrumbs.length > 0 && (\n <BreadcrumbNav className=\"text-ds-sm\">\n <BreadcrumbList>\n {breadcrumbs.map((crumb, index) => {\n const isLast = index === breadcrumbs.length - 1\n return (\n <React.Fragment key={index}>\n {index > 0 && <BreadcrumbSeparator />}\n <BreadcrumbItem>\n {crumb.href && !isLast ? (\n <BreadcrumbLink href={crumb.href}>{crumb.label}</BreadcrumbLink>\n ) : (\n <BreadcrumbPage>{crumb.label}</BreadcrumbPage>\n )}\n </BreadcrumbItem>\n </React.Fragment>\n )\n })}\n </BreadcrumbList>\n </BreadcrumbNav>\n )}\n\n {(resolvedTitle || subtitle || actions) && (\n <div className=\"flex flex-wrap items-start justify-between gap-ds-05\">\n <div className=\"flex min-w-0 flex-col gap-ds-02b\">\n {resolvedTitle && (\n <h1\n className={cn(\n 'text-ds-2xl font-semibold text-surface-fg',\n titleClassName,\n )}\n >\n {resolvedTitle}\n </h1>\n )}\n {subtitle && (\n <p className=\"text-ds-md text-surface-fg-subtle line-clamp-2\">\n {subtitle}\n </p>\n )}\n </div>\n\n {actions && (\n <div className=\"flex flex-wrap items-center gap-ds-03\">{actions}</div>\n )}\n </div>\n )}\n </div>\n )\n },\n)\nPageHeader.displayName = 'PageHeader'\n\nexport { PageHeader }\n"],"mappings":";;;;;AA0BA,IAAM,IAAa,EAAM,YAErB,EAAE,UAAO,aAAU,YAAS,gBAAa,mBAAgB,cAAW,GAAG,KACvE,MACG;CACH,IAAM,IACJ,KAAS,IAAc,EAAY,SAAS,IAAI,SAAS;AAE3D,QACE,kBAAC,OAAD;EACO;EACL,WAAW,EACT,0EACA,EACD;EACD,GAAI;YANN,CAQG,KAAe,EAAY,SAAS,KACnC,kBAAC,GAAD;GAAe,WAAU;aACvB,kBAAC,GAAD,EAAA,UACG,EAAY,KAAK,GAAO,MAAU;IACjC,IAAM,IAAS,MAAU,EAAY,SAAS;AAC9C,WACE,kBAAC,EAAM,UAAP,EAAA,UAAA,CACG,IAAQ,KAAK,kBAAC,GAAD,EAAuB,CAAA,EACrC,kBAAC,GAAD,EAAA,UACG,EAAM,QAAQ,CAAC,IACd,kBAAC,GAAD;KAAgB,MAAM,EAAM;eAAO,EAAM;KAAuB,CAAA,GAEhE,kBAAC,GAAD,EAAA,UAAiB,EAAM,OAAuB,CAAA,EAEjC,CAAA,CACF,EAAA,EATI,EASJ;KAEnB,EACa,CAAA;GACH,CAAA,GAGhB,KAAiB,KAAY,MAC7B,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACG,KACC,kBAAC,MAAD;KACE,WAAW,EACT,6CACA,EACD;eAEA;KACE,CAAA,EAEN,KACC,kBAAC,KAAD;KAAG,WAAU;eACV;KACC,CAAA,CAEF;OAEL,KACC,kBAAC,OAAD;IAAK,WAAU;cAAyC;IAAc,CAAA,CAEpE;KAEJ;;EAGX;AACD,EAAW,cAAc"}
@@ -15,9 +15,9 @@ var a = "bg-surface-raised-hover", o = n.forwardRef(function({ className: n, ...
15
15
  children: [
16
16
  /* @__PURE__ */ i("div", {
17
17
  className: "flex items-center justify-between",
18
- children: [/* @__PURE__ */ r(t, { className: e("h-[12px] w-[80px]", a) }), /* @__PURE__ */ r(t, { className: e("h-ds-sm w-ds-sm rounded-surface", a) })]
18
+ children: [/* @__PURE__ */ r(t, { className: e("h-ds-04 w-ds-11", a) }), /* @__PURE__ */ r(t, { className: e("h-ds-sm w-ds-sm rounded-surface", a) })]
19
19
  }),
20
- /* @__PURE__ */ r(t, { className: e("h-ds-xs-plus w-[64px]", a) }),
20
+ /* @__PURE__ */ r(t, { className: e("h-ds-xs-plus w-ds-10", a) }),
21
21
  /* @__PURE__ */ r(t, { className: e("h-ds-03 w-[112px]", a) })
22
22
  ]
23
23
  }, `stat-${o}`))
@@ -26,18 +26,18 @@ var a = "bg-surface-raised-hover", o = n.forwardRef(function({ className: n, ...
26
26
  children: [
27
27
  /* @__PURE__ */ i("div", {
28
28
  className: "mb-ds-06 flex items-center justify-between",
29
- children: [/* @__PURE__ */ r(t, { className: e("h-[20px] w-[128px]", a) }), /* @__PURE__ */ i("div", {
29
+ children: [/* @__PURE__ */ r(t, { className: e("h-ds-05b w-[128px]", a) }), /* @__PURE__ */ i("div", {
30
30
  className: "flex items-center gap-ds-03",
31
31
  children: [
32
32
  /* @__PURE__ */ r(t, { className: e("h-ds-sm w-ds-sm rounded-surface", a) }),
33
- /* @__PURE__ */ r(t, { className: e("h-[16px] w-[112px]", a) }),
33
+ /* @__PURE__ */ r(t, { className: e("h-ds-05 w-[112px]", a) }),
34
34
  /* @__PURE__ */ r(t, { className: e("h-ds-sm w-ds-sm rounded-surface", a) })
35
35
  ]
36
36
  })]
37
37
  }),
38
38
  /* @__PURE__ */ r("div", {
39
39
  className: "mb-ds-03 grid grid-cols-7 gap-ds-03",
40
- children: Array.from({ length: 7 }).map((n, i) => /* @__PURE__ */ r(t, { className: e("mx-auto h-[12px] w-[32px]", a) }, `wh-${i}`))
40
+ children: Array.from({ length: 7 }).map((n, i) => /* @__PURE__ */ r(t, { className: e("mx-auto h-ds-04 w-ds-07", a) }, `wh-${i}`))
41
41
  }),
42
42
  /* @__PURE__ */ r("div", {
43
43
  className: "grid grid-cols-7 gap-ds-03",
@@ -58,14 +58,14 @@ var s = n.forwardRef(function({ className: n, ...o }, s) {
58
58
  className: "flex flex-col gap-ds-05 sm:flex-row sm:items-center sm:justify-between",
59
59
  children: [/* @__PURE__ */ i("div", {
60
60
  className: "flex flex-col gap-ds-03",
61
- children: [/* @__PURE__ */ r(t, { className: e("h-[24px] w-[112px]", a) }), /* @__PURE__ */ r(t, { className: e("h-ds-04 w-[160px]", a) })]
61
+ children: [/* @__PURE__ */ r(t, { className: e("h-ds-06 w-[112px]", a) }), /* @__PURE__ */ r(t, { className: e("h-ds-04 w-ds-13", a) })]
62
62
  }), /* @__PURE__ */ r(t, { className: e("h-ds-sm-plus w-[128px] rounded-surface", a) })]
63
63
  }),
64
64
  /* @__PURE__ */ i("div", {
65
65
  className: "flex flex-col gap-ds-04 sm:flex-row sm:items-center",
66
66
  children: [/* @__PURE__ */ r(t, { className: e("h-ds-sm-plus flex-1 rounded-surface", a) }), /* @__PURE__ */ r("div", {
67
67
  className: "flex gap-ds-02b",
68
- children: Array.from({ length: 4 }).map((n, i) => /* @__PURE__ */ r(t, { className: e("h-ds-sm w-[64px] rounded-surface", a) }, `f-${i}`))
68
+ children: Array.from({ length: 4 }).map((n, i) => /* @__PURE__ */ r(t, { className: e("h-ds-sm w-ds-10 rounded-surface", a) }, `f-${i}`))
69
69
  })]
70
70
  }),
71
71
  /* @__PURE__ */ r("div", {
@@ -75,14 +75,14 @@ var s = n.forwardRef(function({ className: n, ...o }, s) {
75
75
  children: [
76
76
  /* @__PURE__ */ i("div", {
77
77
  className: "flex items-center justify-between",
78
- children: [/* @__PURE__ */ r(t, { className: e("h-[20px] w-[64px] rounded-pill", a) }), /* @__PURE__ */ r(t, { className: e("h-[16px] w-[80px] rounded-control", a) })]
78
+ children: [/* @__PURE__ */ r(t, { className: e("h-ds-05b w-ds-10 rounded-pill", a) }), /* @__PURE__ */ r(t, { className: e("h-ds-05 w-ds-11 rounded-control", a) })]
79
79
  }),
80
80
  /* @__PURE__ */ i("div", {
81
81
  className: "flex flex-col gap-ds-03",
82
82
  children: [
83
- /* @__PURE__ */ r(t, { className: e("h-[16px] w-3/4", a) }),
84
- /* @__PURE__ */ r(t, { className: e("h-[12px] w-full", a) }),
85
- /* @__PURE__ */ r(t, { className: e("h-[12px] w-2/3", a) })
83
+ /* @__PURE__ */ r(t, { className: e("h-ds-05 w-3/4", a) }),
84
+ /* @__PURE__ */ r(t, { className: e("h-ds-04 w-full", a) }),
85
+ /* @__PURE__ */ r(t, { className: e("h-ds-04 w-2/3", a) })
86
86
  ]
87
87
  }),
88
88
  /* @__PURE__ */ i("div", {
@@ -107,7 +107,7 @@ var c = n.forwardRef(function({ className: n, ...o }, s) {
107
107
  children: [
108
108
  /* @__PURE__ */ i("div", {
109
109
  className: "flex items-center justify-between border-b border-surface-border-strong px-ds-05b py-ds-05",
110
- children: [/* @__PURE__ */ r(t, { className: e("h-[20px] w-[192px]", a) }), /* @__PURE__ */ i("div", {
110
+ children: [/* @__PURE__ */ r(t, { className: e("h-ds-05b w-[192px]", a) }), /* @__PURE__ */ i("div", {
111
111
  className: "flex items-center gap-ds-03",
112
112
  children: [/* @__PURE__ */ r(t, { className: e("h-ds-xs-plus w-ds-xs-plus rounded-surface", a) }), /* @__PURE__ */ r(t, { className: e("h-ds-xs-plus w-ds-xs-plus rounded-surface", a) })]
113
113
  })]
@@ -116,24 +116,24 @@ var c = n.forwardRef(function({ className: n, ...o }, s) {
116
116
  className: "flex flex-col gap-0 border-b border-surface-border-strong px-ds-05b py-ds-05",
117
117
  children: Array.from({ length: 5 }).map((n, o) => /* @__PURE__ */ i("div", {
118
118
  className: "flex items-center gap-ds-05 py-ds-03",
119
- children: [/* @__PURE__ */ r(t, { className: e("h-[12px] w-[96px] shrink-0", a) }), /* @__PURE__ */ r(t, { className: e("h-[24px] w-[128px] rounded-control", a) })]
119
+ children: [/* @__PURE__ */ r(t, { className: e("h-ds-04 w-ds-12 shrink-0", a) }), /* @__PURE__ */ r(t, { className: e("h-ds-06 w-[128px] rounded-control", a) })]
120
120
  }, `prop-${o}`))
121
121
  }),
122
122
  /* @__PURE__ */ r("div", {
123
123
  className: "border-b border-surface-border-strong px-ds-05b",
124
124
  children: /* @__PURE__ */ r("div", {
125
125
  className: "flex gap-ds-05 py-ds-04",
126
- children: Array.from({ length: 3 }).map((n, i) => /* @__PURE__ */ r(t, { className: e("h-[16px] w-[64px]", a) }, `tab-${i}`))
126
+ children: Array.from({ length: 3 }).map((n, i) => /* @__PURE__ */ r(t, { className: e("h-ds-05 w-ds-10", a) }, `tab-${i}`))
127
127
  })
128
128
  }),
129
129
  /* @__PURE__ */ i("div", {
130
130
  className: "flex flex-1 flex-col gap-ds-04 px-ds-05b py-ds-05",
131
131
  children: [
132
- /* @__PURE__ */ r(t, { className: e("h-[12px] w-full", a) }),
133
- /* @__PURE__ */ r(t, { className: e("h-[12px] w-4/5", a) }),
134
- /* @__PURE__ */ r(t, { className: e("h-[12px] w-3/5", a) }),
135
- /* @__PURE__ */ r(t, { className: e("mt-ds-03 h-[12px] w-full", a) }),
136
- /* @__PURE__ */ r(t, { className: e("h-[12px] w-2/3", a) })
132
+ /* @__PURE__ */ r(t, { className: e("h-ds-04 w-full", a) }),
133
+ /* @__PURE__ */ r(t, { className: e("h-ds-04 w-4/5", a) }),
134
+ /* @__PURE__ */ r(t, { className: e("h-ds-04 w-3/5", a) }),
135
+ /* @__PURE__ */ r(t, { className: e("mt-ds-03 h-ds-04 w-full", a) }),
136
+ /* @__PURE__ */ r(t, { className: e("h-ds-04 w-2/3", a) })
137
137
  ]
138
138
  })
139
139
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"page-skeletons.js","names":[],"sources":["../../src/composed/page-skeletons.tsx"],"sourcesContent":["// @server-safe\nimport * as React from 'react'\n\nimport { cn } from '../ui/lib/utils'\nimport { Skeleton } from '../ui/skeleton'\n\nconst shimmer = 'bg-surface-raised-hover'\n\n// --- Dashboard Skeleton ---\n\nexport interface DashboardSkeletonProps extends React.ComponentPropsWithoutRef<'div'> {}\n\nconst DashboardSkeleton = React.forwardRef<HTMLDivElement, DashboardSkeletonProps>(\n function DashboardSkeleton({ className, ...props }, ref) {\n return (\n <div ref={ref} {...props} className={cn(\"flex flex-col gap-ds-06\", className)}>\n {/* Stat cards grid */}\n <div className=\"grid grid-cols-1 gap-ds-05 sm:grid-cols-2 lg:grid-cols-4\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div\n key={`stat-${i}`}\n className=\"flex flex-col gap-ds-04 rounded-overlay-lg border border-surface-border-strong bg-surface-raised p-ds-05b\"\n >\n <div className=\"flex items-center justify-between\">\n <Skeleton className={cn('h-[12px] w-[80px]', shimmer)} />\n <Skeleton className={cn('h-ds-sm w-ds-sm rounded-surface', shimmer)} />\n </div>\n <Skeleton className={cn('h-ds-xs-plus w-[64px]', shimmer)} />\n <Skeleton className={cn('h-ds-03 w-[112px]', shimmer)} />\n </div>\n ))}\n </div>\n\n {/* Attendance calendar placeholder */}\n <div className=\"rounded-overlay-lg border border-surface-border-strong bg-surface-raised p-ds-06\">\n <div className=\"mb-ds-06 flex items-center justify-between\">\n <Skeleton className={cn('h-[20px] w-[128px]', shimmer)} />\n <div className=\"flex items-center gap-ds-03\">\n <Skeleton className={cn('h-ds-sm w-ds-sm rounded-surface', shimmer)} />\n <Skeleton className={cn('h-[16px] w-[112px]', shimmer)} />\n <Skeleton className={cn('h-ds-sm w-ds-sm rounded-surface', shimmer)} />\n </div>\n </div>\n {/* Weekday headers */}\n <div className=\"mb-ds-03 grid grid-cols-7 gap-ds-03\">\n {Array.from({ length: 7 }).map((_, i) => (\n <Skeleton key={`wh-${i}`} className={cn('mx-auto h-[12px] w-[32px]', shimmer)} />\n ))}\n </div>\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-ds-03\">\n {Array.from({ length: 35 }).map((_, i) => (\n <Skeleton\n key={`cal-${i}`}\n className={cn('mx-auto h-ds-md w-ds-md rounded-pill', shimmer)}\n />\n ))}\n </div>\n </div>\n </div>\n )\n},\n)\n\nDashboardSkeleton.displayName = 'DashboardSkeleton'\n\n// --- Project List Skeleton ---\n\nexport interface ProjectListSkeletonProps extends React.ComponentPropsWithoutRef<'div'> {}\n\nconst ProjectListSkeleton = React.forwardRef<HTMLDivElement, ProjectListSkeletonProps>(\n function ProjectListSkeleton({ className, ...props }, ref) {\n return (\n <div ref={ref} {...props} className={cn(\"flex flex-col gap-ds-06\", className)}>\n {/* Header */}\n <div className=\"flex flex-col gap-ds-05 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex flex-col gap-ds-03\">\n <Skeleton className={cn('h-[24px] w-[112px]', shimmer)} />\n <Skeleton className={cn('h-ds-04 w-[160px]', shimmer)} />\n </div>\n <Skeleton className={cn('h-ds-sm-plus w-[128px] rounded-surface', shimmer)} />\n </div>\n\n {/* Filters */}\n <div className=\"flex flex-col gap-ds-04 sm:flex-row sm:items-center\">\n <Skeleton className={cn('h-ds-sm-plus flex-1 rounded-surface', shimmer)} />\n <div className=\"flex gap-ds-02b\">\n {Array.from({ length: 4 }).map((_, i) => (\n <Skeleton key={`f-${i}`} className={cn('h-ds-sm w-[64px] rounded-surface', shimmer)} />\n ))}\n </div>\n </div>\n\n {/* Project cards grid */}\n <div className=\"grid grid-cols-1 gap-ds-05 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div\n key={`proj-${i}`}\n className=\"flex flex-col gap-ds-05 rounded-overlay-lg border border-surface-border-strong bg-surface-raised p-ds-05b\"\n >\n {/* Top row: status + org */}\n <div className=\"flex items-center justify-between\">\n <Skeleton className={cn('h-[20px] w-[64px] rounded-pill', shimmer)} />\n <Skeleton className={cn('h-[16px] w-[80px] rounded-control', shimmer)} />\n </div>\n {/* Title + description */}\n <div className=\"flex flex-col gap-ds-03\">\n <Skeleton className={cn('h-[16px] w-3/4', shimmer)} />\n <Skeleton className={cn('h-[12px] w-full', shimmer)} />\n <Skeleton className={cn('h-[12px] w-2/3', shimmer)} />\n </div>\n {/* Bottom row: members + count */}\n <div className=\"flex items-center justify-between pt-ds-02\">\n <div className=\"flex -space-x-ds-03\">\n {Array.from({ length: 3 }).map((_, j) => (\n <Skeleton\n key={`av-${i}-${j}`}\n className={cn('h-ds-xs-plus w-ds-xs-plus rounded-pill', shimmer)}\n />\n ))}\n </div>\n <Skeleton className={cn('h-ds-04 w-ds-md', shimmer)} />\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n},\n)\n\nProjectListSkeleton.displayName = 'ProjectListSkeleton'\n\n// --- Task Detail Skeleton ---\n\nexport interface TaskDetailSkeletonProps extends React.ComponentPropsWithoutRef<'div'> {}\n\nconst TaskDetailSkeleton = React.forwardRef<HTMLDivElement, TaskDetailSkeletonProps>(\n function TaskDetailSkeleton({ className, ...props }, ref) {\n return (\n <div ref={ref} {...props} className={cn(\"flex h-full flex-col gap-0 rounded-overlay-lg border border-surface-border-strong bg-surface-raised\", className)}>\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-surface-border-strong px-ds-05b py-ds-05\">\n <Skeleton className={cn('h-[20px] w-[192px]', shimmer)} />\n <div className=\"flex items-center gap-ds-03\">\n <Skeleton className={cn('h-ds-xs-plus w-ds-xs-plus rounded-surface', shimmer)} />\n <Skeleton className={cn('h-ds-xs-plus w-ds-xs-plus rounded-surface', shimmer)} />\n </div>\n </div>\n\n {/* Property rows */}\n <div className=\"flex flex-col gap-0 border-b border-surface-border-strong px-ds-05b py-ds-05\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div\n key={`prop-${i}`}\n className=\"flex items-center gap-ds-05 py-ds-03\"\n >\n <Skeleton className={cn('h-[12px] w-[96px] shrink-0', shimmer)} />\n <Skeleton className={cn('h-[24px] w-[128px] rounded-control', shimmer)} />\n </div>\n ))}\n </div>\n\n {/* Tabs */}\n <div className=\"border-b border-surface-border-strong px-ds-05b\">\n <div className=\"flex gap-ds-05 py-ds-04\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={`tab-${i}`} className={cn('h-[16px] w-[64px]', shimmer)} />\n ))}\n </div>\n </div>\n\n {/* Tab content */}\n <div className=\"flex flex-1 flex-col gap-ds-04 px-ds-05b py-ds-05\">\n <Skeleton className={cn('h-[12px] w-full', shimmer)} />\n <Skeleton className={cn('h-[12px] w-4/5', shimmer)} />\n <Skeleton className={cn('h-[12px] w-3/5', shimmer)} />\n <Skeleton className={cn('mt-ds-03 h-[12px] w-full', shimmer)} />\n <Skeleton className={cn('h-[12px] w-2/3', shimmer)} />\n </div>\n </div>\n )\n},\n)\n\nTaskDetailSkeleton.displayName = 'TaskDetailSkeleton'\n\nexport {\n DashboardSkeleton,\n ProjectListSkeleton,\n TaskDetailSkeleton,\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"page-skeletons.js","names":[],"sources":["../../src/composed/page-skeletons.tsx"],"sourcesContent":["// @server-safe\nimport * as React from 'react'\n\nimport { cn } from '../ui/lib/utils'\nimport { Skeleton } from '../ui/skeleton'\n\nconst shimmer = 'bg-surface-raised-hover'\n\n// --- Dashboard Skeleton ---\n\nexport interface DashboardSkeletonProps extends React.ComponentPropsWithoutRef<'div'> {}\n\nconst DashboardSkeleton = React.forwardRef<HTMLDivElement, DashboardSkeletonProps>(\n function DashboardSkeleton({ className, ...props }, ref) {\n return (\n <div ref={ref} {...props} className={cn(\"flex flex-col gap-ds-06\", className)}>\n {/* Stat cards grid */}\n <div className=\"grid grid-cols-1 gap-ds-05 sm:grid-cols-2 lg:grid-cols-4\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div\n key={`stat-${i}`}\n className=\"flex flex-col gap-ds-04 rounded-overlay-lg border border-surface-border-strong bg-surface-raised p-ds-05b\"\n >\n <div className=\"flex items-center justify-between\">\n <Skeleton className={cn('h-ds-04 w-ds-11', shimmer)} />\n <Skeleton className={cn('h-ds-sm w-ds-sm rounded-surface', shimmer)} />\n </div>\n <Skeleton className={cn('h-ds-xs-plus w-ds-10', shimmer)} />\n <Skeleton className={cn('h-ds-03 w-[112px]', shimmer)} />\n </div>\n ))}\n </div>\n\n {/* Attendance calendar placeholder */}\n <div className=\"rounded-overlay-lg border border-surface-border-strong bg-surface-raised p-ds-06\">\n <div className=\"mb-ds-06 flex items-center justify-between\">\n <Skeleton className={cn('h-ds-05b w-[128px]', shimmer)} />\n <div className=\"flex items-center gap-ds-03\">\n <Skeleton className={cn('h-ds-sm w-ds-sm rounded-surface', shimmer)} />\n <Skeleton className={cn('h-ds-05 w-[112px]', shimmer)} />\n <Skeleton className={cn('h-ds-sm w-ds-sm rounded-surface', shimmer)} />\n </div>\n </div>\n {/* Weekday headers */}\n <div className=\"mb-ds-03 grid grid-cols-7 gap-ds-03\">\n {Array.from({ length: 7 }).map((_, i) => (\n <Skeleton key={`wh-${i}`} className={cn('mx-auto h-ds-04 w-ds-07', shimmer)} />\n ))}\n </div>\n {/* Calendar grid */}\n <div className=\"grid grid-cols-7 gap-ds-03\">\n {Array.from({ length: 35 }).map((_, i) => (\n <Skeleton\n key={`cal-${i}`}\n className={cn('mx-auto h-ds-md w-ds-md rounded-pill', shimmer)}\n />\n ))}\n </div>\n </div>\n </div>\n )\n},\n)\n\nDashboardSkeleton.displayName = 'DashboardSkeleton'\n\n// --- Project List Skeleton ---\n\nexport interface ProjectListSkeletonProps extends React.ComponentPropsWithoutRef<'div'> {}\n\nconst ProjectListSkeleton = React.forwardRef<HTMLDivElement, ProjectListSkeletonProps>(\n function ProjectListSkeleton({ className, ...props }, ref) {\n return (\n <div ref={ref} {...props} className={cn(\"flex flex-col gap-ds-06\", className)}>\n {/* Header */}\n <div className=\"flex flex-col gap-ds-05 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex flex-col gap-ds-03\">\n <Skeleton className={cn('h-ds-06 w-[112px]', shimmer)} />\n <Skeleton className={cn('h-ds-04 w-ds-13', shimmer)} />\n </div>\n <Skeleton className={cn('h-ds-sm-plus w-[128px] rounded-surface', shimmer)} />\n </div>\n\n {/* Filters */}\n <div className=\"flex flex-col gap-ds-04 sm:flex-row sm:items-center\">\n <Skeleton className={cn('h-ds-sm-plus flex-1 rounded-surface', shimmer)} />\n <div className=\"flex gap-ds-02b\">\n {Array.from({ length: 4 }).map((_, i) => (\n <Skeleton key={`f-${i}`} className={cn('h-ds-sm w-ds-10 rounded-surface', shimmer)} />\n ))}\n </div>\n </div>\n\n {/* Project cards grid */}\n <div className=\"grid grid-cols-1 gap-ds-05 sm:grid-cols-2 lg:grid-cols-3\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div\n key={`proj-${i}`}\n className=\"flex flex-col gap-ds-05 rounded-overlay-lg border border-surface-border-strong bg-surface-raised p-ds-05b\"\n >\n {/* Top row: status + org */}\n <div className=\"flex items-center justify-between\">\n <Skeleton className={cn('h-ds-05b w-ds-10 rounded-pill', shimmer)} />\n <Skeleton className={cn('h-ds-05 w-ds-11 rounded-control', shimmer)} />\n </div>\n {/* Title + description */}\n <div className=\"flex flex-col gap-ds-03\">\n <Skeleton className={cn('h-ds-05 w-3/4', shimmer)} />\n <Skeleton className={cn('h-ds-04 w-full', shimmer)} />\n <Skeleton className={cn('h-ds-04 w-2/3', shimmer)} />\n </div>\n {/* Bottom row: members + count */}\n <div className=\"flex items-center justify-between pt-ds-02\">\n <div className=\"flex -space-x-ds-03\">\n {Array.from({ length: 3 }).map((_, j) => (\n <Skeleton\n key={`av-${i}-${j}`}\n className={cn('h-ds-xs-plus w-ds-xs-plus rounded-pill', shimmer)}\n />\n ))}\n </div>\n <Skeleton className={cn('h-ds-04 w-ds-md', shimmer)} />\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n},\n)\n\nProjectListSkeleton.displayName = 'ProjectListSkeleton'\n\n// --- Task Detail Skeleton ---\n\nexport interface TaskDetailSkeletonProps extends React.ComponentPropsWithoutRef<'div'> {}\n\nconst TaskDetailSkeleton = React.forwardRef<HTMLDivElement, TaskDetailSkeletonProps>(\n function TaskDetailSkeleton({ className, ...props }, ref) {\n return (\n <div ref={ref} {...props} className={cn(\"flex h-full flex-col gap-0 rounded-overlay-lg border border-surface-border-strong bg-surface-raised\", className)}>\n {/* Header */}\n <div className=\"flex items-center justify-between border-b border-surface-border-strong px-ds-05b py-ds-05\">\n <Skeleton className={cn('h-ds-05b w-[192px]', shimmer)} />\n <div className=\"flex items-center gap-ds-03\">\n <Skeleton className={cn('h-ds-xs-plus w-ds-xs-plus rounded-surface', shimmer)} />\n <Skeleton className={cn('h-ds-xs-plus w-ds-xs-plus rounded-surface', shimmer)} />\n </div>\n </div>\n\n {/* Property rows */}\n <div className=\"flex flex-col gap-0 border-b border-surface-border-strong px-ds-05b py-ds-05\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div\n key={`prop-${i}`}\n className=\"flex items-center gap-ds-05 py-ds-03\"\n >\n <Skeleton className={cn('h-ds-04 w-ds-12 shrink-0', shimmer)} />\n <Skeleton className={cn('h-ds-06 w-[128px] rounded-control', shimmer)} />\n </div>\n ))}\n </div>\n\n {/* Tabs */}\n <div className=\"border-b border-surface-border-strong px-ds-05b\">\n <div className=\"flex gap-ds-05 py-ds-04\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={`tab-${i}`} className={cn('h-ds-05 w-ds-10', shimmer)} />\n ))}\n </div>\n </div>\n\n {/* Tab content */}\n <div className=\"flex flex-1 flex-col gap-ds-04 px-ds-05b py-ds-05\">\n <Skeleton className={cn('h-ds-04 w-full', shimmer)} />\n <Skeleton className={cn('h-ds-04 w-4/5', shimmer)} />\n <Skeleton className={cn('h-ds-04 w-3/5', shimmer)} />\n <Skeleton className={cn('mt-ds-03 h-ds-04 w-full', shimmer)} />\n <Skeleton className={cn('h-ds-04 w-2/3', shimmer)} />\n </div>\n </div>\n )\n},\n)\n\nTaskDetailSkeleton.displayName = 'TaskDetailSkeleton'\n\nexport {\n DashboardSkeleton,\n ProjectListSkeleton,\n TaskDetailSkeleton,\n}\n"],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ "use client";
2
+ import * as DialogPrimitive from '../primitives/react-dialog';
3
+ import * as React from 'react';
4
+ export interface ResponsiveModalProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root> {
5
+ /** When false, Escape/overlay/drag cannot dismiss — only an explicit Close/onOpenChange can. @default true */
6
+ dismissable?: boolean;
7
+ }
8
+ declare const ResponsiveModal: React.FC<ResponsiveModalProps>;
9
+ declare const ResponsiveModalTrigger: React.ForwardRefExoticComponent<DialogPrimitive.DialogTriggerProps & React.RefAttributes<HTMLButtonElement>>;
10
+ declare const ResponsiveModalClose: React.ForwardRefExoticComponent<DialogPrimitive.DialogCloseProps & React.RefAttributes<HTMLButtonElement>>;
11
+ declare const ResponsiveModalPortal: React.FC<DialogPrimitive.DialogPortalProps>;
12
+ declare const ResponsiveModalOverlay: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogOverlayProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
13
+ export interface ResponsiveModalContentProps extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {
14
+ /**
15
+ * Mobile-only. Rest heights as ascending fractions of viewport height, e.g.
16
+ * `[0.5, 0.9]`. Omit for a content-height sheet. The largest fraction caps the
17
+ * sheet height. Ignored on desktop.
18
+ */
19
+ snapPoints?: number[];
20
+ /** Mobile-only. Index into `snapPoints` the sheet opens at. @default last (tallest) */
21
+ defaultSnapPoint?: number;
22
+ }
23
+ declare const ResponsiveModalContent: React.ForwardRefExoticComponent<ResponsiveModalContentProps & React.RefAttributes<HTMLDivElement>>;
24
+ /**
25
+ * Full-bleed layer painted behind the modal content (`-z-10`), clipped to the
26
+ * panel's rounded corners. Render whatever you want behind the content (a
27
+ * gradient, an aurora, an image). It is non-interactive by default.
28
+ */
29
+ declare const ResponsiveModalBackground: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
30
+ /** Pinned header — sits above the scroll body and does not scroll with it. */
31
+ declare const ResponsiveModalHeader: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
32
+ /** Internal scroll region — grows to fill, scrolls when content exceeds the height cap. */
33
+ declare const ResponsiveModalBody: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
34
+ /** Pinned footer action row. Stacks on mobile, right-aligned inline on desktop. */
35
+ declare const ResponsiveModalFooter: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
36
+ declare const ResponsiveModalTitle: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
37
+ declare const ResponsiveModalDescription: React.ForwardRefExoticComponent<Omit<DialogPrimitive.DialogDescriptionProps & React.RefAttributes<HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
38
+ export { ResponsiveModal, ResponsiveModalBackground, ResponsiveModalBody, ResponsiveModalClose, ResponsiveModalContent, ResponsiveModalDescription, ResponsiveModalFooter, ResponsiveModalHeader, ResponsiveModalOverlay, ResponsiveModalPortal, ResponsiveModalTitle, ResponsiveModalTrigger, };
39
+ //# sourceMappingURL=responsive-modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responsive-modal.d.ts","sourceRoot":"","sources":["../../src/composed/responsive-modal.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,eAAe,MAAM,0BAA0B,CAAA;AAG3D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAqE9B,MAAM,WAAW,oBACf,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC;IACnE,8GAA8G;IAC9G,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,QAAA,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAoCnD,CAAA;AAGD,QAAA,MAAM,sBAAsB,8GAA0B,CAAA;AACtD,QAAA,MAAM,oBAAoB,4GAAwB,CAAA;AAClD,QAAA,MAAM,qBAAqB,6CAAyB,CAAA;AAEpD,QAAA,MAAM,sBAAsB,8JAU1B,CAAA;AAyBF,MAAM,WAAW,2BACf,SAAQ,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC;IACtE;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,uFAAuF;IACvF,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAKD,QAAA,MAAM,sBAAsB,oGA2K1B,CAAA;AAKF;;;;GAIG;AACH,QAAA,MAAM,yBAAyB,6GAS9B,CAAA;AAKD,8EAA8E;AAC9E,QAAA,MAAM,qBAAqB,6GAW1B,CAAA;AAGD,2FAA2F;AAC3F,QAAA,MAAM,mBAAmB,6GAQxB,CAAA;AAGD,mFAAmF;AACnF,QAAA,MAAM,qBAAqB,6GAW1B,CAAA;AAGD,QAAA,MAAM,oBAAoB,oKASxB,CAAA;AAGF,QAAA,MAAM,0BAA0B,8KAS9B,CAAA;AAGF,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,GACvB,CAAA"}
@@ -0,0 +1,212 @@
1
+ "use client";
2
+ import { An as e, Dn as t, En as n, Mn as r, On as i, Tn as a, jn as o, kn as s } from "../_chunks/primitives.js";
3
+ import { springs as c, tweens as l } from "../ui/lib/motion.js";
4
+ import { cn as u } from "../ui/lib/utils.js";
5
+ import { Icon as d } from "../ui/icon.js";
6
+ import { useIsMobile as f } from "../hooks/use-mobile.js";
7
+ import * as p from "react";
8
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
9
+ import { IconX as g } from "@tabler/icons-react";
10
+ import { AnimatePresence as _, motion as v, useDragControls as y, useReducedMotion as b } from "framer-motion";
11
+ //#region src/composed/responsive-modal.tsx
12
+ var x = p.createContext({
13
+ open: !1,
14
+ isMobile: !1,
15
+ dismissable: !0,
16
+ onClose: () => {}
17
+ }), S = () => p.useContext(x), C = ({ open: t, defaultOpen: n = !1, onOpenChange: r, dismissable: i = !0, children: a, ...o }) => {
18
+ let [s, c] = p.useState(n), l = t !== void 0, u = l ? t : s, d = f(), h = p.useCallback((e) => {
19
+ !e && !i || (l || c(e), r?.(e));
20
+ }, [
21
+ l,
22
+ r,
23
+ i
24
+ ]), g = p.useMemo(() => ({
25
+ open: u,
26
+ isMobile: d,
27
+ dismissable: i,
28
+ onClose: () => h(!1)
29
+ }), [
30
+ u,
31
+ d,
32
+ i,
33
+ h
34
+ ]);
35
+ return /* @__PURE__ */ m(x.Provider, {
36
+ value: g,
37
+ children: /* @__PURE__ */ m(e, {
38
+ open: u,
39
+ onOpenChange: h,
40
+ ...o,
41
+ children: a
42
+ })
43
+ });
44
+ };
45
+ C.displayName = "ResponsiveModal";
46
+ var w = r, T = a, E = s, D = p.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ m(i, {
47
+ ref: n,
48
+ forceMount: !0,
49
+ className: u("fixed inset-0 z-overlay bg-overlay", e),
50
+ ...t
51
+ }));
52
+ D.displayName = "ResponsiveModalOverlay";
53
+ function O(e, t) {
54
+ let n = 0, r = Infinity;
55
+ for (let i = 0; i < t.length; i++) {
56
+ let a = Math.abs(t[i] - e);
57
+ a < r && (r = a, n = i);
58
+ }
59
+ return n;
60
+ }
61
+ var k = 120, A = 500, j = p.forwardRef(({ className: e, children: t, snapPoints: r, defaultSnapPoint: i, ...o }, s) => {
62
+ let { open: f, isMobile: x, dismissable: C, onClose: w } = S(), T = b(), j = y(), M = x && Array.isArray(r) && r.length > 0, N = p.useMemo(() => M ? [...r].sort((e, t) => e - t) : [], [M, r]), P = N.length ? N[N.length - 1] : 1, F = p.useMemo(() => {
63
+ if (!N.length) return 0;
64
+ let e = i ?? N.length - 1;
65
+ return Math.min(Math.max(e, 0), N.length - 1);
66
+ }, [N, i]), [I, L] = p.useState(F), [R, z] = p.useState(0), B = p.useRef(null);
67
+ p.useEffect(() => {
68
+ f && L(F);
69
+ }, [f, F]), p.useEffect(() => {
70
+ if (!x) return;
71
+ let e = B.current;
72
+ if (!e) return;
73
+ let t = () => z(e.getBoundingClientRect().height);
74
+ t();
75
+ let n = new ResizeObserver(t);
76
+ return n.observe(e), () => n.disconnect();
77
+ }, [x, f]);
78
+ let V = p.useCallback((e) => {
79
+ B.current = e, typeof s == "function" ? s(e) : s && (s.current = e);
80
+ }, [s]), H = p.useCallback((e) => !N.length || !R ? 0 : (P - N[e]) / P * R, [
81
+ N,
82
+ R,
83
+ P
84
+ ]), U = x && C && !T, W = p.useCallback((e, t) => {
85
+ if (!N.length) {
86
+ (t.offset.y > k || t.velocity.y > A) && w();
87
+ return;
88
+ }
89
+ let n = P - (H(I) + t.offset.y) / R * P, r = N[0] - n;
90
+ if (I === 0 && (r > .15 || t.velocity.y > A)) {
91
+ w();
92
+ return;
93
+ }
94
+ L(O(n, N));
95
+ }, [
96
+ N,
97
+ H,
98
+ I,
99
+ P,
100
+ R,
101
+ w
102
+ ]), G = u("fixed inset-x-0 bottom-0 z-modal flex flex-col overflow-hidden rounded-t-overlay-lg border-t border-surface-border-strong bg-surface-overlay shadow-overlay", M ? void 0 : "max-h-[90dvh]"), K = C ? /* @__PURE__ */ h(a, {
103
+ title: "Close",
104
+ className: "absolute right-ds-05 top-ds-05 z-10 flex min-h-ds-xs min-w-ds-xs items-center justify-center rounded-control-inner text-surface-fg-subtle transition-colors duration-fast-01 ease-productive-standard hover:bg-surface-raised-hover hover:text-surface-fg-muted focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 active:scale-90 disabled:pointer-events-none",
105
+ children: [/* @__PURE__ */ m(d, {
106
+ icon: g,
107
+ size: "lg"
108
+ }), /* @__PURE__ */ m("span", {
109
+ className: "sr-only",
110
+ children: "Close"
111
+ })]
112
+ }) : null;
113
+ return /* @__PURE__ */ m(_, { children: f && /* @__PURE__ */ h(E, {
114
+ forceMount: !0,
115
+ children: [/* @__PURE__ */ m(D, {
116
+ asChild: !0,
117
+ children: /* @__PURE__ */ m(v.div, {
118
+ initial: { opacity: 0 },
119
+ animate: { opacity: 1 },
120
+ exit: { opacity: 0 },
121
+ transition: l.fade
122
+ })
123
+ }), /* @__PURE__ */ m(n, {
124
+ ref: V,
125
+ forceMount: !0,
126
+ asChild: !0,
127
+ onPointerDownOutside: C ? void 0 : (e) => e.preventDefault(),
128
+ ...o,
129
+ children: /* @__PURE__ */ h(v.div, {
130
+ className: u(x ? G : "fixed left-[50%] top-[50%] z-modal flex max-h-[85dvh] w-full max-w-lg flex-col overflow-hidden rounded-overlay-lg bg-surface-overlay shadow-overlay", e),
131
+ style: M ? { height: `${P * 100}dvh` } : void 0,
132
+ initial: x ? { y: "100%" } : {
133
+ opacity: 0,
134
+ scale: .96,
135
+ x: "-50%",
136
+ y: "-50%"
137
+ },
138
+ animate: x ? { y: M ? H(I) : 0 } : {
139
+ opacity: 1,
140
+ scale: 1,
141
+ x: "-50%",
142
+ y: "-50%"
143
+ },
144
+ exit: x ? { y: "100%" } : {
145
+ opacity: 0,
146
+ scale: .96,
147
+ x: "-50%",
148
+ y: "-50%"
149
+ },
150
+ transition: x ? c.smooth : {
151
+ ...c.smooth,
152
+ opacity: l.fade
153
+ },
154
+ drag: U ? "y" : !1,
155
+ dragListener: !1,
156
+ dragControls: j,
157
+ dragConstraints: { top: 0 },
158
+ dragElastic: .15,
159
+ onDragEnd: U ? W : void 0,
160
+ children: [
161
+ x && /* @__PURE__ */ m("div", {
162
+ className: u("flex shrink-0 justify-center pb-ds-01 pt-ds-03", U && "cursor-grab touch-none"),
163
+ onPointerDown: U ? (e) => j.start(e) : void 0,
164
+ children: /* @__PURE__ */ m("div", { className: "h-1 w-8 rounded-pill bg-surface-border" })
165
+ }),
166
+ K,
167
+ t
168
+ ]
169
+ })
170
+ })]
171
+ }) });
172
+ });
173
+ j.displayName = "ResponsiveModalContent";
174
+ var M = p.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ m("div", {
175
+ ref: n,
176
+ "aria-hidden": !0,
177
+ className: u("pointer-events-none absolute inset-0 -z-10 overflow-hidden rounded-[inherit]", e),
178
+ ...t
179
+ }));
180
+ M.displayName = "ResponsiveModalBackground";
181
+ var N = p.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ m("div", {
182
+ ref: n,
183
+ className: u("flex shrink-0 flex-col gap-ds-02b px-ds-06 pb-ds-04 pt-ds-05 text-center sm:text-left", e),
184
+ ...t
185
+ }));
186
+ N.displayName = "ResponsiveModalHeader";
187
+ var P = p.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ m("div", {
188
+ ref: n,
189
+ className: u("min-h-0 flex-1 overflow-y-auto px-ds-06 py-ds-02", e),
190
+ ...t
191
+ }));
192
+ P.displayName = "ResponsiveModalBody";
193
+ var F = p.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ m("div", {
194
+ ref: n,
195
+ className: u("flex shrink-0 flex-col-reverse gap-ds-03 px-ds-06 pb-ds-06 pt-ds-04 sm:flex-row sm:justify-end", e),
196
+ ...t
197
+ }));
198
+ F.displayName = "ResponsiveModalFooter";
199
+ var I = p.forwardRef(({ className: e, ...t }, n) => /* @__PURE__ */ m(o, {
200
+ ref: n,
201
+ className: u("text-ds-lg font-semibold text-surface-fg", e),
202
+ ...t
203
+ }));
204
+ I.displayName = "ResponsiveModalTitle";
205
+ var L = p.forwardRef(({ className: e, ...n }, r) => /* @__PURE__ */ m(t, {
206
+ ref: r,
207
+ className: u("text-ds-md text-surface-fg-muted", e),
208
+ ...n
209
+ }));
210
+ L.displayName = "ResponsiveModalDescription";
211
+ //#endregion
212
+ export { C as ResponsiveModal, M as ResponsiveModalBackground, P as ResponsiveModalBody, T as ResponsiveModalClose, j as ResponsiveModalContent, L as ResponsiveModalDescription, F as ResponsiveModalFooter, N as ResponsiveModalHeader, D as ResponsiveModalOverlay, E as ResponsiveModalPortal, I as ResponsiveModalTitle, w as ResponsiveModalTrigger };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responsive-modal.js","names":[],"sources":["../../src/composed/responsive-modal.tsx"],"sourcesContent":["'use client'\n\nimport * as DialogPrimitive from '@primitives/react-dialog'\nimport { IconX } from '@tabler/icons-react'\nimport { AnimatePresence, motion, useDragControls, useReducedMotion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { useIsMobile } from '../hooks/use-mobile'\nimport { Icon } from '../ui/icon'\nimport { springs, tweens } from '../ui/lib/motion'\nimport { cn } from '../ui/lib/utils'\n\n/**\n * ResponsiveModal — one overlay that is a centered **Dialog** on desktop (md+)\n * and a partial, content-height **bottom sheet** on mobile (drag-to-dismiss,\n * optional snap points). Built on the same accessible dialog primitive as\n * `Dialog` and `Sheet` (focus trap, Escape, scroll lock), so it is an\n * alternative-to both — not a re-roll.\n *\n * Why it exists: `DialogContent responsive` collapses to a full-screen takeover\n * on mobile (`inset-0`), which leaves dead space under short content and drops\n * the drawer affordances users expect. This composes the two correct halves and\n * owns the fiddly bits (pinned header, internal scroll body with sane height\n * caps, close-button stacking above an optional full-bleed background) so\n * consumers stop hand-rolling a `useIsMobile()` switch.\n *\n * **Parts (in composition order):**\n * - `ResponsiveModal` — open/close state (this root)\n * - `ResponsiveModalTrigger` — opens it (use `asChild`)\n * - `ResponsiveModalContent` — the switching panel (Dialog md+ / bottom sheet below)\n * - `ResponsiveModalBackground` — optional full-bleed layer painted behind content (`-z-10`)\n * - `ResponsiveModalHeader` — pinned; stays put while the body scrolls\n * - `ResponsiveModalTitle` — required for accessibility (labels the dialog)\n * - `ResponsiveModalDescription` — optional subtitle\n * - `ResponsiveModalBody` — internal scroll region (capped 85dvh desktop / 90dvh mobile)\n * - `ResponsiveModalFooter` — pinned action row\n * - `ResponsiveModalClose` — manual close (a close button is built into Content)\n *\n * @compound\n * @example\n * <ResponsiveModal>\n * <ResponsiveModalTrigger asChild><Button>Open</Button></ResponsiveModalTrigger>\n * <ResponsiveModalContent>\n * <ResponsiveModalHeader>\n * <ResponsiveModalTitle>Filters</ResponsiveModalTitle>\n * <ResponsiveModalDescription>Narrow the result set.</ResponsiveModalDescription>\n * </ResponsiveModalHeader>\n * <ResponsiveModalBody>…form fields…</ResponsiveModalBody>\n * <ResponsiveModalFooter>\n * <ResponsiveModalClose asChild><Button variant=\"soft\">Cancel</Button></ResponsiveModalClose>\n * <Button>Apply</Button>\n * </ResponsiveModalFooter>\n * </ResponsiveModalContent>\n * </ResponsiveModal>\n */\n\n// ── Context ──────────────────────────────────────────────────────────────────\n\ntype ResponsiveModalContextValue = {\n open: boolean\n isMobile: boolean\n dismissable: boolean\n onClose: () => void\n}\nconst ResponsiveModalContext = React.createContext<ResponsiveModalContextValue>({\n open: false,\n isMobile: false,\n dismissable: true,\n onClose: () => {},\n})\nconst useResponsiveModal = () => React.useContext(ResponsiveModalContext)\n\n// ── Root ──────────────────────────────────────────────────────────────────────\n\nexport interface ResponsiveModalProps\n extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root> {\n /** When false, Escape/overlay/drag cannot dismiss — only an explicit Close/onOpenChange can. @default true */\n dismissable?: boolean\n}\n\nconst ResponsiveModal: React.FC<ResponsiveModalProps> = ({\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n dismissable = true,\n children,\n ...props\n}) => {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen)\n const isControlled = controlledOpen !== undefined\n const open = isControlled ? controlledOpen : uncontrolledOpen\n const isMobile = useIsMobile()\n\n const handleOpenChange = React.useCallback(\n (value: boolean) => {\n // A non-dismissable modal ignores the primitive's implicit close attempts\n // (Escape, outside-click); only value=true or an explicit close gets through.\n if (!value && !dismissable) return\n if (!isControlled) setUncontrolledOpen(value)\n onOpenChange?.(value)\n },\n [isControlled, onOpenChange, dismissable],\n )\n\n const contextValue = React.useMemo<ResponsiveModalContextValue>(\n () => ({ open, isMobile, dismissable, onClose: () => handleOpenChange(false) }),\n [open, isMobile, dismissable, handleOpenChange],\n )\n\n return (\n <ResponsiveModalContext.Provider value={contextValue}>\n <DialogPrimitive.Root open={open} onOpenChange={handleOpenChange} {...props}>\n {children}\n </DialogPrimitive.Root>\n </ResponsiveModalContext.Provider>\n )\n}\nResponsiveModal.displayName = 'ResponsiveModal'\n\nconst ResponsiveModalTrigger = DialogPrimitive.Trigger\nconst ResponsiveModalClose = DialogPrimitive.Close\nconst ResponsiveModalPortal = DialogPrimitive.Portal\n\nconst ResponsiveModalOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n forceMount\n className={cn('fixed inset-0 z-overlay bg-overlay', className)}\n {...props}\n />\n))\nResponsiveModalOverlay.displayName = 'ResponsiveModalOverlay'\n\n// ── Snap points ────────────────────────────────────────────────────────────────\n// A snap point is a fraction (0,1] of the viewport height the sheet rests at.\n// Omitted → the sheet is content-height (capped at 90dvh) with a single rest at\n// its natural height. Provided → the sheet is tall enough for the largest snap\n// and rests at each fraction; dragging below the smallest past a threshold\n// dismisses (when dismissable).\n\nfunction nearestSnapIndex(currentVisibleFraction: number, snapPoints: number[]) {\n let best = 0\n let bestDist = Infinity\n for (let i = 0; i < snapPoints.length; i++) {\n const d = Math.abs(snapPoints[i] - currentVisibleFraction)\n if (d < bestDist) {\n bestDist = d\n best = i\n }\n }\n return best\n}\n\n// ── Content ──────────────────────────────────────────────────────────────────\n\nexport interface ResponsiveModalContentProps\n extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n /**\n * Mobile-only. Rest heights as ascending fractions of viewport height, e.g.\n * `[0.5, 0.9]`. Omit for a content-height sheet. The largest fraction caps the\n * sheet height. Ignored on desktop.\n */\n snapPoints?: number[]\n /** Mobile-only. Index into `snapPoints` the sheet opens at. @default last (tallest) */\n defaultSnapPoint?: number\n}\n\nconst DRAG_DISMISS_THRESHOLD_PX = 120\nconst DRAG_DISMISS_VELOCITY = 500\n\nconst ResponsiveModalContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n ResponsiveModalContentProps\n>(({ className, children, snapPoints, defaultSnapPoint, ...props }, ref) => {\n const { open, isMobile, dismissable, onClose } = useResponsiveModal()\n const reduced = useReducedMotion()\n const dragControls = useDragControls()\n\n const hasSnaps = isMobile && Array.isArray(snapPoints) && snapPoints.length > 0\n const sortedSnaps = React.useMemo(\n () => (hasSnaps ? [...snapPoints!].sort((a, b) => a - b) : []),\n [hasSnaps, snapPoints],\n )\n const maxSnap = sortedSnaps.length ? sortedSnaps[sortedSnaps.length - 1] : 1\n const initialSnap = React.useMemo(() => {\n if (!sortedSnaps.length) return 0\n const d = defaultSnapPoint ?? sortedSnaps.length - 1\n return Math.min(Math.max(d, 0), sortedSnaps.length - 1)\n }, [sortedSnaps, defaultSnapPoint])\n\n const [activeSnap, setActiveSnap] = React.useState(initialSnap)\n const [sheetHeight, setSheetHeight] = React.useState(0)\n const internalRef = React.useRef<HTMLDivElement>(null)\n\n // Reset to the opening snap each time it re-opens.\n React.useEffect(() => {\n if (open) setActiveSnap(initialSnap)\n }, [open, initialSnap])\n\n // Measure the laid-out sheet height so snap rest positions can be expressed in px.\n React.useEffect(() => {\n if (!isMobile) return\n const el = internalRef.current\n if (!el) return\n const measure = () => setSheetHeight(el.getBoundingClientRect().height)\n measure()\n const ro = new ResizeObserver(measure)\n ro.observe(el)\n return () => ro.disconnect()\n }, [isMobile, open])\n\n const composedRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n internalRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node\n },\n [ref],\n )\n\n // Rest translateY for a snap index: at the tallest snap y=0; smaller snaps push\n // the sheet down so only that fraction of viewport height shows.\n const restY = React.useCallback(\n (index: number) => {\n if (!sortedSnaps.length || !sheetHeight) return 0\n const visible = sortedSnaps[index]\n return ((maxSnap - visible) / maxSnap) * sheetHeight\n },\n [sortedSnaps, sheetHeight, maxSnap],\n )\n\n const canDrag = isMobile && dismissable && !reduced\n\n const handleDragEnd = React.useCallback(\n (\n _e: unknown,\n info: { offset: { y: number }; velocity: { y: number } },\n ) => {\n if (!sortedSnaps.length) {\n // Content-height sheet: single rest; drag down past threshold dismisses.\n if (info.offset.y > DRAG_DISMISS_THRESHOLD_PX || info.velocity.y > DRAG_DISMISS_VELOCITY) {\n onClose()\n }\n return\n }\n // Snapped sheet: project the release point onto the visible-fraction axis.\n const currentY = restY(activeSnap) + info.offset.y\n const draggedVisible = maxSnap - (currentY / sheetHeight) * maxSnap\n const belowLowest = sortedSnaps[0] - draggedVisible\n if (\n activeSnap === 0 &&\n (belowLowest > 0.15 || info.velocity.y > DRAG_DISMISS_VELOCITY)\n ) {\n onClose()\n return\n }\n setActiveSnap(nearestSnapIndex(draggedVisible, sortedSnaps))\n },\n [sortedSnaps, restY, activeSnap, maxSnap, sheetHeight, onClose],\n )\n\n // ── Desktop: centered Dialog ──\n const desktopClasses =\n 'fixed left-[50%] top-[50%] z-modal flex max-h-[85dvh] w-full max-w-lg flex-col overflow-hidden rounded-overlay-lg bg-surface-overlay shadow-overlay'\n\n // ── Mobile: bottom sheet ──\n const mobileClasses = cn(\n 'fixed inset-x-0 bottom-0 z-modal flex flex-col overflow-hidden rounded-t-overlay-lg border-t border-surface-border-strong bg-surface-overlay shadow-overlay',\n // Snap sheets are as tall as the largest snap; content sheets hug content up to 90dvh.\n hasSnaps ? undefined : 'max-h-[90dvh]',\n )\n\n const closeButton = dismissable ? (\n <DialogPrimitive.Close\n title=\"Close\"\n className=\"absolute right-ds-05 top-ds-05 z-10 flex min-h-ds-xs min-w-ds-xs items-center justify-center rounded-control-inner text-surface-fg-subtle transition-colors duration-fast-01 ease-productive-standard hover:bg-surface-raised-hover hover:text-surface-fg-muted focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-accent-9 active:scale-90 disabled:pointer-events-none\"\n >\n <Icon icon={IconX} size=\"lg\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n ) : null\n\n return (\n <AnimatePresence>\n {open && (\n <ResponsiveModalPortal forceMount>\n <ResponsiveModalOverlay asChild>\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={tweens.fade}\n />\n </ResponsiveModalOverlay>\n <DialogPrimitive.Content\n ref={composedRef}\n forceMount\n asChild\n onPointerDownOutside={dismissable ? undefined : (e) => e.preventDefault()}\n {...props}\n >\n <motion.div\n className={cn(isMobile ? mobileClasses : desktopClasses, className)}\n style={\n hasSnaps\n ? { height: `${maxSnap * 100}dvh` }\n : undefined\n }\n initial={isMobile ? { y: '100%' } : { opacity: 0, scale: 0.96, x: '-50%', y: '-50%' }}\n animate={\n isMobile\n ? { y: hasSnaps ? restY(activeSnap) : 0 }\n : { opacity: 1, scale: 1, x: '-50%', y: '-50%' }\n }\n exit={isMobile ? { y: '100%' } : { opacity: 0, scale: 0.96, x: '-50%', y: '-50%' }}\n transition={isMobile ? springs.smooth : { ...springs.smooth, opacity: tweens.fade }}\n drag={canDrag ? 'y' : false}\n dragListener={false}\n dragControls={dragControls}\n dragConstraints={{ top: 0 }}\n dragElastic={0.15}\n onDragEnd={canDrag ? handleDragEnd : undefined}\n >\n {/* Drag handle — the only surface that initiates a drag, so the\n scroll body below never fights the gesture (useDragControls). */}\n {isMobile && (\n <div\n className={cn('flex shrink-0 justify-center pb-ds-01 pt-ds-03', canDrag && 'cursor-grab touch-none')}\n onPointerDown={canDrag ? (e) => dragControls.start(e) : undefined}\n >\n <div className=\"h-1 w-8 rounded-pill bg-surface-border\" />\n </div>\n )}\n {closeButton}\n {children}\n </motion.div>\n </DialogPrimitive.Content>\n </ResponsiveModalPortal>\n )}\n </AnimatePresence>\n )\n})\nResponsiveModalContent.displayName = 'ResponsiveModalContent'\n\n// ── Background slot ────────────────────────────────────────────────────────────\n\n/**\n * Full-bleed layer painted behind the modal content (`-z-10`), clipped to the\n * panel's rounded corners. Render whatever you want behind the content (a\n * gradient, an aurora, an image). It is non-interactive by default.\n */\nconst ResponsiveModalBackground = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n aria-hidden\n className={cn('pointer-events-none absolute inset-0 -z-10 overflow-hidden rounded-[inherit]', className)}\n {...props}\n />\n ),\n)\nResponsiveModalBackground.displayName = 'ResponsiveModalBackground'\n\n// ── Layout parts ───────────────────────────────────────────────────────────────\n\n/** Pinned header — sits above the scroll body and does not scroll with it. */\nconst ResponsiveModalHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'flex shrink-0 flex-col gap-ds-02b px-ds-06 pb-ds-04 pt-ds-05 text-center sm:text-left',\n className,\n )}\n {...props}\n />\n ),\n)\nResponsiveModalHeader.displayName = 'ResponsiveModalHeader'\n\n/** Internal scroll region — grows to fill, scrolls when content exceeds the height cap. */\nconst ResponsiveModalBody = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('min-h-0 flex-1 overflow-y-auto px-ds-06 py-ds-02', className)}\n {...props}\n />\n ),\n)\nResponsiveModalBody.displayName = 'ResponsiveModalBody'\n\n/** Pinned footer action row. Stacks on mobile, right-aligned inline on desktop. */\nconst ResponsiveModalFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'flex shrink-0 flex-col-reverse gap-ds-03 px-ds-06 pb-ds-06 pt-ds-04 sm:flex-row sm:justify-end',\n className,\n )}\n {...props}\n />\n ),\n)\nResponsiveModalFooter.displayName = 'ResponsiveModalFooter'\n\nconst ResponsiveModalTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-ds-lg font-semibold text-surface-fg', className)}\n {...props}\n />\n))\nResponsiveModalTitle.displayName = 'ResponsiveModalTitle'\n\nconst ResponsiveModalDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-ds-md text-surface-fg-muted', className)}\n {...props}\n />\n))\nResponsiveModalDescription.displayName = 'ResponsiveModalDescription'\n\nexport {\n ResponsiveModal,\n ResponsiveModalBackground,\n ResponsiveModalBody,\n ResponsiveModalClose,\n ResponsiveModalContent,\n ResponsiveModalDescription,\n ResponsiveModalFooter,\n ResponsiveModalHeader,\n ResponsiveModalOverlay,\n ResponsiveModalPortal,\n ResponsiveModalTitle,\n ResponsiveModalTrigger,\n}\n"],"mappings":";;;;;;;;;;;AAgEA,IAAM,IAAyB,EAAM,cAA2C;CAC9E,MAAM;CACN,UAAU;CACV,aAAa;CACb,eAAe;CAChB,CAAC,EACI,UAA2B,EAAM,WAAW,EAAuB,EAUnE,KAAmD,EACvD,MAAM,GACN,iBAAc,IACd,iBACA,iBAAc,IACd,aACA,GAAG,QACC;CACJ,IAAM,CAAC,GAAkB,KAAuB,EAAM,SAAS,EAAY,EACrE,IAAe,MAAmB,KAAA,GAClC,IAAO,IAAe,IAAiB,GACvC,IAAW,GAAa,EAExB,IAAmB,EAAM,aAC5B,MAAmB;AAGd,GAAC,KAAS,CAAC,MACV,KAAc,EAAoB,EAAM,EAC7C,IAAe,EAAM;IAEvB;EAAC;EAAc;EAAc;EAAY,CAC1C,EAEK,IAAe,EAAM,eAClB;EAAE;EAAM;EAAU;EAAa,eAAe,EAAiB,GAAM;EAAE,GAC9E;EAAC;EAAM;EAAU;EAAa;EAAiB,CAChD;AAED,QACE,kBAAC,EAAuB,UAAxB;EAAiC,OAAO;YACtC,kBAAC,GAAD;GAA4B;GAAM,cAAc;GAAkB,GAAI;GACnE;GACoB,CAAA;EACS,CAAA;;AAGtC,EAAgB,cAAc;AAE9B,IAAM,IAAyB,GACzB,IAAuB,GACvB,IAAwB,GAExB,IAAyB,EAAM,YAGlC,EAAE,cAAW,GAAG,KAAS,MAC1B,kBAAC,GAAD;CACO;CACL,YAAA;CACA,WAAW,EAAG,sCAAsC,EAAU;CAC9D,GAAI;CACJ,CAAA,CACF;AACF,EAAuB,cAAc;AASrC,SAAS,EAAiB,GAAgC,GAAsB;CAC9E,IAAI,IAAO,GACP,IAAW;AACf,MAAK,IAAI,IAAI,GAAG,IAAI,EAAW,QAAQ,KAAK;EAC1C,IAAM,IAAI,KAAK,IAAI,EAAW,KAAK,EAAuB;AAC1D,EAAI,IAAI,MACN,IAAW,GACX,IAAO;;AAGX,QAAO;;AAiBT,IAAM,IAA4B,KAC5B,IAAwB,KAExB,IAAyB,EAAM,YAGlC,EAAE,cAAW,aAAU,eAAY,qBAAkB,GAAG,KAAS,MAAQ;CAC1E,IAAM,EAAE,SAAM,aAAU,gBAAa,eAAY,GAAoB,EAC/D,IAAU,GAAkB,EAC5B,IAAe,GAAiB,EAEhC,IAAW,KAAY,MAAM,QAAQ,EAAW,IAAI,EAAW,SAAS,GACxE,IAAc,EAAM,cACjB,IAAW,CAAC,GAAG,EAAY,CAAC,MAAM,GAAG,MAAM,IAAI,EAAE,GAAG,EAAE,EAC7D,CAAC,GAAU,EAAW,CACvB,EACK,IAAU,EAAY,SAAS,EAAY,EAAY,SAAS,KAAK,GACrE,IAAc,EAAM,cAAc;AACtC,MAAI,CAAC,EAAY,OAAQ,QAAO;EAChC,IAAM,IAAI,KAAoB,EAAY,SAAS;AACnD,SAAO,KAAK,IAAI,KAAK,IAAI,GAAG,EAAE,EAAE,EAAY,SAAS,EAAE;IACtD,CAAC,GAAa,EAAiB,CAAC,EAE7B,CAAC,GAAY,KAAiB,EAAM,SAAS,EAAY,EACzD,CAAC,GAAa,KAAkB,EAAM,SAAS,EAAE,EACjD,IAAc,EAAM,OAAuB,KAAK;AAQtD,CALA,EAAM,gBAAgB;AACpB,EAAI,KAAM,EAAc,EAAY;IACnC,CAAC,GAAM,EAAY,CAAC,EAGvB,EAAM,gBAAgB;AACpB,MAAI,CAAC,EAAU;EACf,IAAM,IAAK,EAAY;AACvB,MAAI,CAAC,EAAI;EACT,IAAM,UAAgB,EAAe,EAAG,uBAAuB,CAAC,OAAO;AACvE,KAAS;EACT,IAAM,IAAK,IAAI,eAAe,EAAQ;AAEtC,SADA,EAAG,QAAQ,EAAG,QACD,EAAG,YAAY;IAC3B,CAAC,GAAU,EAAK,CAAC;CAEpB,IAAM,IAAc,EAAM,aACvB,MAAgC;AAE/B,EADA,EAAY,UAAU,GAClB,OAAO,KAAQ,aAAY,EAAI,EAAK,GAC/B,MAAM,EAAsD,UAAU;IAEjF,CAAC,EAAI,CACN,EAIK,IAAQ,EAAM,aACjB,MACK,CAAC,EAAY,UAAU,CAAC,IAAoB,KAEvC,IADO,EAAY,MACE,IAAW,GAE3C;EAAC;EAAa;EAAa;EAAQ,CACpC,EAEK,IAAU,KAAY,KAAe,CAAC,GAEtC,IAAgB,EAAM,aAExB,GACA,MACG;AACH,MAAI,CAAC,EAAY,QAAQ;AAEvB,IAAI,EAAK,OAAO,IAAI,KAA6B,EAAK,SAAS,IAAI,MACjE,GAAS;AAEX;;EAIF,IAAM,IAAiB,KADN,EAAM,EAAW,GAAG,EAAK,OAAO,KACJ,IAAe,GACtD,IAAc,EAAY,KAAK;AACrC,MACE,MAAe,MACd,IAAc,OAAQ,EAAK,SAAS,IAAI,IACzC;AACA,MAAS;AACT;;AAEF,IAAc,EAAiB,GAAgB,EAAY,CAAC;IAE9D;EAAC;EAAa;EAAO;EAAY;EAAS;EAAa;EAAQ,CAChE,EAOK,IAAgB,EACpB,+JAEA,IAAW,KAAA,IAAY,gBACxB,EAEK,IAAc,IAClB,kBAAC,GAAD;EACE,OAAM;EACN,WAAU;YAFZ,CAIE,kBAAC,GAAD;GAAM,MAAM;GAAO,MAAK;GAAO,CAAA,EAC/B,kBAAC,QAAD;GAAM,WAAU;aAAU;GAAY,CAAA,CAChB;MACtB;AAEJ,QACE,kBAAC,GAAD,EAAA,UACG,KACC,kBAAC,GAAD;EAAuB,YAAA;YAAvB,CACE,kBAAC,GAAD;GAAwB,SAAA;aACtB,kBAAC,EAAO,KAAR;IACE,SAAS,EAAE,SAAS,GAAG;IACvB,SAAS,EAAE,SAAS,GAAG;IACvB,MAAM,EAAE,SAAS,GAAG;IACpB,YAAY,EAAO;IACnB,CAAA;GACqB,CAAA,EACzB,kBAAC,GAAD;GACE,KAAK;GACL,YAAA;GACA,SAAA;GACA,sBAAsB,IAAc,KAAA,KAAa,MAAM,EAAE,gBAAgB;GACzE,GAAI;aAEJ,kBAAC,EAAO,KAAR;IACE,WAAW,EAAG,IAAW,IAAgB,uJAAgB,EAAU;IACnE,OACE,IACI,EAAE,QAAQ,GAAG,IAAU,IAAI,MAAM,GACjC,KAAA;IAEN,SAAS,IAAW,EAAE,GAAG,QAAQ,GAAG;KAAE,SAAS;KAAG,OAAO;KAAM,GAAG;KAAQ,GAAG;KAAQ;IACrF,SACE,IACI,EAAE,GAAG,IAAW,EAAM,EAAW,GAAG,GAAG,GACvC;KAAE,SAAS;KAAG,OAAO;KAAG,GAAG;KAAQ,GAAG;KAAQ;IAEpD,MAAM,IAAW,EAAE,GAAG,QAAQ,GAAG;KAAE,SAAS;KAAG,OAAO;KAAM,GAAG;KAAQ,GAAG;KAAQ;IAClF,YAAY,IAAW,EAAQ,SAAS;KAAE,GAAG,EAAQ;KAAQ,SAAS,EAAO;KAAM;IACnF,MAAM,IAAU,MAAM;IACtB,cAAc;IACA;IACd,iBAAiB,EAAE,KAAK,GAAG;IAC3B,aAAa;IACb,WAAW,IAAU,IAAgB,KAAA;cApBvC;KAwBG,KACC,kBAAC,OAAD;MACE,WAAW,EAAG,kDAAkD,KAAW,yBAAyB;MACpG,eAAe,KAAW,MAAM,EAAa,MAAM,EAAE,GAAG,KAAA;gBAExD,kBAAC,OAAD,EAAK,WAAU,0CAA2C,CAAA;MACtD,CAAA;KAEP;KACA;KACU;;GACW,CAAA,CACJ;KAEV,CAAA;EAEpB;AACF,EAAuB,cAAc;AASrC,IAAM,IAA4B,EAAM,YACrC,EAAE,cAAW,GAAG,KAAS,MACxB,kBAAC,OAAD;CACO;CACL,eAAA;CACA,WAAW,EAAG,gFAAgF,EAAU;CACxG,GAAI;CACJ,CAAA,CAEL;AACD,EAA0B,cAAc;AAKxC,IAAM,IAAwB,EAAM,YACjC,EAAE,cAAW,GAAG,KAAS,MACxB,kBAAC,OAAD;CACO;CACL,WAAW,EACT,yFACA,EACD;CACD,GAAI;CACJ,CAAA,CAEL;AACD,EAAsB,cAAc;AAGpC,IAAM,IAAsB,EAAM,YAC/B,EAAE,cAAW,GAAG,KAAS,MACxB,kBAAC,OAAD;CACO;CACL,WAAW,EAAG,oDAAoD,EAAU;CAC5E,GAAI;CACJ,CAAA,CAEL;AACD,EAAoB,cAAc;AAGlC,IAAM,IAAwB,EAAM,YACjC,EAAE,cAAW,GAAG,KAAS,MACxB,kBAAC,OAAD;CACO;CACL,WAAW,EACT,kGACA,EACD;CACD,GAAI;CACJ,CAAA,CAEL;AACD,EAAsB,cAAc;AAEpC,IAAM,IAAuB,EAAM,YAGhC,EAAE,cAAW,GAAG,KAAS,MAC1B,kBAAC,GAAD;CACO;CACL,WAAW,EAAG,4CAA4C,EAAU;CACpE,GAAI;CACJ,CAAA,CACF;AACF,EAAqB,cAAc;AAEnC,IAAM,IAA6B,EAAM,YAGtC,EAAE,cAAW,GAAG,KAAS,MAC1B,kBAAC,GAAD;CACO;CACL,WAAW,EAAG,oCAAoC,EAAU;CAC5D,GAAI;CACJ,CAAA,CACF;AACF,EAA2B,cAAc"}
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { ln as e, mn as t, pn as n, un as r } from "../_chunks/primitives.js";
2
+ import { cn as e, fn as t, ln as n, pn as r } from "../_chunks/primitives.js";
3
3
  import { durations as i } from "../ui/lib/motion.js";
4
4
  import { cn as a } from "../ui/lib/utils.js";
5
5
  import { Spinner as o } from "../ui/spinner.js";
@@ -1479,9 +1479,9 @@ var xt = E.forwardRef(function({ onSubmit: o, placeholder: u = "Type a message..
1479
1479
  e(i, a, {
1480
1480
  placement: "top-end",
1481
1481
  middleware: [
1482
- n(8),
1483
- r(),
1484
- t({ padding: 8 })
1482
+ t(8),
1483
+ n(),
1484
+ r({ padding: 8 })
1485
1485
  ]
1486
1486
  }).then(({ x: e, y: t }) => {
1487
1487
  Object.assign(a.style, {