@cossistant/react 0.0.28 → 0.0.30

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 (301) hide show
  1. package/README.md +1 -1
  2. package/_virtual/rolldown_runtime.js +9 -23
  3. package/hooks/index.d.ts +3 -3
  4. package/hooks/private/store/use-conversations-store.d.ts +2 -0
  5. package/hooks/private/store/use-conversations-store.d.ts.map +1 -1
  6. package/hooks/private/store/use-conversations-store.js +15 -8
  7. package/hooks/private/store/use-conversations-store.js.map +1 -1
  8. package/hooks/private/store/use-store-selector.d.ts +3 -0
  9. package/hooks/private/store/use-store-selector.d.ts.map +1 -1
  10. package/hooks/private/store/use-store-selector.js +4 -8
  11. package/hooks/private/store/use-store-selector.js.map +1 -1
  12. package/hooks/private/store/use-website-store.d.ts +3 -1
  13. package/hooks/private/store/use-website-store.d.ts.map +1 -1
  14. package/hooks/private/store/use-website-store.js +14 -6
  15. package/hooks/private/store/use-website-store.js.map +1 -1
  16. package/hooks/private/use-client-query.d.ts +1 -1
  17. package/hooks/private/use-client-query.d.ts.map +1 -1
  18. package/hooks/private/use-client-query.js +1 -0
  19. package/hooks/private/use-client-query.js.map +1 -1
  20. package/hooks/private/use-default-messages.d.ts +1 -1
  21. package/hooks/private/use-grouped-messages.d.ts +10 -7
  22. package/hooks/private/use-grouped-messages.d.ts.map +1 -1
  23. package/hooks/private/use-grouped-messages.js +44 -11
  24. package/hooks/private/use-grouped-messages.js.map +1 -1
  25. package/hooks/private/use-rest-client.d.ts +13 -3
  26. package/hooks/private/use-rest-client.d.ts.map +1 -1
  27. package/hooks/private/use-rest-client.js +49 -22
  28. package/hooks/private/use-rest-client.js.map +1 -1
  29. package/hooks/private/use-visitor-typing-reporter.d.ts +1 -1
  30. package/hooks/use-conversation-auto-seen.d.ts +1 -1
  31. package/hooks/use-conversation-page.d.ts +1 -1
  32. package/hooks/use-conversation-page.d.ts.map +1 -1
  33. package/hooks/use-conversation-page.js +10 -3
  34. package/hooks/use-conversation-page.js.map +1 -1
  35. package/hooks/use-conversation-preview.d.ts +3 -1
  36. package/hooks/use-conversation-preview.d.ts.map +1 -1
  37. package/hooks/use-conversation-preview.js +6 -3
  38. package/hooks/use-conversation-preview.js.map +1 -1
  39. package/hooks/use-conversation-seen.d.ts +1 -1
  40. package/hooks/use-conversation-seen.js +1 -1
  41. package/hooks/use-conversation-seen.js.map +1 -1
  42. package/hooks/use-conversation-timeline-items.d.ts +1 -1
  43. package/hooks/use-conversation-timeline-items.js +2 -3
  44. package/hooks/use-conversation-timeline-items.js.map +1 -1
  45. package/hooks/use-conversation-timeline.d.ts +1 -1
  46. package/hooks/use-conversation-timeline.d.ts.map +1 -1
  47. package/hooks/use-conversation-timeline.js +1 -3
  48. package/hooks/use-conversation-timeline.js.map +1 -1
  49. package/hooks/use-conversation.d.ts +1 -1
  50. package/hooks/use-conversation.js +2 -3
  51. package/hooks/use-conversation.js.map +1 -1
  52. package/hooks/use-conversations.d.ts +1 -1
  53. package/hooks/use-conversations.js +5 -3
  54. package/hooks/use-conversations.js.map +1 -1
  55. package/hooks/use-create-conversation.d.ts +3 -3
  56. package/hooks/use-create-conversation.js +1 -0
  57. package/hooks/use-create-conversation.js.map +1 -1
  58. package/hooks/use-file-upload.d.ts +1 -1
  59. package/hooks/use-file-upload.js +3 -3
  60. package/hooks/use-file-upload.js.map +1 -1
  61. package/hooks/use-home-page.js +3 -3
  62. package/hooks/use-home-page.js.map +1 -1
  63. package/hooks/use-message-composer.d.ts +10 -3
  64. package/hooks/use-message-composer.d.ts.map +1 -1
  65. package/hooks/use-message-composer.js +5 -2
  66. package/hooks/use-message-composer.js.map +1 -1
  67. package/hooks/use-realtime-support.d.ts +1 -1
  68. package/hooks/use-send-message.d.ts +8 -2
  69. package/hooks/use-send-message.d.ts.map +1 -1
  70. package/hooks/use-send-message.js +5 -3
  71. package/hooks/use-send-message.js.map +1 -1
  72. package/hooks/use-visitor.js +2 -2
  73. package/hooks/use-visitor.js.map +1 -1
  74. package/identify-visitor.d.ts.map +1 -1
  75. package/identify-visitor.js +15 -1
  76. package/identify-visitor.js.map +1 -1
  77. package/index.d.ts +3 -3
  78. package/index.js +1 -1
  79. package/package.json +5 -3
  80. package/{conversation.d.ts → packages/types/src/api/conversation.d.ts} +368 -64
  81. package/packages/types/src/api/conversation.d.ts.map +1 -0
  82. package/packages/types/src/api/timeline-item.d.ts +460 -0
  83. package/packages/types/src/api/timeline-item.d.ts.map +1 -0
  84. package/packages/types/src/realtime-events.d.ts +1004 -0
  85. package/packages/types/src/realtime-events.d.ts.map +1 -0
  86. package/{schemas3.d.ts → packages/types/src/schemas.d.ts} +95 -19
  87. package/packages/types/src/schemas.d.ts.map +1 -0
  88. package/primitives/avatar/avatar.js +1 -1
  89. package/primitives/avatar/avatar.js.map +1 -1
  90. package/primitives/avatar/fallback.d.ts.map +1 -1
  91. package/primitives/avatar/fallback.js +2 -2
  92. package/primitives/avatar/fallback.js.map +1 -1
  93. package/primitives/avatar/image.d.ts +1 -1
  94. package/primitives/avatar/image.js +1 -1
  95. package/primitives/avatar/image.js.map +1 -1
  96. package/primitives/button.js +1 -1
  97. package/primitives/button.js.map +1 -1
  98. package/primitives/conversation-timeline.d.ts +1 -1
  99. package/primitives/conversation-timeline.js +4 -4
  100. package/primitives/conversation-timeline.js.map +1 -1
  101. package/primitives/day-separator.d.ts +76 -0
  102. package/primitives/day-separator.d.ts.map +1 -0
  103. package/primitives/day-separator.js +111 -0
  104. package/primitives/day-separator.js.map +1 -0
  105. package/primitives/index.d.ts +3 -2
  106. package/primitives/index.js +6 -1
  107. package/primitives/index.parts.d.ts +2 -1
  108. package/primitives/index.parts.js +2 -1
  109. package/primitives/multimodal-input.d.ts +2 -2
  110. package/primitives/multimodal-input.d.ts.map +1 -1
  111. package/primitives/multimodal-input.js +2 -2
  112. package/primitives/multimodal-input.js.map +1 -1
  113. package/primitives/timeline-item-attachments.d.ts +1 -1
  114. package/primitives/timeline-item-attachments.js +6 -7
  115. package/primitives/timeline-item-attachments.js.map +1 -1
  116. package/primitives/timeline-item-group.d.ts +1 -1
  117. package/primitives/timeline-item-group.d.ts.map +1 -1
  118. package/primitives/timeline-item-group.js +8 -8
  119. package/primitives/timeline-item-group.js.map +1 -1
  120. package/primitives/timeline-item.d.ts +1 -1
  121. package/primitives/timeline-item.d.ts.map +1 -1
  122. package/primitives/timeline-item.js +33 -8
  123. package/primitives/timeline-item.js.map +1 -1
  124. package/primitives/trigger.js +1 -1
  125. package/primitives/trigger.js.map +1 -1
  126. package/primitives/window.js +1 -1
  127. package/primitives/window.js.map +1 -1
  128. package/provider.d.ts +4 -2
  129. package/provider.d.ts.map +1 -1
  130. package/provider.js +56 -8
  131. package/provider.js.map +1 -1
  132. package/realtime/event-filter.d.ts +4 -1
  133. package/realtime/event-filter.d.ts.map +1 -1
  134. package/realtime/event-filter.js +14 -0
  135. package/realtime/event-filter.js.map +1 -1
  136. package/realtime/provider.d.ts +1 -1
  137. package/realtime/provider.d.ts.map +1 -1
  138. package/realtime/provider.js +1 -2
  139. package/realtime/provider.js.map +1 -1
  140. package/realtime/seen-store.d.ts +2 -2
  141. package/realtime/support-provider.js +6 -1
  142. package/realtime/support-provider.js.map +1 -1
  143. package/realtime/typing-store.d.ts +1 -1
  144. package/realtime/use-realtime.d.ts +1 -1
  145. package/support/components/avatar-stack.d.ts.map +1 -1
  146. package/support/components/avatar-stack.js +32 -12
  147. package/support/components/avatar-stack.js.map +1 -1
  148. package/support/components/avatar.d.ts +34 -3
  149. package/support/components/avatar.d.ts.map +1 -1
  150. package/support/components/avatar.js +61 -8
  151. package/support/components/avatar.js.map +1 -1
  152. package/support/components/button.d.ts +4 -2
  153. package/support/components/button.d.ts.map +1 -1
  154. package/support/components/button.js +3 -3
  155. package/support/components/button.js.map +1 -1
  156. package/support/components/configuration-error.d.ts +16 -0
  157. package/support/components/configuration-error.d.ts.map +1 -0
  158. package/support/components/configuration-error.js +162 -0
  159. package/support/components/configuration-error.js.map +1 -0
  160. package/support/components/content.js +1 -2
  161. package/support/components/content.js.map +1 -1
  162. package/support/components/conversation-button-link.js +18 -23
  163. package/support/components/conversation-button-link.js.map +1 -1
  164. package/support/components/conversation-event.d.ts.map +1 -1
  165. package/support/components/conversation-event.js +7 -5
  166. package/support/components/conversation-event.js.map +1 -1
  167. package/support/components/conversation-timeline.d.ts +6 -1
  168. package/support/components/conversation-timeline.d.ts.map +1 -1
  169. package/support/components/conversation-timeline.js +22 -2
  170. package/support/components/conversation-timeline.js.map +1 -1
  171. package/support/components/header.js +1 -1
  172. package/support/components/image-lightbox.d.ts +1 -1
  173. package/support/components/image-lightbox.js +1 -2
  174. package/support/components/image-lightbox.js.map +1 -1
  175. package/support/components/index.js +1 -1
  176. package/support/components/multimodal-input.js +0 -1
  177. package/support/components/multimodal-input.js.map +1 -1
  178. package/support/components/navigation-tab.js +1 -1
  179. package/support/components/online-indicator.d.ts +50 -0
  180. package/support/components/online-indicator.d.ts.map +1 -0
  181. package/support/components/online-indicator.js +65 -0
  182. package/support/components/online-indicator.js.map +1 -0
  183. package/support/components/root.js +0 -1
  184. package/support/components/root.js.map +1 -1
  185. package/support/components/timeline-identification-tool.js +4 -4
  186. package/support/components/timeline-identification-tool.js.map +1 -1
  187. package/support/components/timeline-message-group.d.ts +1 -1
  188. package/support/components/timeline-message-group.d.ts.map +1 -1
  189. package/support/components/timeline-message-group.js +6 -4
  190. package/support/components/timeline-message-group.js.map +1 -1
  191. package/support/components/timeline-message-item.d.ts +1 -1
  192. package/support/components/timeline-message-item.js +4 -4
  193. package/support/components/timeline-message-item.js.map +1 -1
  194. package/support/components/trigger.js +1 -2
  195. package/support/components/trigger.js.map +1 -1
  196. package/support/components/typing-indicator.js +1 -1
  197. package/support/components/typing-indicator.js.map +1 -1
  198. package/support/context/controlled-state.js +0 -1
  199. package/support/context/controlled-state.js.map +1 -1
  200. package/support/context/events.d.ts +1 -1
  201. package/support/context/events.js +0 -1
  202. package/support/context/events.js.map +1 -1
  203. package/support/context/handle.js +0 -1
  204. package/support/context/handle.js.map +1 -1
  205. package/support/context/identification.d.ts +33 -0
  206. package/support/context/identification.d.ts.map +1 -0
  207. package/support/context/identification.js +34 -0
  208. package/support/context/identification.js.map +1 -0
  209. package/support/context/positioning.js +0 -1
  210. package/support/context/positioning.js.map +1 -1
  211. package/support/context/slots.js +0 -1
  212. package/support/context/slots.js.map +1 -1
  213. package/support/context/websocket.d.ts +1 -1
  214. package/support/context/websocket.js +0 -1
  215. package/support/context/websocket.js.map +1 -1
  216. package/support/index.d.ts.map +1 -1
  217. package/support/index.js +51 -18
  218. package/support/index.js.map +1 -1
  219. package/support/pages/conversation-history.js +2 -1
  220. package/support/pages/conversation-history.js.map +1 -1
  221. package/support/pages/conversation.d.ts +1 -1
  222. package/support/pages/conversation.js +1 -1
  223. package/support/pages/conversation.js.map +1 -1
  224. package/support/pages/home.js +5 -3
  225. package/support/pages/home.js.map +1 -1
  226. package/support/router.d.ts.map +1 -1
  227. package/support/router.js +4 -0
  228. package/support/router.js.map +1 -1
  229. package/support/store/support-store.js +0 -1
  230. package/support/store/support-store.js.map +1 -1
  231. package/support/{support-C7Xaw-N6.css → support-DmViRaga.css} +2 -2
  232. package/support/{support-C7Xaw-N6.css.map → support-DmViRaga.css.map} +1 -1
  233. package/support/text/index.d.ts +1 -1
  234. package/support/text/index.d.ts.map +1 -1
  235. package/support/text/index.js +1 -1
  236. package/support/text/index.js.map +1 -1
  237. package/support/text/locales/en.js +1 -1
  238. package/support/text/locales/en.js.map +1 -1
  239. package/support/text/locales/es.js +1 -1
  240. package/support/text/locales/es.js.map +1 -1
  241. package/support/text/locales/fr.js +1 -1
  242. package/support/text/locales/fr.js.map +1 -1
  243. package/support/utils/index.d.ts +1 -1
  244. package/support-config.js +0 -1
  245. package/support-config.js.map +1 -1
  246. package/support.css +1 -1
  247. package/tailwind.css +1 -1
  248. package/utils/conversation.d.ts.map +1 -1
  249. package/utils/conversation.js +1 -3
  250. package/utils/conversation.js.map +1 -1
  251. package/utils/use-render-element.d.ts.map +1 -1
  252. package/utils/use-render-element.js +20 -5
  253. package/utils/use-render-element.js.map +1 -1
  254. package/api.d.ts +0 -71
  255. package/api.d.ts.map +0 -1
  256. package/checks.d.ts +0 -189
  257. package/checks.d.ts.map +0 -1
  258. package/clsx.d.ts +0 -7
  259. package/clsx.d.ts.map +0 -1
  260. package/coerce.d.ts +0 -9
  261. package/coerce.d.ts.map +0 -1
  262. package/conversation.d.ts.map +0 -1
  263. package/core.d.ts +0 -35
  264. package/core.d.ts.map +0 -1
  265. package/errors.d.ts +0 -121
  266. package/errors.d.ts.map +0 -1
  267. package/errors2.d.ts +0 -24
  268. package/errors2.d.ts.map +0 -1
  269. package/index2.d.ts +0 -4
  270. package/index3.d.ts +0 -1
  271. package/metadata.d.ts +0 -1
  272. package/openapi-generator.d.ts +0 -1
  273. package/openapi-generator2.d.ts +0 -1
  274. package/openapi-generator3.d.ts +0 -1
  275. package/openapi30.d.ts +0 -125
  276. package/openapi30.d.ts.map +0 -1
  277. package/openapi31.d.ts +0 -131
  278. package/openapi31.d.ts.map +0 -1
  279. package/parse.d.ts +0 -17
  280. package/parse.d.ts.map +0 -1
  281. package/realtime-events.d.ts +0 -482
  282. package/realtime-events.d.ts.map +0 -1
  283. package/registries.d.ts +0 -32
  284. package/registries.d.ts.map +0 -1
  285. package/schemas.d.ts +0 -673
  286. package/schemas.d.ts.map +0 -1
  287. package/schemas2.d.ts +0 -320
  288. package/schemas2.d.ts.map +0 -1
  289. package/schemas3.d.ts.map +0 -1
  290. package/specification-extension.d.ts +0 -9
  291. package/specification-extension.d.ts.map +0 -1
  292. package/standard-schema.d.ts +0 -59
  293. package/standard-schema.d.ts.map +0 -1
  294. package/timeline-item.d.ts +0 -227
  295. package/timeline-item.d.ts.map +0 -1
  296. package/util.d.ts +0 -41
  297. package/util.d.ts.map +0 -1
  298. package/versions.d.ts +0 -9
  299. package/versions.d.ts.map +0 -1
  300. package/zod-extensions.d.ts +0 -39
  301. package/zod-extensions.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["result: ParsedChildren","React","Primitive.Trigger","SupportContent: React.FC<SupportContentProps>","SupportRouter: React.FC<SupportRouterProps>"],"sources":["../../src/support/index.tsx"],"sourcesContent":["import \"./support.css\";\n\nimport type { DefaultMessage } from \"@cossistant/types\";\nimport * as React from \"react\";\nimport * as Primitive from \"../primitives\";\nimport { useSupport } from \"../provider\";\nimport { SupportRealtimeProvider } from \"../realtime\";\nimport { SupportConfig } from \"../support-config\";\nimport { Content } from \"./components/content\";\nimport { Root } from \"./components/root\";\nimport { ThemeWrapper } from \"./components/theme-wrapper\";\nimport { DefaultTrigger } from \"./components/trigger\";\nimport { ControlledStateProvider } from \"./context/controlled-state\";\nimport {\n\ttype ConversationEndEvent,\n\ttype ConversationStartEvent,\n\ttype ErrorEvent,\n\ttype MessageReceivedEvent,\n\ttype MessageSentEvent,\n\tSupportEventsProvider,\n} from \"./context/events\";\nimport { type SupportHandle, SupportHandleProvider } from \"./context/handle\";\nimport { FooterSlot, HeaderSlot } from \"./context/slots\";\nimport { type CustomPage, Page, Router } from \"./router\";\nimport { initializeSupportStore } from \"./store/support-store\";\nimport type { SupportLocale, SupportTextContentOverrides } from \"./text\";\nimport { SupportTextProvider } from \"./text\";\nimport type {\n\tAlign,\n\tCollisionPadding,\n\tSide,\n\tTriggerRenderProps,\n} from \"./types\";\n\n// =============================================================================\n// Support Props\n// =============================================================================\n\nexport type SupportProps<Locale extends string = SupportLocale> = {\n\t/**\n\t * Additional CSS classes for the root wrapper.\n\t */\n\tclassName?: string;\n\n\t/**\n\t * Which side of the trigger to place the content.\n\t * @default \"top\"\n\t */\n\tside?: Side;\n\n\t/**\n\t * Alignment along the side axis.\n\t * @default \"end\"\n\t */\n\talign?: Align;\n\n\t/**\n\t * Distance (in pixels) between the trigger and the content.\n\t * @default 16\n\t */\n\tsideOffset?: number;\n\n\t/**\n\t * Enable automatic collision avoidance.\n\t * When true, the content repositions to stay within the viewport.\n\t * @default true\n\t */\n\tavoidCollisions?: boolean;\n\n\t/**\n\t * Padding from viewport edges when avoiding collisions.\n\t * @default 8\n\t */\n\tcollisionPadding?: CollisionPadding;\n\n\t/**\n\t * Granular className overrides for specific parts.\n\t */\n\tclassNames?: {\n\t\ttrigger?: string;\n\t\tcontent?: string;\n\t};\n\n\t/**\n\t * Force a specific theme. Omit for automatic detection.\n\t */\n\ttheme?: \"light\" | \"dark\";\n\n\t/**\n\t * Controlled open state.\n\t * When provided, the widget operates in controlled mode.\n\t * Use with `onOpenChange` to manage state externally.\n\t */\n\topen?: boolean;\n\n\t/**\n\t * Callback fired when the open state should change.\n\t * Use with `open` prop for controlled mode.\n\t *\n\t * @example\n\t * const [isOpen, setIsOpen] = useState(false);\n\t * <Support open={isOpen} onOpenChange={setIsOpen} />\n\t */\n\tonOpenChange?: (open: boolean) => void;\n\n\t/**\n\t * Whether the widget should open automatically on mount (uncontrolled mode).\n\t * Ignored when `open` prop is provided (controlled mode).\n\t * @default false\n\t */\n\tdefaultOpen?: boolean;\n\n\t/**\n\t * Quick reply options displayed to users.\n\t */\n\tquickOptions?: string[];\n\n\t/**\n\t * Custom welcome messages shown before a conversation starts.\n\t */\n\tdefaultMessages?: DefaultMessage[];\n\n\t/**\n\t * Locale string for widget translations.\n\t */\n\tlocale?: Locale;\n\n\t/**\n\t * Custom text content overrides for internationalization.\n\t */\n\tcontent?: SupportTextContentOverrides<Locale>;\n\n\t/**\n\t * Custom pages to add to the router.\n\t */\n\tcustomPages?: CustomPage[];\n\n\t// =========================================================================\n\t// Event Callbacks\n\t// =========================================================================\n\n\t/**\n\t * Called when a new conversation is started.\n\t */\n\tonConversationStart?: (event: ConversationStartEvent) => void;\n\n\t/**\n\t * Called when a conversation ends (resolved, closed, etc.).\n\t */\n\tonConversationEnd?: (event: ConversationEndEvent) => void;\n\n\t/**\n\t * Called when the visitor sends a message.\n\t */\n\tonMessageSent?: (event: MessageSentEvent) => void;\n\n\t/**\n\t * Called when a message is received from an agent (human or AI).\n\t */\n\tonMessageReceived?: (event: MessageReceivedEvent) => void;\n\n\t/**\n\t * Called when an error occurs within the widget.\n\t */\n\tonError?: (event: ErrorEvent) => void;\n\n\t/**\n\t * Children for composition. Can include:\n\t * - <Support.Trigger> for custom trigger\n\t * - <Support.Content> for custom content positioning\n\t * - <Support.Page> components for custom routes\n\t */\n\tchildren?: React.ReactNode;\n};\n\n// =============================================================================\n// Child Component Detection\n// =============================================================================\n\ntype ParsedChildren = {\n\ttrigger: React.ReactNode | null;\n\tcontent: React.ReactNode | null;\n\tpages: React.ReactNode[];\n\tother: React.ReactNode[];\n};\n\nfunction parseChildren(children: React.ReactNode): ParsedChildren {\n\tconst result: ParsedChildren = {\n\t\ttrigger: null,\n\t\tcontent: null,\n\t\tpages: [],\n\t\tother: [],\n\t};\n\n\tReact.Children.forEach(children, (child) => {\n\t\tif (!React.isValidElement(child)) {\n\t\t\tresult.other.push(child);\n\t\t\treturn;\n\t\t}\n\n\t\t// Check component type by displayName or the component reference\n\t\tconst displayName = (child.type as React.ComponentType)?.displayName ?? \"\";\n\n\t\tif (displayName === \"Support.Trigger\" || child.type === SupportTrigger) {\n\t\t\tresult.trigger = child;\n\t\t} else if (\n\t\t\tdisplayName === \"Support.Content\" ||\n\t\t\tchild.type === SupportContent\n\t\t) {\n\t\t\tresult.content = child;\n\t\t} else if (displayName === \"Support.Page\" || child.type === Page) {\n\t\t\tresult.pages.push(child);\n\t\t} else {\n\t\t\tresult.other.push(child);\n\t\t}\n\t});\n\n\treturn result;\n}\n\n// =============================================================================\n// Main Support Component\n// =============================================================================\n\n/**\n * Complete support widget with chat, routing, and real-time features.\n *\n * @example\n * // Zero config - works instantly\n * <Support />\n *\n * @example\n * // With styling\n * <Support\n * theme=\"dark\"\n * classNames={{\n * trigger: \"bg-purple-600\",\n * content: \"border-purple-200\",\n * }}\n * />\n *\n * @example\n * // With custom positioning\n * <Support side=\"bottom\" align=\"end\" sideOffset={8} />\n *\n * @example\n * // Controlled mode - external state management\n * const [isOpen, setIsOpen] = useState(false);\n * <Support open={isOpen} onOpenChange={setIsOpen} />\n *\n * @example\n * // With imperative ref\n * const supportRef = useRef<SupportHandle>(null);\n * supportRef.current?.open();\n * supportRef.current?.startConversation(\"Hello!\");\n * <Support ref={supportRef} />\n *\n * @example\n * // With custom trigger\n * <Support side=\"bottom\" align=\"end\">\n * <Support.Trigger className=\"px-4 py-2\">\n * {({ isOpen, unreadCount }) => (\n * <span>{isOpen ? \"Close\" : `Help (${unreadCount})`}</span>\n * )}\n * </Support.Trigger>\n * </Support>\n *\n * @example\n * // With custom pages\n * <Support>\n * <Support.Page name=\"FAQ\" component={FAQPage} />\n * </Support>\n */\nfunction SupportComponentInner<Locale extends string = SupportLocale>(\n\t{\n\t\tclassName,\n\t\tside = \"top\",\n\t\talign = \"end\",\n\t\tsideOffset = 16,\n\t\tavoidCollisions = true,\n\t\tcollisionPadding = 8,\n\t\tclassNames = {},\n\t\ttheme,\n\t\topen,\n\t\tonOpenChange,\n\t\tdefaultOpen,\n\t\tquickOptions,\n\t\tdefaultMessages,\n\t\tlocale,\n\t\tcontent,\n\t\tcustomPages,\n\t\tonConversationStart,\n\t\tonConversationEnd,\n\t\tonMessageSent,\n\t\tonMessageReceived,\n\t\tonError,\n\t\tchildren,\n\t}: SupportProps<Locale>,\n\tref: React.Ref<SupportHandle>\n): React.ReactElement | null {\n\tconst { website } = useSupport();\n\tconst isVisitorBlocked = website?.visitor?.isBlocked ?? false;\n\n\t// Initialize store for uncontrolled mode (when open prop is not provided)\n\tReact.useEffect(() => {\n\t\tif (open === undefined && defaultOpen !== undefined) {\n\t\t\tinitializeSupportStore({ defaultOpen });\n\t\t}\n\t}, [open, defaultOpen]);\n\n\tif (!website || isVisitorBlocked) {\n\t\treturn null;\n\t}\n\n\t// Parse children to detect custom components\n\tconst parsed = parseChildren(children);\n\n\t// Determine which components to render\n\tconst triggerElement = parsed.trigger ?? (\n\t\t<DefaultTrigger className={classNames.trigger} />\n\t);\n\n\t// If custom content is provided, use it; otherwise create default\n\tconst contentElement = parsed.content ?? (\n\t\t<Content\n\t\t\talign={align}\n\t\t\tavoidCollisions={avoidCollisions}\n\t\t\tclassName={classNames.content}\n\t\t\tcollisionPadding={collisionPadding}\n\t\t\tside={side}\n\t\t\tsideOffset={sideOffset}\n\t\t>\n\t\t\t<Router customPages={customPages}>{parsed.pages}</Router>\n\t\t</Content>\n\t);\n\n\treturn (\n\t\t<ControlledStateProvider onOpenChange={onOpenChange} open={open}>\n\t\t\t<SupportEventsProvider\n\t\t\t\tonConversationEnd={onConversationEnd}\n\t\t\t\tonConversationStart={onConversationStart}\n\t\t\t\tonError={onError}\n\t\t\t\tonMessageReceived={onMessageReceived}\n\t\t\t\tonMessageSent={onMessageSent}\n\t\t\t>\n\t\t\t\t<SupportHandleProvider forwardedRef={ref}>\n\t\t\t\t\t<ThemeWrapper theme={theme}>\n\t\t\t\t\t\t<SupportRealtimeProvider>\n\t\t\t\t\t\t\t<SupportTextProvider content={content} locale={locale}>\n\t\t\t\t\t\t\t\t<Root className={className}>\n\t\t\t\t\t\t\t\t\t{triggerElement}\n\t\t\t\t\t\t\t\t\t{contentElement}\n\t\t\t\t\t\t\t\t</Root>\n\t\t\t\t\t\t\t</SupportTextProvider>\n\t\t\t\t\t\t</SupportRealtimeProvider>\n\t\t\t\t\t\t<SupportConfig\n\t\t\t\t\t\t\tdefaultMessages={defaultMessages}\n\t\t\t\t\t\t\tquickOptions={quickOptions}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ThemeWrapper>\n\t\t\t\t</SupportHandleProvider>\n\t\t\t</SupportEventsProvider>\n\t\t</ControlledStateProvider>\n\t);\n}\n\n// Forward ref with proper generic typing\nconst SupportComponent = React.forwardRef(SupportComponentInner) as <\n\tLocale extends string = SupportLocale,\n>(\n\tprops: SupportProps<Locale> & { ref?: React.Ref<SupportHandle> }\n) => React.ReactElement | null;\n\n// =============================================================================\n// Trigger Compound Component\n// =============================================================================\n\nexport type SupportTriggerProps = Omit<\n\tReact.ButtonHTMLAttributes<HTMLButtonElement>,\n\t\"children\"\n> & {\n\t/**\n\t * Content to render inside the trigger.\n\t * Can be static content or a function receiving render props.\n\t */\n\tchildren?: React.ReactNode | ((props: TriggerRenderProps) => React.ReactNode);\n\t/**\n\t * When true, renders children directly with all props passed through.\n\t */\n\tasChild?: boolean;\n\tclassName?: string;\n};\n\n/**\n * Custom trigger component for the support widget.\n * Use this inside <Support> to replace the default floating button.\n *\n * @example\n * <Support.Trigger className=\"my-button\">\n * {({ isOpen, unreadCount }) => (\n * <span>{isOpen ? \"Close\" : `Help (${unreadCount})`}</span>\n * )}\n * </Support.Trigger>\n */\nconst SupportTrigger = React.forwardRef<HTMLButtonElement, SupportTriggerProps>(\n\t({ children, className, asChild = false, ...props }, ref) => (\n\t\t<Primitive.Trigger\n\t\t\tasChild={asChild}\n\t\t\tclassName={className}\n\t\t\tref={ref}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</Primitive.Trigger>\n\t)\n);\n\nSupportTrigger.displayName = \"Support.Trigger\";\n\n// =============================================================================\n// Content Compound Component\n// =============================================================================\n\nexport type SupportContentProps = {\n\tclassName?: string;\n\t/**\n\t * Which side of the trigger to place the content.\n\t * @default \"top\"\n\t */\n\tside?: Side;\n\t/**\n\t * Alignment along the side axis.\n\t * @default \"end\"\n\t */\n\talign?: Align;\n\t/**\n\t * Distance (in pixels) between the trigger and the content.\n\t * @default 16\n\t */\n\tsideOffset?: number;\n\t/**\n\t * Enable automatic collision avoidance.\n\t * When true, the content repositions to stay within the viewport.\n\t * @default true\n\t */\n\tavoidCollisions?: boolean;\n\t/**\n\t * Padding from viewport edges when avoiding collisions.\n\t * @default 8\n\t */\n\tcollisionPadding?: CollisionPadding;\n\tchildren?: React.ReactNode;\n};\n\n/**\n * Custom content wrapper for the support widget.\n * Use this inside <Support> for custom positioning or styling.\n *\n * @example\n * <Support>\n * <Support.Trigger>Help</Support.Trigger>\n * <Support.Content side=\"bottom\" align=\"end\" className=\"my-content\">\n * <Support.Router />\n * </Support.Content>\n * </Support>\n */\nconst SupportContent: React.FC<SupportContentProps> = ({\n\tclassName,\n\tside = \"top\",\n\talign = \"end\",\n\tsideOffset = 16,\n\tavoidCollisions = true,\n\tcollisionPadding = 8,\n\tchildren,\n}) => (\n\t<Content\n\t\talign={align}\n\t\tavoidCollisions={avoidCollisions}\n\t\tclassName={className}\n\t\tcollisionPadding={collisionPadding}\n\t\tside={side}\n\t\tsideOffset={sideOffset}\n\t>\n\t\t{children ?? <Router />}\n\t</Content>\n);\n\n(SupportContent as React.FC & { displayName?: string }).displayName =\n\t\"Support.Content\";\n\n// =============================================================================\n// Router Compound Component\n// =============================================================================\n\nexport type SupportRouterProps = {\n\t/**\n\t * Custom pages to add alongside built-in pages.\n\t */\n\tcustomPages?: CustomPage[];\n\t/**\n\t * Page components to register.\n\t */\n\tchildren?: React.ReactNode;\n};\n\n/**\n * Router with all default pages (Home, Conversation, etc.).\n * Use inside <Support.Content> for full control.\n *\n * @example\n * <Support.Content>\n * <Support.Router />\n * </Support.Content>\n *\n * @example\n * // With custom pages\n * <Support.Router>\n * <Support.Page name=\"FAQ\" component={FAQPage} />\n * </Support.Router>\n */\nconst SupportRouter: React.FC<SupportRouterProps> = ({\n\tcustomPages,\n\tchildren,\n}) => <Router customPages={customPages}>{children}</Router>;\n\n(SupportRouter as React.FC & { displayName?: string }).displayName =\n\t\"Support.Router\";\n\n// =============================================================================\n// Page Compound Component\n// =============================================================================\n\nexport type SupportPageProps<\n\tK extends\n\t\tkeyof import(\"@cossistant/core\").RouteRegistry = keyof import(\"@cossistant/core\").RouteRegistry,\n> = {\n\tname: K;\n\tcomponent: React.ComponentType<{\n\t\tparams?: import(\"@cossistant/core\").RouteRegistry[K];\n\t}>;\n};\n\n/**\n * Declarative page registration for custom routes.\n *\n * @example\n * <Support>\n * <Support.Page name=\"FAQ\" component={FAQPage} />\n * <Support.Page name=\"SETTINGS\" component={SettingsPage} />\n * </Support>\n */\nconst SupportPage = Page;\n\n(SupportPage as unknown as { displayName?: string }).displayName =\n\t\"Support.Page\";\n\n// =============================================================================\n// Root Compound Component (for full composition)\n// =============================================================================\n\nexport type SupportRootProps = {\n\t/**\n\t * Controlled open state.\n\t * When provided, the widget operates in controlled mode.\n\t */\n\topen?: boolean;\n\t/**\n\t * Callback fired when the open state should change.\n\t * Use with `open` prop for controlled mode.\n\t */\n\tonOpenChange?: (open: boolean) => void;\n\t/**\n\t * Whether the widget should open automatically (uncontrolled mode).\n\t * Ignored when `open` prop is provided.\n\t * @default false\n\t */\n\tdefaultOpen?: boolean;\n\t/**\n\t * Force a specific theme.\n\t */\n\ttheme?: \"light\" | \"dark\";\n\t/**\n\t * Additional CSS classes.\n\t */\n\tclassName?: string;\n\t/**\n\t * Called when a new conversation is started.\n\t */\n\tonConversationStart?: (event: ConversationStartEvent) => void;\n\t/**\n\t * Called when a conversation ends.\n\t */\n\tonConversationEnd?: (event: ConversationEndEvent) => void;\n\t/**\n\t * Called when the visitor sends a message.\n\t */\n\tonMessageSent?: (event: MessageSentEvent) => void;\n\t/**\n\t * Called when a message is received from an agent.\n\t */\n\tonMessageReceived?: (event: MessageReceivedEvent) => void;\n\t/**\n\t * Called when an error occurs.\n\t */\n\tonError?: (event: ErrorEvent) => void;\n\tchildren: React.ReactNode;\n};\n\n/**\n * Root component for full composition mode.\n * Use when you need complete control over the widget structure.\n *\n * @example\n * // Uncontrolled\n * <Support.Root defaultOpen={false}>\n * <Support.Trigger asChild>\n * <button>Help</button>\n * </Support.Trigger>\n * <Support.Content side=\"bottom\" align=\"end\">\n * <Support.Router />\n * </Support.Content>\n * </Support.Root>\n *\n * @example\n * // Controlled\n * const [isOpen, setIsOpen] = useState(false);\n * <Support.Root open={isOpen} onOpenChange={setIsOpen}>\n * ...\n * </Support.Root>\n *\n * @example\n * // With imperative ref\n * const supportRef = useRef<SupportHandle>(null);\n * <Support.Root ref={supportRef}>\n * ...\n * </Support.Root>\n */\nconst SupportRoot = React.forwardRef<SupportHandle, SupportRootProps>(\n\t(\n\t\t{\n\t\t\topen,\n\t\t\tonOpenChange,\n\t\t\tdefaultOpen,\n\t\t\ttheme,\n\t\t\tclassName,\n\t\t\tonConversationStart,\n\t\t\tonConversationEnd,\n\t\t\tonMessageSent,\n\t\t\tonMessageReceived,\n\t\t\tonError,\n\t\t\tchildren,\n\t\t},\n\t\tref\n\t) => {\n\t\tconst { website } = useSupport();\n\t\tconst isVisitorBlocked = website?.visitor?.isBlocked ?? false;\n\n\t\t// Initialize store for uncontrolled mode\n\t\tReact.useEffect(() => {\n\t\t\tif (open === undefined && defaultOpen !== undefined) {\n\t\t\t\tinitializeSupportStore({ defaultOpen });\n\t\t\t}\n\t\t}, [open, defaultOpen]);\n\n\t\tif (!website || isVisitorBlocked) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn (\n\t\t\t<ControlledStateProvider onOpenChange={onOpenChange} open={open}>\n\t\t\t\t<SupportEventsProvider\n\t\t\t\t\tonConversationEnd={onConversationEnd}\n\t\t\t\t\tonConversationStart={onConversationStart}\n\t\t\t\t\tonError={onError}\n\t\t\t\t\tonMessageReceived={onMessageReceived}\n\t\t\t\t\tonMessageSent={onMessageSent}\n\t\t\t\t>\n\t\t\t\t\t<SupportHandleProvider forwardedRef={ref}>\n\t\t\t\t\t\t<ThemeWrapper theme={theme}>\n\t\t\t\t\t\t\t<SupportRealtimeProvider>\n\t\t\t\t\t\t\t\t<Root className={className}>{children}</Root>\n\t\t\t\t\t\t\t</SupportRealtimeProvider>\n\t\t\t\t\t\t</ThemeWrapper>\n\t\t\t\t\t</SupportHandleProvider>\n\t\t\t\t</SupportEventsProvider>\n\t\t\t</ControlledStateProvider>\n\t\t);\n\t}\n);\n\nSupportRoot.displayName = \"Support.Root\";\n\n// =============================================================================\n// Compound Component Assembly\n// =============================================================================\n\nexport const Support = Object.assign(SupportComponent, {\n\tRoot: SupportRoot,\n\tTrigger: SupportTrigger,\n\tContent: SupportContent,\n\tRouter: SupportRouter,\n\tPage: SupportPage,\n\tHeader: HeaderSlot,\n\tFooter: FooterSlot,\n});\n\nexport default Support;\n\n// =============================================================================\n// Type Exports\n// =============================================================================\n\nexport type {\n\tDefaultRoutes,\n\tNavigationState,\n\tRouteRegistry,\n\tSupportPage as SupportPageType,\n} from \"@cossistant/core\";\n// Custom page type\nexport type { CustomPage } from \"./router\";\n// Types from ./types.ts\nexport type {\n\tAlign,\n\tCollisionPadding,\n\tContentProps,\n\tRootProps,\n\tSide,\n\tTriggerRenderProps,\n} from \"./types\";\n\n// =============================================================================\n// Component Exports\n// =============================================================================\n\nexport { CoButton as Button } from \"./components/button\";\nexport { Header } from \"./components/header\";\n\n// =============================================================================\n// Hook Exports\n// =============================================================================\n\nexport type { WebSocketContextValue } from \"./context/websocket\";\nexport { useWebSocket, WebSocketProvider } from \"./context/websocket\";\nexport {\n\tuseSupportConfig,\n\tuseSupportNavigation,\n\tuseSupportStore,\n} from \"./store\";\n\n// =============================================================================\n// Text & Localization\n// =============================================================================\n\nexport type { SupportLocale, SupportTextContentOverrides } from \"./text\";\nexport { Text, useSupportText } from \"./text\";\n\n// =============================================================================\n// Events\n// =============================================================================\n\nexport type {\n\tConversationEndEvent,\n\tConversationStartEvent,\n\tErrorEvent,\n\tMessageReceivedEvent,\n\tMessageSentEvent,\n\tSupportEvent,\n\tSupportEventCallbacks,\n\tSupportEventType,\n} from \"./context/events\";\nexport { useSupportEventEmitter, useSupportEvents } from \"./context/events\";\n\n// =============================================================================\n// Imperative Handle\n// =============================================================================\n\nexport type { SupportHandle } from \"./context/handle\";\nexport { useSupportHandle } from \"./context/handle\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA0LA,SAAS,cAAc,UAA2C;CACjE,MAAMA,SAAyB;EAC9B,SAAS;EACT,SAAS;EACT,OAAO,EAAE;EACT,OAAO,EAAE;EACT;AAED,SAAM,SAAS,QAAQ,WAAW,UAAU;AAC3C,MAAI,CAACC,QAAM,eAAe,MAAM,EAAE;AACjC,UAAO,MAAM,KAAK,MAAM;AACxB;;EAID,MAAM,cAAe,MAAM,MAA8B,eAAe;AAExE,MAAI,gBAAgB,qBAAqB,MAAM,SAAS,eACvD,QAAO,UAAU;WAEjB,gBAAgB,qBAChB,MAAM,SAAS,eAEf,QAAO,UAAU;WACP,gBAAgB,kBAAkB,MAAM,SAAS,KAC3D,QAAO,MAAM,KAAK,MAAM;MAExB,QAAO,MAAM,KAAK,MAAM;GAExB;AAEF,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDR,SAAS,sBACR,EACC,WACA,OAAO,OACP,QAAQ,OACR,aAAa,IACb,kBAAkB,MAClB,mBAAmB,GACnB,aAAa,EAAE,EACf,OACA,MACA,cACA,aACA,cACA,iBACA,QACA,SACA,aACA,qBACA,mBACA,eACA,mBACA,SACA,YAED,KAC4B;CAC5B,MAAM,EAAE,YAAY,YAAY;CAChC,MAAM,mBAAmB,SAAS,SAAS,aAAa;AAGxD,SAAM,gBAAgB;AACrB,MAAI,SAAS,UAAa,gBAAgB,OACzC,wBAAuB,EAAE,aAAa,CAAC;IAEtC,CAAC,MAAM,YAAY,CAAC;AAEvB,KAAI,CAAC,WAAW,iBACf,QAAO;CAIR,MAAM,SAAS,cAAc,SAAS;AAqBtC,QACC,oBAAC;EAAsC;EAAoB;YAC1D,oBAAC;GACmB;GACE;GACZ;GACU;GACJ;aAEf,oBAAC;IAAsB,cAAc;cACpC,qBAAC;KAAoB;gBACpB,oBAAC,qCACA,oBAAC;MAA6B;MAAiB;gBAC9C,qBAAC;OAAgB;kBA/BD,OAAO,WAC7B,oBAAC,kBAAe,WAAW,WAAW,UAAW,EAI3B,OAAO,WAC7B,oBAAC;QACO;QACU;QACjB,WAAW,WAAW;QACJ;QACZ;QACM;kBAEZ,oBAAC;SAAoB;mBAAc,OAAO;UAAe;SAChD;QAmBG;OACc,GACG,EAC1B,oBAAC;MACiB;MACH;OACb;MACY;KACQ;IACD;GACC;;AAK5B,MAAM,mBAAmBA,QAAM,WAAW,sBAAsB;;;;;;;;;;;;AAqChE,MAAM,iBAAiBA,QAAM,YAC3B,EAAE,UAAU,WAAW,UAAU,MAAO,GAAG,SAAS,QACpD,oBAACC;CACS;CACE;CACN;CACL,GAAI;CAEH;EACkB,CAErB;AAED,eAAe,cAAc;;;;;;;;;;;;;AAiD7B,MAAMC,kBAAiD,EACtD,WACA,OAAO,OACP,QAAQ,OACR,aAAa,IACb,kBAAkB,MAClB,mBAAmB,GACnB,eAEA,oBAAC;CACO;CACU;CACN;CACO;CACZ;CACM;WAEX,YAAY,oBAAC,WAAS;EACd;AAGX,AAAC,eAAuD,cACvD;;;;;;;;;;;;;;;;AAgCD,MAAMC,iBAA+C,EACpD,aACA,eACK,oBAAC;CAAoB;CAAc;EAAkB;AAE3D,AAAC,cAAsD,cACtD;;;;;;;;;;AAyBD,MAAM,cAAc;AAEpB,AAAC,YAAoD,cACpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmFD,MAAM,cAAcH,QAAM,YAExB,EACC,MACA,cACA,aACA,OACA,WACA,qBACA,mBACA,eACA,mBACA,SACA,YAED,QACI;CACJ,MAAM,EAAE,YAAY,YAAY;CAChC,MAAM,mBAAmB,SAAS,SAAS,aAAa;AAGxD,SAAM,gBAAgB;AACrB,MAAI,SAAS,UAAa,gBAAgB,OACzC,wBAAuB,EAAE,aAAa,CAAC;IAEtC,CAAC,MAAM,YAAY,CAAC;AAEvB,KAAI,CAAC,WAAW,iBACf,QAAO;AAGR,QACC,oBAAC;EAAsC;EAAoB;YAC1D,oBAAC;GACmB;GACE;GACZ;GACU;GACJ;aAEf,oBAAC;IAAsB,cAAc;cACpC,oBAAC;KAAoB;eACpB,oBAAC,qCACA,oBAAC;MAAgB;MAAY;OAAgB,GACpB;MACZ;KACQ;IACD;GACC;EAG5B;AAED,YAAY,cAAc;AAM1B,MAAa,UAAU,OAAO,OAAO,kBAAkB;CACtD,MAAM;CACN,SAAS;CACT,SAAS;CACT,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,CAAC;AAEF,sBAAe"}
