@lindaui/blocks 0.4.2 → 0.5.1

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 (255) hide show
  1. package/README.md +67 -0
  2. package/dist/ai-cost-card-f403ypsg.js +99 -0
  3. package/dist/ai-performance-card-cggm09nc.js +191 -0
  4. package/dist/analytics/ai-cost-card.d.ts +3 -0
  5. package/dist/analytics/ai-cost-card.d.ts.map +1 -0
  6. package/dist/analytics/ai-performance-card.d.ts +3 -0
  7. package/dist/analytics/ai-performance-card.d.ts.map +1 -0
  8. package/dist/analytics/analytics-card.d.ts +3 -0
  9. package/dist/analytics/analytics-card.d.ts.map +1 -0
  10. package/dist/analytics/analytics-skeleton.d.ts +5 -0
  11. package/dist/analytics/analytics-skeleton.d.ts.map +1 -0
  12. package/dist/analytics/entity-health-card.d.ts +3 -0
  13. package/dist/analytics/entity-health-card.d.ts.map +1 -0
  14. package/dist/analytics/status-distribution-chart.d.ts +3 -0
  15. package/dist/analytics/status-distribution-chart.d.ts.map +1 -0
  16. package/dist/analytics/time-range-picker.d.ts +3 -0
  17. package/dist/analytics/time-range-picker.d.ts.map +1 -0
  18. package/dist/analytics/top-entities-table.d.ts +3 -0
  19. package/dist/analytics/top-entities-table.d.ts.map +1 -0
  20. package/dist/analytics/types.d.ts +104 -0
  21. package/dist/analytics/types.d.ts.map +1 -0
  22. package/dist/analytics-card-bcmijpt6.js +38 -0
  23. package/dist/analytics-skeleton-imve37du.js +164 -0
  24. package/dist/analytics.d.ts +11 -0
  25. package/dist/analytics.d.ts.map +1 -0
  26. package/dist/analytics.js +8 -0
  27. package/dist/app-shell/drawer-focus.d.ts +8 -0
  28. package/dist/app-shell/drawer-focus.d.ts.map +1 -0
  29. package/dist/app-shell/footer.d.ts +39 -0
  30. package/dist/app-shell/footer.d.ts.map +1 -0
  31. package/dist/app-shell/logout-dialog.d.ts +6 -0
  32. package/dist/app-shell/logout-dialog.d.ts.map +1 -0
  33. package/dist/app-shell/navigation.d.ts +15 -0
  34. package/dist/app-shell/navigation.d.ts.map +1 -0
  35. package/dist/app-shell/types.d.ts +55 -0
  36. package/dist/app-shell/types.d.ts.map +1 -0
  37. package/dist/app-shell.d.ts +7 -0
  38. package/dist/app-shell.d.ts.map +1 -0
  39. package/dist/app-shell.js +254 -0
  40. package/dist/channel-settings.d.ts +24 -0
  41. package/dist/channel-settings.d.ts.map +1 -0
  42. package/dist/channel-settings.js +60 -0
  43. package/dist/chat-avatar-jdmeyf2o.js +30 -0
  44. package/dist/chat-layout-fwx3x26g.js +25 -0
  45. package/dist/chat.d.ts +22 -0
  46. package/dist/chat.d.ts.map +1 -0
  47. package/dist/chat.js +66 -0
  48. package/dist/command-palette.d.ts +22 -0
  49. package/dist/command-palette.d.ts.map +1 -0
  50. package/dist/command-palette.js +141 -0
  51. package/dist/compat-chat/chat-avatar.d.ts +16 -0
  52. package/dist/compat-chat/chat-avatar.d.ts.map +1 -0
  53. package/dist/compat-chat/chat-header.d.ts +9 -0
  54. package/dist/compat-chat/chat-header.d.ts.map +1 -0
  55. package/dist/compat-chat/chat-layout.d.ts +10 -0
  56. package/dist/compat-chat/chat-layout.d.ts.map +1 -0
  57. package/dist/compat-chat/conversation-list-item.d.ts +10 -0
  58. package/dist/compat-chat/conversation-list-item.d.ts.map +1 -0
  59. package/dist/compat-chat/conversation-list.d.ts +24 -0
  60. package/dist/compat-chat/conversation-list.d.ts.map +1 -0
  61. package/dist/compat-chat/conversation-thread.d.ts +18 -0
  62. package/dist/compat-chat/conversation-thread.d.ts.map +1 -0
  63. package/dist/compat-chat/date-divider.d.ts +5 -0
  64. package/dist/compat-chat/date-divider.d.ts.map +1 -0
  65. package/dist/compat-chat/empty-chat-view.d.ts +6 -0
  66. package/dist/compat-chat/empty-chat-view.d.ts.map +1 -0
  67. package/dist/compat-chat/image-lightbox.d.ts +7 -0
  68. package/dist/compat-chat/image-lightbox.d.ts.map +1 -0
  69. package/dist/compat-chat/message-bubble.d.ts +6 -0
  70. package/dist/compat-chat/message-bubble.d.ts.map +1 -0
  71. package/dist/compat-chat/message-composer.d.ts +11 -0
  72. package/dist/compat-chat/message-composer.d.ts.map +1 -0
  73. package/dist/compat-chat/time-divider.d.ts +5 -0
  74. package/dist/compat-chat/time-divider.d.ts.map +1 -0
  75. package/dist/compat-chat/time-grouping.d.ts +5 -0
  76. package/dist/compat-chat/time-grouping.d.ts.map +1 -0
  77. package/dist/compat-chat/types.d.ts +35 -0
  78. package/dist/compat-chat/types.d.ts.map +1 -0
  79. package/dist/compat-chat/whatsapp-audio-player.d.ts +7 -0
  80. package/dist/compat-chat/whatsapp-audio-player.d.ts.map +1 -0
  81. package/dist/compat.d.ts +9 -0
  82. package/dist/compat.d.ts.map +1 -0
  83. package/dist/compat.js +4 -0
  84. package/dist/connected-panel-lhwy25yk.js +132 -0
  85. package/dist/connection-panel/connected-panel.d.ts +26 -0
  86. package/dist/connection-panel/connected-panel.d.ts.map +1 -0
  87. package/dist/connection-panel/disconnected-panel.d.ts +12 -0
  88. package/dist/connection-panel/disconnected-panel.d.ts.map +1 -0
  89. package/dist/connection-panel/instructions.d.ts +5 -0
  90. package/dist/connection-panel/instructions.d.ts.map +1 -0
  91. package/dist/connection-panel/qr-panel.d.ts +14 -0
  92. package/dist/connection-panel/qr-panel.d.ts.map +1 -0
  93. package/dist/connection-panel/use-qr-refresh.d.ts +18 -0
  94. package/dist/connection-panel/use-qr-refresh.d.ts.map +1 -0
  95. package/dist/connection-panel.d.ts +39 -0
  96. package/dist/connection-panel.d.ts.map +1 -0
  97. package/dist/connection-panel.js +328 -0
  98. package/dist/conversation-list-ekq2dzca.js +133 -0
  99. package/dist/conversation-list-item-fy6t5af2.js +55 -0
  100. package/dist/conversation-thread-c60431oa.js +205 -0
  101. package/dist/entity-card.d.ts +17 -0
  102. package/dist/entity-card.d.ts.map +1 -0
  103. package/dist/entity-card.js +69 -0
  104. package/dist/entity-health-card-ggnmrtrq.js +192 -0
  105. package/dist/entity-switcher.d.ts +33 -0
  106. package/dist/entity-switcher.d.ts.map +1 -0
  107. package/dist/entity-switcher.js +137 -0
  108. package/dist/filter-bar.d.ts +41 -0
  109. package/dist/filter-bar.d.ts.map +1 -0
  110. package/dist/filter-bar.js +155 -0
  111. package/dist/footer-f7r5e42b.js +192 -0
  112. package/dist/image-lightbox-ci3arb6z.js +62 -0
  113. package/dist/kanban/drop-utils.d.ts +18 -0
  114. package/dist/kanban/drop-utils.d.ts.map +1 -0
  115. package/dist/kanban/navigation-buttons.d.ts +9 -0
  116. package/dist/kanban/navigation-buttons.d.ts.map +1 -0
  117. package/dist/kanban/scroll-indicators.d.ts +6 -0
  118. package/dist/kanban/scroll-indicators.d.ts.map +1 -0
  119. package/dist/kanban/use-keyboard-navigation.d.ts +4 -0
  120. package/dist/kanban/use-keyboard-navigation.d.ts.map +1 -0
  121. package/dist/kanban-board.d.ts +31 -0
  122. package/dist/kanban-board.d.ts.map +1 -0
  123. package/dist/kanban-board.js +128 -0
  124. package/dist/kanban-column.d.ts +13 -0
  125. package/dist/kanban-column.d.ts.map +1 -0
  126. package/dist/kanban-column.js +58 -0
  127. package/dist/legacy-kpi-card.d.ts +16 -0
  128. package/dist/legacy-kpi-card.d.ts.map +1 -0
  129. package/dist/legacy-kpi-card.js +4 -0
  130. package/dist/logout-dialog-bbv59tbi.js +93 -0
  131. package/dist/message-bubble-odjvhroq.js +110 -0
  132. package/dist/message-composer-m2n6soo7.js +59 -0
  133. package/dist/navigation-buttons-e77mshh0.js +65 -0
  134. package/dist/navigation-hotcrqoq.js +115 -0
  135. package/dist/save-bar.d.ts +15 -0
  136. package/dist/save-bar.d.ts.map +1 -0
  137. package/dist/save-bar.js +38 -0
  138. package/dist/scroll-indicators-gvxapogd.js +39 -0
  139. package/dist/settings-layout.d.ts +20 -0
  140. package/dist/settings-layout.d.ts.map +1 -0
  141. package/dist/settings-layout.js +56 -0
  142. package/dist/source-selector.d.ts +18 -0
  143. package/dist/source-selector.d.ts.map +1 -0
  144. package/dist/source-selector.js +59 -0
  145. package/dist/status-distribution-chart-oucedzv7.js +87 -0
  146. package/dist/status-filters.d.ts +12 -0
  147. package/dist/status-filters.d.ts.map +1 -0
  148. package/dist/status-filters.js +31 -0
  149. package/dist/stepper.d.ts +15 -0
  150. package/dist/stepper.d.ts.map +1 -0
  151. package/dist/stepper.js +42 -0
  152. package/dist/time-range-picker-mu38hul4.js +123 -0
  153. package/dist/top-entities-table-o7xzpq96.js +78 -0
  154. package/dist/use-keyboard-navigation-he1xmriz.js +52 -0
  155. package/dist/whatsapp-audio-player-nooty6jb.js +277 -0
  156. package/llms.txt +98 -4
  157. package/package.json +191 -46
  158. package/src/analytics/ai-cost-card.tsx +31 -0
  159. package/src/analytics/ai-performance-card.tsx +48 -0
  160. package/src/analytics/analytics-card.tsx +14 -0
  161. package/src/analytics/analytics-skeleton.tsx +15 -0
  162. package/src/analytics/entity-health-card.tsx +50 -0
  163. package/src/analytics/status-distribution-chart.tsx +20 -0
  164. package/src/analytics/time-range-picker.tsx +43 -0
  165. package/src/analytics/top-entities-table.tsx +24 -0
  166. package/src/analytics/types.ts +43 -0
  167. package/src/analytics.ts +10 -0
  168. package/src/app-shell/drawer-focus.ts +42 -0
  169. package/src/app-shell/footer.tsx +160 -0
  170. package/src/app-shell/logout-dialog.tsx +68 -0
  171. package/src/app-shell/navigation.tsx +147 -0
  172. package/src/app-shell/types.ts +57 -0
  173. package/src/app-shell.tsx +166 -0
  174. package/src/area-chart.tsx +85 -0
  175. package/src/audio-player.tsx +74 -0
  176. package/src/auth-layout.tsx +132 -0
  177. package/src/auth-provider.tsx +29 -0
  178. package/src/bar-chart.tsx +78 -0
  179. package/src/channel-settings.tsx +76 -0
  180. package/src/chart-card.tsx +45 -0
  181. package/src/chat-avatar.tsx +57 -0
  182. package/src/chat-date-divider.tsx +18 -0
  183. package/src/chat-header.tsx +24 -0
  184. package/src/chat-layout.tsx +41 -0
  185. package/src/chat-time-divider.tsx +20 -0
  186. package/src/chat-types.ts +32 -0
  187. package/src/chat.ts +21 -0
  188. package/src/command-palette.tsx +110 -0
  189. package/src/compat-chat/chat-avatar.tsx +23 -0
  190. package/src/compat-chat/chat-header.tsx +12 -0
  191. package/src/compat-chat/chat-layout.tsx +14 -0
  192. package/src/compat-chat/conversation-list-item.tsx +27 -0
  193. package/src/compat-chat/conversation-list.tsx +49 -0
  194. package/src/compat-chat/conversation-thread.tsx +92 -0
  195. package/src/compat-chat/date-divider.tsx +7 -0
  196. package/src/compat-chat/empty-chat-view.tsx +9 -0
  197. package/src/compat-chat/image-lightbox.tsx +22 -0
  198. package/src/compat-chat/message-bubble.tsx +28 -0
  199. package/src/compat-chat/message-composer.tsx +26 -0
  200. package/src/compat-chat/time-divider.tsx +5 -0
  201. package/src/compat-chat/time-grouping.ts +19 -0
  202. package/src/compat-chat/types.ts +31 -0
  203. package/src/compat-chat/whatsapp-audio-player.tsx +100 -0
  204. package/src/compat.ts +8 -0
  205. package/src/confirm-dialog.tsx +85 -0
  206. package/src/connection-panel/connected-panel.tsx +106 -0
  207. package/src/connection-panel/disconnected-panel.tsx +48 -0
  208. package/src/connection-panel/instructions.tsx +9 -0
  209. package/src/connection-panel/qr-panel.tsx +62 -0
  210. package/src/connection-panel/use-qr-refresh.ts +52 -0
  211. package/src/connection-panel.tsx +141 -0
  212. package/src/conversation-list-item.tsx +53 -0
  213. package/src/conversation-list.tsx +67 -0
  214. package/src/conversation-thread.tsx +64 -0
  215. package/src/detail-panel.tsx +123 -0
  216. package/src/document-panel.tsx +109 -0
  217. package/src/document-reader.tsx +29 -0
  218. package/src/empty-chat-view.tsx +25 -0
  219. package/src/entity-card.tsx +74 -0
  220. package/src/entity-health-card.tsx +53 -0
  221. package/src/entity-switcher.tsx +126 -0
  222. package/src/fetching-indicator.tsx +16 -0
  223. package/src/field-array-form.tsx +166 -0
  224. package/src/filter-bar.tsx +203 -0
  225. package/src/image-viewer.tsx +129 -0
  226. package/src/kanban/drop-utils.ts +31 -0
  227. package/src/kanban/navigation-buttons.tsx +80 -0
  228. package/src/kanban/scroll-indicators.tsx +47 -0
  229. package/src/kanban/use-keyboard-navigation.ts +43 -0
  230. package/src/kanban-board.tsx +160 -0
  231. package/src/kanban-column.tsx +62 -0
  232. package/src/legacy-kpi-card.tsx +38 -0
  233. package/src/line-chart.tsx +58 -0
  234. package/src/list-item.tsx +63 -0
  235. package/src/list-pane.tsx +143 -0
  236. package/src/login-form.tsx +128 -0
  237. package/src/message-bubble.tsx +70 -0
  238. package/src/message-composer.tsx +52 -0
  239. package/src/pie-chart.tsx +70 -0
  240. package/src/radar-chart.tsx +55 -0
  241. package/src/radial-chart.tsx +103 -0
  242. package/src/recording-overlay.tsx +159 -0
  243. package/src/save-bar.tsx +35 -0
  244. package/src/settings-layout.tsx +79 -0
  245. package/src/source-selector.tsx +71 -0
  246. package/src/split-workspace.tsx +74 -0
  247. package/src/stat-card.tsx +166 -0
  248. package/src/stats-grid.tsx +23 -0
  249. package/src/status-filters.tsx +28 -0
  250. package/src/stepper.tsx +47 -0
  251. package/src/table-pane.tsx +194 -0
  252. package/src/time-range-picker.tsx +89 -0
  253. package/src/workspace-back-button.tsx +32 -0
  254. package/dist/chat-types.test.d.ts +0 -2
  255. package/dist/chat-types.test.d.ts.map +0 -1