1
+ {"version":3,"file":"index.js","names":["result: ParsedChildren","React","Primitive.Trigger","SupportContent: React.FC<SupportContentProps>","SupportRouter: React.FC<SupportRouterProps>"],"sources":["../../src/support/index.tsx"],"sourcesContent":["import \"./support.css\";\n\nimport type { DefaultMessage } from \"@cossistant/types\";\nimport * as React from \"react\";\nimport * as Primitive from \"../primitives\";\nimport { useSupport } from \"../provider\";\nimport { SupportRealtimeProvider } from \"../realtime\";\nimport { SupportConfig } from \"../support-config\";\nimport { ConfigurationErrorDisplay } from \"./components/configuration-error\";\nimport { Content } from \"./components/content\";\nimport { Root } from \"./components/root\";\nimport { ThemeWrapper } from \"./components/theme-wrapper\";\nimport { DefaultTrigger } from \"./components/trigger\";\nimport { ControlledStateProvider } from \"./context/controlled-state\";\nimport {\n\ttype ConversationEndEvent,\n\ttype ConversationStartEvent,\n\ttype ErrorEvent,\n\ttype MessageReceivedEvent,\n\ttype MessageSentEvent,\n\tSupportEventsProvider,\n} from \"./context/events\";\nimport { type SupportHandle, SupportHandleProvider } from \"./context/handle\";\nimport { FooterSlot, HeaderSlot } from \"./context/slots\";\nimport { type CustomPage, Page, Router } from \"./router\";\nimport { initializeSupportStore } from \"./store/support-store\";\nimport type { SupportLocale, SupportTextContentOverrides } from \"./text\";\nimport { SupportTextProvider } from \"./text\";\nimport type {\n\tAlign,\n\tCollisionPadding,\n\tSide,\n\tTriggerRenderProps,\n} from \"./types\";\n\n// =============================================================================\n// Support Props\n// =============================================================================\n\nexport type SupportProps<Locale extends string = SupportLocale> = {\n\t/**\n\t * Additional CSS classes for the root wrapper.\n\t */\n\tclassName?: string;\n\n\t/**\n\t * Which side of the trigger to place the content.\n\t * @default \"top\"\n\t */\n\tside?: Side;\n\n\t/**\n\t * Alignment along the side axis.\n\t * @default \"end\"\n\t */\n\talign?: Align;\n\n\t/**\n\t * Distance (in pixels) between the trigger and the content.\n\t * @default 16\n\t */\n\tsideOffset?: number;\n\n\t/**\n\t * Enable automatic collision avoidance.\n\t * When true, the content repositions to stay within the viewport.\n\t * @default true\n\t */\n\tavoidCollisions?: boolean;\n\n\t/**\n\t * Padding from viewport edges when avoiding collisions.\n\t * @default 8\n\t */\n\tcollisionPadding?: CollisionPadding;\n\n\t/**\n\t * Granular className overrides for specific parts.\n\t */\n\tclassNames?: {\n\t\ttrigger?: string;\n\t\tcontent?: string;\n\t};\n\n\t/**\n\t * Force a specific theme. Omit for automatic detection.\n\t */\n\ttheme?: \"light\" | \"dark\";\n\n\t/**\n\t * Controlled open state.\n\t * When provided, the widget operates in controlled mode.\n\t * Use with `onOpenChange` to manage state externally.\n\t */\n\topen?: boolean;\n\n\t/**\n\t * Callback fired when the open state should change.\n\t * Use with `open` prop for controlled mode.\n\t *\n\t * @example\n\t * const [isOpen, setIsOpen] = useState(false);\n\t * <Support open={isOpen} onOpenChange={setIsOpen} />\n\t */\n\tonOpenChange?: (open: boolean) => void;\n\n\t/**\n\t * Whether the widget should open automatically on mount (uncontrolled mode).\n\t * Ignored when `open` prop is provided (controlled mode).\n\t * @default false\n\t */\n\tdefaultOpen?: boolean;\n\n\t/**\n\t * Quick reply options displayed to users.\n\t */\n\tquickOptions?: string[];\n\n\t/**\n\t * Custom welcome messages shown before a conversation starts.\n\t */\n\tdefaultMessages?: DefaultMessage[];\n\n\t/**\n\t * Locale string for widget translations.\n\t */\n\tlocale?: Locale;\n\n\t/**\n\t * Custom text content overrides for internationalization.\n\t */\n\tcontent?: SupportTextContentOverrides<Locale>;\n\n\t/**\n\t * Custom pages to add to the router.\n\t */\n\tcustomPages?: CustomPage[];\n\n\t// =========================================================================\n\t// Event Callbacks\n\t// =========================================================================\n\n\t/**\n\t * Called when a new conversation is started.\n\t */\n\tonConversationStart?: (event: ConversationStartEvent) => void;\n\n\t/**\n\t * Called when a conversation ends (resolved, closed, etc.).\n\t */\n\tonConversationEnd?: (event: ConversationEndEvent) => void;\n\n\t/**\n\t * Called when the visitor sends a message.\n\t */\n\tonMessageSent?: (event: MessageSentEvent) => void;\n\n\t/**\n\t * Called when a message is received from an agent (human or AI).\n\t */\n\tonMessageReceived?: (event: MessageReceivedEvent) => void;\n\n\t/**\n\t * Called when an error occurs within the widget.\n\t */\n\tonError?: (event: ErrorEvent) => void;\n\n\t/**\n\t * Children for composition. Can include:\n\t * - <Support.Trigger> for custom trigger\n\t * - <Support.Content> for custom content positioning\n\t * - <Support.Page> components for custom routes\n\t */\n\tchildren?: React.ReactNode;\n};\n\n// =============================================================================\n// Child Component Detection\n// =============================================================================\n\ntype ParsedChildren = {\n\ttrigger: React.ReactNode | null;\n\tcontent: React.ReactNode | null;\n\tpages: React.ReactNode[];\n\tother: React.ReactNode[];\n};\n\nfunction parseChildren(children: React.ReactNode): ParsedChildren {\n\tconst result: ParsedChildren = {\n\t\ttrigger: null,\n\t\tcontent: null,\n\t\tpages: [],\n\t\tother: [],\n\t};\n\n\tReact.Children.forEach(children, (child) => {\n\t\tif (!React.isValidElement(child)) {\n\t\t\tresult.other.push(child);\n\t\t\treturn;\n\t\t}\n\n\t\t// Check component type by displayName or the component reference\n\t\tconst displayName = (child.type as React.ComponentType)?.displayName ?? \"\";\n\n\t\tif (displayName === \"Support.Trigger\" || child.type === SupportTrigger) {\n\t\t\tresult.trigger = child;\n\t\t} else if (\n\t\t\tdisplayName === \"Support.Content\" ||\n\t\t\tchild.type === SupportContent\n\t\t) {\n\t\t\tresult.content = child;\n\t\t} else if (displayName === \"Support.Page\" || child.type === Page) {\n\t\t\tresult.pages.push(child);\n\t\t} else {\n\t\t\tresult.other.push(child);\n\t\t}\n\t});\n\n\treturn result;\n}\n\n// =============================================================================\n// Main Support Component\n// =============================================================================\n\n/**\n * Complete support widget with chat, routing, and real-time features.\n *\n * @example\n * // Zero config - works instantly\n * <Support />\n *\n * @example\n * // With styling\n * <Support\n * theme=\"dark\"\n * classNames={{\n * trigger: \"bg-purple-600\",\n * content: \"border-purple-200\",\n * }}\n * />\n *\n * @example\n * // With custom positioning\n * <Support side=\"bottom\" align=\"end\" sideOffset={8} />\n *\n * @example\n * // Controlled mode - external state management\n * const [isOpen, setIsOpen] = useState(false);\n * <Support open={isOpen} onOpenChange={setIsOpen} />\n *\n * @example\n * // With imperative ref\n * const supportRef = useRef<SupportHandle>(null);\n * supportRef.current?.open();\n * supportRef.current?.startConversation(\"Hello!\");\n * <Support ref={supportRef} />\n *\n * @example\n * // With custom trigger\n * <Support side=\"bottom\" align=\"end\">\n * <Support.Trigger className=\"px-4 py-2\">\n * {({ isOpen, unreadCount }) => (\n * <span>{isOpen ? \"Close\" : `Help (${unreadCount})`}</span>\n * )}\n * </Support.Trigger>\n * </Support>\n *\n * @example\n * // With custom pages\n * <Support>\n * <Support.Page name=\"FAQ\" component={FAQPage} />\n * </Support>\n */\nfunction SupportComponentInner<Locale extends string = SupportLocale>(\n\t{\n\t\tclassName,\n\t\tside = \"top\",\n\t\talign = \"end\",\n\t\tsideOffset = 16,\n\t\tavoidCollisions = true,\n\t\tcollisionPadding = 8,\n\t\tclassNames = {},\n\t\ttheme,\n\t\topen,\n\t\tonOpenChange,\n\t\tdefaultOpen,\n\t\tquickOptions,\n\t\tdefaultMessages,\n\t\tlocale,\n\t\tcontent,\n\t\tcustomPages,\n\t\tonConversationStart,\n\t\tonConversationEnd,\n\t\tonMessageSent,\n\t\tonMessageReceived,\n\t\tonError,\n\t\tchildren,\n\t}: SupportProps<Locale>,\n\tref: React.Ref<SupportHandle>\n): React.ReactElement | null {\n\tconst { website, configurationError } = useSupport();\n\tconst isVisitorBlocked = website?.visitor?.isBlocked ?? false;\n\n\t// Initialize store for uncontrolled mode (when open prop is not provided)\n\tReact.useEffect(() => {\n\t\tif (open === undefined && defaultOpen !== undefined) {\n\t\t\tinitializeSupportStore({ defaultOpen });\n\t\t}\n\t}, [open, defaultOpen]);\n\n\t// If visitor is blocked, don't render anything\n\tif (website && isVisitorBlocked) {\n\t\treturn null;\n\t}\n\n\t// Parse children to detect custom components\n\tconst parsed = parseChildren(children);\n\n\t// Determine which components to render\n\tconst triggerElement = parsed.trigger ?? (\n\t\t<DefaultTrigger className={classNames.trigger} />\n\t);\n\n\t// Show configuration error inside the widget content when API key is missing\n\t// This allows the user to see the widget is installed correctly and get setup instructions\n\tconst contentElement = parsed.content ?? (\n\t\t<Content\n\t\t\talign={align}\n\t\t\tavoidCollisions={avoidCollisions}\n\t\t\tclassName={classNames.content}\n\t\t\tcollisionPadding={collisionPadding}\n\t\t\tside={side}\n\t\t\tsideOffset={sideOffset}\n\t\t>\n\t\t\t{configurationError ? (\n\t\t\t\t<ConfigurationErrorDisplay error={configurationError} />\n\t\t\t) : website ? (\n\t\t\t\t<Router customPages={customPages}>{parsed.pages}</Router>\n\t\t\t) : null}\n\t\t</Content>\n\t);\n\n\t// When there's a configuration error, render a minimal version without realtime/events\n\tif (configurationError) {\n\t\treturn (\n\t\t\t<ControlledStateProvider onOpenChange={onOpenChange} open={open}>\n\t\t\t\t<SupportHandleProvider forwardedRef={ref}>\n\t\t\t\t\t<ThemeWrapper theme={theme}>\n\t\t\t\t\t\t<Root className={className}>\n\t\t\t\t\t\t\t{triggerElement}\n\t\t\t\t\t\t\t{contentElement}\n\t\t\t\t\t\t</Root>\n\t\t\t\t\t</ThemeWrapper>\n\t\t\t\t</SupportHandleProvider>\n\t\t\t</ControlledStateProvider>\n\t\t);\n\t}\n\n\t// Don't render anything while loading or if no website\n\tif (!website) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<ControlledStateProvider onOpenChange={onOpenChange} open={open}>\n\t\t\t<SupportEventsProvider\n\t\t\t\tonConversationEnd={onConversationEnd}\n\t\t\t\tonConversationStart={onConversationStart}\n\t\t\t\tonError={onError}\n\t\t\t\tonMessageReceived={onMessageReceived}\n\t\t\t\tonMessageSent={onMessageSent}\n\t\t\t>\n\t\t\t\t<SupportHandleProvider forwardedRef={ref}>\n\t\t\t\t\t<ThemeWrapper theme={theme}>\n\t\t\t\t\t\t<SupportRealtimeProvider>\n\t\t\t\t\t\t\t<SupportTextProvider content={content} locale={locale}>\n\t\t\t\t\t\t\t\t<Root className={className}>\n\t\t\t\t\t\t\t\t\t{triggerElement}\n\t\t\t\t\t\t\t\t\t{contentElement}\n\t\t\t\t\t\t\t\t</Root>\n\t\t\t\t\t\t\t</SupportTextProvider>\n\t\t\t\t\t\t</SupportRealtimeProvider>\n\t\t\t\t\t\t<SupportConfig\n\t\t\t\t\t\t\tdefaultMessages={defaultMessages}\n\t\t\t\t\t\t\tquickOptions={quickOptions}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</ThemeWrapper>\n\t\t\t\t</SupportHandleProvider>\n\t\t\t</SupportEventsProvider>\n\t\t</ControlledStateProvider>\n\t);\n}\n\n// Forward ref with proper generic typing\nconst SupportComponent = React.forwardRef(SupportComponentInner) as <\n\tLocale extends string = SupportLocale,\n>(\n\tprops: SupportProps<Locale> & { ref?: React.Ref<SupportHandle> }\n) => React.ReactElement | null;\n\n// =============================================================================\n// Trigger Compound Component\n// =============================================================================\n\nexport type SupportTriggerProps = Omit<\n\tReact.ButtonHTMLAttributes<HTMLButtonElement>,\n\t\"children\"\n> & {\n\t/**\n\t * Content to render inside the trigger.\n\t * Can be static content or a function receiving render props.\n\t */\n\tchildren?: React.ReactNode | ((props: TriggerRenderProps) => React.ReactNode);\n\t/**\n\t * When true, renders children directly with all props passed through.\n\t */\n\tasChild?: boolean;\n\tclassName?: string;\n};\n\n/**\n * Custom trigger component for the support widget.\n * Use this inside <Support> to replace the default floating button.\n *\n * @example\n * <Support.Trigger className=\"my-button\">\n * {({ isOpen, unreadCount }) => (\n * <span>{isOpen ? \"Close\" : `Help (${unreadCount})`}</span>\n * )}\n * </Support.Trigger>\n */\nconst SupportTrigger = React.forwardRef<HTMLButtonElement, SupportTriggerProps>(\n\t({ children, className, asChild = false, ...props }, ref) => (\n\t\t<Primitive.Trigger\n\t\t\tasChild={asChild}\n\t\t\tclassName={className}\n\t\t\tref={ref}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</Primitive.Trigger>\n\t)\n);\n\nSupportTrigger.displayName = \"Support.Trigger\";\n\n// =============================================================================\n// Content Compound Component\n// =============================================================================\n\nexport type SupportContentProps = {\n\tclassName?: string;\n\t/**\n\t * Which side of the trigger to place the content.\n\t * @default \"top\"\n\t */\n\tside?: Side;\n\t/**\n\t * Alignment along the side axis.\n\t * @default \"end\"\n\t */\n\talign?: Align;\n\t/**\n\t * Distance (in pixels) between the trigger and the content.\n\t * @default 16\n\t */\n\tsideOffset?: number;\n\t/**\n\t * Enable automatic collision avoidance.\n\t * When true, the content repositions to stay within the viewport.\n\t * @default true\n\t */\n\tavoidCollisions?: boolean;\n\t/**\n\t * Padding from viewport edges when avoiding collisions.\n\t * @default 8\n\t */\n\tcollisionPadding?: CollisionPadding;\n\tchildren?: React.ReactNode;\n};\n\n/**\n * Custom content wrapper for the support widget.\n * Use this inside <Support> for custom positioning or styling.\n *\n * @example\n * <Support>\n * <Support.Trigger>Help</Support.Trigger>\n * <Support.Content side=\"bottom\" align=\"end\" className=\"my-content\">\n * <Support.Router />\n * </Support.Content>\n * </Support>\n */\nconst SupportContent: React.FC<SupportContentProps> = ({\n\tclassName,\n\tside = \"top\",\n\talign = \"end\",\n\tsideOffset = 16,\n\tavoidCollisions = true,\n\tcollisionPadding = 8,\n\tchildren,\n}) => (\n\t<Content\n\t\talign={align}\n\t\tavoidCollisions={avoidCollisions}\n\t\tclassName={className}\n\t\tcollisionPadding={collisionPadding}\n\t\tside={side}\n\t\tsideOffset={sideOffset}\n\t>\n\t\t{children ?? <Router />}\n\t</Content>\n);\n\n(SupportContent as React.FC & { displayName?: string }).displayName =\n\t\"Support.Content\";\n\n// =============================================================================\n// Router Compound Component\n// =============================================================================\n\nexport type SupportRouterProps = {\n\t/**\n\t * Custom pages to add alongside built-in pages.\n\t */\n\tcustomPages?: CustomPage[];\n\t/**\n\t * Page components to register.\n\t */\n\tchildren?: React.ReactNode;\n};\n\n/**\n * Router with all default pages (Home, Conversation, etc.).\n * Use inside <Support.Content> for full control.\n *\n * @example\n * <Support.Content>\n * <Support.Router />\n * </Support.Content>\n *\n * @example\n * // With custom pages\n * <Support.Router>\n * <Support.Page name=\"FAQ\" component={FAQPage} />\n * </Support.Router>\n */\nconst SupportRouter: React.FC<SupportRouterProps> = ({\n\tcustomPages,\n\tchildren,\n}) => <Router customPages={customPages}>{children}</Router>;\n\n(SupportRouter as React.FC & { displayName?: string }).displayName =\n\t\"Support.Router\";\n\n// =============================================================================\n// Page Compound Component\n// =============================================================================\n\nexport type SupportPageProps<\n\tK extends\n\t\tkeyof import(\"@cossistant/core\").RouteRegistry = keyof import(\"@cossistant/core\").RouteRegistry,\n> = {\n\tname: K;\n\tcomponent: React.ComponentType<{\n\t\tparams?: import(\"@cossistant/core\").RouteRegistry[K];\n\t}>;\n};\n\n/**\n * Declarative page registration for custom routes.\n *\n * @example\n * <Support>\n * <Support.Page name=\"FAQ\" component={FAQPage} />\n * <Support.Page name=\"SETTINGS\" component={SettingsPage} />\n * </Support>\n */\nconst SupportPage = Page;\n\n(SupportPage as unknown as { displayName?: string }).displayName =\n\t\"Support.Page\";\n\n// =============================================================================\n// Root Compound Component (for full composition)\n// =============================================================================\n\nexport type SupportRootProps = {\n\t/**\n\t * Controlled open state.\n\t * When provided, the widget operates in controlled mode.\n\t */\n\topen?: boolean;\n\t/**\n\t * Callback fired when the open state should change.\n\t * Use with `open` prop for controlled mode.\n\t */\n\tonOpenChange?: (open: boolean) => void;\n\t/**\n\t * Whether the widget should open automatically (uncontrolled mode).\n\t * Ignored when `open` prop is provided.\n\t * @default false\n\t */\n\tdefaultOpen?: boolean;\n\t/**\n\t * Force a specific theme.\n\t */\n\ttheme?: \"light\" | \"dark\";\n\t/**\n\t * Additional CSS classes.\n\t */\n\tclassName?: string;\n\t/**\n\t * Called when a new conversation is started.\n\t */\n\tonConversationStart?: (event: ConversationStartEvent) => void;\n\t/**\n\t * Called when a conversation ends.\n\t */\n\tonConversationEnd?: (event: ConversationEndEvent) => void;\n\t/**\n\t * Called when the visitor sends a message.\n\t */\n\tonMessageSent?: (event: MessageSentEvent) => void;\n\t/**\n\t * Called when a message is received from an agent.\n\t */\n\tonMessageReceived?: (event: MessageReceivedEvent) => void;\n\t/**\n\t * Called when an error occurs.\n\t */\n\tonError?: (event: ErrorEvent) => void;\n\tchildren: React.ReactNode;\n};\n\n/**\n * Root component for full composition mode.\n * Use when you need complete control over the widget structure.\n *\n * @example\n * // Uncontrolled\n * <Support.Root defaultOpen={false}>\n * <Support.Trigger asChild>\n * <button>Help</button>\n * </Support.Trigger>\n * <Support.Content side=\"bottom\" align=\"end\">\n * <Support.Router />\n * </Support.Content>\n * </Support.Root>\n *\n * @example\n * // Controlled\n * const [isOpen, setIsOpen] = useState(false);\n * <Support.Root open={isOpen} onOpenChange={setIsOpen}>\n * ...\n * </Support.Root>\n *\n * @example\n * // With imperative ref\n * const supportRef = useRef<SupportHandle>(null);\n * <Support.Root ref={supportRef}>\n * ...\n * </Support.Root>\n */\nconst SupportRoot = React.forwardRef<SupportHandle, SupportRootProps>(\n\t(\n\t\t{\n\t\t\topen,\n\t\t\tonOpenChange,\n\t\t\tdefaultOpen,\n\t\t\ttheme,\n\t\t\tclassName,\n\t\t\tonConversationStart,\n\t\t\tonConversationEnd,\n\t\t\tonMessageSent,\n\t\t\tonMessageReceived,\n\t\t\tonError,\n\t\t\tchildren,\n\t\t},\n\t\tref\n\t) => {\n\t\tconst { website, configurationError } = useSupport();\n\t\tconst isVisitorBlocked = website?.visitor?.isBlocked ?? false;\n\n\t\t// Initialize store for uncontrolled mode\n\t\tReact.useEffect(() => {\n\t\t\tif (open === undefined && defaultOpen !== undefined) {\n\t\t\t\tinitializeSupportStore({ defaultOpen });\n\t\t\t}\n\t\t}, [open, defaultOpen]);\n\n\t\t// If visitor is blocked, don't render anything\n\t\tif (website && isVisitorBlocked) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// When there's a configuration error, render a minimal version without realtime/events\n\t\t// The children (Trigger + Content) will still render, but Content should show the error\n\t\tif (configurationError) {\n\t\t\treturn (\n\t\t\t\t<ControlledStateProvider onOpenChange={onOpenChange} open={open}>\n\t\t\t\t\t<SupportHandleProvider forwardedRef={ref}>\n\t\t\t\t\t\t<ThemeWrapper theme={theme}>\n\t\t\t\t\t\t\t<Root className={className}>{children}</Root>\n\t\t\t\t\t\t</ThemeWrapper>\n\t\t\t\t\t</SupportHandleProvider>\n\t\t\t\t</ControlledStateProvider>\n\t\t\t);\n\t\t}\n\n\t\t// Don't render anything while loading or if no website\n\t\tif (!website) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn (\n\t\t\t<ControlledStateProvider onOpenChange={onOpenChange} open={open}>\n\t\t\t\t<SupportEventsProvider\n\t\t\t\t\tonConversationEnd={onConversationEnd}\n\t\t\t\t\tonConversationStart={onConversationStart}\n\t\t\t\t\tonError={onError}\n\t\t\t\t\tonMessageReceived={onMessageReceived}\n\t\t\t\t\tonMessageSent={onMessageSent}\n\t\t\t\t>\n\t\t\t\t\t<SupportHandleProvider forwardedRef={ref}>\n\t\t\t\t\t\t<ThemeWrapper theme={theme}>\n\t\t\t\t\t\t\t<SupportRealtimeProvider>\n\t\t\t\t\t\t\t\t<Root className={className}>{children}</Root>\n\t\t\t\t\t\t\t</SupportRealtimeProvider>\n\t\t\t\t\t\t</ThemeWrapper>\n\t\t\t\t\t</SupportHandleProvider>\n\t\t\t\t</SupportEventsProvider>\n\t\t\t</ControlledStateProvider>\n\t\t);\n\t}\n);\n\nSupportRoot.displayName = \"Support.Root\";\n\n// =============================================================================\n// Compound Component Assembly\n// =============================================================================\n\nexport const Support = Object.assign(SupportComponent, {\n\tRoot: SupportRoot,\n\tTrigger: SupportTrigger,\n\tContent: SupportContent,\n\tRouter: SupportRouter,\n\tPage: SupportPage,\n\tHeader: HeaderSlot,\n\tFooter: FooterSlot,\n});\n\nexport default Support;\n\n// =============================================================================\n// Type Exports\n// =============================================================================\n\nexport type {\n\tDefaultRoutes,\n\tNavigationState,\n\tRouteRegistry,\n\tSupportPage as SupportPageType,\n} from \"@cossistant/core\";\n// Custom page type\nexport type { CustomPage } from \"./router\";\n// Types from ./types.ts\nexport type {\n\tAlign,\n\tCollisionPadding,\n\tContentProps,\n\tRootProps,\n\tSide,\n\tTriggerRenderProps,\n} from \"./types\";\n\n// =============================================================================\n// Component Exports\n// =============================================================================\n\nexport { CoButton as Button } from \"./components/button\";\nexport { Header } from \"./components/header\";\n\n// =============================================================================\n// Hook Exports\n// =============================================================================\n\nexport type { WebSocketContextValue } from \"./context/websocket\";\nexport { useWebSocket, WebSocketProvider } from \"./context/websocket\";\nexport {\n\tuseSupportConfig,\n\tuseSupportNavigation,\n\tuseSupportStore,\n} from \"./store\";\n\n// =============================================================================\n// Text & Localization\n// =============================================================================\n\nexport type { SupportLocale, SupportTextContentOverrides } from \"./text\";\nexport { Text, useSupportText } from \"./text\";\n\n// =============================================================================\n// Events\n// =============================================================================\n\nexport type {\n\tConversationEndEvent,\n\tConversationStartEvent,\n\tErrorEvent,\n\tMessageReceivedEvent,\n\tMessageSentEvent,\n\tSupportEvent,\n\tSupportEventCallbacks,\n\tSupportEventType,\n} from \"./context/events\";\nexport { useSupportEventEmitter, useSupportEvents } from \"./context/events\";\n\n// =============================================================================\n// Imperative Handle\n// =============================================================================\n\nexport type { SupportHandle } from \"./context/handle\";\nexport { useSupportHandle } from \"./context/handle\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA2LA,SAAS,cAAc,UAA2C;CACjE,MAAMA,SAAyB;EAC9B,SAAS;EACT,SAAS;EACT,OAAO,EAAE;EACT,OAAO,EAAE;EACT;AAED,SAAM,SAAS,QAAQ,WAAW,UAAU;AAC3C,MAAI,CAACC,QAAM,eAAe,MAAM,EAAE;AACjC,UAAO,MAAM,KAAK,MAAM;AACxB;;EAID,MAAM,cAAe,MAAM,MAA8B,eAAe;AAExE,MAAI,gBAAgB,qBAAqB,MAAM,SAAS,eACvD,QAAO,UAAU;WAEjB,gBAAgB,qBAChB,MAAM,SAAS,eAEf,QAAO,UAAU;WACP,gBAAgB,kBAAkB,MAAM,SAAS,KAC3D,QAAO,MAAM,KAAK,MAAM;MAExB,QAAO,MAAM,KAAK,MAAM;GAExB;AAEF,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDR,SAAS,sBACR,EACC,WACA,OAAO,OACP,QAAQ,OACR,aAAa,IACb,kBAAkB,MAClB,mBAAmB,GACnB,aAAa,EAAE,EACf,OACA,MACA,cACA,aACA,cACA,iBACA,QACA,SACA,aACA,qBACA,mBACA,eACA,mBACA,SACA,YAED,KAC4B;CAC5B,MAAM,EAAE,SAAS,uBAAuB,YAAY;CACpD,MAAM,mBAAmB,SAAS,SAAS,aAAa;AAGxD,SAAM,gBAAgB;AACrB,MAAI,SAAS,UAAa,gBAAgB,OACzC,wBAAuB,EAAE,aAAa,CAAC;IAEtC,CAAC,MAAM,YAAY,CAAC;AAGvB,KAAI,WAAW,iBACd,QAAO;CAIR,MAAM,SAAS,cAAc,SAAS;CAGtC,MAAM,iBAAiB,OAAO,WAC7B,oBAAC,kBAAe,WAAW,WAAW,UAAW;CAKlD,MAAM,iBAAiB,OAAO,WAC7B,oBAAC;EACO;EACU;EACjB,WAAW,WAAW;EACJ;EACZ;EACM;YAEX,qBACA,oBAAC,6BAA0B,OAAO,qBAAsB,GACrD,UACH,oBAAC;GAAoB;aAAc,OAAO;IAAe,GACtD;GACK;AAIX,KAAI,mBACH,QACC,oBAAC;EAAsC;EAAoB;YAC1D,oBAAC;GAAsB,cAAc;aACpC,oBAAC;IAAoB;cACpB,qBAAC;KAAgB;gBACf,gBACA;MACK;KACO;IACQ;GACC;AAK5B,KAAI,CAAC,QACJ,QAAO;AAGR,QACC,oBAAC;EAAsC;EAAoB;YAC1D,oBAAC;GACmB;GACE;GACZ;GACU;GACJ;aAEf,oBAAC;IAAsB,cAAc;cACpC,qBAAC;KAAoB;gBACpB,oBAAC,qCACA,oBAAC;MAA6B;MAAiB;gBAC9C,qBAAC;OAAgB;kBACf,gBACA;QACK;OACc,GACG,EAC1B,oBAAC;MACiB;MACH;OACb;MACY;KACQ;IACD;GACC;;AAK5B,MAAM,mBAAmBA,QAAM,WAAW,sBAAsB;;;;;;;;;;;;AAqChE,MAAM,iBAAiBA,QAAM,YAC3B,EAAE,UAAU,WAAW,UAAU,OAAO,GAAG,SAAS,QACpD,oBAACC;CACS;CACE;CACN;CACL,GAAI;CAEH;EACkB,CAErB;AAED,eAAe,cAAc;;;;;;;;;;;;;AAiD7B,MAAMC,kBAAiD,EACtD,WACA,OAAO,OACP,QAAQ,OACR,aAAa,IACb,kBAAkB,MAClB,mBAAmB,GACnB,eAEA,oBAAC;CACO;CACU;CACN;CACO;CACZ;CACM;WAEX,YAAY,oBAAC,WAAS;EACd;AAGX,AAAC,eAAuD,cACvD;;;;;;;;;;;;;;;;AAgCD,MAAMC,iBAA+C,EACpD,aACA,eACK,oBAAC;CAAoB;CAAc;EAAkB;AAE3D,AAAC,cAAsD,cACtD;;;;;;;;;;AAyBD,MAAM,cAAc;AAEpB,AAAC,YAAoD,cACpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmFD,MAAM,cAAcH,QAAM,YAExB,EACC,MACA,cACA,aACA,OACA,WACA,qBACA,mBACA,eACA,mBACA,SACA,YAED,QACI;CACJ,MAAM,EAAE,SAAS,uBAAuB,YAAY;CACpD,MAAM,mBAAmB,SAAS,SAAS,aAAa;AAGxD,SAAM,gBAAgB;AACrB,MAAI,SAAS,UAAa,gBAAgB,OACzC,wBAAuB,EAAE,aAAa,CAAC;IAEtC,CAAC,MAAM,YAAY,CAAC;AAGvB,KAAI,WAAW,iBACd,QAAO;AAKR,KAAI,mBACH,QACC,oBAAC;EAAsC;EAAoB;YAC1D,oBAAC;GAAsB,cAAc;aACpC,oBAAC;IAAoB;cACpB,oBAAC;KAAgB;KAAY;MAAgB;KAC/B;IACQ;GACC;AAK5B,KAAI,CAAC,QACJ,QAAO;AAGR,QACC,oBAAC;EAAsC;EAAoB;YAC1D,oBAAC;GACmB;GACE;GACZ;GACU;GACJ;aAEf,oBAAC;IAAsB,cAAc;cACpC,oBAAC;KAAoB;eACpB,oBAAC,qCACA,oBAAC;MAAgB;MAAY;OAAgB,GACpB;MACZ;KACQ;IACD;GACC;EAG5B;AAED,YAAY,cAAc;AAM1B,MAAa,UAAU,OAAO,OAAO,kBAAkB;CACtD,MAAM;CACN,SAAS;CACT,SAAS;CACT,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,QAAQ;CACR,CAAC;AAEF,sBAAe"}
@@ -1,8 +1,8 @@
1
1
  import { AvatarStack } from "../components/avatar-stack.js";
2
2
  import { useSupportNavigation } from "../store/support-store.js";
3
+ import { CoButton } from "../components/button.js";
3
4
  import icons_default from "../components/icons.js";
4
5
  import { PENDING_CONVERSATION_ID } from "../../utils/id.js";
5
- import { CoButton } from "../components/button.js";
6
6
  import { Header } from "../components/header.js";
7
7
  import { Text, useSupportText } from "../text/index.js";
8
8
  import { Watermark } from "../components/watermark.js";
@@ -54,6 +54,7 @@ const ConversationHistoryPage = (_props = {}) => {
54
54
  }), /* @__PURE__ */ jsx(AvatarStack, {
55
55
  aiAgents: availableAIAgents,
56
56
  gapWidth: 2,
57
+ hideDefaultAIAgent: false,
57
58
  humanAgents: availableHumanAgents,
58
59
  size: 32,
59
60
  spacing: 28
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-history.js","names":["ConversationHistoryPage: React.FC<ConversationHistoryPageProps>","Icon"],"sources":["../../../src/support/pages/conversation-history.tsx"],"sourcesContent":["import { useSupport } from \"@cossistant/react\";\nimport { PENDING_CONVERSATION_ID } from \"@cossistant/react/utils/id\";\nimport type React from \"react\";\nimport { useConversationHistoryPage } from \"../../hooks/use-conversation-history-page\";\nimport { AvatarStack } from \"../components/avatar-stack\";\nimport { CoButton } from \"../components/button\";\nimport { ConversationButtonLink } from \"../components/conversation-button-link\";\nimport { Header } from \"../components/header\";\nimport Icon from \"../components/icons\";\nimport { Watermark } from \"../components/watermark\";\nimport { useSupportNavigation } from \"../store/support-store\";\nimport { Text, useSupportText } from \"../text\";\n\ntype ConversationHistoryPageProps = {\n\tparams?: undefined;\n};\n\n/**\n * Conversation history page with list of past conversations and pagination.\n */\nexport const ConversationHistoryPage: React.FC<ConversationHistoryPageProps> = (\n\t_props = {}\n) => {\n\tconst { goBack, canGoBack, navigate } = useSupportNavigation();\n\tconst { availableAIAgents, availableHumanAgents } = useSupport();\n\tconst text = useSupportText();\n\n\tconst history = useConversationHistoryPage({\n\t\tinitialVisibleCount: 4,\n\t\tonOpenConversation: (conversationId) => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: {\n\t\t\t\t\tconversationId,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tonStartConversation: (initialMessage) => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: {\n\t\t\t\t\tconversationId: PENDING_CONVERSATION_ID,\n\t\t\t\t\tinitialMessage,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t});\n\n\tconst handleGoBack = () => {\n\t\tif (canGoBack) {\n\t\t\tgoBack();\n\t\t} else {\n\t\t\tnavigate({\n\t\t\t\tpage: \"HOME\",\n\t\t\t});\n\t\t}\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<Header onGoBack={handleGoBack}>\n\t\t\t\t<div className=\"flex w-full items-center justify-between gap-2 py-3\">\n\t\t\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t\t\t<h2 className=\"max-w-xs text-balance font-co-sans text-md leading-normal\">\n\t\t\t\t\t\t\t{text(\"page.conversationHistory.title\")}\n\t\t\t\t\t\t</h2>\n\t\t\t\t\t</div>\n\t\t\t\t\t<AvatarStack\n\t\t\t\t\t\taiAgents={availableAIAgents}\n\t\t\t\t\t\tgapWidth={2}\n\t\t\t\t\t\thumanAgents={availableHumanAgents}\n\t\t\t\t\t\tsize={32}\n\t\t\t\t\t\tspacing={28}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</Header>\n\n\t\t\t<div className=\"flex flex-1 flex-col items-center justify-between gap-2 px-6 pb-4\">\n\t\t\t\t{history.conversations.length > 0 && (\n\t\t\t\t\t<div className=\"flex w-full flex-col items-center justify-between gap-2 pt-4\">\n\t\t\t\t\t\t<div className=\"flex w-full flex-col overflow-clip rounded-md border border-co-border/80\">\n\t\t\t\t\t\t\t{history.visibleConversations.map((conversation) => (\n\t\t\t\t\t\t\t\t<ConversationButtonLink\n\t\t\t\t\t\t\t\t\tclassName=\"rounded-none\"\n\t\t\t\t\t\t\t\t\tconversation={conversation}\n\t\t\t\t\t\t\t\t\tkey={conversation.id}\n\t\t\t\t\t\t\t\t\tonClick={() => history.openConversation(conversation.id)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{history.hasMore && (\n\t\t\t\t\t\t\t<CoButton\n\t\t\t\t\t\t\t\tclassName=\"relative mt-6 w-full text-co-primary/40 text-xs hover:text-co-primary\"\n\t\t\t\t\t\t\t\tonClick={history.showAll}\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\tas=\"span\"\n\t\t\t\t\t\t\t\t\ttextKey=\"page.conversationHistory.showMore\"\n\t\t\t\t\t\t\t\t\tvariables={{ count: history.remainingCount }}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</CoButton>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div className=\"sticky bottom-4 z-10 flex w-full flex-col items-center gap-2\">\n\t\t\t\t\t<CoButton\n\t\t\t\t\t\tclassName=\"relative w-full justify-between\"\n\t\t\t\t\t\tonClick={() => history.startConversation()}\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\tclassName=\"-translate-y-1/2 absolute top-1/2 right-4 size-3 text-co-primary/60 transition-transform duration-200 group-hover/btn:translate-x-0.5 group-hover/btn:text-co-primary\"\n\t\t\t\t\t\t\tname=\"arrow-right\"\n\t\t\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Text as=\"span\" textKey=\"common.actions.askQuestion\" />\n\t\t\t\t\t</CoButton>\n\t\t\t\t\t<Watermark className=\"mt-4 mb-2\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</>\n\t);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAoBA,MAAaA,2BACZ,SAAS,EAAE,KACP;CACJ,MAAM,EAAE,QAAQ,WAAW,aAAa,sBAAsB;CAC9D,MAAM,EAAE,mBAAmB,yBAAyB,YAAY;CAChE,MAAM,OAAO,gBAAgB;CAE7B,MAAM,UAAU,2BAA2B;EAC1C,qBAAqB;EACrB,qBAAqB,mBAAmB;AACvC,YAAS;IACR,MAAM;IACN,QAAQ,EACP,gBACA;IACD,CAAC;;EAEH,sBAAsB,mBAAmB;AACxC,YAAS;IACR,MAAM;IACN,QAAQ;KACP,gBAAgB;KAChB;KACA;IACD,CAAC;;EAEH,CAAC;CAEF,MAAM,qBAAqB;AAC1B,MAAI,UACH,SAAQ;MAER,UAAS,EACR,MAAM,QACN,CAAC;;AAIJ,QACC,4CACC,oBAAC;EAAO,UAAU;YACjB,qBAAC;GAAI,WAAU;cACd,oBAAC;IAAI,WAAU;cACd,oBAAC;KAAG,WAAU;eACZ,KAAK,iCAAiC;MACnC;KACA,EACN,oBAAC;IACA,UAAU;IACV,UAAU;IACV,aAAa;IACb,MAAM;IACN,SAAS;KACR;IACG;GACE,EAET,qBAAC;EAAI,WAAU;aACb,QAAQ,cAAc,SAAS,KAC/B,qBAAC;GAAI,WAAU;cACd,oBAAC;IAAI,WAAU;cACb,QAAQ,qBAAqB,KAAK,iBAClC,oBAAC;KACA,WAAU;KACI;KAEd,eAAe,QAAQ,iBAAiB,aAAa,GAAG;OADnD,aAAa,GAEjB,CACD;KACG,EACL,QAAQ,WACR,oBAAC;IACA,WAAU;IACV,SAAS,QAAQ;IACjB,SAAQ;cAER,oBAAC;KACA,IAAG;KACH,SAAQ;KACR,WAAW,EAAE,OAAO,QAAQ,gBAAgB;MAC3C;KACQ;IAEP,EAGP,qBAAC;GAAI,WAAU;cACd,qBAAC;IACA,WAAU;IACV,eAAe,QAAQ,mBAAmB;IAC1C,MAAK;IACL,SAAQ;eAER,oBAACC;KACA,WAAU;KACV,MAAK;KACL,SAAQ;MACP,EACF,oBAAC;KAAK,IAAG;KAAO,SAAQ;MAA+B;KAC7C,EACX,oBAAC,aAAU,WAAU,cAAc;IAC9B;GACD,IACJ"}
1
+ {"version":3,"file":"conversation-history.js","names":["ConversationHistoryPage: React.FC<ConversationHistoryPageProps>","Icon"],"sources":["../../../src/support/pages/conversation-history.tsx"],"sourcesContent":["import { useSupport } from \"@cossistant/react\";\nimport { PENDING_CONVERSATION_ID } from \"@cossistant/react/utils/id\";\nimport type React from \"react\";\nimport { useConversationHistoryPage } from \"../../hooks/use-conversation-history-page\";\nimport { AvatarStack } from \"../components/avatar-stack\";\nimport { CoButton } from \"../components/button\";\nimport { ConversationButtonLink } from \"../components/conversation-button-link\";\nimport { Header } from \"../components/header\";\nimport Icon from \"../components/icons\";\nimport { Watermark } from \"../components/watermark\";\nimport { useSupportNavigation } from \"../store/support-store\";\nimport { Text, useSupportText } from \"../text\";\n\ntype ConversationHistoryPageProps = {\n\tparams?: undefined;\n};\n\n/**\n * Conversation history page with list of past conversations and pagination.\n */\nexport const ConversationHistoryPage: React.FC<ConversationHistoryPageProps> = (\n\t_props = {}\n) => {\n\tconst { goBack, canGoBack, navigate } = useSupportNavigation();\n\tconst { availableAIAgents, availableHumanAgents } = useSupport();\n\tconst text = useSupportText();\n\n\tconst history = useConversationHistoryPage({\n\t\tinitialVisibleCount: 4,\n\t\tonOpenConversation: (conversationId) => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: {\n\t\t\t\t\tconversationId,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tonStartConversation: (initialMessage) => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: {\n\t\t\t\t\tconversationId: PENDING_CONVERSATION_ID,\n\t\t\t\t\tinitialMessage,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t});\n\n\tconst handleGoBack = () => {\n\t\tif (canGoBack) {\n\t\t\tgoBack();\n\t\t} else {\n\t\t\tnavigate({\n\t\t\t\tpage: \"HOME\",\n\t\t\t});\n\t\t}\n\t};\n\n\treturn (\n\t\t<>\n\t\t\t<Header onGoBack={handleGoBack}>\n\t\t\t\t<div className=\"flex w-full items-center justify-between gap-2 py-3\">\n\t\t\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t\t\t<h2 className=\"max-w-xs text-balance font-co-sans text-md leading-normal\">\n\t\t\t\t\t\t\t{text(\"page.conversationHistory.title\")}\n\t\t\t\t\t\t</h2>\n\t\t\t\t\t</div>\n\t\t\t\t\t<AvatarStack\n\t\t\t\t\t\taiAgents={availableAIAgents}\n\t\t\t\t\t\tgapWidth={2}\n\t\t\t\t\t\thideDefaultAIAgent={false}\n\t\t\t\t\t\thumanAgents={availableHumanAgents}\n\t\t\t\t\t\tsize={32}\n\t\t\t\t\t\tspacing={28}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</Header>\n\n\t\t\t<div className=\"flex flex-1 flex-col items-center justify-between gap-2 px-6 pb-4\">\n\t\t\t\t{history.conversations.length > 0 && (\n\t\t\t\t\t<div className=\"flex w-full flex-col items-center justify-between gap-2 pt-4\">\n\t\t\t\t\t\t<div className=\"flex w-full flex-col overflow-clip rounded-md border border-co-border/80\">\n\t\t\t\t\t\t\t{history.visibleConversations.map((conversation) => (\n\t\t\t\t\t\t\t\t<ConversationButtonLink\n\t\t\t\t\t\t\t\t\tclassName=\"rounded-none\"\n\t\t\t\t\t\t\t\t\tconversation={conversation}\n\t\t\t\t\t\t\t\t\tkey={conversation.id}\n\t\t\t\t\t\t\t\t\tonClick={() => history.openConversation(conversation.id)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{history.hasMore && (\n\t\t\t\t\t\t\t<CoButton\n\t\t\t\t\t\t\t\tclassName=\"relative mt-6 w-full text-co-primary/40 text-xs hover:text-co-primary\"\n\t\t\t\t\t\t\t\tonClick={history.showAll}\n\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\t\t\tas=\"span\"\n\t\t\t\t\t\t\t\t\ttextKey=\"page.conversationHistory.showMore\"\n\t\t\t\t\t\t\t\t\tvariables={{ count: history.remainingCount }}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</CoButton>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div className=\"sticky bottom-4 z-10 flex w-full flex-col items-center gap-2\">\n\t\t\t\t\t<CoButton\n\t\t\t\t\t\tclassName=\"relative w-full justify-between\"\n\t\t\t\t\t\tonClick={() => history.startConversation()}\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\tclassName=\"-translate-y-1/2 absolute top-1/2 right-4 size-3 text-co-primary/60 transition-transform duration-200 group-hover/btn:translate-x-0.5 group-hover/btn:text-co-primary\"\n\t\t\t\t\t\t\tname=\"arrow-right\"\n\t\t\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Text as=\"span\" textKey=\"common.actions.askQuestion\" />\n\t\t\t\t\t</CoButton>\n\t\t\t\t\t<Watermark className=\"mt-4 mb-2\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</>\n\t);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAoBA,MAAaA,2BACZ,SAAS,EAAE,KACP;CACJ,MAAM,EAAE,QAAQ,WAAW,aAAa,sBAAsB;CAC9D,MAAM,EAAE,mBAAmB,yBAAyB,YAAY;CAChE,MAAM,OAAO,gBAAgB;CAE7B,MAAM,UAAU,2BAA2B;EAC1C,qBAAqB;EACrB,qBAAqB,mBAAmB;AACvC,YAAS;IACR,MAAM;IACN,QAAQ,EACP,gBACA;IACD,CAAC;;EAEH,sBAAsB,mBAAmB;AACxC,YAAS;IACR,MAAM;IACN,QAAQ;KACP,gBAAgB;KAChB;KACA;IACD,CAAC;;EAEH,CAAC;CAEF,MAAM,qBAAqB;AAC1B,MAAI,UACH,SAAQ;MAER,UAAS,EACR,MAAM,QACN,CAAC;;AAIJ,QACC,4CACC,oBAAC;EAAO,UAAU;YACjB,qBAAC;GAAI,WAAU;cACd,oBAAC;IAAI,WAAU;cACd,oBAAC;KAAG,WAAU;eACZ,KAAK,iCAAiC;MACnC;KACA,EACN,oBAAC;IACA,UAAU;IACV,UAAU;IACV,oBAAoB;IACpB,aAAa;IACb,MAAM;IACN,SAAS;KACR;IACG;GACE,EAET,qBAAC;EAAI,WAAU;aACb,QAAQ,cAAc,SAAS,KAC/B,qBAAC;GAAI,WAAU;cACd,oBAAC;IAAI,WAAU;cACb,QAAQ,qBAAqB,KAAK,iBAClC,oBAAC;KACA,WAAU;KACI;KAEd,eAAe,QAAQ,iBAAiB,aAAa,GAAG;OADnD,aAAa,GAEjB,CACD;KACG,EACL,QAAQ,WACR,oBAAC;IACA,WAAU;IACV,SAAS,QAAQ;IACjB,SAAQ;cAER,oBAAC;KACA,IAAG;KACH,SAAQ;KACR,WAAW,EAAE,OAAO,QAAQ,gBAAgB;MAC3C;KACQ;IAEP,EAGP,qBAAC;GAAI,WAAU;cACd,qBAAC;IACA,WAAU;IACV,eAAe,QAAQ,mBAAmB;IAC1C,MAAK;IACL,SAAQ;eAER,oBAACC;KACA,WAAU;KACV,MAAK;KACL,SAAQ;MACP,EACF,oBAAC;KAAK,IAAG;KAAO,SAAQ;MAA+B;KAC7C,EACX,oBAAC,aAAU,WAAU,cAAc;IAC9B;GACD,IACJ"}
@@ -1,4 +1,4 @@
1
- import { TimelineItem } from "../../timeline-item.js";
1
+ import { TimelineItem } from "../../packages/types/src/api/timeline-item.js";
2
2
  import { ReactElement } from "react";
3
3
 
4
4
  //#region src/support/pages/conversation.d.ts
@@ -40,7 +40,7 @@ const ConversationPage = ({ params, conversationId: legacyConversationId, initia
40
40
  });
41
41
  }
42
42
  });
43
- const activeConversation = useStoreSelector(client.conversationsStore, (state) => conversation.isPending ? null : state.byId[conversation.conversationId]);
43
+ const activeConversation = useStoreSelector(client?.conversationsStore ?? null, (state) => conversation.isPending || !state ? null : state.byId[conversation.conversationId]);
44
44
  const isConversationClosed = Boolean(activeConversation && (activeConversation.status === ConversationStatus.RESOLVED || activeConversation.status === ConversationStatus.SPAM || activeConversation.deletedAt));
45
45
  const handleGoBack = () => {
46
46
  if (canGoBack) goBack();
@@ -1 +1 @@
1
- {"version":3,"file":"conversation.js","names":["ConversationPage: ConversationPageComponent"],"sources":["../../../src/support/pages/conversation.tsx"],"sourcesContent":["import { ConversationStatus } from \"@cossistant/types\";\nimport type { TimelineItem } from \"@cossistant/types/api/timeline-item\";\nimport { type ReactElement, useEffect, useMemo, useRef } from \"react\";\nimport { useStoreSelector } from \"../../hooks/private/store/use-store-selector\";\nimport { useConversationPage } from \"../../hooks/use-conversation-page\";\nimport { useNewMessageSound } from \"../../hooks/use-new-message-sound\";\nimport { useSupport } from \"../../provider\";\nimport { AvatarStack } from \"../components/avatar-stack\";\nimport { ConversationTimelineList } from \"../components/conversation-timeline\";\nimport { Header } from \"../components/header\";\nimport { MultimodalInput } from \"../components/multimodal-input\";\nimport { IdentificationTimelineTool } from \"../components/timeline-identification-tool\";\nimport { useSupportConfig, useSupportNavigation } from \"../store\";\nimport { Text, useSupportText } from \"../text\";\n\ntype ConversationPageProps = {\n\t/**\n\t * Page params object (for compatibility with Page component)\n\t */\n\tparams?: {\n\t\t/**\n\t\t * The conversation ID to display (can be PENDING_CONVERSATION_ID or a real ID).\n\t\t */\n\t\tconversationId: string;\n\n\t\t/**\n\t\t * Optional initial message to send when opening the conversation.\n\t\t */\n\t\tinitialMessage?: string;\n\n\t\t/**\n\t\t * Optional timeline items to display (for optimistic updates or initial state).\n\t\t */\n\t\titems?: TimelineItem[];\n\t};\n\n\t// Legacy direct props support (deprecated but maintained for backward compatibility)\n\tconversationId?: string;\n\tinitialMessage?: string;\n\titems?: TimelineItem[];\n};\n\n/**\n * Conversation page with message timeline and input composer.\n */\ntype ConversationPageComponent = (props: ConversationPageProps) => ReactElement;\n\nexport const ConversationPage: ConversationPageComponent = ({\n\tparams,\n\tconversationId: legacyConversationId,\n\tinitialMessage: legacyInitialMessage,\n\titems: legacyItems,\n}: ConversationPageProps) => {\n\t// Support both params object (new) and direct props (legacy)\n\tconst initialConversationId =\n\t\tparams?.conversationId ?? legacyConversationId ?? \"\";\n\tconst initialMessage = params?.initialMessage ?? legacyInitialMessage;\n\tconst passedItems = params?.items ?? legacyItems ?? [];\n\tconst { website, availableAIAgents, availableHumanAgents, visitor, client } =\n\t\tuseSupport();\n\tconst { navigate, replace, goBack, canGoBack } = useSupportNavigation();\n\tconst { isOpen } = useSupportConfig();\n\tconst text = useSupportText();\n\tconst playNewMessageSound = useNewMessageSound({\n\t\tvolume: 0.7,\n\t\tplaybackRate: 1.0,\n\t});\n\tconst previousItemsRef = useRef<TimelineItem[]>([]);\n\n\tconst timelineTools = useMemo(\n\t\t() => ({\n\t\t\tidentification: { component: IdentificationTimelineTool },\n\t\t}),\n\t\t[]\n\t);\n\n\t// Main conversation hook - handles all logic\n\tconst conversation = useConversationPage({\n\t\tconversationId: initialConversationId,\n\t\titems: passedItems,\n\t\tinitialMessage,\n\t\tautoSeenEnabled: isOpen,\n\t\tonConversationIdChange: (newConversationId) => {\n\t\t\t// Update navigation when conversation is created\n\t\t\treplace({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: { conversationId: newConversationId },\n\t\t\t});\n\t\t},\n\t});\n\n\t// Get conversation from store (no API call) to check status\n\tconst activeConversation = useStoreSelector(\n\t\tclient.conversationsStore,\n\t\t(state) =>\n\t\t\tconversation.isPending ? null : state.byId[conversation.conversationId]\n\t);\n\n\tconst isConversationClosed = Boolean(\n\t\tactiveConversation &&\n\t\t\t(activeConversation.status === ConversationStatus.RESOLVED ||\n\t\t\t\tactiveConversation.status === ConversationStatus.SPAM ||\n\t\t\t\tactiveConversation.deletedAt)\n\t);\n\n\tconst handleGoBack = () => {\n\t\tif (canGoBack) {\n\t\t\tgoBack();\n\t\t} else {\n\t\t\tnavigate({ page: \"HOME\" });\n\t\t}\n\t};\n\n\t// Play sound when new messages arrive from agents (not visitor)\n\tuseEffect(() => {\n\t\tconst currentItems = conversation.items;\n\t\tconst previousItems = previousItemsRef.current;\n\n\t\t// Check if there are new items\n\t\tif (currentItems.length > previousItems.length) {\n\t\t\t// Find the new items\n\t\t\tconst newItems = currentItems.slice(previousItems.length);\n\n\t\t\t// Play sound only if new message is from agent (not visitor)\n\t\t\tfor (const item of newItems) {\n\t\t\t\tif (item.type === \"message\" && !item.visitorId) {\n\t\t\t\t\tplayNewMessageSound();\n\t\t\t\t\tbreak; // Only play once per batch\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Update the ref\n\t\tpreviousItemsRef.current = currentItems;\n\t}, [conversation.items, playNewMessageSound]);\n\n\treturn (\n\t\t<div className=\"flex h-full flex-col gap-0 overflow-hidden\">\n\t\t\t<Header onGoBack={handleGoBack}>\n\t\t\t\t<div className=\"flex w-full items-center justify-between gap-2 py-3\">\n\t\t\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t\t\t<p className=\"font-medium text-co-primary text-sm\">\n\t\t\t\t\t\t\t{website?.name}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\tas=\"p\"\n\t\t\t\t\t\t\tclassName=\"text-co-muted-foreground text-sm\"\n\t\t\t\t\t\t\ttextKey=\"common.labels.supportOnline\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<AvatarStack\n\t\t\t\t\t\taiAgents={availableAIAgents}\n\t\t\t\t\t\tgapWidth={2}\n\t\t\t\t\t\thumanAgents={availableHumanAgents}\n\t\t\t\t\t\tsize={32}\n\t\t\t\t\t\tspacing={28}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</Header>\n\n\t\t\t<ConversationTimelineList\n\t\t\t\tavailableAIAgents={availableAIAgents}\n\t\t\t\tavailableHumanAgents={availableHumanAgents}\n\t\t\t\tclassName=\"min-h-0 flex-1 px-4\"\n\t\t\t\tconversationId={conversation.conversationId}\n\t\t\t\tcurrentVisitorId={visitor?.id}\n\t\t\t\titems={conversation.items}\n\t\t\t\ttools={timelineTools}\n\t\t\t/>\n\n\t\t\t{isConversationClosed ? (\n\t\t\t\t<div className=\"m-4 flex items-center justify-center text-balance px-4 pb-6 text-center font-medium text-co-muted-foreground text-sm\">\n\t\t\t\t\t<Text as=\"p\" textKey=\"component.conversationPage.closedMessage\" />\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"flex-shrink-0 p-1\">\n\t\t\t\t\t<MultimodalInput\n\t\t\t\t\t\tdisabled={\n\t\t\t\t\t\t\tconversation.composer.isSubmitting ||\n\t\t\t\t\t\t\tconversation.composer.isUploading\n\t\t\t\t\t\t}\n\t\t\t\t\t\terror={conversation.error}\n\t\t\t\t\t\tfiles={conversation.composer.files}\n\t\t\t\t\t\tisSubmitting={conversation.composer.isSubmitting}\n\t\t\t\t\t\tisUploading={conversation.composer.isUploading}\n\t\t\t\t\t\tonChange={conversation.composer.setMessage}\n\t\t\t\t\t\tonFileSelect={conversation.composer.addFiles}\n\t\t\t\t\t\tonRemoveFile={conversation.composer.removeFile}\n\t\t\t\t\t\tonSubmit={conversation.composer.submit}\n\t\t\t\t\t\tplaceholder={text(\"component.multimodalInput.placeholder\")}\n\t\t\t\t\t\tvalue={conversation.composer.message}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"],"mappings":";;;;;;;;;;;;;;;;AA+CA,MAAaA,oBAA+C,EAC3D,QACA,gBAAgB,sBAChB,gBAAgB,sBAChB,OAAO,kBACqB;CAE5B,MAAM,wBACL,QAAQ,kBAAkB,wBAAwB;CACnD,MAAM,iBAAiB,QAAQ,kBAAkB;CACjD,MAAM,cAAc,QAAQ,SAAS,eAAe,EAAE;CACtD,MAAM,EAAE,SAAS,mBAAmB,sBAAsB,SAAS,WAClE,YAAY;CACb,MAAM,EAAE,UAAU,SAAS,QAAQ,cAAc,sBAAsB;CACvE,MAAM,EAAE,WAAW,kBAAkB;CACrC,MAAM,OAAO,gBAAgB;CAC7B,MAAM,sBAAsB,mBAAmB;EAC9C,QAAQ;EACR,cAAc;EACd,CAAC;CACF,MAAM,mBAAmB,OAAuB,EAAE,CAAC;CAEnD,MAAM,gBAAgB,eACd,EACN,gBAAgB,EAAE,WAAW,4BAA4B,EACzD,GACD,EAAE,CACF;CAGD,MAAM,eAAe,oBAAoB;EACxC,gBAAgB;EAChB,OAAO;EACP;EACA,iBAAiB;EACjB,yBAAyB,sBAAsB;AAE9C,WAAQ;IACP,MAAM;IACN,QAAQ,EAAE,gBAAgB,mBAAmB;IAC7C,CAAC;;EAEH,CAAC;CAGF,MAAM,qBAAqB,iBAC1B,OAAO,qBACN,UACA,aAAa,YAAY,OAAO,MAAM,KAAK,aAAa,gBACzD;CAED,MAAM,uBAAuB,QAC5B,uBACE,mBAAmB,WAAW,mBAAmB,YACjD,mBAAmB,WAAW,mBAAmB,QACjD,mBAAmB,WACrB;CAED,MAAM,qBAAqB;AAC1B,MAAI,UACH,SAAQ;MAER,UAAS,EAAE,MAAM,QAAQ,CAAC;;AAK5B,iBAAgB;EACf,MAAM,eAAe,aAAa;EAClC,MAAM,gBAAgB,iBAAiB;AAGvC,MAAI,aAAa,SAAS,cAAc,QAAQ;GAE/C,MAAM,WAAW,aAAa,MAAM,cAAc,OAAO;AAGzD,QAAK,MAAM,QAAQ,SAClB,KAAI,KAAK,SAAS,aAAa,CAAC,KAAK,WAAW;AAC/C,yBAAqB;AACrB;;;AAMH,mBAAiB,UAAU;IACzB,CAAC,aAAa,OAAO,oBAAoB,CAAC;AAE7C,QACC,qBAAC;EAAI,WAAU;;GACd,oBAAC;IAAO,UAAU;cACjB,qBAAC;KAAI,WAAU;gBACd,qBAAC;MAAI,WAAU;iBACd,oBAAC;OAAE,WAAU;iBACX,SAAS;QACP,EACJ,oBAAC;OACA,IAAG;OACH,WAAU;OACV,SAAQ;QACP;OACG,EACN,oBAAC;MACA,UAAU;MACV,UAAU;MACV,aAAa;MACb,MAAM;MACN,SAAS;OACR;MACG;KACE;GAET,oBAAC;IACmB;IACG;IACtB,WAAU;IACV,gBAAgB,aAAa;IAC7B,kBAAkB,SAAS;IAC3B,OAAO,aAAa;IACpB,OAAO;KACN;GAED,uBACA,oBAAC;IAAI,WAAU;cACd,oBAAC;KAAK,IAAG;KAAI,SAAQ;MAA6C;KAC7D,GAEN,oBAAC;IAAI,WAAU;cACd,oBAAC;KACA,UACC,aAAa,SAAS,gBACtB,aAAa,SAAS;KAEvB,OAAO,aAAa;KACpB,OAAO,aAAa,SAAS;KAC7B,cAAc,aAAa,SAAS;KACpC,aAAa,aAAa,SAAS;KACnC,UAAU,aAAa,SAAS;KAChC,cAAc,aAAa,SAAS;KACpC,cAAc,aAAa,SAAS;KACpC,UAAU,aAAa,SAAS;KAChC,aAAa,KAAK,wCAAwC;KAC1D,OAAO,aAAa,SAAS;MAC5B;KACG;;GAEF"}
1
+ {"version":3,"file":"conversation.js","names":["ConversationPage: ConversationPageComponent"],"sources":["../../../src/support/pages/conversation.tsx"],"sourcesContent":["import { ConversationStatus } from \"@cossistant/types\";\nimport type { TimelineItem } from \"@cossistant/types/api/timeline-item\";\nimport { type ReactElement, useEffect, useMemo, useRef } from \"react\";\nimport { useStoreSelector } from \"../../hooks/private/store/use-store-selector\";\nimport { useConversationPage } from \"../../hooks/use-conversation-page\";\nimport { useNewMessageSound } from \"../../hooks/use-new-message-sound\";\nimport { useSupport } from \"../../provider\";\nimport { AvatarStack } from \"../components/avatar-stack\";\nimport { ConversationTimelineList } from \"../components/conversation-timeline\";\nimport { Header } from \"../components/header\";\nimport { MultimodalInput } from \"../components/multimodal-input\";\nimport { IdentificationTimelineTool } from \"../components/timeline-identification-tool\";\nimport { useSupportConfig, useSupportNavigation } from \"../store\";\nimport { Text, useSupportText } from \"../text\";\n\ntype ConversationPageProps = {\n\t/**\n\t * Page params object (for compatibility with Page component)\n\t */\n\tparams?: {\n\t\t/**\n\t\t * The conversation ID to display (can be PENDING_CONVERSATION_ID or a real ID).\n\t\t */\n\t\tconversationId: string;\n\n\t\t/**\n\t\t * Optional initial message to send when opening the conversation.\n\t\t */\n\t\tinitialMessage?: string;\n\n\t\t/**\n\t\t * Optional timeline items to display (for optimistic updates or initial state).\n\t\t */\n\t\titems?: TimelineItem[];\n\t};\n\n\t// Legacy direct props support (deprecated but maintained for backward compatibility)\n\tconversationId?: string;\n\tinitialMessage?: string;\n\titems?: TimelineItem[];\n};\n\n/**\n * Conversation page with message timeline and input composer.\n */\ntype ConversationPageComponent = (props: ConversationPageProps) => ReactElement;\n\nexport const ConversationPage: ConversationPageComponent = ({\n\tparams,\n\tconversationId: legacyConversationId,\n\tinitialMessage: legacyInitialMessage,\n\titems: legacyItems,\n}: ConversationPageProps) => {\n\t// Support both params object (new) and direct props (legacy)\n\tconst initialConversationId =\n\t\tparams?.conversationId ?? legacyConversationId ?? \"\";\n\tconst initialMessage = params?.initialMessage ?? legacyInitialMessage;\n\tconst passedItems = params?.items ?? legacyItems ?? [];\n\tconst { website, availableAIAgents, availableHumanAgents, visitor, client } =\n\t\tuseSupport();\n\tconst { navigate, replace, goBack, canGoBack } = useSupportNavigation();\n\tconst { isOpen } = useSupportConfig();\n\tconst text = useSupportText();\n\tconst playNewMessageSound = useNewMessageSound({\n\t\tvolume: 0.7,\n\t\tplaybackRate: 1.0,\n\t});\n\tconst previousItemsRef = useRef<TimelineItem[]>([]);\n\n\tconst timelineTools = useMemo(\n\t\t() => ({\n\t\t\tidentification: { component: IdentificationTimelineTool },\n\t\t}),\n\t\t[]\n\t);\n\n\t// Main conversation hook - handles all logic\n\tconst conversation = useConversationPage({\n\t\tconversationId: initialConversationId,\n\t\titems: passedItems,\n\t\tinitialMessage,\n\t\tautoSeenEnabled: isOpen,\n\t\tonConversationIdChange: (newConversationId) => {\n\t\t\t// Update navigation when conversation is created\n\t\t\treplace({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: { conversationId: newConversationId },\n\t\t\t});\n\t\t},\n\t});\n\n\t// Get conversation from store (no API call) to check status\n\tconst activeConversation = useStoreSelector(\n\t\tclient?.conversationsStore ?? null,\n\t\t(state) =>\n\t\t\tconversation.isPending || !state\n\t\t\t\t? null\n\t\t\t\t: state.byId[conversation.conversationId]\n\t);\n\n\tconst isConversationClosed = Boolean(\n\t\tactiveConversation &&\n\t\t\t(activeConversation.status === ConversationStatus.RESOLVED ||\n\t\t\t\tactiveConversation.status === ConversationStatus.SPAM ||\n\t\t\t\tactiveConversation.deletedAt)\n\t);\n\n\tconst handleGoBack = () => {\n\t\tif (canGoBack) {\n\t\t\tgoBack();\n\t\t} else {\n\t\t\tnavigate({ page: \"HOME\" });\n\t\t}\n\t};\n\n\t// Play sound when new messages arrive from agents (not visitor)\n\tuseEffect(() => {\n\t\tconst currentItems = conversation.items;\n\t\tconst previousItems = previousItemsRef.current;\n\n\t\t// Check if there are new items\n\t\tif (currentItems.length > previousItems.length) {\n\t\t\t// Find the new items\n\t\t\tconst newItems = currentItems.slice(previousItems.length);\n\n\t\t\t// Play sound only if new message is from agent (not visitor)\n\t\t\tfor (const item of newItems) {\n\t\t\t\tif (item.type === \"message\" && !item.visitorId) {\n\t\t\t\t\tplayNewMessageSound();\n\t\t\t\t\tbreak; // Only play once per batch\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Update the ref\n\t\tpreviousItemsRef.current = currentItems;\n\t}, [conversation.items, playNewMessageSound]);\n\n\treturn (\n\t\t<div className=\"flex h-full flex-col gap-0 overflow-hidden\">\n\t\t\t<Header onGoBack={handleGoBack}>\n\t\t\t\t<div className=\"flex w-full items-center justify-between gap-2 py-3\">\n\t\t\t\t\t<div className=\"flex flex-col\">\n\t\t\t\t\t\t<p className=\"font-medium text-co-primary text-sm\">\n\t\t\t\t\t\t\t{website?.name}\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\tas=\"p\"\n\t\t\t\t\t\t\tclassName=\"text-co-muted-foreground text-sm\"\n\t\t\t\t\t\t\ttextKey=\"common.labels.supportOnline\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<AvatarStack\n\t\t\t\t\t\taiAgents={availableAIAgents}\n\t\t\t\t\t\tgapWidth={2}\n\t\t\t\t\t\thumanAgents={availableHumanAgents}\n\t\t\t\t\t\tsize={32}\n\t\t\t\t\t\tspacing={28}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</Header>\n\n\t\t\t<ConversationTimelineList\n\t\t\t\tavailableAIAgents={availableAIAgents}\n\t\t\t\tavailableHumanAgents={availableHumanAgents}\n\t\t\t\tclassName=\"min-h-0 flex-1 px-4\"\n\t\t\t\tconversationId={conversation.conversationId}\n\t\t\t\tcurrentVisitorId={visitor?.id}\n\t\t\t\titems={conversation.items}\n\t\t\t\ttools={timelineTools}\n\t\t\t/>\n\n\t\t\t{isConversationClosed ? (\n\t\t\t\t<div className=\"m-4 flex items-center justify-center text-balance px-4 pb-6 text-center font-medium text-co-muted-foreground text-sm\">\n\t\t\t\t\t<Text as=\"p\" textKey=\"component.conversationPage.closedMessage\" />\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"flex-shrink-0 p-1\">\n\t\t\t\t\t<MultimodalInput\n\t\t\t\t\t\tdisabled={\n\t\t\t\t\t\t\tconversation.composer.isSubmitting ||\n\t\t\t\t\t\t\tconversation.composer.isUploading\n\t\t\t\t\t\t}\n\t\t\t\t\t\terror={conversation.error}\n\t\t\t\t\t\tfiles={conversation.composer.files}\n\t\t\t\t\t\tisSubmitting={conversation.composer.isSubmitting}\n\t\t\t\t\t\tisUploading={conversation.composer.isUploading}\n\t\t\t\t\t\tonChange={conversation.composer.setMessage}\n\t\t\t\t\t\tonFileSelect={conversation.composer.addFiles}\n\t\t\t\t\t\tonRemoveFile={conversation.composer.removeFile}\n\t\t\t\t\t\tonSubmit={conversation.composer.submit}\n\t\t\t\t\t\tplaceholder={text(\"component.multimodalInput.placeholder\")}\n\t\t\t\t\t\tvalue={conversation.composer.message}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n"],"mappings":";;;;;;;;;;;;;;;;AA+CA,MAAaA,oBAA+C,EAC3D,QACA,gBAAgB,sBAChB,gBAAgB,sBAChB,OAAO,kBACqB;CAE5B,MAAM,wBACL,QAAQ,kBAAkB,wBAAwB;CACnD,MAAM,iBAAiB,QAAQ,kBAAkB;CACjD,MAAM,cAAc,QAAQ,SAAS,eAAe,EAAE;CACtD,MAAM,EAAE,SAAS,mBAAmB,sBAAsB,SAAS,WAClE,YAAY;CACb,MAAM,EAAE,UAAU,SAAS,QAAQ,cAAc,sBAAsB;CACvE,MAAM,EAAE,WAAW,kBAAkB;CACrC,MAAM,OAAO,gBAAgB;CAC7B,MAAM,sBAAsB,mBAAmB;EAC9C,QAAQ;EACR,cAAc;EACd,CAAC;CACF,MAAM,mBAAmB,OAAuB,EAAE,CAAC;CAEnD,MAAM,gBAAgB,eACd,EACN,gBAAgB,EAAE,WAAW,4BAA4B,EACzD,GACD,EAAE,CACF;CAGD,MAAM,eAAe,oBAAoB;EACxC,gBAAgB;EAChB,OAAO;EACP;EACA,iBAAiB;EACjB,yBAAyB,sBAAsB;AAE9C,WAAQ;IACP,MAAM;IACN,QAAQ,EAAE,gBAAgB,mBAAmB;IAC7C,CAAC;;EAEH,CAAC;CAGF,MAAM,qBAAqB,iBAC1B,QAAQ,sBAAsB,OAC7B,UACA,aAAa,aAAa,CAAC,QACxB,OACA,MAAM,KAAK,aAAa,gBAC5B;CAED,MAAM,uBAAuB,QAC5B,uBACE,mBAAmB,WAAW,mBAAmB,YACjD,mBAAmB,WAAW,mBAAmB,QACjD,mBAAmB,WACrB;CAED,MAAM,qBAAqB;AAC1B,MAAI,UACH,SAAQ;MAER,UAAS,EAAE,MAAM,QAAQ,CAAC;;AAK5B,iBAAgB;EACf,MAAM,eAAe,aAAa;EAClC,MAAM,gBAAgB,iBAAiB;AAGvC,MAAI,aAAa,SAAS,cAAc,QAAQ;GAE/C,MAAM,WAAW,aAAa,MAAM,cAAc,OAAO;AAGzD,QAAK,MAAM,QAAQ,SAClB,KAAI,KAAK,SAAS,aAAa,CAAC,KAAK,WAAW;AAC/C,yBAAqB;AACrB;;;AAMH,mBAAiB,UAAU;IACzB,CAAC,aAAa,OAAO,oBAAoB,CAAC;AAE7C,QACC,qBAAC;EAAI,WAAU;;GACd,oBAAC;IAAO,UAAU;cACjB,qBAAC;KAAI,WAAU;gBACd,qBAAC;MAAI,WAAU;iBACd,oBAAC;OAAE,WAAU;iBACX,SAAS;QACP,EACJ,oBAAC;OACA,IAAG;OACH,WAAU;OACV,SAAQ;QACP;OACG,EACN,oBAAC;MACA,UAAU;MACV,UAAU;MACV,aAAa;MACb,MAAM;MACN,SAAS;OACR;MACG;KACE;GAET,oBAAC;IACmB;IACG;IACtB,WAAU;IACV,gBAAgB,aAAa;IAC7B,kBAAkB,SAAS;IAC3B,OAAO,aAAa;IACpB,OAAO;KACN;GAED,uBACA,oBAAC;IAAI,WAAU;cACd,oBAAC;KAAK,IAAG;KAAI,SAAQ;MAA6C;KAC7D,GAEN,oBAAC;IAAI,WAAU;cACd,oBAAC;KACA,UACC,aAAa,SAAS,gBACtB,aAAa,SAAS;KAEvB,OAAO,aAAa;KACpB,OAAO,aAAa,SAAS;KAC7B,cAAc,aAAa,SAAS;KACpC,aAAa,aAAa,SAAS;KACnC,UAAU,aAAa,SAAS;KAChC,cAAc,aAAa,SAAS;KACpC,cAAc,aAAa,SAAS;KACpC,UAAU,aAAa,SAAS;KAChC,aAAa,KAAK,wCAAwC;KAC1D,OAAO,aAAa,SAAS;MAC5B;KACG;;GAEF"}
@@ -1,8 +1,8 @@
1
1
  import { AvatarStack } from "../components/avatar-stack.js";
2
2
  import { useSupportNavigation } from "../store/support-store.js";
3
+ import { CoButton } from "../components/button.js";
3
4
  import icons_default from "../components/icons.js";
4
5
  import { PENDING_CONVERSATION_ID } from "../../utils/id.js";
5
- import { CoButton } from "../components/button.js";
6
6
  import { Header } from "../components/header.js";
7
7
  import { Text, useSupportText } from "../text/index.js";
8
8
  import { Watermark } from "../components/watermark.js";
@@ -71,11 +71,13 @@ const HomePage = (_props = {}) => {
71
71
  },
72
72
  children: [/* @__PURE__ */ jsx(AvatarStack, {
73
73
  aiAgents: website?.availableAIAgents || [],
74
+ className: "mb-4",
75
+ hideDefaultAIAgent: false,
74
76
  humanAgents: availableHumanAgents,
75
77
  size: 44,
76
- spacing: 32
78
+ spacing: 42
77
79
  }), /* @__PURE__ */ jsx("h2", {
78
- className: "max-w-xs text-balance font-co-sans font-medium text-2xl text-co-primary leading-normal",
80
+ className: "max-w-xs text-balance font-co-sans font-medium text-2xl text-co-primary leading-normal tracking-wide",
79
81
  children: text("page.home.greeting", { visitorName: visitor?.contact?.name?.split(" ")[0] ?? void 0 })
80
82
  })]
81
83
  }), quickOptions.length > 0 && /* @__PURE__ */ jsx(motion.div, {
@@ -1 +1 @@
1
- {"version":3,"file":"home.js","names":["Icon"],"sources":["../../../src/support/pages/home.tsx"],"sourcesContent":["import { motion } from \"motion/react\";\nimport type { ReactElement } from \"react\";\nimport { useHomePage } from \"../../hooks/use-home-page\";\nimport { useSupport } from \"../../provider\";\nimport { PENDING_CONVERSATION_ID } from \"../../utils/id\";\nimport { AvatarStack } from \"../components/avatar-stack\";\nimport { CoButton } from \"../components/button\";\nimport { ConversationButtonLink } from \"../components/conversation-button-link\";\nimport { Header } from \"../components/header\";\nimport Icon from \"../components/icons\";\nimport { Watermark } from \"../components/watermark\";\nimport { useSupportNavigation } from \"../store/support-store\";\nimport { Text, useSupportText } from \"../text\";\n\ntype HomePageProps = {\n\tparams?: undefined;\n};\n\n/**\n * Home page with welcome message, quick options, and conversation starter.\n */\nexport const HomePage = (_props: HomePageProps = {}): ReactElement => {\n\tconst { website, availableHumanAgents, visitor, quickOptions } = useSupport();\n\tconst { navigate } = useSupportNavigation();\n\tconst text = useSupportText();\n\n\t// Main home page hook - handles all logic\n\tconst home = useHomePage({\n\t\tonStartConversation: (initialMessage) => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: {\n\t\t\t\t\tconversationId: PENDING_CONVERSATION_ID,\n\t\t\t\t\tinitialMessage,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tonOpenConversation: (conversationId) => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: {\n\t\t\t\t\tconversationId,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tonOpenConversationHistory: () => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION_HISTORY\",\n\t\t\t});\n\t\t},\n\t});\n\n\treturn (\n\t\t<>\n\t\t\t<Header>{/* <NavigationTab /> */}</Header>\n\t\t\t<div className=\"sticky top-0 flex flex-1 px-6\">\n\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\tclassName=\"flex flex-col gap-2\"\n\t\t\t\t\t\texit=\"exit\"\n\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\tdelay: 0.1,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tvariants={{\n\t\t\t\t\t\t\thidden: { opacity: 0, y: 20, filter: \"blur(12px)\" },\n\t\t\t\t\t\t\tvisible: { opacity: 1, y: 0, filter: \"blur(0px)\" },\n\t\t\t\t\t\t\texit: { opacity: 0, y: 20, filter: \"blur(12px)\" },\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<AvatarStack\n\t\t\t\t\t\t\taiAgents={website?.availableAIAgents || []}\n\t\t\t\t\t\t\thumanAgents={availableHumanAgents}\n\t\t\t\t\t\t\tsize={44}\n\t\t\t\t\t\t\tspacing={32}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<h2 className=\"max-w-xs text-balance font-co-sans font-medium text-2xl text-co-primary leading-normal\">\n\t\t\t\t\t\t\t{text(\"page.home.greeting\", {\n\t\t\t\t\t\t\t\tvisitorName: visitor?.contact?.name?.split(\" \")[0] ?? undefined,\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</h2>\n\t\t\t\t\t</motion.div>\n\n\t\t\t\t\t{quickOptions.length > 0 && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\tclassName=\"mt-6 space-x-2 space-y-2\"\n\t\t\t\t\t\t\texit=\"exit\"\n\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\tdelay: 0.1,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tvariants={{\n\t\t\t\t\t\t\t\thidden: { opacity: 0, y: 20, filter: \"blur(12px)\" },\n\t\t\t\t\t\t\t\tvisible: { opacity: 1, y: 0, filter: \"blur(0px)\" },\n\t\t\t\t\t\t\t\texit: { opacity: 0, y: 20, filter: \"blur(12px)\" },\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{quickOptions?.map((option) => (\n\t\t\t\t\t\t\t\t<CoButton\n\t\t\t\t\t\t\t\t\tclassName=\"inline-flex w-fit rounded-lg border-dashed px-2\"\n\t\t\t\t\t\t\t\t\tkey={option}\n\t\t\t\t\t\t\t\t\tonClick={() => home.startConversation(option)}\n\t\t\t\t\t\t\t\t\tsize=\"default\"\n\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{option}\n\t\t\t\t\t\t\t\t</CoButton>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-shrink-0 flex-col items-center justify-center gap-2 px-6 pb-4\">\n\t\t\t\t{home.availableConversationsCount > 0 && (\n\t\t\t\t\t<CoButton\n\t\t\t\t\t\tclassName=\"relative w-full text-co-primary/40 text-xs hover:text-co-primary\"\n\t\t\t\t\t\tonClick={home.openConversationHistory}\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\tas=\"span\"\n\t\t\t\t\t\t\ttextKey=\"page.home.history.more\"\n\t\t\t\t\t\t\tvariables={{ count: home.availableConversationsCount }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</CoButton>\n\t\t\t\t)}\n\n\t\t\t\t{home.lastOpenConversation && (\n\t\t\t\t\t<div className=\"flex w-full flex-col overflow-clip rounded-md border border-co-border/80\">\n\t\t\t\t\t\t<ConversationButtonLink\n\t\t\t\t\t\t\tclassName=\"rounded-none\"\n\t\t\t\t\t\t\tconversation={home.lastOpenConversation}\n\t\t\t\t\t\t\tkey={home.lastOpenConversation.id}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tif (home.lastOpenConversation) {\n\t\t\t\t\t\t\t\t\thome.openConversation(home.lastOpenConversation.id);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div className=\"sticky bottom-4 z-10 flex w-full flex-col items-center gap-2\">\n\t\t\t\t\t<CoButton\n\t\t\t\t\t\tclassName=\"relative w-full justify-between\"\n\t\t\t\t\t\tonClick={() => home.startConversation()}\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\tclassName=\"-translate-y-1/2 absolute top-1/2 right-4 size-3 text-co-primary/60 transition-transform duration-200 group-hover/btn:translate-x-0.5 group-hover/btn:text-co-primary\"\n\t\t\t\t\t\t\tname=\"arrow-right\"\n\t\t\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Text as=\"span\" textKey=\"common.actions.askQuestion\" />\n\t\t\t\t\t</CoButton>\n\t\t\t\t\t<Watermark className=\"mt-4 mb-0\" />\n\t\t\t\t</div>\n\t\t\t\t<div />\n\t\t\t</div>\n\t\t</>\n\t);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAqBA,MAAa,YAAY,SAAwB,EAAE,KAAmB;CACrE,MAAM,EAAE,SAAS,sBAAsB,SAAS,iBAAiB,YAAY;CAC7E,MAAM,EAAE,aAAa,sBAAsB;CAC3C,MAAM,OAAO,gBAAgB;CAG7B,MAAM,OAAO,YAAY;EACxB,sBAAsB,mBAAmB;AACxC,YAAS;IACR,MAAM;IACN,QAAQ;KACP,gBAAgB;KAChB;KACA;IACD,CAAC;;EAEH,qBAAqB,mBAAmB;AACvC,YAAS;IACR,MAAM;IACN,QAAQ,EACP,gBACA;IACD,CAAC;;EAEH,iCAAiC;AAChC,YAAS,EACR,MAAM,wBACN,CAAC;;EAEH,CAAC;AAEF,QACC;EACC,oBAAC,WAAyC;EAC1C,oBAAC;GAAI,WAAU;aACd,qBAAC;IAAI,WAAU;eACd,qBAAC,OAAO;KACP,SAAQ;KACR,WAAU;KACV,MAAK;KACL,SAAQ;KACR,YAAY,EACX,OAAO,IACP;KACD,UAAU;MACT,QAAQ;OAAE,SAAS;OAAG,GAAG;OAAI,QAAQ;OAAc;MACnD,SAAS;OAAE,SAAS;OAAG,GAAG;OAAG,QAAQ;OAAa;MAClD,MAAM;OAAE,SAAS;OAAG,GAAG;OAAI,QAAQ;OAAc;MACjD;gBAED,oBAAC;MACA,UAAU,SAAS,qBAAqB,EAAE;MAC1C,aAAa;MACb,MAAM;MACN,SAAS;OACR,EACF,oBAAC;MAAG,WAAU;gBACZ,KAAK,sBAAsB,EAC3B,aAAa,SAAS,SAAS,MAAM,MAAM,IAAI,CAAC,MAAM,QACtD,CAAC;OACE;MACO,EAEZ,aAAa,SAAS,KACtB,oBAAC,OAAO;KACP,SAAQ;KACR,WAAU;KACV,MAAK;KACL,SAAQ;KACR,YAAY,EACX,OAAO,IACP;KACD,UAAU;MACT,QAAQ;OAAE,SAAS;OAAG,GAAG;OAAI,QAAQ;OAAc;MACnD,SAAS;OAAE,SAAS;OAAG,GAAG;OAAG,QAAQ;OAAa;MAClD,MAAM;OAAE,SAAS;OAAG,GAAG;OAAI,QAAQ;OAAc;MACjD;eAEA,cAAc,KAAK,WACnB,oBAAC;MACA,WAAU;MAEV,eAAe,KAAK,kBAAkB,OAAO;MAC7C,MAAK;MACL,SAAQ;gBAEP;QALI,OAMK,CACV;MACU;KAET;IACD;EACN,qBAAC;GAAI,WAAU;;IACb,KAAK,8BAA8B,KACnC,oBAAC;KACA,WAAU;KACV,SAAS,KAAK;KACd,SAAQ;eAER,oBAAC;MACA,IAAG;MACH,SAAQ;MACR,WAAW,EAAE,OAAO,KAAK,6BAA6B;OACrD;MACQ;IAGX,KAAK,wBACL,oBAAC;KAAI,WAAU;eACd,oBAAC;MACA,WAAU;MACV,cAAc,KAAK;MAEnB,eAAe;AACd,WAAI,KAAK,qBACR,MAAK,iBAAiB,KAAK,qBAAqB,GAAG;;QAHhD,KAAK,qBAAqB,GAM9B;MACG;IAGP,qBAAC;KAAI,WAAU;gBACd,qBAAC;MACA,WAAU;MACV,eAAe,KAAK,mBAAmB;MACvC,MAAK;MACL,SAAQ;iBAER,oBAACA;OACA,WAAU;OACV,MAAK;OACL,SAAQ;QACP,EACF,oBAAC;OAAK,IAAG;OAAO,SAAQ;QAA+B;OAC7C,EACX,oBAAC,aAAU,WAAU,cAAc;MAC9B;IACN,oBAAC,UAAM;;IACF;KACJ"}
1
+ {"version":3,"file":"home.js","names":["Icon"],"sources":["../../../src/support/pages/home.tsx"],"sourcesContent":["import { motion } from \"motion/react\";\nimport type { ReactElement } from \"react\";\nimport { useHomePage } from \"../../hooks/use-home-page\";\nimport { useSupport } from \"../../provider\";\nimport { PENDING_CONVERSATION_ID } from \"../../utils/id\";\nimport { AvatarStack } from \"../components/avatar-stack\";\nimport { CoButton } from \"../components/button\";\nimport { ConversationButtonLink } from \"../components/conversation-button-link\";\nimport { Header } from \"../components/header\";\nimport Icon from \"../components/icons\";\nimport { Watermark } from \"../components/watermark\";\nimport { useSupportNavigation } from \"../store/support-store\";\nimport { Text, useSupportText } from \"../text\";\n\ntype HomePageProps = {\n\tparams?: undefined;\n};\n\n/**\n * Home page with welcome message, quick options, and conversation starter.\n */\nexport const HomePage = (_props: HomePageProps = {}): ReactElement => {\n\tconst { website, availableHumanAgents, visitor, quickOptions } = useSupport();\n\tconst { navigate } = useSupportNavigation();\n\tconst text = useSupportText();\n\n\t// Main home page hook - handles all logic\n\tconst home = useHomePage({\n\t\tonStartConversation: (initialMessage) => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: {\n\t\t\t\t\tconversationId: PENDING_CONVERSATION_ID,\n\t\t\t\t\tinitialMessage,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tonOpenConversation: (conversationId) => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION\",\n\t\t\t\tparams: {\n\t\t\t\t\tconversationId,\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tonOpenConversationHistory: () => {\n\t\t\tnavigate({\n\t\t\t\tpage: \"CONVERSATION_HISTORY\",\n\t\t\t});\n\t\t},\n\t});\n\n\treturn (\n\t\t<>\n\t\t\t<Header>{/* <NavigationTab /> */}</Header>\n\t\t\t<div className=\"sticky top-0 flex flex-1 px-6\">\n\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t<motion.div\n\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\tclassName=\"flex flex-col gap-2\"\n\t\t\t\t\t\texit=\"exit\"\n\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\tdelay: 0.1,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tvariants={{\n\t\t\t\t\t\t\thidden: { opacity: 0, y: 20, filter: \"blur(12px)\" },\n\t\t\t\t\t\t\tvisible: { opacity: 1, y: 0, filter: \"blur(0px)\" },\n\t\t\t\t\t\t\texit: { opacity: 0, y: 20, filter: \"blur(12px)\" },\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<AvatarStack\n\t\t\t\t\t\t\taiAgents={website?.availableAIAgents || []}\n\t\t\t\t\t\t\tclassName=\"mb-4\"\n\t\t\t\t\t\t\thideDefaultAIAgent={false}\n\t\t\t\t\t\t\thumanAgents={availableHumanAgents}\n\t\t\t\t\t\t\tsize={44}\n\t\t\t\t\t\t\tspacing={42}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<h2 className=\"max-w-xs text-balance font-co-sans font-medium text-2xl text-co-primary leading-normal tracking-wide\">\n\t\t\t\t\t\t\t{text(\"page.home.greeting\", {\n\t\t\t\t\t\t\t\tvisitorName: visitor?.contact?.name?.split(\" \")[0] ?? undefined,\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</h2>\n\t\t\t\t\t</motion.div>\n\n\t\t\t\t\t{quickOptions.length > 0 && (\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tanimate=\"visible\"\n\t\t\t\t\t\t\tclassName=\"mt-6 space-x-2 space-y-2\"\n\t\t\t\t\t\t\texit=\"exit\"\n\t\t\t\t\t\t\tinitial=\"hidden\"\n\t\t\t\t\t\t\ttransition={{\n\t\t\t\t\t\t\t\tdelay: 0.1,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tvariants={{\n\t\t\t\t\t\t\t\thidden: { opacity: 0, y: 20, filter: \"blur(12px)\" },\n\t\t\t\t\t\t\t\tvisible: { opacity: 1, y: 0, filter: \"blur(0px)\" },\n\t\t\t\t\t\t\t\texit: { opacity: 0, y: 20, filter: \"blur(12px)\" },\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{quickOptions?.map((option) => (\n\t\t\t\t\t\t\t\t<CoButton\n\t\t\t\t\t\t\t\t\tclassName=\"inline-flex w-fit rounded-lg border-dashed px-2\"\n\t\t\t\t\t\t\t\t\tkey={option}\n\t\t\t\t\t\t\t\t\tonClick={() => home.startConversation(option)}\n\t\t\t\t\t\t\t\t\tsize=\"default\"\n\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{option}\n\t\t\t\t\t\t\t\t</CoButton>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-shrink-0 flex-col items-center justify-center gap-2 px-6 pb-4\">\n\t\t\t\t{home.availableConversationsCount > 0 && (\n\t\t\t\t\t<CoButton\n\t\t\t\t\t\tclassName=\"relative w-full text-co-primary/40 text-xs hover:text-co-primary\"\n\t\t\t\t\t\tonClick={home.openConversationHistory}\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Text\n\t\t\t\t\t\t\tas=\"span\"\n\t\t\t\t\t\t\ttextKey=\"page.home.history.more\"\n\t\t\t\t\t\t\tvariables={{ count: home.availableConversationsCount }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</CoButton>\n\t\t\t\t)}\n\n\t\t\t\t{home.lastOpenConversation && (\n\t\t\t\t\t<div className=\"flex w-full flex-col overflow-clip rounded-md border border-co-border/80\">\n\t\t\t\t\t\t<ConversationButtonLink\n\t\t\t\t\t\t\tclassName=\"rounded-none\"\n\t\t\t\t\t\t\tconversation={home.lastOpenConversation}\n\t\t\t\t\t\t\tkey={home.lastOpenConversation.id}\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tif (home.lastOpenConversation) {\n\t\t\t\t\t\t\t\t\thome.openConversation(home.lastOpenConversation.id);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<div className=\"sticky bottom-4 z-10 flex w-full flex-col items-center gap-2\">\n\t\t\t\t\t<CoButton\n\t\t\t\t\t\tclassName=\"relative w-full justify-between\"\n\t\t\t\t\t\tonClick={() => home.startConversation()}\n\t\t\t\t\t\tsize=\"large\"\n\t\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon\n\t\t\t\t\t\t\tclassName=\"-translate-y-1/2 absolute top-1/2 right-4 size-3 text-co-primary/60 transition-transform duration-200 group-hover/btn:translate-x-0.5 group-hover/btn:text-co-primary\"\n\t\t\t\t\t\t\tname=\"arrow-right\"\n\t\t\t\t\t\t\tvariant=\"default\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Text as=\"span\" textKey=\"common.actions.askQuestion\" />\n\t\t\t\t\t</CoButton>\n\t\t\t\t\t<Watermark className=\"mt-4 mb-0\" />\n\t\t\t\t</div>\n\t\t\t\t<div />\n\t\t\t</div>\n\t\t</>\n\t);\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAqBA,MAAa,YAAY,SAAwB,EAAE,KAAmB;CACrE,MAAM,EAAE,SAAS,sBAAsB,SAAS,iBAAiB,YAAY;CAC7E,MAAM,EAAE,aAAa,sBAAsB;CAC3C,MAAM,OAAO,gBAAgB;CAG7B,MAAM,OAAO,YAAY;EACxB,sBAAsB,mBAAmB;AACxC,YAAS;IACR,MAAM;IACN,QAAQ;KACP,gBAAgB;KAChB;KACA;IACD,CAAC;;EAEH,qBAAqB,mBAAmB;AACvC,YAAS;IACR,MAAM;IACN,QAAQ,EACP,gBACA;IACD,CAAC;;EAEH,iCAAiC;AAChC,YAAS,EACR,MAAM,wBACN,CAAC;;EAEH,CAAC;AAEF,QACC;EACC,oBAAC,WAAyC;EAC1C,oBAAC;GAAI,WAAU;aACd,qBAAC;IAAI,WAAU;eACd,qBAAC,OAAO;KACP,SAAQ;KACR,WAAU;KACV,MAAK;KACL,SAAQ;KACR,YAAY,EACX,OAAO,IACP;KACD,UAAU;MACT,QAAQ;OAAE,SAAS;OAAG,GAAG;OAAI,QAAQ;OAAc;MACnD,SAAS;OAAE,SAAS;OAAG,GAAG;OAAG,QAAQ;OAAa;MAClD,MAAM;OAAE,SAAS;OAAG,GAAG;OAAI,QAAQ;OAAc;MACjD;gBAED,oBAAC;MACA,UAAU,SAAS,qBAAqB,EAAE;MAC1C,WAAU;MACV,oBAAoB;MACpB,aAAa;MACb,MAAM;MACN,SAAS;OACR,EACF,oBAAC;MAAG,WAAU;gBACZ,KAAK,sBAAsB,EAC3B,aAAa,SAAS,SAAS,MAAM,MAAM,IAAI,CAAC,MAAM,QACtD,CAAC;OACE;MACO,EAEZ,aAAa,SAAS,KACtB,oBAAC,OAAO;KACP,SAAQ;KACR,WAAU;KACV,MAAK;KACL,SAAQ;KACR,YAAY,EACX,OAAO,IACP;KACD,UAAU;MACT,QAAQ;OAAE,SAAS;OAAG,GAAG;OAAI,QAAQ;OAAc;MACnD,SAAS;OAAE,SAAS;OAAG,GAAG;OAAG,QAAQ;OAAa;MAClD,MAAM;OAAE,SAAS;OAAG,GAAG;OAAI,QAAQ;OAAc;MACjD;eAEA,cAAc,KAAK,WACnB,oBAAC;MACA,WAAU;MAEV,eAAe,KAAK,kBAAkB,OAAO;MAC7C,MAAK;MACL,SAAQ;gBAEP;QALI,OAMK,CACV;MACU;KAET;IACD;EACN,qBAAC;GAAI,WAAU;;IACb,KAAK,8BAA8B,KACnC,oBAAC;KACA,WAAU;KACV,SAAS,KAAK;KACd,SAAQ;eAER,oBAAC;MACA,IAAG;MACH,SAAQ;MACR,WAAW,EAAE,OAAO,KAAK,6BAA6B;OACrD;MACQ;IAGX,KAAK,wBACL,oBAAC;KAAI,WAAU;eACd,oBAAC;MACA,WAAU;MACV,cAAc,KAAK;MAEnB,eAAe;AACd,WAAI,KAAK,qBACR,MAAK,iBAAiB,KAAK,qBAAqB,GAAG;;QAHhD,KAAK,qBAAqB,GAM9B;MACG;IAGP,qBAAC;KAAI,WAAU;gBACd,qBAAC;MACA,WAAU;MACV,eAAe,KAAK,mBAAmB;MACvC,MAAK;MACL,SAAQ;iBAER,oBAACA;OACA,WAAU;OACV,MAAK;OACL,SAAQ;QACP,EACF,oBAAC;OAAK,IAAG;OAAO,SAAQ;QAA+B;OAC7C,EACX,oBAAC,aAAU,WAAU,cAAc;MAC9B;IACN,oBAAC,UAAM;;IACF;KACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","names":[],"sources":["../../src/support/router.tsx"],"sourcesContent":[],"mappings":";;;;;;;AAaA;AAAuC,KAA3B,UAA2B,CAAA,UAAA,MAAA,aAAA,GAAA,MAAsB,aAAtB,CAAA,GAAA;EAAsB,IAAA,EACtD,CADsD;EACtD,SAAA,EACK,OAAA,CAAM,aADX,CAAA;IACoC,MAAA,CAAA,EAAA,aAAA,CAAc,CAAd,CAAA;EAAc,CAAA,CAAA;CAA7C;AAAmB,KAGnB,WAAA,GAHmB;EAGnB;AAsEZ;AAmCA;EAAsC,WAAA,CAAA,EArGvB,UAqGuB,EAAA;EAAsB;;;EAQH,QAAA,CAAA,EAzG7C,OAAA,CAAM,SAyGuC;CAA7C;;AAYZ;;;;;;;;;;;;;;;;;;cAvDa,QAAQ,OAAA,CAAM,GAAG;KAmClB,0BAA0B,sBAAsB;;;;QAIrD;;;;aAIK,OAAA,CAAM;aAAyB,cAAc;;;;;;;;;;;;cAY5C,uBAAwB,uBAAuB,UAAU"}
1
+ {"version":3,"file":"router.d.ts","names":[],"sources":["../../src/support/router.tsx"],"sourcesContent":[],"mappings":";;;;;;;AAeA;AAAuC,KAA3B,UAA2B,CAAA,UAAA,MAAA,aAAA,GAAA,MAAsB,aAAtB,CAAA,GAAA;EAAsB,IAAA,EACtD,CADsD;EACtD,SAAA,EACK,OAAA,CAAM,aADX,CAAA;IACoC,MAAA,CAAA,EAAA,aAAA,CAAc,CAAd,CAAA;EAAc,CAAA,CAAA;CAA7C;AAAmB,KAGnB,WAAA,GAHmB;EAGnB;AAsEZ;AAyCA;EAAsC,WAAA,CAAA,EA3GvB,UA2GuB,EAAA;EAAsB;;;EAQH,QAAA,CAAA,EA/G7C,OAAA,CAAM,SA+GuC;CAA7C;;AAYZ;;;;;;;;;;;;;;;;;;cA7Da,QAAQ,OAAA,CAAM,GAAG;KAyClB,0BAA0B,sBAAsB;;;;QAIrD;;;;aAIK,OAAA,CAAM;aAAyB,cAAc;;;;;;;;;;;;cAY5C,uBAAwB,uBAAuB,UAAU"}
package/support/router.js CHANGED
@@ -1,9 +1,11 @@
1
1
  import { Router as Router$1 } from "../primitives/router.js";
2
2
  import { useSupportNavigation } from "./store/support-store.js";
3
+ import { ConfigurationErrorDisplay } from "./components/configuration-error.js";
3
4
  import { ArticlesPage } from "./pages/articles.js";
4
5
  import { ConversationPage } from "./pages/conversation.js";
5
6
  import { ConversationHistoryPage } from "./pages/conversation-history.js";
6
7
  import { HomePage } from "./pages/home.js";
8
+ import { useSupport } from "../provider.js";
7
9
  import * as React$1 from "react";
8
10
  import { jsx } from "react/jsx-runtime";
9
11
 
@@ -68,12 +70,14 @@ function extractPagesFromChildren(children) {
68
70
  */
69
71
  const Router = ({ customPages = [], children }) => {
70
72
  const { current } = useSupportNavigation();
73
+ const { configurationError } = useSupport();
71
74
  const extractedPages = React$1.useMemo(() => extractPagesFromChildren(children), [children]);
72
75
  const allPages = React$1.useMemo(() => [
73
76
  ...builtInPages,
74
77
  ...customPages,
75
78
  ...extractedPages
76
79
  ], [customPages, extractedPages]);
80
+ if (configurationError) return /* @__PURE__ */ jsx(ConfigurationErrorDisplay, { error: configurationError });
77
81
  return /* @__PURE__ */ jsx(Router$1, {
78
82
  fallback: HomePage,
79
83
  page: current.page,
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","names":["pages: CustomPage[]","React","Router: React.FC<RouterProps>","Primitive.Router"],"sources":["../../src/support/router.tsx"],"sourcesContent":["import type { RouteRegistry } from \"@cossistant/core\";\nimport * as React from \"react\";\nimport type { PageDefinition } from \"../primitives\";\nimport * as Primitive from \"../primitives\";\nimport { ArticlesPage } from \"./pages/articles\";\nimport { ConversationPage } from \"./pages/conversation\";\nimport { ConversationHistoryPage } from \"./pages/conversation-history\";\nimport { HomePage } from \"./pages/home\";\nimport { useSupportNavigation } from \"./store/support-store\";\n\n/**\n * Type for custom pages that ensures they match RouteRegistry.\n */\nexport type CustomPage<K extends keyof RouteRegistry = keyof RouteRegistry> = {\n\tname: K;\n\tcomponent: React.ComponentType<{ params?: RouteRegistry[K] }>;\n};\n\nexport type RouterProps = {\n\t/**\n\t * Custom pages to add alongside the built-in pages.\n\t */\n\tcustomPages?: CustomPage[];\n\t/**\n\t * Children can include <Support.Page /> components.\n\t */\n\tchildren?: React.ReactNode;\n};\n\n/**\n * Built-in pages that are always available.\n * Type assertion is needed because each page component has different param types,\n * but they all satisfy the PageDefinition interface.\n */\nconst builtInPages = [\n\t{ name: \"HOME\", component: HomePage },\n\t{ name: \"ARTICLES\", component: ArticlesPage },\n\t{ name: \"CONVERSATION\", component: ConversationPage },\n\t{ name: \"CONVERSATION_HISTORY\", component: ConversationHistoryPage },\n] as PageDefinition[];\n\n/**\n * Extract page definitions from Support.Page children.\n * This allows declarative page registration via JSX.\n */\nfunction extractPagesFromChildren(children: React.ReactNode): CustomPage[] {\n\tconst pages: CustomPage[] = [];\n\n\tReact.Children.forEach(children, (child) => {\n\t\tif (!React.isValidElement(child)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if this is a Page component by looking for name and component props\n\t\tconst props = child.props as {\n\t\t\tname?: string;\n\t\t\tcomponent?: React.ComponentType;\n\t\t};\n\t\tif (props.name && props.component) {\n\t\t\tpages.push({\n\t\t\t\tname: props.name as keyof RouteRegistry,\n\t\t\t\tcomponent: props.component,\n\t\t\t});\n\t\t}\n\t});\n\n\treturn pages;\n}\n\n/**\n * Router with default support pages (HOME, ARTICLES, CONVERSATION, CONVERSATION_HISTORY).\n * Add custom pages via the customPages prop or as children.\n *\n * @example\n * // Default pages only\n * <Support.Router />\n *\n * @example\n * // With custom pages via prop\n * <Support.Router customPages={[{ name: \"FAQ\", component: FAQPage }]} />\n *\n * @example\n * // With custom pages as children\n * <Support.Router>\n * <Support.Page name=\"FAQ\" component={FAQPage} />\n * <Support.Page name=\"SETTINGS\" component={SettingsPage} />\n * </Support.Router>\n */\nexport const Router: React.FC<RouterProps> = ({\n\tcustomPages = [],\n\tchildren,\n}) => {\n\tconst { current } = useSupportNavigation();\n\n\t// Extract pages from JSX children (Support.Page components)\n\tconst extractedPages = React.useMemo(\n\t\t() => extractPagesFromChildren(children),\n\t\t[children]\n\t);\n\n\t// Merge built-in pages, prop-based custom pages, and JSX-declared pages\n\tconst allPages = React.useMemo(\n\t\t() =>\n\t\t\t[...builtInPages, ...customPages, ...extractedPages] as PageDefinition<\n\t\t\t\tkeyof RouteRegistry\n\t\t\t>[],\n\t\t[customPages, extractedPages]\n\t);\n\n\treturn (\n\t\t<Primitive.Router\n\t\t\tfallback={HomePage as React.ComponentType<{ params?: unknown }>}\n\t\t\tpage={current.page}\n\t\t\tpages={allPages}\n\t\t\tparams={current.params}\n\t\t/>\n\t);\n};\n\n// =============================================================================\n// Page Component\n// =============================================================================\n\nexport type PageProps<K extends keyof RouteRegistry = keyof RouteRegistry> = {\n\t/**\n\t * The route name for this page.\n\t */\n\tname: K;\n\t/**\n\t * The component to render for this page.\n\t */\n\tcomponent: React.ComponentType<{ params?: RouteRegistry[K] }>;\n};\n\n/**\n * Declarative way to register custom pages.\n * This component is collected by the Router and doesn't render anything itself.\n *\n * @example\n * <Support.Router>\n * <Support.Page name=\"FAQ\" component={FAQPage} />\n * </Support.Router>\n */\nexport const Page = <K extends keyof RouteRegistry>(_props: PageProps<K>) => {\n\t// This component is declarative and doesn't render anything.\n\t// The Router collects Page children and uses them for routing.\n\treturn null;\n};\n"],"mappings":";;;;;;;;;;;;;;;AAkCA,MAAM,eAAe;CACpB;EAAE,MAAM;EAAQ,WAAW;EAAU;CACrC;EAAE,MAAM;EAAY,WAAW;EAAc;CAC7C;EAAE,MAAM;EAAgB,WAAW;EAAkB;CACrD;EAAE,MAAM;EAAwB,WAAW;EAAyB;CACpE;;;;;AAMD,SAAS,yBAAyB,UAAyC;CAC1E,MAAMA,QAAsB,EAAE;AAE9B,SAAM,SAAS,QAAQ,WAAW,UAAU;AAC3C,MAAI,CAACC,QAAM,eAAe,MAAM,CAC/B;EAID,MAAM,QAAQ,MAAM;AAIpB,MAAI,MAAM,QAAQ,MAAM,UACvB,OAAM,KAAK;GACV,MAAM,MAAM;GACZ,WAAW,MAAM;GACjB,CAAC;GAEF;AAEF,QAAO;;;;;;;;;;;;;;;;;;;;;AAsBR,MAAaC,UAAiC,EAC7C,cAAc,EAAE,EAChB,eACK;CACL,MAAM,EAAE,YAAY,sBAAsB;CAG1C,MAAM,iBAAiBD,QAAM,cACtB,yBAAyB,SAAS,EACxC,CAAC,SAAS,CACV;CAGD,MAAM,WAAWA,QAAM,cAErB;EAAC,GAAG;EAAc,GAAG;EAAa,GAAG;EAAe,EAGrD,CAAC,aAAa,eAAe,CAC7B;AAED,QACC,oBAACE;EACA,UAAU;EACV,MAAM,QAAQ;EACd,OAAO;EACP,QAAQ,QAAQ;GACf;;;;;;;;;;;AA4BJ,MAAa,QAAuC,WAAyB;AAG5E,QAAO"}
1
+ {"version":3,"file":"router.js","names":["pages: CustomPage[]","React","Router: React.FC<RouterProps>","Primitive.Router"],"sources":["../../src/support/router.tsx"],"sourcesContent":["import type { RouteRegistry } from \"@cossistant/core\";\nimport * as React from \"react\";\nimport type { PageDefinition } from \"../primitives\";\nimport * as Primitive from \"../primitives\";\nimport { useSupport } from \"../provider\";\nimport { ConfigurationErrorDisplay } from \"./components/configuration-error\";\nimport { ArticlesPage } from \"./pages/articles\";\nimport { ConversationPage } from \"./pages/conversation\";\nimport { ConversationHistoryPage } from \"./pages/conversation-history\";\nimport { HomePage } from \"./pages/home\";\nimport { useSupportNavigation } from \"./store/support-store\";\n\n/**\n * Type for custom pages that ensures they match RouteRegistry.\n */\nexport type CustomPage<K extends keyof RouteRegistry = keyof RouteRegistry> = {\n\tname: K;\n\tcomponent: React.ComponentType<{ params?: RouteRegistry[K] }>;\n};\n\nexport type RouterProps = {\n\t/**\n\t * Custom pages to add alongside the built-in pages.\n\t */\n\tcustomPages?: CustomPage[];\n\t/**\n\t * Children can include <Support.Page /> components.\n\t */\n\tchildren?: React.ReactNode;\n};\n\n/**\n * Built-in pages that are always available.\n * Type assertion is needed because each page component has different param types,\n * but they all satisfy the PageDefinition interface.\n */\nconst builtInPages = [\n\t{ name: \"HOME\", component: HomePage },\n\t{ name: \"ARTICLES\", component: ArticlesPage },\n\t{ name: \"CONVERSATION\", component: ConversationPage },\n\t{ name: \"CONVERSATION_HISTORY\", component: ConversationHistoryPage },\n] as PageDefinition[];\n\n/**\n * Extract page definitions from Support.Page children.\n * This allows declarative page registration via JSX.\n */\nfunction extractPagesFromChildren(children: React.ReactNode): CustomPage[] {\n\tconst pages: CustomPage[] = [];\n\n\tReact.Children.forEach(children, (child) => {\n\t\tif (!React.isValidElement(child)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if this is a Page component by looking for name and component props\n\t\tconst props = child.props as {\n\t\t\tname?: string;\n\t\t\tcomponent?: React.ComponentType;\n\t\t};\n\t\tif (props.name && props.component) {\n\t\t\tpages.push({\n\t\t\t\tname: props.name as keyof RouteRegistry,\n\t\t\t\tcomponent: props.component,\n\t\t\t});\n\t\t}\n\t});\n\n\treturn pages;\n}\n\n/**\n * Router with default support pages (HOME, ARTICLES, CONVERSATION, CONVERSATION_HISTORY).\n * Add custom pages via the customPages prop or as children.\n *\n * @example\n * // Default pages only\n * <Support.Router />\n *\n * @example\n * // With custom pages via prop\n * <Support.Router customPages={[{ name: \"FAQ\", component: FAQPage }]} />\n *\n * @example\n * // With custom pages as children\n * <Support.Router>\n * <Support.Page name=\"FAQ\" component={FAQPage} />\n * <Support.Page name=\"SETTINGS\" component={SettingsPage} />\n * </Support.Router>\n */\nexport const Router: React.FC<RouterProps> = ({\n\tcustomPages = [],\n\tchildren,\n}) => {\n\tconst { current } = useSupportNavigation();\n\tconst { configurationError } = useSupport();\n\n\t// Extract pages from JSX children (Support.Page components)\n\tconst extractedPages = React.useMemo(\n\t\t() => extractPagesFromChildren(children),\n\t\t[children]\n\t);\n\n\t// Merge built-in pages, prop-based custom pages, and JSX-declared pages\n\tconst allPages = React.useMemo(\n\t\t() =>\n\t\t\t[...builtInPages, ...customPages, ...extractedPages] as PageDefinition<\n\t\t\t\tkeyof RouteRegistry\n\t\t\t>[],\n\t\t[customPages, extractedPages]\n\t);\n\n\t// Show configuration error when API key is missing/invalid\n\tif (configurationError) {\n\t\treturn <ConfigurationErrorDisplay error={configurationError} />;\n\t}\n\n\treturn (\n\t\t<Primitive.Router\n\t\t\tfallback={HomePage as React.ComponentType<{ params?: unknown }>}\n\t\t\tpage={current.page}\n\t\t\tpages={allPages}\n\t\t\tparams={current.params}\n\t\t/>\n\t);\n};\n\n// =============================================================================\n// Page Component\n// =============================================================================\n\nexport type PageProps<K extends keyof RouteRegistry = keyof RouteRegistry> = {\n\t/**\n\t * The route name for this page.\n\t */\n\tname: K;\n\t/**\n\t * The component to render for this page.\n\t */\n\tcomponent: React.ComponentType<{ params?: RouteRegistry[K] }>;\n};\n\n/**\n * Declarative way to register custom pages.\n * This component is collected by the Router and doesn't render anything itself.\n *\n * @example\n * <Support.Router>\n * <Support.Page name=\"FAQ\" component={FAQPage} />\n * </Support.Router>\n */\nexport const Page = <K extends keyof RouteRegistry>(_props: PageProps<K>) => {\n\t// This component is declarative and doesn't render anything.\n\t// The Router collects Page children and uses them for routing.\n\treturn null;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;AAoCA,MAAM,eAAe;CACpB;EAAE,MAAM;EAAQ,WAAW;EAAU;CACrC;EAAE,MAAM;EAAY,WAAW;EAAc;CAC7C;EAAE,MAAM;EAAgB,WAAW;EAAkB;CACrD;EAAE,MAAM;EAAwB,WAAW;EAAyB;CACpE;;;;;AAMD,SAAS,yBAAyB,UAAyC;CAC1E,MAAMA,QAAsB,EAAE;AAE9B,SAAM,SAAS,QAAQ,WAAW,UAAU;AAC3C,MAAI,CAACC,QAAM,eAAe,MAAM,CAC/B;EAID,MAAM,QAAQ,MAAM;AAIpB,MAAI,MAAM,QAAQ,MAAM,UACvB,OAAM,KAAK;GACV,MAAM,MAAM;GACZ,WAAW,MAAM;GACjB,CAAC;GAEF;AAEF,QAAO;;;;;;;;;;;;;;;;;;;;;AAsBR,MAAaC,UAAiC,EAC7C,cAAc,EAAE,EAChB,eACK;CACL,MAAM,EAAE,YAAY,sBAAsB;CAC1C,MAAM,EAAE,uBAAuB,YAAY;CAG3C,MAAM,iBAAiBD,QAAM,cACtB,yBAAyB,SAAS,EACxC,CAAC,SAAS,CACV;CAGD,MAAM,WAAWA,QAAM,cAErB;EAAC,GAAG;EAAc,GAAG;EAAa,GAAG;EAAe,EAGrD,CAAC,aAAa,eAAe,CAC7B;AAGD,KAAI,mBACH,QAAO,oBAAC,6BAA0B,OAAO,qBAAsB;AAGhE,QACC,oBAACE;EACA,UAAU;EACV,MAAM,QAAQ;EACd,OAAO;EACP,QAAQ,QAAQ;GACf;;;;;;;;;;;AA4BJ,MAAa,QAAuC,WAAyB;AAG5E,QAAO"}
@@ -1,6 +1,5 @@
1
1
  "use client";
2
2
 
3
-
4
3
  import { useControlledState } from "../context/controlled-state.js";
5
4
  import { useCallback, useMemo, useRef, useSyncExternalStore } from "react";
6
5
  import { createSupportStore } from "@cossistant/core";
@@ -1 +1 @@
1
- {"version":3,"file":"support-store.js","names":["patch: Partial<SupportConfig>"],"sources":["../../../src/support/store/support-store.ts"],"sourcesContent":["\"use client\";\n\nimport {\n\tcreateSupportStore,\n\ttype SupportConfig,\n\ttype SupportStore,\n\ttype SupportStoreState,\n} from \"@cossistant/core\";\nimport { useCallback, useMemo, useRef, useSyncExternalStore } from \"react\";\nimport { useControlledState } from \"../context/controlled-state\";\n\nconst storage = typeof window !== \"undefined\" ? window.localStorage : undefined;\nconst store = createSupportStore({ storage });\n\ntype Selector<T> = (state: SupportStoreState) => T;\n\ntype EqualityChecker<T> = (previous: T, next: T) => boolean;\n\nfunction useSelector<TSelected>(\n\tselector: Selector<TSelected>,\n\tisEqual: EqualityChecker<TSelected> = Object.is\n): TSelected {\n\tconst selectionRef = useRef<TSelected>(undefined);\n\n\tconst subscribe = (onStoreChange: () => void) =>\n\t\tstore.subscribe(() => {\n\t\t\tonStoreChange();\n\t\t});\n\n\tconst snapshot = useSyncExternalStore(\n\t\tsubscribe,\n\t\tstore.getState,\n\t\tstore.getState\n\t);\n\n\tconst selected = selector(snapshot);\n\n\tif (\n\t\tselectionRef.current === undefined ||\n\t\t!isEqual(selectionRef.current, selected)\n\t) {\n\t\tselectionRef.current = selected;\n\t}\n\n\treturn selectionRef.current as TSelected;\n}\n\nexport type UseSupportStoreResult = SupportStoreState &\n\tPick<\n\t\tSupportStore,\n\t\t| \"navigate\"\n\t\t| \"replace\"\n\t\t| \"goBack\"\n\t\t| \"open\"\n\t\t| \"close\"\n\t\t| \"toggle\"\n\t\t| \"updateConfig\"\n\t\t| \"reset\"\n\t>;\n\n/**\n * Access the support widget store state and actions.\n *\n * @example\n * const { isOpen, navigate, toggle } = useSupportStore();\n */\nexport function useSupportStore(): UseSupportStoreResult {\n\tconst state = useSelector((current) => current);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\t...state,\n\t\t\tnavigate: store.navigate,\n\t\t\treplace: store.replace,\n\t\t\tgoBack: store.goBack,\n\t\t\topen: store.open,\n\t\t\tclose: store.close,\n\t\t\ttoggle: store.toggle,\n\t\t\tupdateConfig: store.updateConfig,\n\t\t\treset: store.reset,\n\t\t}),\n\t\t[state]\n\t);\n}\n\nexport type UseSupportConfigResult = {\n\tisOpen: boolean;\n\tsize: SupportConfig[\"size\"];\n\topen: () => void;\n\tclose: () => void;\n\ttoggle: () => void;\n};\n\n/**\n * Access widget configuration (isOpen, size) and toggle helpers.\n * Supports both controlled and uncontrolled modes.\n *\n * In controlled mode (when `open` prop is provided to Support),\n * the `isOpen` state is driven by the prop, and `open`/`close`/`toggle`\n * will call `onOpenChange` instead of updating internal state.\n *\n * @example\n * // Uncontrolled (internal state)\n * const { isOpen, open, close, toggle } = useSupportConfig();\n *\n * @example\n * // Controlled (external state via Support props)\n * <Support open={isOpen} onOpenChange={setIsOpen}>\n * <MyComponent />\n * </Support>\n */\nexport const useSupportConfig = (): UseSupportConfigResult => {\n\tconst config = useSelector((state) => state.config);\n\tconst controlledState = useControlledState();\n\n\t// Determine if we're in controlled mode\n\tconst isControlled = controlledState?.isControlled ?? false;\n\tconst controlledOpen = controlledState?.open;\n\tconst onOpenChange = controlledState?.onOpenChange;\n\n\t// Use controlled state if available, otherwise use store state\n\tconst isOpen = isControlled ? (controlledOpen ?? false) : config.isOpen;\n\n\t// Create wrapped actions that respect controlled mode\n\tconst open = useCallback(() => {\n\t\tif (isControlled && onOpenChange) {\n\t\t\tonOpenChange(true);\n\t\t} else {\n\t\t\tstore.open();\n\t\t}\n\t}, [isControlled, onOpenChange]);\n\n\tconst close = useCallback(() => {\n\t\tif (isControlled && onOpenChange) {\n\t\t\tonOpenChange(false);\n\t\t} else {\n\t\t\tstore.close();\n\t\t}\n\t}, [isControlled, onOpenChange]);\n\n\tconst toggle = useCallback(() => {\n\t\tif (isControlled && onOpenChange) {\n\t\t\tonOpenChange(!controlledOpen);\n\t\t} else {\n\t\t\tstore.toggle();\n\t\t}\n\t}, [isControlled, onOpenChange, controlledOpen]);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\tisOpen,\n\t\t\tsize: config.size,\n\t\t\topen,\n\t\t\tclose,\n\t\t\ttoggle,\n\t\t}),\n\t\t[isOpen, config.size, open, close, toggle]\n\t);\n};\n\n/**\n * Access navigation state and routing methods.\n *\n * @example\n * const { navigate, goBack, page, params } = useSupportNavigation();\n */\nexport const useSupportNavigation = () => {\n\tconst navigation = useSelector((state) => state.navigation);\n\tconst { current, previousPages } = navigation;\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\tcurrent,\n\t\t\tpage: current.page,\n\t\t\tparams: current.params,\n\t\t\tpreviousPages,\n\t\t\tnavigate: store.navigate,\n\t\t\treplace: store.replace,\n\t\t\tgoBack: store.goBack,\n\t\t\tcanGoBack: previousPages.length > 0,\n\t\t}),\n\t\t[current, previousPages]\n\t);\n};\n\n/**\n * Initialize store with default configuration (used internally by Support component).\n */\nexport const initializeSupportStore = (props: {\n\tsize?: SupportConfig[\"size\"];\n\tdefaultOpen?: boolean;\n}) => {\n\tconst patch: Partial<SupportConfig> = {};\n\n\tif (props.size !== undefined) {\n\t\tpatch.size = props.size;\n\t}\n\n\tif (props.defaultOpen !== undefined) {\n\t\tpatch.isOpen = props.defaultOpen;\n\t}\n\n\tif (Object.keys(patch).length > 0) {\n\t\tstore.updateConfig(patch);\n\t}\n};\n"],"mappings":";;;;;;;;AAYA,MAAM,QAAQ,mBAAmB,EAAE,SADnB,OAAO,WAAW,cAAc,OAAO,eAAe,QAC1B,CAAC;AAM7C,SAAS,YACR,UACA,UAAsC,OAAO,IACjC;CACZ,MAAM,eAAe,OAAkB,OAAU;CAEjD,MAAM,aAAa,kBAClB,MAAM,gBAAgB;AACrB,iBAAe;GACd;CAQH,MAAM,WAAW,SANA,qBAChB,WACA,MAAM,UACN,MAAM,SACN,CAEkC;AAEnC,KACC,aAAa,YAAY,UACzB,CAAC,QAAQ,aAAa,SAAS,SAAS,CAExC,cAAa,UAAU;AAGxB,QAAO,aAAa;;;;;;;;AAsBrB,SAAgB,kBAAyC;CACxD,MAAM,QAAQ,aAAa,YAAY,QAAQ;AAE/C,QAAO,eACC;EACN,GAAG;EACH,UAAU,MAAM;EAChB,SAAS,MAAM;EACf,QAAQ,MAAM;EACd,MAAM,MAAM;EACZ,OAAO,MAAM;EACb,QAAQ,MAAM;EACd,cAAc,MAAM;EACpB,OAAO,MAAM;EACb,GACD,CAAC,MAAM,CACP;;;;;;;;;;;;;;;;;;;;AA6BF,MAAa,yBAAiD;CAC7D,MAAM,SAAS,aAAa,UAAU,MAAM,OAAO;CACnD,MAAM,kBAAkB,oBAAoB;CAG5C,MAAM,eAAe,iBAAiB,gBAAgB;CACtD,MAAM,iBAAiB,iBAAiB;CACxC,MAAM,eAAe,iBAAiB;CAGtC,MAAM,SAAS,eAAgB,kBAAkB,QAAS,OAAO;CAGjE,MAAM,OAAO,kBAAkB;AAC9B,MAAI,gBAAgB,aACnB,cAAa,KAAK;MAElB,OAAM,MAAM;IAEX,CAAC,cAAc,aAAa,CAAC;CAEhC,MAAM,QAAQ,kBAAkB;AAC/B,MAAI,gBAAgB,aACnB,cAAa,MAAM;MAEnB,OAAM,OAAO;IAEZ,CAAC,cAAc,aAAa,CAAC;CAEhC,MAAM,SAAS,kBAAkB;AAChC,MAAI,gBAAgB,aACnB,cAAa,CAAC,eAAe;MAE7B,OAAM,QAAQ;IAEb;EAAC;EAAc;EAAc;EAAe,CAAC;AAEhD,QAAO,eACC;EACN;EACA,MAAM,OAAO;EACb;EACA;EACA;EACA,GACD;EAAC;EAAQ,OAAO;EAAM;EAAM;EAAO;EAAO,CAC1C;;;;;;;;AASF,MAAa,6BAA6B;CAEzC,MAAM,EAAE,SAAS,kBADE,aAAa,UAAU,MAAM,WAAW;AAG3D,QAAO,eACC;EACN;EACA,MAAM,QAAQ;EACd,QAAQ,QAAQ;EAChB;EACA,UAAU,MAAM;EAChB,SAAS,MAAM;EACf,QAAQ,MAAM;EACd,WAAW,cAAc,SAAS;EAClC,GACD,CAAC,SAAS,cAAc,CACxB;;;;;AAMF,MAAa,0BAA0B,UAGjC;CACL,MAAMA,QAAgC,EAAE;AAExC,KAAI,MAAM,SAAS,OAClB,OAAM,OAAO,MAAM;AAGpB,KAAI,MAAM,gBAAgB,OACzB,OAAM,SAAS,MAAM;AAGtB,KAAI,OAAO,KAAK,MAAM,CAAC,SAAS,EAC/B,OAAM,aAAa,MAAM"}
1
+ {"version":3,"file":"support-store.js","names":["patch: Partial<SupportConfig>"],"sources":["../../../src/support/store/support-store.ts"],"sourcesContent":["\"use client\";\n\nimport {\n\tcreateSupportStore,\n\ttype SupportConfig,\n\ttype SupportStore,\n\ttype SupportStoreState,\n} from \"@cossistant/core\";\nimport { useCallback, useMemo, useRef, useSyncExternalStore } from \"react\";\nimport { useControlledState } from \"../context/controlled-state\";\n\nconst storage = typeof window !== \"undefined\" ? window.localStorage : undefined;\nconst store = createSupportStore({ storage });\n\ntype Selector<T> = (state: SupportStoreState) => T;\n\ntype EqualityChecker<T> = (previous: T, next: T) => boolean;\n\nfunction useSelector<TSelected>(\n\tselector: Selector<TSelected>,\n\tisEqual: EqualityChecker<TSelected> = Object.is\n): TSelected {\n\tconst selectionRef = useRef<TSelected>(undefined);\n\n\tconst subscribe = (onStoreChange: () => void) =>\n\t\tstore.subscribe(() => {\n\t\t\tonStoreChange();\n\t\t});\n\n\tconst snapshot = useSyncExternalStore(\n\t\tsubscribe,\n\t\tstore.getState,\n\t\tstore.getState\n\t);\n\n\tconst selected = selector(snapshot);\n\n\tif (\n\t\tselectionRef.current === undefined ||\n\t\t!isEqual(selectionRef.current, selected)\n\t) {\n\t\tselectionRef.current = selected;\n\t}\n\n\treturn selectionRef.current as TSelected;\n}\n\nexport type UseSupportStoreResult = SupportStoreState &\n\tPick<\n\t\tSupportStore,\n\t\t| \"navigate\"\n\t\t| \"replace\"\n\t\t| \"goBack\"\n\t\t| \"open\"\n\t\t| \"close\"\n\t\t| \"toggle\"\n\t\t| \"updateConfig\"\n\t\t| \"reset\"\n\t>;\n\n/**\n * Access the support widget store state and actions.\n *\n * @example\n * const { isOpen, navigate, toggle } = useSupportStore();\n */\nexport function useSupportStore(): UseSupportStoreResult {\n\tconst state = useSelector((current) => current);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\t...state,\n\t\t\tnavigate: store.navigate,\n\t\t\treplace: store.replace,\n\t\t\tgoBack: store.goBack,\n\t\t\topen: store.open,\n\t\t\tclose: store.close,\n\t\t\ttoggle: store.toggle,\n\t\t\tupdateConfig: store.updateConfig,\n\t\t\treset: store.reset,\n\t\t}),\n\t\t[state]\n\t);\n}\n\nexport type UseSupportConfigResult = {\n\tisOpen: boolean;\n\tsize: SupportConfig[\"size\"];\n\topen: () => void;\n\tclose: () => void;\n\ttoggle: () => void;\n};\n\n/**\n * Access widget configuration (isOpen, size) and toggle helpers.\n * Supports both controlled and uncontrolled modes.\n *\n * In controlled mode (when `open` prop is provided to Support),\n * the `isOpen` state is driven by the prop, and `open`/`close`/`toggle`\n * will call `onOpenChange` instead of updating internal state.\n *\n * @example\n * // Uncontrolled (internal state)\n * const { isOpen, open, close, toggle } = useSupportConfig();\n *\n * @example\n * // Controlled (external state via Support props)\n * <Support open={isOpen} onOpenChange={setIsOpen}>\n * <MyComponent />\n * </Support>\n */\nexport const useSupportConfig = (): UseSupportConfigResult => {\n\tconst config = useSelector((state) => state.config);\n\tconst controlledState = useControlledState();\n\n\t// Determine if we're in controlled mode\n\tconst isControlled = controlledState?.isControlled ?? false;\n\tconst controlledOpen = controlledState?.open;\n\tconst onOpenChange = controlledState?.onOpenChange;\n\n\t// Use controlled state if available, otherwise use store state\n\tconst isOpen = isControlled ? (controlledOpen ?? false) : config.isOpen;\n\n\t// Create wrapped actions that respect controlled mode\n\tconst open = useCallback(() => {\n\t\tif (isControlled && onOpenChange) {\n\t\t\tonOpenChange(true);\n\t\t} else {\n\t\t\tstore.open();\n\t\t}\n\t}, [isControlled, onOpenChange]);\n\n\tconst close = useCallback(() => {\n\t\tif (isControlled && onOpenChange) {\n\t\t\tonOpenChange(false);\n\t\t} else {\n\t\t\tstore.close();\n\t\t}\n\t}, [isControlled, onOpenChange]);\n\n\tconst toggle = useCallback(() => {\n\t\tif (isControlled && onOpenChange) {\n\t\t\tonOpenChange(!controlledOpen);\n\t\t} else {\n\t\t\tstore.toggle();\n\t\t}\n\t}, [isControlled, onOpenChange, controlledOpen]);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\tisOpen,\n\t\t\tsize: config.size,\n\t\t\topen,\n\t\t\tclose,\n\t\t\ttoggle,\n\t\t}),\n\t\t[isOpen, config.size, open, close, toggle]\n\t);\n};\n\n/**\n * Access navigation state and routing methods.\n *\n * @example\n * const { navigate, goBack, page, params } = useSupportNavigation();\n */\nexport const useSupportNavigation = () => {\n\tconst navigation = useSelector((state) => state.navigation);\n\tconst { current, previousPages } = navigation;\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\tcurrent,\n\t\t\tpage: current.page,\n\t\t\tparams: current.params,\n\t\t\tpreviousPages,\n\t\t\tnavigate: store.navigate,\n\t\t\treplace: store.replace,\n\t\t\tgoBack: store.goBack,\n\t\t\tcanGoBack: previousPages.length > 0,\n\t\t}),\n\t\t[current, previousPages]\n\t);\n};\n\n/**\n * Initialize store with default configuration (used internally by Support component).\n */\nexport const initializeSupportStore = (props: {\n\tsize?: SupportConfig[\"size\"];\n\tdefaultOpen?: boolean;\n}) => {\n\tconst patch: Partial<SupportConfig> = {};\n\n\tif (props.size !== undefined) {\n\t\tpatch.size = props.size;\n\t}\n\n\tif (props.defaultOpen !== undefined) {\n\t\tpatch.isOpen = props.defaultOpen;\n\t}\n\n\tif (Object.keys(patch).length > 0) {\n\t\tstore.updateConfig(patch);\n\t}\n};\n"],"mappings":";;;;;;;AAYA,MAAM,QAAQ,mBAAmB,EAAE,SADnB,OAAO,WAAW,cAAc,OAAO,eAAe,QAC1B,CAAC;AAM7C,SAAS,YACR,UACA,UAAsC,OAAO,IACjC;CACZ,MAAM,eAAe,OAAkB,OAAU;CAEjD,MAAM,aAAa,kBAClB,MAAM,gBAAgB;AACrB,iBAAe;GACd;CAQH,MAAM,WAAW,SANA,qBAChB,WACA,MAAM,UACN,MAAM,SACN,CAEkC;AAEnC,KACC,aAAa,YAAY,UACzB,CAAC,QAAQ,aAAa,SAAS,SAAS,CAExC,cAAa,UAAU;AAGxB,QAAO,aAAa;;;;;;;;AAsBrB,SAAgB,kBAAyC;CACxD,MAAM,QAAQ,aAAa,YAAY,QAAQ;AAE/C,QAAO,eACC;EACN,GAAG;EACH,UAAU,MAAM;EAChB,SAAS,MAAM;EACf,QAAQ,MAAM;EACd,MAAM,MAAM;EACZ,OAAO,MAAM;EACb,QAAQ,MAAM;EACd,cAAc,MAAM;EACpB,OAAO,MAAM;EACb,GACD,CAAC,MAAM,CACP;;;;;;;;;;;;;;;;;;;;AA6BF,MAAa,yBAAiD;CAC7D,MAAM,SAAS,aAAa,UAAU,MAAM,OAAO;CACnD,MAAM,kBAAkB,oBAAoB;CAG5C,MAAM,eAAe,iBAAiB,gBAAgB;CACtD,MAAM,iBAAiB,iBAAiB;CACxC,MAAM,eAAe,iBAAiB;CAGtC,MAAM,SAAS,eAAgB,kBAAkB,QAAS,OAAO;CAGjE,MAAM,OAAO,kBAAkB;AAC9B,MAAI,gBAAgB,aACnB,cAAa,KAAK;MAElB,OAAM,MAAM;IAEX,CAAC,cAAc,aAAa,CAAC;CAEhC,MAAM,QAAQ,kBAAkB;AAC/B,MAAI,gBAAgB,aACnB,cAAa,MAAM;MAEnB,OAAM,OAAO;IAEZ,CAAC,cAAc,aAAa,CAAC;CAEhC,MAAM,SAAS,kBAAkB;AAChC,MAAI,gBAAgB,aACnB,cAAa,CAAC,eAAe;MAE7B,OAAM,QAAQ;IAEb;EAAC;EAAc;EAAc;EAAe,CAAC;AAEhD,QAAO,eACC;EACN;EACA,MAAM,OAAO;EACb;EACA;EACA;EACA,GACD;EAAC;EAAQ,OAAO;EAAM;EAAM;EAAO;EAAO,CAC1C;;;;;;;;AASF,MAAa,6BAA6B;CAEzC,MAAM,EAAE,SAAS,kBADE,aAAa,UAAU,MAAM,WAAW;AAG3D,QAAO,eACC;EACN;EACA,MAAM,QAAQ;EACd,QAAQ,QAAQ;EAChB;EACA,UAAU,MAAM;EAChB,SAAS,MAAM;EACf,QAAQ,MAAM;EACd,WAAW,cAAc,SAAS;EAClC,GACD,CAAC,SAAS,cAAc,CACxB;;;;;AAMF,MAAa,0BAA0B,UAGjC;CACL,MAAMA,QAAgC,EAAE;AAExC,KAAI,MAAM,SAAS,OAClB,OAAM,OAAO,MAAM;AAGpB,KAAI,MAAM,gBAAgB,OACzB,OAAM,SAAS,MAAM;AAGtB,KAAI,OAAO,KAAK,MAAM,CAAC,SAAS,EAC/B,OAAM,aAAa,MAAM"}
@@ -21,7 +21,7 @@
21
21
  );
22
22
 
23
23
  /* Core surfaces */
24
- --co-radius: var(--co-theme-radius, 0.625rem);
24
+ --co-radius: var(--co-theme-radius, 0.375rem);
25
25
  --co-background-base: var(--co-theme-background, oklch(99% 0 0));
26
26
  --co-foreground-base: var(--co-theme-foreground, oklch(20.5% 0 0));
27
27
  --co-popover-base: var(--co-theme-popover, var(--co-background-base));
@@ -384,4 +384,4 @@
384
384
  }
385
385
 
386
386
 
387
- /*# sourceMappingURL=support-C7Xaw-N6.css.map*/
387
+ /*# sourceMappingURL=support-DmViRaga.css.map*/
@@ -1 +1 @@
1
- {"version":3,"file":"support-C7Xaw-N6.css","names":[],"sources":["../../src/support/support.css"],"sourcesContent":["/*\n* This indicates to tailwind to\n* compile classes from Cossistant with the host tailwind config\n*/\n@source \"./components\";\n@source \"./pages\";\n\n@layer base {\n\t.cossistant {\n\t\t@apply text-co-primary;\n\n\t\tcolor-scheme: inherit;\n\n\t\t/* Typeface tokens */\n\t\t--co-font-sans: var(--co-theme-font-sans, \"Geist\", \"Inter\", sans-serif);\n\t\t--co-font-mono: var(\n\t\t\t--co-theme-font-mono,\n\t\t\t\"Geist Mono\",\n\t\t\t\"Inter Mono\",\n\t\t\tmonospace\n\t\t);\n\n\t\t/* Core surfaces */\n\t\t--co-radius: var(--co-theme-radius, 0.625rem);\n\t\t--co-background-base: var(--co-theme-background, oklch(99% 0 0));\n\t\t--co-foreground-base: var(--co-theme-foreground, oklch(20.5% 0 0));\n\t\t--co-popover-base: var(--co-theme-popover, var(--co-background-base));\n\t\t--co-popover-foreground-base: var(\n\t\t\t--co-theme-popover-foreground,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-primary-base: var(--co-theme-primary, oklch(14.5% 0 0));\n\t\t--co-primary-foreground-base: var(\n\t\t\t--co-theme-primary-foreground,\n\t\t\toklch(98.5% 0 0)\n\t\t);\n\t\t--co-secondary-base: var(--co-theme-secondary, oklch(97% 0 0));\n\t\t--co-secondary-foreground-base: var(\n\t\t\t--co-theme-secondary-foreground,\n\t\t\toklch(14.5% 0 0)\n\t\t);\n\t\t--co-border-base: var(--co-theme-border, oklch(92.2% 0 0));\n\t\t--co-input-base: var(--co-theme-input, oklch(92.2% 0 0));\n\t\t--co-ring-base: var(--co-theme-ring, var(--co-primary-base));\n\t\t--co-accent-base: var(--co-theme-accent, var(--co-primary-base));\n\t\t--co-accent-foreground-base: var(\n\t\t\t--co-theme-accent-foreground,\n\t\t\tvar(--co-primary-foreground-base)\n\t\t);\n\n\t\t/* Neutral shades derived from the background */\n\t\t--co-background-50-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 98%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-100-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 97%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-200-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 96%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-300-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 95%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-400-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 94%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-500-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 93%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-600-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 92%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\n\t\t/* Muted tones */\n\t\t--co-muted-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 85%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-muted-foreground-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-foreground-base) 70%,\n\t\t\twhite\n\t\t);\n\n\t\t/* Public tokens consumed by Tailwind theme */\n\t\t--co-background: var(--co-background-base);\n\t\t--co-background-50: var(\n\t\t\t--co-theme-background-50,\n\t\t\tvar(--co-background-50-mix, oklch(92% 0 0))\n\t\t);\n\t\t--co-background-100: var(\n\t\t\t--co-theme-background-100,\n\t\t\tvar(--co-background-100-mix, oklch(93% 0 0))\n\t\t);\n\t\t--co-background-200: var(\n\t\t\t--co-theme-background-200,\n\t\t\tvar(--co-background-200-mix, oklch(94% 0 0))\n\t\t);\n\t\t--co-background-300: var(\n\t\t\t--co-theme-background-300,\n\t\t\tvar(--co-background-300-mix, oklch(95% 0 0))\n\t\t);\n\t\t--co-background-400: var(\n\t\t\t--co-theme-background-400,\n\t\t\tvar(--co-background-400-mix, oklch(96% 0 0))\n\t\t);\n\t\t--co-background-500: var(\n\t\t\t--co-theme-background-500,\n\t\t\tvar(--co-background-500-mix, oklch(97% 0 0))\n\t\t);\n\t\t--co-background-600: var(\n\t\t\t--co-theme-background-600,\n\t\t\tvar(--co-background-600-mix, oklch(98% 0 0))\n\t\t);\n\n\t\t--co-foreground: var(--co-foreground-base);\n\t\t--co-popover: var(--co-popover-base);\n\t\t--co-popover-foreground: var(--co-popover-foreground-base);\n\t\t--co-primary: var(--co-primary-base);\n\t\t--co-primary-foreground: var(--co-primary-foreground-base);\n\t\t--co-secondary: var(--co-secondary-base);\n\t\t--co-secondary-foreground: var(--co-secondary-foreground-base);\n\t\t--co-muted: var(--co-theme-muted, var(--co-muted-mix, oklch(97% 0 0)));\n\t\t--co-muted-foreground: var(\n\t\t\t--co-theme-muted-foreground,\n\t\t\tvar(--co-muted-foreground-mix, oklch(55.6% 0 0))\n\t\t);\n\t\t--co-border: var(--co-border-base);\n\t\t--co-input: var(--co-input-base);\n\t\t--co-ring: var(--co-ring-base);\n\t\t--co-accent: var(--co-accent-base);\n\t\t--co-accent-foreground: var(--co-accent-foreground-base);\n\n\t\t/* Accent palette */\n\t\t--co-pink: var(--co-theme-pink, oklch(76.3% 0.152 354));\n\t\t--co-yellow: var(--co-theme-yellow, oklch(86.4% 0.144 99));\n\t\t--co-blue: var(--co-theme-blue, oklch(72.5% 0.132 241));\n\t\t--co-orange: var(--co-theme-orange, oklch(74.5% 0.166 50));\n\n\t\t/* Status colors */\n\t\t--co-destructive: var(--co-theme-destructive, oklch(57.7% 0.245 27.325));\n\t\t--co-destructive-foreground: var(\n\t\t\t--co-theme-destructive-foreground,\n\t\t\toklch(57.7% 0.245 27.325)\n\t\t);\n\t\t--co-success: var(--co-theme-success, oklch(71.7% 0.18 142));\n\t\t--co-success-foreground: var(\n\t\t\t--co-theme-success-foreground,\n\t\t\toklch(26.5% 0.052 142.7)\n\t\t);\n\t\t--co-neutral: var(--co-theme-neutral, oklch(60.8% 0 0));\n\t\t--co-neutral-foreground: var(\n\t\t\t--co-theme-neutral-foreground,\n\t\t\toklch(25.6% 0 0)\n\t\t);\n\t\t--co-warning: var(--co-theme-warning, oklch(86.4% 0.144 99));\n\t\t--co-warning-foreground: var(\n\t\t\t--co-theme-warning-foreground,\n\t\t\toklch(41.4% 0.071 99)\n\t\t);\n\n\t\t/* Tailwind theme mapping - scoped to widget */\n\t\t@theme inline {\n\t\t\t--font-co-sans: var(--co-font-sans);\n\t\t\t--font-co-mono: var(--co-font-mono);\n\t\t\t--color-co-background: var(--co-background);\n\t\t\t--color-co-background-50: var(--co-background-50);\n\t\t\t--color-co-background-100: var(--co-background-100);\n\t\t\t--color-co-background-200: var(--co-background-200);\n\t\t\t--color-co-background-300: var(--co-background-300);\n\t\t\t--color-co-background-400: var(--co-background-400);\n\t\t\t--color-co-background-500: var(--co-background-500);\n\t\t\t--color-co-background-600: var(--co-background-600);\n\n\t\t\t--color-co-foreground: var(--co-foreground);\n\n\t\t\t--color-co-primary: var(--co-primary);\n\t\t\t--color-co-primary-foreground: var(--co-primary-foreground);\n\t\t\t--color-co-secondary: var(--co-secondary);\n\t\t\t--color-co-secondary-foreground: var(--co-secondary-foreground);\n\t\t\t--color-co-muted: var(--co-muted);\n\t\t\t--color-co-muted-foreground: var(--co-muted-foreground);\n\t\t\t--color-co-border: var(--co-border);\n\t\t\t--color-co-input: var(--co-input);\n\t\t\t--color-co-ring: var(--co-ring);\n\t\t\t--radius-co: var(--co-radius);\n\n\t\t\t/* custom colors */\n\t\t\t--color-co-pink: var(--co-pink);\n\t\t\t--color-co-yellow: var(--co-yellow);\n\t\t\t--color-co-blue: var(--co-blue);\n\t\t\t--color-co-orange: var(--co-orange);\n\n\t\t\t/* status colors */\n\t\t\t--color-co-destructive: var(--co-destructive);\n\t\t\t--color-co-destructive-foreground: var(--co-destructive-foreground);\n\t\t\t--color-co-success: var(--co-success);\n\t\t\t--color-co-success-foreground: var(--co-success-foreground);\n\t\t\t--color-co-neutral: var(--co-neutral);\n\t\t\t--color-co-neutral-foreground: var(--co-neutral-foreground);\n\t\t\t--color-co-warning: var(--co-warning);\n\t\t\t--color-co-warning-foreground: var(--co-warning-foreground);\n\t\t}\n\t}\n\n\t.dark .cossistant,\n\t.cossistant[data-color-scheme=\"dark\"] {\n\t\t/* Dark mode defaults */\n\t\t--co-background-base: var(--co-theme-background, oklch(15.5% 0 0));\n\t\t--co-foreground-base: var(--co-theme-foreground, oklch(95% 0 0));\n\t\t--co-popover-base: var(--co-theme-popover, oklch(14.5% 0 0));\n\t\t--co-popover-foreground-base: var(\n\t\t\t--co-theme-popover-foreground,\n\t\t\toklch(95% 0 0)\n\t\t);\n\t\t--co-primary-base: var(--co-theme-primary, oklch(98.5% 0 0));\n\t\t--co-primary-foreground-base: var(\n\t\t\t--co-theme-primary-foreground,\n\t\t\toklch(14.5% 0 0)\n\t\t);\n\t\t--co-secondary-base: var(--co-theme-secondary, oklch(26.9% 0 0));\n\t\t--co-secondary-foreground-base: var(\n\t\t\t--co-theme-secondary-foreground,\n\t\t\toklch(95% 0 0)\n\t\t);\n\t\t--co-border-base: var(--co-theme-border, oklch(26.9% 0 0));\n\t\t--co-input-base: var(--co-theme-input, oklch(26.9% 0 0));\n\t\t--co-ring-base: var(--co-theme-ring, var(--co-primary-base));\n\t\t--co-accent-base: var(--co-theme-accent, var(--co-primary-base));\n\t\t--co-accent-foreground-base: var(\n\t\t\t--co-theme-accent-foreground,\n\t\t\tvar(--co-primary-foreground-base)\n\t\t);\n\n\t\t--co-muted-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 55%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-muted-foreground-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-foreground-base) 65%,\n\t\t\twhite\n\t\t);\n\n\t\t--co-background-50-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 98%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-100-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 96%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-200-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 94%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-300-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 92%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-400-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 90%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-500-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 88%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-600-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 86%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\n\t\t--co-pink: var(--co-theme-pink, oklch(84.2% 0.109 354));\n\t\t--co-yellow: var(--co-theme-yellow, oklch(90.3% 0.111 99));\n\t\t--co-blue: var(--co-theme-blue, oklch(79.8% 0.089 241));\n\t\t--co-orange: var(--co-theme-orange, oklch(68.2% 0.194 50));\n\n\t\t--co-destructive: var(--co-theme-destructive, oklch(39.6% 0.141 25.723));\n\t\t--co-destructive-foreground: var(\n\t\t\t--co-theme-destructive-foreground,\n\t\t\toklch(63.7% 0.237 25.331)\n\t\t);\n\t\t--co-success: var(--co-theme-success, oklch(60% 0.15 142));\n\t\t--co-success-foreground: var(\n\t\t\t--co-theme-success-foreground,\n\t\t\toklch(85% 0.12 142)\n\t\t);\n\t\t--co-neutral: var(--co-theme-neutral, oklch(50% 0 0));\n\t\t--co-neutral-foreground: var(--co-theme-neutral-foreground, oklch(85% 0 0));\n\t\t--co-warning: var(--co-theme-warning, oklch(90.3% 0.111 99));\n\t\t--co-warning-foreground: var(\n\t\t\t--co-theme-warning-foreground,\n\t\t\toklch(85% 0.1 99)\n\t\t);\n\t}\n}\n\n@layer utilities {\n\t.cossistant {\n\t\t/* Native scrollbar styling */\n\t\t.co-scrollbar-thin {\n\t\t\tscrollbar-width: thin;\n\t\t\tscrollbar-color: oklch(from var(--co-primary) l c h / 0.3) transparent;\n\t\t}\n\n\t\t.co-scrollbar-thin::-webkit-scrollbar {\n\t\t\twidth: 8px;\n\t\t\theight: 8px;\n\t\t}\n\n\t\t.co-scrollbar-thin::-webkit-scrollbar-track {\n\t\t\tbackground: transparent;\n\t\t}\n\n\t\t.co-scrollbar-thin::-webkit-scrollbar-thumb {\n\t\t\tbackground-color: oklch(from var(--co-primary) l c h / 0.3);\n\t\t\tborder-radius: 4px;\n\t\t}\n\n\t\t.co-scrollbar-thin::-webkit-scrollbar-thumb:hover {\n\t\t\tbackground-color: oklch(from var(--co-primary) l c h / 0.5);\n\t\t}\n\n\t\t.animation-delay-0 {\n\t\t\tanimation-delay: 0ms;\n\t\t}\n\t\t.animation-delay-200 {\n\t\t\tanimation-delay: 200ms;\n\t\t}\n\t\t.animation-delay-400 {\n\t\t\tanimation-delay: 400ms;\n\t\t}\n\n\t\t@keyframes bounce-dot {\n\t\t\t0%,\n\t\t\t80%,\n\t\t\t100% {\n\t\t\t\ttransform: translateY(0);\n\t\t\t}\n\t\t\t40% {\n\t\t\t\ttransform: translateY(-6px);\n\t\t\t}\n\t\t}\n\n\t\t.dot-bounce-1 {\n\t\t\tanimation: bounce-dot 1.4s infinite;\n\t\t\tanimation-delay: 0s;\n\t\t}\n\n\t\t.dot-bounce-2 {\n\t\t\tanimation: bounce-dot 1.4s infinite;\n\t\t\tanimation-delay: 0.16s;\n\t\t}\n\n\t\t.dot-bounce-3 {\n\t\t\tanimation: bounce-dot 1.4s infinite;\n\t\t\tanimation-delay: 0.32s;\n\t\t}\n\t}\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA"}
1
+ {"version":3,"file":"support-DmViRaga.css","names":[],"sources":["../../src/support/support.css"],"sourcesContent":["/*\n* This indicates to tailwind to\n* compile classes from Cossistant with the host tailwind config\n*/\n@source \"./components\";\n@source \"./pages\";\n\n@layer base {\n\t.cossistant {\n\t\t@apply text-co-primary;\n\n\t\tcolor-scheme: inherit;\n\n\t\t/* Typeface tokens */\n\t\t--co-font-sans: var(--co-theme-font-sans, \"Geist\", \"Inter\", sans-serif);\n\t\t--co-font-mono: var(\n\t\t\t--co-theme-font-mono,\n\t\t\t\"Geist Mono\",\n\t\t\t\"Inter Mono\",\n\t\t\tmonospace\n\t\t);\n\n\t\t/* Core surfaces */\n\t\t--co-radius: var(--co-theme-radius, 0.375rem);\n\t\t--co-background-base: var(--co-theme-background, oklch(99% 0 0));\n\t\t--co-foreground-base: var(--co-theme-foreground, oklch(20.5% 0 0));\n\t\t--co-popover-base: var(--co-theme-popover, var(--co-background-base));\n\t\t--co-popover-foreground-base: var(\n\t\t\t--co-theme-popover-foreground,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-primary-base: var(--co-theme-primary, oklch(14.5% 0 0));\n\t\t--co-primary-foreground-base: var(\n\t\t\t--co-theme-primary-foreground,\n\t\t\toklch(98.5% 0 0)\n\t\t);\n\t\t--co-secondary-base: var(--co-theme-secondary, oklch(97% 0 0));\n\t\t--co-secondary-foreground-base: var(\n\t\t\t--co-theme-secondary-foreground,\n\t\t\toklch(14.5% 0 0)\n\t\t);\n\t\t--co-border-base: var(--co-theme-border, oklch(92.2% 0 0));\n\t\t--co-input-base: var(--co-theme-input, oklch(92.2% 0 0));\n\t\t--co-ring-base: var(--co-theme-ring, var(--co-primary-base));\n\t\t--co-accent-base: var(--co-theme-accent, var(--co-primary-base));\n\t\t--co-accent-foreground-base: var(\n\t\t\t--co-theme-accent-foreground,\n\t\t\tvar(--co-primary-foreground-base)\n\t\t);\n\n\t\t/* Neutral shades derived from the background */\n\t\t--co-background-50-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 98%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-100-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 97%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-200-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 96%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-300-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 95%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-400-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 94%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-500-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 93%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-600-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 92%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\n\t\t/* Muted tones */\n\t\t--co-muted-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 85%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-muted-foreground-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-foreground-base) 70%,\n\t\t\twhite\n\t\t);\n\n\t\t/* Public tokens consumed by Tailwind theme */\n\t\t--co-background: var(--co-background-base);\n\t\t--co-background-50: var(\n\t\t\t--co-theme-background-50,\n\t\t\tvar(--co-background-50-mix, oklch(92% 0 0))\n\t\t);\n\t\t--co-background-100: var(\n\t\t\t--co-theme-background-100,\n\t\t\tvar(--co-background-100-mix, oklch(93% 0 0))\n\t\t);\n\t\t--co-background-200: var(\n\t\t\t--co-theme-background-200,\n\t\t\tvar(--co-background-200-mix, oklch(94% 0 0))\n\t\t);\n\t\t--co-background-300: var(\n\t\t\t--co-theme-background-300,\n\t\t\tvar(--co-background-300-mix, oklch(95% 0 0))\n\t\t);\n\t\t--co-background-400: var(\n\t\t\t--co-theme-background-400,\n\t\t\tvar(--co-background-400-mix, oklch(96% 0 0))\n\t\t);\n\t\t--co-background-500: var(\n\t\t\t--co-theme-background-500,\n\t\t\tvar(--co-background-500-mix, oklch(97% 0 0))\n\t\t);\n\t\t--co-background-600: var(\n\t\t\t--co-theme-background-600,\n\t\t\tvar(--co-background-600-mix, oklch(98% 0 0))\n\t\t);\n\n\t\t--co-foreground: var(--co-foreground-base);\n\t\t--co-popover: var(--co-popover-base);\n\t\t--co-popover-foreground: var(--co-popover-foreground-base);\n\t\t--co-primary: var(--co-primary-base);\n\t\t--co-primary-foreground: var(--co-primary-foreground-base);\n\t\t--co-secondary: var(--co-secondary-base);\n\t\t--co-secondary-foreground: var(--co-secondary-foreground-base);\n\t\t--co-muted: var(--co-theme-muted, var(--co-muted-mix, oklch(97% 0 0)));\n\t\t--co-muted-foreground: var(\n\t\t\t--co-theme-muted-foreground,\n\t\t\tvar(--co-muted-foreground-mix, oklch(55.6% 0 0))\n\t\t);\n\t\t--co-border: var(--co-border-base);\n\t\t--co-input: var(--co-input-base);\n\t\t--co-ring: var(--co-ring-base);\n\t\t--co-accent: var(--co-accent-base);\n\t\t--co-accent-foreground: var(--co-accent-foreground-base);\n\n\t\t/* Accent palette */\n\t\t--co-pink: var(--co-theme-pink, oklch(76.3% 0.152 354));\n\t\t--co-yellow: var(--co-theme-yellow, oklch(86.4% 0.144 99));\n\t\t--co-blue: var(--co-theme-blue, oklch(72.5% 0.132 241));\n\t\t--co-orange: var(--co-theme-orange, oklch(74.5% 0.166 50));\n\n\t\t/* Status colors */\n\t\t--co-destructive: var(--co-theme-destructive, oklch(57.7% 0.245 27.325));\n\t\t--co-destructive-foreground: var(\n\t\t\t--co-theme-destructive-foreground,\n\t\t\toklch(57.7% 0.245 27.325)\n\t\t);\n\t\t--co-success: var(--co-theme-success, oklch(71.7% 0.18 142));\n\t\t--co-success-foreground: var(\n\t\t\t--co-theme-success-foreground,\n\t\t\toklch(26.5% 0.052 142.7)\n\t\t);\n\t\t--co-neutral: var(--co-theme-neutral, oklch(60.8% 0 0));\n\t\t--co-neutral-foreground: var(\n\t\t\t--co-theme-neutral-foreground,\n\t\t\toklch(25.6% 0 0)\n\t\t);\n\t\t--co-warning: var(--co-theme-warning, oklch(86.4% 0.144 99));\n\t\t--co-warning-foreground: var(\n\t\t\t--co-theme-warning-foreground,\n\t\t\toklch(41.4% 0.071 99)\n\t\t);\n\n\t\t/* Tailwind theme mapping - scoped to widget */\n\t\t@theme inline {\n\t\t\t--font-co-sans: var(--co-font-sans);\n\t\t\t--font-co-mono: var(--co-font-mono);\n\t\t\t--color-co-background: var(--co-background);\n\t\t\t--color-co-background-50: var(--co-background-50);\n\t\t\t--color-co-background-100: var(--co-background-100);\n\t\t\t--color-co-background-200: var(--co-background-200);\n\t\t\t--color-co-background-300: var(--co-background-300);\n\t\t\t--color-co-background-400: var(--co-background-400);\n\t\t\t--color-co-background-500: var(--co-background-500);\n\t\t\t--color-co-background-600: var(--co-background-600);\n\n\t\t\t--color-co-foreground: var(--co-foreground);\n\n\t\t\t--color-co-primary: var(--co-primary);\n\t\t\t--color-co-primary-foreground: var(--co-primary-foreground);\n\t\t\t--color-co-secondary: var(--co-secondary);\n\t\t\t--color-co-secondary-foreground: var(--co-secondary-foreground);\n\t\t\t--color-co-muted: var(--co-muted);\n\t\t\t--color-co-muted-foreground: var(--co-muted-foreground);\n\t\t\t--color-co-border: var(--co-border);\n\t\t\t--color-co-input: var(--co-input);\n\t\t\t--color-co-ring: var(--co-ring);\n\t\t\t--radius-co: var(--co-radius);\n\n\t\t\t/* custom colors */\n\t\t\t--color-co-pink: var(--co-pink);\n\t\t\t--color-co-yellow: var(--co-yellow);\n\t\t\t--color-co-blue: var(--co-blue);\n\t\t\t--color-co-orange: var(--co-orange);\n\n\t\t\t/* status colors */\n\t\t\t--color-co-destructive: var(--co-destructive);\n\t\t\t--color-co-destructive-foreground: var(--co-destructive-foreground);\n\t\t\t--color-co-success: var(--co-success);\n\t\t\t--color-co-success-foreground: var(--co-success-foreground);\n\t\t\t--color-co-neutral: var(--co-neutral);\n\t\t\t--color-co-neutral-foreground: var(--co-neutral-foreground);\n\t\t\t--color-co-warning: var(--co-warning);\n\t\t\t--color-co-warning-foreground: var(--co-warning-foreground);\n\t\t}\n\t}\n\n\t.dark .cossistant,\n\t.cossistant[data-color-scheme=\"dark\"] {\n\t\t/* Dark mode defaults */\n\t\t--co-background-base: var(--co-theme-background, oklch(15.5% 0 0));\n\t\t--co-foreground-base: var(--co-theme-foreground, oklch(95% 0 0));\n\t\t--co-popover-base: var(--co-theme-popover, oklch(14.5% 0 0));\n\t\t--co-popover-foreground-base: var(\n\t\t\t--co-theme-popover-foreground,\n\t\t\toklch(95% 0 0)\n\t\t);\n\t\t--co-primary-base: var(--co-theme-primary, oklch(98.5% 0 0));\n\t\t--co-primary-foreground-base: var(\n\t\t\t--co-theme-primary-foreground,\n\t\t\toklch(14.5% 0 0)\n\t\t);\n\t\t--co-secondary-base: var(--co-theme-secondary, oklch(26.9% 0 0));\n\t\t--co-secondary-foreground-base: var(\n\t\t\t--co-theme-secondary-foreground,\n\t\t\toklch(95% 0 0)\n\t\t);\n\t\t--co-border-base: var(--co-theme-border, oklch(26.9% 0 0));\n\t\t--co-input-base: var(--co-theme-input, oklch(26.9% 0 0));\n\t\t--co-ring-base: var(--co-theme-ring, var(--co-primary-base));\n\t\t--co-accent-base: var(--co-theme-accent, var(--co-primary-base));\n\t\t--co-accent-foreground-base: var(\n\t\t\t--co-theme-accent-foreground,\n\t\t\tvar(--co-primary-foreground-base)\n\t\t);\n\n\t\t--co-muted-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 55%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-muted-foreground-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-foreground-base) 65%,\n\t\t\twhite\n\t\t);\n\n\t\t--co-background-50-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 98%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-100-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 96%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-200-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 94%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-300-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 92%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-400-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 90%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-500-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 88%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\t\t--co-background-600-mix: color-mix(\n\t\t\tin oklch,\n\t\t\tvar(--co-background-base) 86%,\n\t\t\tvar(--co-foreground-base)\n\t\t);\n\n\t\t--co-pink: var(--co-theme-pink, oklch(84.2% 0.109 354));\n\t\t--co-yellow: var(--co-theme-yellow, oklch(90.3% 0.111 99));\n\t\t--co-blue: var(--co-theme-blue, oklch(79.8% 0.089 241));\n\t\t--co-orange: var(--co-theme-orange, oklch(68.2% 0.194 50));\n\n\t\t--co-destructive: var(--co-theme-destructive, oklch(39.6% 0.141 25.723));\n\t\t--co-destructive-foreground: var(\n\t\t\t--co-theme-destructive-foreground,\n\t\t\toklch(63.7% 0.237 25.331)\n\t\t);\n\t\t--co-success: var(--co-theme-success, oklch(60% 0.15 142));\n\t\t--co-success-foreground: var(\n\t\t\t--co-theme-success-foreground,\n\t\t\toklch(85% 0.12 142)\n\t\t);\n\t\t--co-neutral: var(--co-theme-neutral, oklch(50% 0 0));\n\t\t--co-neutral-foreground: var(--co-theme-neutral-foreground, oklch(85% 0 0));\n\t\t--co-warning: var(--co-theme-warning, oklch(90.3% 0.111 99));\n\t\t--co-warning-foreground: var(\n\t\t\t--co-theme-warning-foreground,\n\t\t\toklch(85% 0.1 99)\n\t\t);\n\t}\n}\n\n@layer utilities {\n\t.cossistant {\n\t\t/* Native scrollbar styling */\n\t\t.co-scrollbar-thin {\n\t\t\tscrollbar-width: thin;\n\t\t\tscrollbar-color: oklch(from var(--co-primary) l c h / 0.3) transparent;\n\t\t}\n\n\t\t.co-scrollbar-thin::-webkit-scrollbar {\n\t\t\twidth: 8px;\n\t\t\theight: 8px;\n\t\t}\n\n\t\t.co-scrollbar-thin::-webkit-scrollbar-track {\n\t\t\tbackground: transparent;\n\t\t}\n\n\t\t.co-scrollbar-thin::-webkit-scrollbar-thumb {\n\t\t\tbackground-color: oklch(from var(--co-primary) l c h / 0.3);\n\t\t\tborder-radius: 4px;\n\t\t}\n\n\t\t.co-scrollbar-thin::-webkit-scrollbar-thumb:hover {\n\t\t\tbackground-color: oklch(from var(--co-primary) l c h / 0.5);\n\t\t}\n\n\t\t.animation-delay-0 {\n\t\t\tanimation-delay: 0ms;\n\t\t}\n\t\t.animation-delay-200 {\n\t\t\tanimation-delay: 200ms;\n\t\t}\n\t\t.animation-delay-400 {\n\t\t\tanimation-delay: 400ms;\n\t\t}\n\n\t\t@keyframes bounce-dot {\n\t\t\t0%,\n\t\t\t80%,\n\t\t\t100% {\n\t\t\t\ttransform: translateY(0);\n\t\t\t}\n\t\t\t40% {\n\t\t\t\ttransform: translateY(-6px);\n\t\t\t}\n\t\t}\n\n\t\t.dot-bounce-1 {\n\t\t\tanimation: bounce-dot 1.4s infinite;\n\t\t\tanimation-delay: 0s;\n\t\t}\n\n\t\t.dot-bounce-2 {\n\t\t\tanimation: bounce-dot 1.4s infinite;\n\t\t\tanimation-delay: 0.16s;\n\t\t}\n\n\t\t.dot-bounce-3 {\n\t\t\tanimation: bounce-dot 1.4s infinite;\n\t\t\tanimation-delay: 0.32s;\n\t\t}\n\t}\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA"}
@@ -41,7 +41,7 @@ type TextProps<K extends SupportTextKey, As extends keyof React.JSX.IntrinsicEle
41
41
  * rendered HTML element.
42
42
  */
43
43
  declare const Text: <K extends SupportTextKey, As extends keyof React.JSX.IntrinsicElements = "span">(props: TextProps<K, As> & {
44
- ref?: React.ComponentPropsWithRef<As>["ref"];
44
+ ref?: React.Ref<Element>;
45
45
  }) => React.ReactElement | null;
46
46
  //#endregion
47
47
  export { type SupportLocale, type SupportTextContentOverrides, type SupportTextKey, SupportTextProvider, type SupportTextVariables, Text, useSupportText };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/support/text/index.tsx"],"sourcesContent":[],"mappings":";;;;AAewB,KASnB,wBAAA,CAAA,eAAwB,MAAA,GAAyB,aAAzB,CAAA,GAAA;EAAyB,QAAA,EAC3C,KAAA,CAAM,SADqC;EAC3C,MAAM,CAAA,EACP,MADO;EACP,OAAA,CAAA,EACC,2BADD,CAC6B,MAD7B,CAAA;CAC6B;;;AAWvC;;;AAEC,iBAFe,mBAEf,CAAA,eAAA,MAAA,GAF2D,aAE3D,CAAA,CAAA;EAAA,QAAA;EAAA,MAAA;EAAA;AAAA,CAAA,EAEE,wBAFF,CAE2B,MAF3B,CAAA,CAAA,EAEqC,KAAA,CAAM,YAF3C;;;;;AAEuD,iBAyExC,cAAA,CAAA,CAzEwC,EAyEtB,4BAzEsB;AAyExD,KASK,qBATyB,CAAA,UASO,cATH,CAAA,GAUjC,sBAV6D,CAUtC,CAVsC,CAAA,CAAA,WAAA,CAAA,SAAA,SAAA,GAAA;EASzD,SAAA,CAAA,EAAA,SAAA;CAAgC,GAAA,UAAA,SAAA,MAGR,sBAHQ,CAGe,CAHf,CAAA,GAIhC,sBAJgC,CAIT,CAJS,CAAA,CAAA,UAAA,CAAA,SAAA,IAAA,GAAA;EACpC,SAAA,CAAA,EAImB,oBAJnB,CAIwC,CAJxC,CAAA;CAAuB,GAAA;EAEK,SAAA,EAGV,oBAHU,CAGW,CAHX,CAAA;CAAuB,GAAA;EAC/C,SAAA,EAGa,oBAHb,CAGkC,CAHlC,CAAA;CAAuB;KAKvB,SAJoC,CAAA,UAK9B,cAL8B,EAAA,WAAA,MAMvB,KAAA,CAAM,GAAA,CAAI,iBANa,GAAA,MAAA,CAAA,GAOrC,qBAPqC,CAOf,CAPe,CAAA,GAAA;EAArB,OAAA,EAQV,CARU;EACoB,EAAA,CAAA,EAQlC,EARkC;CAArB,GASf,IATe,CASV,KAAA,CAAM,wBATI,CASqB,EATrB,CAAA,EAAA,UAAA,CAAA;;;;AACmB;;AAId,cAkCX,IAlCe,EAAA,CAAA,UAmCjB,cAnCiB,EAAA,WAAA,MAoCV,KAAA,CAAM,GAAA,CAAI,iBApCA,GAAA,MAAA,CAAA,CAAA,KAAA,EAsCpB,SAtCoB,CAsCV,CAtCU,EAsCP,EAtCO,CAAA,GAAA;EACF,GAAA,CAAA,EAqCS,KAAA,CAAM,qBArCf,CAqCqC,EArCrC,CAAA,CAAA,KAAA,CAAA;CAAtB,EAAA,GAsCC,KAAA,CAAM,YAtCP,GAAA,IAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/support/text/index.tsx"],"sourcesContent":[],"mappings":";;;;AAewB,KASnB,wBAAA,CAAA,eAAwB,MAAA,GAAyB,aAAzB,CAAA,GAAA;EAAyB,QAAA,EAC3C,KAAA,CAAM,SADqC;EAC3C,MAAM,CAAA,EACP,MADO;EACP,OAAA,CAAA,EACC,2BADD,CAC6B,MAD7B,CAAA;CAC6B;;;AAWvC;;;AAEC,iBAFe,mBAEf,CAAA,eAAA,MAAA,GAF2D,aAE3D,CAAA,CAAA;EAAA,QAAA;EAAA,MAAA;EAAA;AAAA,CAAA,EAEE,wBAFF,CAE2B,MAF3B,CAAA,CAAA,EAEqC,KAAA,CAAM,YAF3C;;;;;AAEuD,iBAyExC,cAAA,CAAA,CAzEwC,EAyEtB,4BAzEsB;AAyExD,KASK,qBATyB,CAAA,UASO,cATH,CAAA,GAUjC,sBAV6D,CAUtC,CAVsC,CAAA,CAAA,WAAA,CAAA,SAAA,SAAA,GAAA;EASzD,SAAA,CAAA,EAAA,SAAA;CAAgC,GAAA,UAAA,SAAA,MAGR,sBAHQ,CAGe,CAHf,CAAA,GAIhC,sBAJgC,CAIT,CAJS,CAAA,CAAA,UAAA,CAAA,SAAA,IAAA,GAAA;EACpC,SAAA,CAAA,EAImB,oBAJnB,CAIwC,CAJxC,CAAA;CAAuB,GAAA;EAEK,SAAA,EAGV,oBAHU,CAGW,CAHX,CAAA;CAAuB,GAAA;EAC/C,SAAA,EAGa,oBAHb,CAGkC,CAHlC,CAAA;CAAuB;KAKvB,SAJoC,CAAA,UAK9B,cAL8B,EAAA,WAAA,MAMvB,KAAA,CAAM,GAAA,CAAI,iBANa,GAAA,MAAA,CAAA,GAOrC,qBAPqC,CAOf,CAPe,CAAA,GAAA;EAArB,OAAA,EAQV,CARU;EACoB,EAAA,CAAA,EAQlC,EARkC;CAArB,GASf,IATe,CASV,KAAA,CAAM,wBATI,CASqB,EATrB,CAAA,EAAA,UAAA,CAAA;;;;AACmB;;AAId,cA+BX,IA/Be,EAAA,CAAA,UAgCjB,cAhCiB,EAAA,WAAA,MAiCV,KAAA,CAAM,GAAA,CAAI,iBAjCA,GAAA,MAAA,CAAA,CAAA,KAAA,EAmCpB,SAnCoB,CAmCV,CAnCU,EAmCP,EAnCO,CAAA,GAAA;EACF,GAAA,CAAA,EAkCS,KAAA,CAAM,GAlCf,CAkCmB,OAlCnB,CAAA;CAAtB,EAAA,GAmCC,KAAA,CAAM,YAnCP,GAAA,IAAA"}
@@ -62,7 +62,7 @@ function useSupportText() {
62
62
  return context.format;
63
63
  }
64
64
  function TextInner(props, forwardedRef) {
65
- const { textKey, variables, as,...rest } = props;
65
+ const { textKey, variables, as, ...rest } = props;
66
66
  const format = useSupportText();
67
67
  const Component = as ?? "span";
68
68
  const content = variables !== void 0 ? format(textKey, variables) : format(textKey);