@@ -0,0 +1,33 @@
1
+ import type { ReactNode } from "react";
2
+ export interface EntitySwitcherItem {
3
+ identifier: string;
4
+ name: string;
5
+ description?: string | null;
6
+ }
7
+ export interface EntitySwitcherAction {
8
+ identifier: string;
9
+ label: string;
10
+ icon?: ReactNode;
11
+ className?: string;
12
+ onAction: () => void;
13
+ }
14
+ export interface EntitySwitcherLabels {
15
+ trigger: string;
16
+ menu: string;
17
+ section: string;
18
+ fallbackDescription?: string;
19
+ visiting?: string;
20
+ }
21
+ export interface EntitySwitcherProps<T extends EntitySwitcherItem = EntitySwitcherItem> {
22
+ currentEntity?: T | null;
23
+ entities: T[];
24
+ onSelect: (entity: T) => void;
25
+ labels: EntitySwitcherLabels;
26
+ isCollapsed?: boolean;
27
+ isVisiting?: boolean;
28
+ actions?: EntitySwitcherAction[];
29
+ renderAvatar?: (entity: T) => ReactNode;
30
+ }
31
+ /** Controlled, domain-neutral entity selector with the original compact sidebar anatomy. */
32
+ export declare function EntitySwitcher<T extends EntitySwitcherItem>({ currentEntity, entities, onSelect, labels, isCollapsed, isVisiting, actions, renderAvatar, }: EntitySwitcherProps<T>): import("react").JSX.Element | null;
33
+ //# sourceMappingURL=entity-switcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-switcher.d.ts","sourceRoot":"","sources":["../src/entity-switcher.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,kBAAkB,GAAG,kBAAkB;IACpF,aAAa,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,CAAC,EAAE,CAAC;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC;IAC9B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACjC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,SAAS,CAAC;CACzC;AAED,4FAA4F;AAC5F,wBAAgB,cAAc,CAAC,CAAC,SAAS,kBAAkB,EAAE,EAC3D,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAmB,EAC9D,UAAkB,EAAE,OAAY,EAAE,YAAY,GAC/C,EAAE,mBAAmB,CAAC,CAAC,CAAC,sCAiFxB"}
@@ -0,0 +1,137 @@
1
+ 'use client';
2
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
+ import { Dropdown, Avatar, Chip, Header, Label, Description, Separator } from '@lindaui/ui/compound';
4
+ import { cn } from '@lindaui/ui/cn';
5
+ import { ChevronDown } from 'lucide-react';
6
+
7
+ /** Controlled, domain-neutral entity selector with the original compact sidebar anatomy. */ function EntitySwitcher({ currentEntity, entities, onSelect, labels, isCollapsed = false, isVisiting = false, actions = [], renderAvatar }) {
8
+ if (!currentEntity) return null;
9
+ return /*#__PURE__*/ jsx("div", {
10
+ className: cn("px-2 py-2", isCollapsed ? "flex justify-center" : ""),
11
+ children: /*#__PURE__*/ jsxs(Dropdown, {
12
+ children: [
13
+ /*#__PURE__*/ jsx(Dropdown.Trigger, {
14
+ "aria-label": labels.trigger,
15
+ className: "w-full min-w-0",
16
+ children: /*#__PURE__*/ jsxs("div", {
17
+ className: cn("flex w-full min-w-0 cursor-pointer items-center gap-2 rounded-lg p-2 transition-colors hover:bg-surface-secondary", isVisiting ? "ring-2 ring-warning ring-offset-1" : "", isCollapsed ? "justify-center" : ""),
18
+ children: [
19
+ /*#__PURE__*/ jsx(Avatar, {
20
+ className: "flex-shrink-0 transition-transform",
21
+ color: isVisiting ? "warning" : "default",
22
+ size: "sm",
23
+ children: renderAvatar ? renderAvatar(currentEntity) : /*#__PURE__*/ jsx(Avatar.Fallback, {
24
+ children: currentEntity.name.charAt(0).toUpperCase()
25
+ })
26
+ }),
27
+ !isCollapsed && /*#__PURE__*/ jsxs(Fragment, {
28
+ children: [
29
+ /*#__PURE__*/ jsxs("div", {
30
+ className: "min-w-0 flex-1 overflow-hidden",
31
+ children: [
32
+ /*#__PURE__*/ jsxs("div", {
33
+ className: "flex min-w-0 items-center gap-1.5",
34
+ children: [
35
+ /*#__PURE__*/ jsx("p", {
36
+ className: "truncate font-semibold text-sm",
37
+ children: currentEntity.name
38
+ }),
39
+ isVisiting && labels.visiting ? /*#__PURE__*/ jsx(Chip, {
40
+ className: "shrink-0",
41
+ color: "warning",
42
+ size: "sm",
43
+ variant: "soft",
44
+ children: labels.visiting
45
+ }) : null
46
+ ]
47
+ }),
48
+ /*#__PURE__*/ jsx("p", {
49
+ className: "truncate text-muted text-xs",
50
+ children: currentEntity.description || labels.fallbackDescription
51
+ })
52
+ ]
53
+ }),
54
+ /*#__PURE__*/ jsx(ChevronDown, {
55
+ className: "shrink-0 text-muted",
56
+ size: 16
57
+ })
58
+ ]
59
+ })
60
+ ]
61
+ })
62
+ }),
63
+ /*#__PURE__*/ jsx(Dropdown.Popover, {
64
+ className: "rounded-[14px]",
65
+ placement: "bottom start",
66
+ children: /*#__PURE__*/ jsxs(Dropdown.Menu, {
67
+ "aria-label": labels.menu,
68
+ className: "w-60 [&_[data-slot=menu-item]]:rounded-lg",
69
+ onAction: (key)=>{
70
+ const action = actions.find((item)=>item.identifier === String(key));
71
+ if (action) {
72
+ action.onAction();
73
+ return;
74
+ }
75
+ const entity = entities.find((item)=>item.identifier === String(key));
76
+ if (entity) onSelect(entity);
77
+ },
78
+ selectedKeys: new Set([
79
+ currentEntity.identifier
80
+ ]),
81
+ selectionMode: "single",
82
+ children: [
83
+ /*#__PURE__*/ jsxs(Dropdown.Section, {
84
+ children: [
85
+ /*#__PURE__*/ jsx(Header, {
86
+ children: labels.section
87
+ }),
88
+ entities.map((entity)=>/*#__PURE__*/ jsxs(Dropdown.Item, {
89
+ id: entity.identifier,
90
+ textValue: entity.name,
91
+ children: [
92
+ /*#__PURE__*/ jsx(Dropdown.ItemIndicator, {}),
93
+ /*#__PURE__*/ jsx(Avatar, {
94
+ className: "flex-shrink-0",
95
+ size: "sm",
96
+ children: renderAvatar ? renderAvatar(entity) : /*#__PURE__*/ jsx(Avatar.Fallback, {
97
+ children: entity.name.charAt(0).toUpperCase()
98
+ })
99
+ }),
100
+ /*#__PURE__*/ jsxs("div", {
101
+ className: "flex min-w-0 flex-col",
102
+ children: [
103
+ /*#__PURE__*/ jsx(Label, {
104
+ children: entity.name
105
+ }),
106
+ /*#__PURE__*/ jsx(Description, {
107
+ children: entity.description
108
+ })
109
+ ]
110
+ })
111
+ ]
112
+ }, entity.identifier))
113
+ ]
114
+ }),
115
+ actions.length > 0 ? /*#__PURE__*/ jsx(Separator, {}) : null,
116
+ actions.length > 0 ? /*#__PURE__*/ jsx(Dropdown.Section, {
117
+ children: actions.map((action)=>/*#__PURE__*/ jsxs(Dropdown.Item, {
118
+ className: action.className,
119
+ id: action.identifier,
120
+ textValue: action.label,
121
+ children: [
122
+ action.icon,
123
+ /*#__PURE__*/ jsx(Label, {
124
+ children: action.label
125
+ })
126
+ ]
127
+ }, action.identifier))
128
+ }) : null
129
+ ]
130
+ })
131
+ })
132
+ ]
133
+ })
134
+ });
135
+ }
136
+
137
+ export { EntitySwitcher };
@@ -0,0 +1,41 @@
1
+ import { type LucideIcon } from "lucide-react";
2
+ import { type ReactNode } from "react";
3
+ export interface FilterOption {
4
+ key: string;
5
+ label: string;
6
+ }
7
+ export interface SortOption {
8
+ key: string;
9
+ label: string;
10
+ }
11
+ export interface FilterBarSearchProps {
12
+ className: string;
13
+ onChange: (value: string) => void;
14
+ placeholder: string;
15
+ value: string;
16
+ }
17
+ export interface FilterBarIconButtonProps {
18
+ icon: LucideIcon;
19
+ isActive: boolean;
20
+ tooltip: string;
21
+ }
22
+ export interface FilterBarProps {
23
+ className?: string;
24
+ searchValue: string;
25
+ onSearchChange: (value: string) => void;
26
+ searchPlaceholder?: string;
27
+ filterOptions?: FilterOption[];
28
+ selectedFilters?: string[];
29
+ onFilterChange?: (filters: string[]) => void;
30
+ filterLabel?: string;
31
+ clearFiltersLabel?: string;
32
+ clearSearchLabel?: string;
33
+ sortOptions?: SortOption[];
34
+ selectedSort?: string;
35
+ onSortChange?: (sort: string) => void;
36
+ sortLabel?: string;
37
+ renderSearchInput?: (props: FilterBarSearchProps) => ReactNode;
38
+ renderIconButton?: (props: FilterBarIconButtonProps) => ReactNode;
39
+ }
40
+ export declare function FilterBar({ searchValue, onSearchChange, searchPlaceholder, filterOptions, selectedFilters, onFilterChange, filterLabel, clearFiltersLabel, clearSearchLabel, sortOptions, selectedSort, onSortChange, sortLabel, className, renderSearchInput, renderIconButton, }: FilterBarProps): import("react").JSX.Element;
41
+ //# sourceMappingURL=filter-bar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-bar.d.ts","sourceRoot":"","sources":["../src/filter-bar.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAqC,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjD,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,SAAS,CAAC;IAC/D,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,SAAS,CAAC;CACnE;AAED,wBAAgB,SAAS,CAAC,EACxB,WAAW,EACX,cAAc,EACd,iBAA+B,EAC/B,aAAa,EACb,eAAoB,EACpB,cAAc,EACd,WAAsB,EACtB,iBAAmC,EACnC,gBAAiC,EACjC,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,SAAkB,EAClB,SAAS,EACT,iBAAiB,EACjB,gBAA6D,GAC9D,EAAE,cAAc,+BAqFhB"}
@@ -0,0 +1,155 @@
1
+ 'use client';
2
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
+ import { Popover, CheckboxGroup, Checkbox, Button, TextField, InputGroup, CloseButton } from '@lindaui/ui/compound';
4
+ import { cn } from '@lindaui/ui/cn';
5
+ import { Filter, SlidersHorizontal, Search } from 'lucide-react';
6
+ import { useState } from 'react';
7
+
8
+ function FilterBar({ searchValue, onSearchChange, searchPlaceholder = "Search...", filterOptions, selectedFilters = [], onFilterChange, filterLabel = "Filter", clearFiltersLabel = "Clear filters", clearSearchLabel = "Clear search", sortOptions, selectedSort, onSortChange, sortLabel = "Sort", className, renderSearchInput, renderIconButton = (props)=>/*#__PURE__*/ jsx(FilterIconButton, {
9
+ ...props
10
+ }) }) {
11
+ const [isFilterOpen, setIsFilterOpen] = useState(false);
12
+ const [isSortOpen, setIsSortOpen] = useState(false);
13
+ const hasActiveFilters = selectedFilters.length > 0;
14
+ const searchProps = {
15
+ className: "min-w-0 flex-1",
16
+ onChange: onSearchChange,
17
+ placeholder: searchPlaceholder,
18
+ value: searchValue
19
+ };
20
+ return /*#__PURE__*/ jsxs("div", {
21
+ className: cn("flex items-center gap-2", className),
22
+ children: [
23
+ renderSearchInput ? renderSearchInput(searchProps) : /*#__PURE__*/ jsx(FilterSearchInput, {
24
+ ...searchProps,
25
+ clearLabel: clearSearchLabel
26
+ }),
27
+ filterOptions && filterOptions.length > 0 ? /*#__PURE__*/ jsxs(Popover, {
28
+ isOpen: isFilterOpen,
29
+ onOpenChange: setIsFilterOpen,
30
+ children: [
31
+ renderIconButton({
32
+ icon: Filter,
33
+ isActive: hasActiveFilters,
34
+ tooltip: filterLabel
35
+ }),
36
+ /*#__PURE__*/ jsx(Popover.Content, {
37
+ className: "min-w-[200px] p-4",
38
+ placement: "bottom end",
39
+ children: /*#__PURE__*/ jsxs(Popover.Dialog, {
40
+ className: "space-y-3",
41
+ children: [
42
+ /*#__PURE__*/ jsx("p", {
43
+ className: "font-semibold text-sm",
44
+ children: filterLabel
45
+ }),
46
+ /*#__PURE__*/ jsx(CheckboxGroup, {
47
+ "aria-label": filterLabel,
48
+ onChange: (values)=>onFilterChange?.(values),
49
+ value: selectedFilters,
50
+ children: filterOptions.map((option)=>/*#__PURE__*/ jsx(Checkbox, {
51
+ value: option.key,
52
+ children: /*#__PURE__*/ jsxs(Checkbox.Content, {
53
+ children: [
54
+ /*#__PURE__*/ jsx(Checkbox.Control, {
55
+ children: /*#__PURE__*/ jsx(Checkbox.Indicator, {})
56
+ }),
57
+ option.label
58
+ ]
59
+ })
60
+ }, option.key))
61
+ }),
62
+ hasActiveFilters ? /*#__PURE__*/ jsx(Button, {
63
+ className: "w-full text-danger",
64
+ onPress: ()=>onFilterChange?.([]),
65
+ size: "sm",
66
+ variant: "ghost",
67
+ children: clearFiltersLabel
68
+ }) : null
69
+ ]
70
+ })
71
+ })
72
+ ]
73
+ }) : null,
74
+ sortOptions && sortOptions.length > 0 ? /*#__PURE__*/ jsxs(Popover, {
75
+ isOpen: isSortOpen,
76
+ onOpenChange: setIsSortOpen,
77
+ children: [
78
+ renderIconButton({
79
+ icon: SlidersHorizontal,
80
+ isActive: !!selectedSort,
81
+ tooltip: sortLabel
82
+ }),
83
+ /*#__PURE__*/ jsx(Popover.Content, {
84
+ className: "min-w-[200px] p-4",
85
+ placement: "bottom end",
86
+ children: /*#__PURE__*/ jsxs(Popover.Dialog, {
87
+ className: "space-y-3",
88
+ children: [
89
+ /*#__PURE__*/ jsx("p", {
90
+ className: "font-semibold text-sm",
91
+ children: sortLabel
92
+ }),
93
+ /*#__PURE__*/ jsx("div", {
94
+ className: "space-y-1",
95
+ children: sortOptions.map((option)=>/*#__PURE__*/ jsx(Button, {
96
+ className: cn("w-full justify-start", selectedSort === option.key && "bg-accent-soft text-accent"),
97
+ onPress: ()=>{
98
+ onSortChange?.(option.key);
99
+ setIsSortOpen(false);
100
+ },
101
+ size: "sm",
102
+ variant: selectedSort === option.key ? "tertiary" : "ghost",
103
+ children: option.label
104
+ }, option.key))
105
+ })
106
+ ]
107
+ })
108
+ })
109
+ ]
110
+ }) : null
111
+ ]
112
+ });
113
+ }
114
+ function FilterSearchInput({ value, onChange, placeholder, className, clearLabel }) {
115
+ return /*#__PURE__*/ jsx(TextField, {
116
+ "aria-label": placeholder,
117
+ className: cn("w-full min-w-0", className),
118
+ onChange: onChange,
119
+ value: value,
120
+ children: /*#__PURE__*/ jsxs(InputGroup, {
121
+ children: [
122
+ /*#__PURE__*/ jsx(InputGroup.Prefix, {
123
+ children: /*#__PURE__*/ jsx(Search, {
124
+ className: "text-muted",
125
+ size: 18
126
+ })
127
+ }),
128
+ /*#__PURE__*/ jsx(InputGroup.Input, {
129
+ className: "text-sm",
130
+ placeholder: placeholder
131
+ }),
132
+ value ? /*#__PURE__*/ jsx(InputGroup.Suffix, {
133
+ children: /*#__PURE__*/ jsx(CloseButton, {
134
+ "aria-label": clearLabel,
135
+ onPress: ()=>onChange("")
136
+ })
137
+ }) : null
138
+ ]
139
+ })
140
+ });
141
+ }
142
+ function FilterIconButton({ icon: Icon, isActive, tooltip }) {
143
+ return /*#__PURE__*/ jsx(Button, {
144
+ "aria-label": tooltip,
145
+ className: cn("border border-border", isActive ? "border-accent" : ""),
146
+ isIconOnly: true,
147
+ size: "md",
148
+ variant: isActive ? "tertiary" : "ghost",
149
+ children: /*#__PURE__*/ jsx(Icon, {
150
+ size: 20
151
+ })
152
+ });
153
+ }
154
+
155
+ export { FilterBar };
@@ -0,0 +1,192 @@
1
+ 'use client';
2
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
3
+ import { Tooltip, Button, Avatar } from '@lindaui/ui/compound';
4
+ import { cn } from '@lindaui/ui/cn';
5
+ import { Wifi, WifiOff, Download, Sun, Moon, LogOut } from 'lucide-react';
6
+ import { u as useLogoutDialog } from './logout-dialog-bbv59tbi.js';
7
+
8
+ const defaultLabels = {
9
+ connected: "Connected",
10
+ disconnected: "Disconnected",
11
+ installApp: "Install app",
12
+ lightTheme: "Light mode",
13
+ darkTheme: "Dark mode",
14
+ lightThemeTooltip: "Light mode",
15
+ darkThemeTooltip: "Dark mode",
16
+ logoutTrigger: "Sign out",
17
+ logoutTitle: "Sign out?",
18
+ logoutDescription: "You will need to sign in again to access your account.",
19
+ logoutCancel: "Cancel",
20
+ logoutConfirm: "Sign out",
21
+ logoutPending: "Signing out…",
22
+ logoutError: "Unable to sign out. Please try again."
23
+ };
24
+ /** Connection, installation, theme and account actions; all business effects are injected. */ function AppShellFooter({ className, isCollapsed = false, isConnected = false, showConnectionStatus = true, isInstallable = false, onInstall, mounted = false, theme, onToggleTheme, user, onSignOut, labels: labelOverrides }) {
25
+ const labels = {
26
+ ...defaultLabels,
27
+ ...labelOverrides
28
+ };
29
+ const logout = useLogoutDialog(onSignOut, labels);
30
+ const statusLabel = isConnected ? labels.connected : labels.disconnected;
31
+ const themeLabel = theme === "dark" ? labels.lightTheme : labels.darkTheme;
32
+ const themeTooltip = theme === "dark" ? labels.lightThemeTooltip : labels.darkThemeTooltip;
33
+ return /*#__PURE__*/ jsxs("div", {
34
+ className: cn("space-y-2 border-border border-t px-2 py-4", className),
35
+ children: [
36
+ showConnectionStatus ? isCollapsed ? /*#__PURE__*/ jsxs(Tooltip, {
37
+ children: [
38
+ /*#__PURE__*/ jsx(Tooltip.Trigger, {
39
+ "aria-label": statusLabel,
40
+ children: /*#__PURE__*/ jsx("div", {
41
+ className: cn("mx-1 flex justify-center rounded-lg py-2", isConnected ? "bg-success/10" : "bg-danger/10"),
42
+ children: isConnected ? /*#__PURE__*/ jsx(Wifi, {
43
+ className: "text-success",
44
+ size: 16
45
+ }) : /*#__PURE__*/ jsx(WifiOff, {
46
+ className: "text-danger",
47
+ size: 16
48
+ })
49
+ })
50
+ }),
51
+ /*#__PURE__*/ jsx(Tooltip.Content, {
52
+ placement: "right",
53
+ children: statusLabel
54
+ })
55
+ ]
56
+ }) : /*#__PURE__*/ jsx("div", {
57
+ className: cn("flex items-center justify-center gap-2 rounded-lg px-3 py-2.5", isConnected ? "bg-success/10" : "bg-danger/10"),
58
+ children: isConnected ? /*#__PURE__*/ jsxs(Fragment, {
59
+ children: [
60
+ /*#__PURE__*/ jsx(Wifi, {
61
+ className: "text-success",
62
+ size: 16
63
+ }),
64
+ /*#__PURE__*/ jsx("span", {
65
+ className: "font-medium text-success text-xs",
66
+ children: statusLabel
67
+ })
68
+ ]
69
+ }) : /*#__PURE__*/ jsxs(Fragment, {
70
+ children: [
71
+ /*#__PURE__*/ jsx(WifiOff, {
72
+ className: "text-danger",
73
+ size: 16
74
+ }),
75
+ /*#__PURE__*/ jsx("span", {
76
+ className: "font-medium text-danger text-xs",
77
+ children: statusLabel
78
+ })
79
+ ]
80
+ })
81
+ }) : null,
82
+ isInstallable && !isCollapsed ? /*#__PURE__*/ jsxs(Button, {
83
+ className: "w-full text-xs",
84
+ onPress: onInstall,
85
+ size: "sm",
86
+ variant: "tertiary",
87
+ children: [
88
+ /*#__PURE__*/ jsx(Download, {
89
+ size: 14
90
+ }),
91
+ labels.installApp
92
+ ]
93
+ }) : null,
94
+ mounted ? isCollapsed ? /*#__PURE__*/ jsxs(Tooltip, {
95
+ children: [
96
+ /*#__PURE__*/ jsx(Tooltip.Trigger, {
97
+ children: /*#__PURE__*/ jsx(Button, {
98
+ "aria-label": themeTooltip,
99
+ className: "w-full text-muted hover:text-foreground",
100
+ isIconOnly: true,
101
+ onPress: onToggleTheme,
102
+ size: "sm",
103
+ variant: "ghost",
104
+ children: theme === "dark" ? /*#__PURE__*/ jsx(Sun, {
105
+ size: 16
106
+ }) : /*#__PURE__*/ jsx(Moon, {
107
+ size: 16
108
+ })
109
+ })
110
+ }),
111
+ /*#__PURE__*/ jsx(Tooltip.Content, {
112
+ placement: "right",
113
+ children: themeTooltip
114
+ })
115
+ ]
116
+ }) : /*#__PURE__*/ jsxs(Button, {
117
+ className: "w-full text-xs",
118
+ onPress: onToggleTheme,
119
+ size: "sm",
120
+ variant: "tertiary",
121
+ children: [
122
+ theme === "dark" ? /*#__PURE__*/ jsx(Sun, {
123
+ size: 14
124
+ }) : /*#__PURE__*/ jsx(Moon, {
125
+ size: 14
126
+ }),
127
+ themeLabel
128
+ ]
129
+ }) : null,
130
+ isCollapsed ? /*#__PURE__*/ jsxs(Tooltip, {
131
+ children: [
132
+ /*#__PURE__*/ jsx(Tooltip.Trigger, {
133
+ children: /*#__PURE__*/ jsx(Button, {
134
+ "aria-label": labels.logoutTrigger,
135
+ className: "w-full text-muted hover:text-danger",
136
+ isIconOnly: true,
137
+ onPress: logout.open,
138
+ size: "sm",
139
+ variant: "ghost",
140
+ children: /*#__PURE__*/ jsx(LogOut, {
141
+ size: 16
142
+ })
143
+ })
144
+ }),
145
+ /*#__PURE__*/ jsx(Tooltip.Content, {
146
+ placement: "right",
147
+ children: labels.logoutTrigger
148
+ })
149
+ ]
150
+ }) : /*#__PURE__*/ jsxs("div", {
151
+ className: "flex items-center gap-2 px-2",
152
+ children: [
153
+ /*#__PURE__*/ jsxs(Avatar, {
154
+ className: "flex-shrink-0",
155
+ color: "default",
156
+ size: "sm",
157
+ children: [
158
+ /*#__PURE__*/ jsx(Avatar.Image, {
159
+ alt: user?.avatarAlt ?? "",
160
+ src: user?.avatarSrc
161
+ }),
162
+ /*#__PURE__*/ jsx(Avatar.Fallback, {
163
+ children: user?.initials
164
+ })
165
+ ]
166
+ }),
167
+ /*#__PURE__*/ jsx("div", {
168
+ className: "min-w-0 flex-1",
169
+ children: /*#__PURE__*/ jsx("p", {
170
+ className: "truncate font-medium text-xs",
171
+ children: user?.displayName
172
+ })
173
+ }),
174
+ /*#__PURE__*/ jsx(Button, {
175
+ "aria-label": labels.logoutTrigger,
176
+ className: "text-muted hover:text-danger",
177
+ isIconOnly: true,
178
+ onPress: logout.open,
179
+ size: "sm",
180
+ variant: "ghost",
181
+ children: /*#__PURE__*/ jsx(LogOut, {
182
+ size: 14
183
+ })
184
+ })
185
+ ]
186
+ }),
187
+ logout.dialog
188
+ ]
189
+ });
190
+ }
191
+
192
+ export { AppShellFooter as A };
@@ -0,0 +1,62 @@
1
+ 'use client';
2
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
3
+ import { Modal } from '@lindaui/ui/compound';
4
+ import { useCallback } from 'react';
5
+ import { useDisclosure } from '@lindaui/ui/use-disclosure';
6
+
7
+ function ImageLightbox({ src, alt = "Media", className }) {
8
+ const { isOpen, open: onOpen, close: onClose } = useDisclosure();
9
+ const handleOpenChange = useCallback((open)=>{
10
+ if (!open) onClose();
11
+ }, [
12
+ onClose
13
+ ]);
14
+ return /*#__PURE__*/ jsxs(Fragment, {
15
+ children: [
16
+ /*#__PURE__*/ jsx("button", {
17
+ "aria-label": `Ver imagen: ${alt}`,
18
+ className: `cursor-pointer rounded-lg p-0 transition-opacity hover:opacity-90 focus:outline-none focus:ring-2 focus:ring-accent ${className ?? ""}`,
19
+ onClick: onOpen,
20
+ type: "button",
21
+ children: /*#__PURE__*/ jsx("img", {
22
+ alt: alt,
23
+ className: "h-44 w-full max-w-[220px] rounded-lg object-cover",
24
+ height: 600,
25
+ loading: "lazy",
26
+ src: src,
27
+ width: 800
28
+ })
29
+ }),
30
+ /*#__PURE__*/ jsx(Modal.Backdrop, {
31
+ className: "bg-black/80",
32
+ isOpen: isOpen,
33
+ onOpenChange: handleOpenChange,
34
+ variant: "blur",
35
+ children: /*#__PURE__*/ jsx(Modal.Container, {
36
+ className: "overflow-hidden",
37
+ size: "full",
38
+ children: /*#__PURE__*/ jsxs(Modal.Dialog, {
39
+ className: "m-0 rounded-none shadow-none",
40
+ children: [
41
+ /*#__PURE__*/ jsx(Modal.CloseTrigger, {
42
+ className: "top-4 right-4 z-10 rounded-full bg-black/50 text-white hover:bg-black/70"
43
+ }),
44
+ /*#__PURE__*/ jsx(Modal.Body, {
45
+ className: "flex h-full items-center justify-center overflow-hidden p-4",
46
+ children: /*#__PURE__*/ jsx("img", {
47
+ alt: alt,
48
+ className: "max-h-full max-w-full rounded-lg object-contain",
49
+ height: 1080,
50
+ src: src,
51
+ width: 1920
52
+ })
53
+ })
54
+ ]
55
+ })
56
+ })
57
+ })
58
+ ]
59
+ });
60
+ }
61
+
62
+ export { ImageLightbox as I };
@@ -0,0 +1,18 @@
1
+ import type { UniqueIdentifier } from "@dnd-kit/core";
2
+ export interface KanbanDropInput<Entity, ColumnId extends UniqueIdentifier> {
3
+ activeId: UniqueIdentifier;
4
+ overId: UniqueIdentifier | null;
5
+ entities: readonly Entity[];
6
+ columns: readonly {
7
+ id: ColumnId;
8
+ }[];
9
+ getEntityId: (entity: Entity) => UniqueIdentifier;
10
+ getColumnId: (entity: Entity) => ColumnId;
11
+ }
12
+ /** Resolve column and card targets without mutating the controlled collection. */
13
+ export declare function resolveKanbanDrop<Entity, ColumnId extends UniqueIdentifier>({ activeId, overId, entities, columns, getEntityId, getColumnId, }: KanbanDropInput<Entity, ColumnId>): {
14
+ entity: Entity & ({} | null);
15
+ entityId: UniqueIdentifier;
16
+ columnId: ColumnId;
17
+ } | null;
18
+ //# sourceMappingURL=drop-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drop-utils.d.ts","sourceRoot":"","sources":["../../src/kanban/drop-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,WAAW,eAAe,CAAC,MAAM,EAAE,QAAQ,SAAS,gBAAgB;IACxE,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,SAAS;QAAE,EAAE,EAAE,QAAQ,CAAA;KAAE,EAAE,CAAC;IACrC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,gBAAgB,CAAC;IAClD,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,QAAQ,CAAC;CAC3C;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,SAAS,gBAAgB,EAAE,EAC3E,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,OAAO,EACP,WAAW,EACX,WAAW,GACZ,EAAE,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC;;;;SAWnC"}