@cossistant/react 0.0.26 → 0.0.28
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.
- package/api.d.ts +1 -1
- package/api.d.ts.map +1 -1
- package/checks.d.ts +1 -1
- package/checks.d.ts.map +1 -1
- package/clsx.d.ts +1 -1
- package/clsx.d.ts.map +1 -1
- package/coerce.d.ts +1 -1
- package/coerce.d.ts.map +1 -1
- package/conversation.d.ts +3 -0
- package/conversation.d.ts.map +1 -1
- package/core.d.ts +1 -1
- package/core.d.ts.map +1 -1
- package/errors.d.ts +1 -1
- package/errors.d.ts.map +1 -1
- package/errors2.d.ts +1 -1
- package/errors2.d.ts.map +1 -1
- package/hooks/index.d.ts +2 -1
- package/hooks/index.js +6 -5
- package/hooks/private/store/use-website-store.js +2 -1
- package/hooks/private/store/use-website-store.js.map +1 -1
- package/hooks/private/use-client-query.d.ts +6 -0
- package/hooks/private/use-client-query.d.ts.map +1 -1
- package/hooks/private/use-client-query.js +26 -3
- package/hooks/private/use-client-query.js.map +1 -1
- package/hooks/private/use-multimodal-input.d.ts.map +1 -1
- package/hooks/private/use-multimodal-input.js +7 -5
- package/hooks/private/use-multimodal-input.js.map +1 -1
- package/hooks/private/use-visitor-typing-reporter.d.ts +18 -1
- package/hooks/private/use-visitor-typing-reporter.d.ts.map +1 -1
- package/hooks/private/use-visitor-typing-reporter.js +34 -4
- package/hooks/private/use-visitor-typing-reporter.js.map +1 -1
- package/hooks/use-conversation-page.d.ts +1 -0
- package/hooks/use-conversation-page.d.ts.map +1 -1
- package/hooks/use-conversation-page.js +6 -1
- package/hooks/use-conversation-page.js.map +1 -1
- package/hooks/use-conversation-preview.d.ts +2 -1
- package/hooks/use-conversation-preview.d.ts.map +1 -1
- package/hooks/use-conversation-preview.js +1 -1
- package/hooks/use-conversation-preview.js.map +1 -1
- package/hooks/use-conversation-timeline-items.js +2 -1
- package/hooks/use-conversation-timeline-items.js.map +1 -1
- package/hooks/use-conversation.js +2 -1
- package/hooks/use-conversation.js.map +1 -1
- package/hooks/use-conversations.js +1 -0
- package/hooks/use-conversations.js.map +1 -1
- package/hooks/use-create-conversation.d.ts.map +1 -1
- package/hooks/use-file-upload.d.ts +55 -0
- package/hooks/use-file-upload.d.ts.map +1 -0
- package/hooks/use-file-upload.js +100 -0
- package/hooks/use-file-upload.js.map +1 -0
- package/hooks/use-message-composer.d.ts +11 -0
- package/hooks/use-message-composer.d.ts.map +1 -1
- package/hooks/use-message-composer.js +7 -3
- package/hooks/use-message-composer.js.map +1 -1
- package/hooks/use-send-message.d.ts +1 -0
- package/hooks/use-send-message.d.ts.map +1 -1
- package/hooks/use-send-message.js +63 -11
- package/hooks/use-send-message.js.map +1 -1
- package/index.d.ts +6 -3
- package/index.js +13 -10
- package/openapi30.d.ts +1 -1
- package/openapi30.d.ts.map +1 -1
- package/openapi31.d.ts +1 -1
- package/openapi31.d.ts.map +1 -1
- package/package.json +4 -3
- package/parse.d.ts +1 -1
- package/parse.d.ts.map +1 -1
- package/primitives/avatar/image.d.ts +1 -1
- package/primitives/conversation-timeline.d.ts.map +1 -1
- package/primitives/conversation-timeline.js +10 -5
- package/primitives/conversation-timeline.js.map +1 -1
- package/primitives/index.d.ts +4 -3
- package/primitives/index.js +12 -5
- package/primitives/index.parts.d.ts +3 -2
- package/primitives/index.parts.js +4 -3
- package/primitives/multimodal-input.d.ts +2 -2
- package/primitives/multimodal-input.d.ts.map +1 -1
- package/primitives/timeline-item-attachments.d.ts +100 -0
- package/primitives/timeline-item-attachments.d.ts.map +1 -0
- package/primitives/timeline-item-attachments.js +151 -0
- package/primitives/timeline-item-attachments.js.map +1 -0
- package/primitives/trigger.d.ts +91 -0
- package/primitives/trigger.d.ts.map +1 -0
- package/primitives/trigger.js +74 -0
- package/primitives/trigger.js.map +1 -0
- package/primitives/window.d.ts +22 -1
- package/primitives/window.d.ts.map +1 -1
- package/primitives/window.js +91 -5
- package/primitives/window.js.map +1 -1
- package/provider.d.ts.map +1 -1
- package/provider.js +8 -3
- package/provider.js.map +1 -1
- package/realtime/index.js +1 -1
- package/realtime/provider.js +1 -1
- package/realtime/support-provider.js +1 -1
- package/realtime/support-provider.js.map +1 -1
- package/realtime-events.d.ts +40 -1
- package/realtime-events.d.ts.map +1 -1
- package/registries.d.ts +1 -1
- package/registries.d.ts.map +1 -1
- package/schemas.d.ts +1 -1
- package/schemas.d.ts.map +1 -1
- package/schemas2.d.ts +1 -1
- package/schemas2.d.ts.map +1 -1
- package/schemas3.d.ts +1 -0
- package/schemas3.d.ts.map +1 -1
- package/specification-extension.d.ts +1 -1
- package/specification-extension.d.ts.map +1 -1
- package/standard-schema.d.ts +1 -1
- package/standard-schema.d.ts.map +1 -1
- package/support/components/content.d.ts +30 -0
- package/support/components/content.d.ts.map +1 -0
- package/support/components/content.js +282 -0
- package/support/components/content.js.map +1 -0
- package/support/components/conversation-button-link.js +1 -1
- package/support/components/conversation-timeline.js +3 -3
- package/support/components/conversation-timeline.js.map +1 -1
- package/support/components/header.js +1 -1
- package/support/components/image-lightbox.d.ts +49 -0
- package/support/components/image-lightbox.d.ts.map +1 -0
- package/support/components/image-lightbox.js +142 -0
- package/support/components/image-lightbox.js.map +1 -0
- package/support/components/index.d.ts +5 -4
- package/support/components/index.js +4 -4
- package/support/components/multimodal-input.d.ts +4 -1
- package/support/components/multimodal-input.d.ts.map +1 -1
- package/support/components/multimodal-input.js +71 -45
- package/support/components/multimodal-input.js.map +1 -1
- package/support/components/navigation-tab.js +1 -1
- package/support/components/root.d.ts +23 -0
- package/support/components/root.d.ts.map +1 -0
- package/support/components/root.js +36 -0
- package/support/components/root.js.map +1 -0
- package/support/components/timeline-message-item.d.ts.map +1 -1
- package/support/components/timeline-message-item.js +82 -18
- package/support/components/timeline-message-item.js.map +1 -1
- package/support/components/trigger.d.ts +14 -0
- package/support/components/trigger.d.ts.map +1 -0
- package/support/components/{bubble.js → trigger.js} +16 -12
- package/support/components/trigger.js.map +1 -0
- package/support/components/typing-indicator.d.ts.map +1 -1
- package/support/components/typing-indicator.js +1 -0
- package/support/components/typing-indicator.js.map +1 -1
- package/support/context/controlled-state.d.ts +46 -0
- package/support/context/controlled-state.d.ts.map +1 -0
- package/support/context/controlled-state.js +34 -0
- package/support/context/controlled-state.js.map +1 -0
- package/support/context/events.d.ts +103 -0
- package/support/context/events.d.ts.map +1 -0
- package/support/context/events.js +139 -0
- package/support/context/events.js.map +1 -0
- package/support/context/handle.d.ts +90 -0
- package/support/context/handle.d.ts.map +1 -0
- package/support/context/handle.js +79 -0
- package/support/context/handle.js.map +1 -0
- package/support/context/positioning.d.ts +17 -0
- package/support/context/positioning.d.ts.map +1 -0
- package/support/context/positioning.js +26 -0
- package/support/context/positioning.js.map +1 -0
- package/support/context/slots.d.ts +85 -0
- package/support/context/slots.d.ts.map +1 -0
- package/support/context/slots.js +115 -0
- package/support/context/slots.js.map +1 -0
- package/support/context/websocket.d.ts +8 -1
- package/support/context/websocket.d.ts.map +1 -1
- package/support/context/websocket.js +8 -1
- package/support/context/websocket.js.map +1 -1
- package/support/index.d.ts +239 -54
- package/support/index.d.ts.map +1 -1
- package/support/index.js +254 -33
- package/support/index.js.map +1 -1
- package/support/pages/articles.d.ts.map +1 -1
- package/support/pages/articles.js +3 -4
- package/support/pages/articles.js.map +1 -1
- package/support/pages/conversation-history.js +2 -2
- package/support/pages/conversation.js +6 -5
- package/support/pages/conversation.js.map +1 -1
- package/support/pages/home.js +2 -2
- package/support/router.d.ts +52 -12
- package/support/router.d.ts.map +1 -1
- package/support/router.js +78 -30
- package/support/router.js.map +1 -1
- package/support/store/index.d.ts +2 -2
- package/support/store/support-store.d.ts +26 -20
- package/support/store/support-store.d.ts.map +1 -1
- package/support/store/support-store.js +47 -6
- package/support/store/support-store.js.map +1 -1
- package/support/{support-D2EgfIts.css → support-C7Xaw-N6.css} +1 -2
- package/support/support-C7Xaw-N6.css.map +1 -0
- package/support/text/index.js.map +1 -1
- package/support/types.d.ts +75 -12
- package/support/types.d.ts.map +1 -1
- package/support.css +2 -2
- package/tailwind.css +0 -1
- package/timeline-item.d.ts +68 -2
- package/timeline-item.d.ts.map +1 -1
- package/util.d.ts +1 -1
- package/util.d.ts.map +1 -1
- package/utils/index.d.ts +2 -1
- package/utils/index.js +2 -1
- package/utils/merge-refs.d.ts +30 -0
- package/utils/merge-refs.d.ts.map +1 -0
- package/utils/merge-refs.js +46 -0
- package/utils/merge-refs.js.map +1 -0
- package/utils/use-render-element.d.ts.map +1 -1
- package/utils/use-render-element.js +20 -7
- package/utils/use-render-element.js.map +1 -1
- package/versions.d.ts +1 -1
- package/versions.d.ts.map +1 -1
- package/zod-extensions.d.ts +1 -1
- package/zod-extensions.d.ts.map +1 -1
- package/primitives/bubble.d.ts +0 -38
- package/primitives/bubble.d.ts.map +0 -1
- package/primitives/bubble.js +0 -57
- package/primitives/bubble.js.map +0 -1
- package/support/components/bubble.d.ts +0 -10
- package/support/components/bubble.d.ts.map +0 -1
- package/support/components/bubble.js.map +0 -1
- package/support/components/container.d.ts +0 -13
- package/support/components/container.d.ts.map +0 -1
- package/support/components/container.js +0 -109
- package/support/components/container.js.map +0 -1
- package/support/components/support-content.d.ts +0 -22
- package/support/components/support-content.d.ts.map +0 -1
- package/support/components/support-content.js +0 -48
- package/support/components/support-content.js.map +0 -1
- package/support/support-D2EgfIts.css.map +0 -1
package/support/router.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","names":[],"sources":["../../src/support/router.tsx"],"sourcesContent":[],"mappings":"
|
|
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"}
|
package/support/router.js
CHANGED
|
@@ -1,51 +1,99 @@
|
|
|
1
|
-
import { Router } from "../primitives/router.js";
|
|
1
|
+
import { Router as Router$1 } from "../primitives/router.js";
|
|
2
2
|
import { useSupportNavigation } from "./store/support-store.js";
|
|
3
3
|
import { ArticlesPage } from "./pages/articles.js";
|
|
4
4
|
import { ConversationPage } from "./pages/conversation.js";
|
|
5
5
|
import { ConversationHistoryPage } from "./pages/conversation-history.js";
|
|
6
6
|
import { HomePage } from "./pages/home.js";
|
|
7
|
-
import
|
|
7
|
+
import * as React$1 from "react";
|
|
8
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
9
|
|
|
9
10
|
//#region src/support/router.tsx
|
|
10
11
|
/**
|
|
12
|
+
* Built-in pages that are always available.
|
|
13
|
+
* Type assertion is needed because each page component has different param types,
|
|
14
|
+
* but they all satisfy the PageDefinition interface.
|
|
15
|
+
*/
|
|
16
|
+
const builtInPages = [
|
|
17
|
+
{
|
|
18
|
+
name: "HOME",
|
|
19
|
+
component: HomePage
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: "ARTICLES",
|
|
23
|
+
component: ArticlesPage
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: "CONVERSATION",
|
|
27
|
+
component: ConversationPage
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: "CONVERSATION_HISTORY",
|
|
31
|
+
component: ConversationHistoryPage
|
|
32
|
+
}
|
|
33
|
+
];
|
|
34
|
+
/**
|
|
35
|
+
* Extract page definitions from Support.Page children.
|
|
36
|
+
* This allows declarative page registration via JSX.
|
|
37
|
+
*/
|
|
38
|
+
function extractPagesFromChildren(children) {
|
|
39
|
+
const pages = [];
|
|
40
|
+
React$1.Children.forEach(children, (child) => {
|
|
41
|
+
if (!React$1.isValidElement(child)) return;
|
|
42
|
+
const props = child.props;
|
|
43
|
+
if (props.name && props.component) pages.push({
|
|
44
|
+
name: props.name,
|
|
45
|
+
component: props.component
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
return pages;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
11
51
|
* Router with default support pages (HOME, ARTICLES, CONVERSATION, CONVERSATION_HISTORY).
|
|
12
|
-
* Add custom pages via customPages prop.
|
|
52
|
+
* Add custom pages via the customPages prop or as children.
|
|
13
53
|
*
|
|
14
54
|
* @example
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
55
|
+
* // Default pages only
|
|
56
|
+
* <Support.Router />
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* // With custom pages via prop
|
|
60
|
+
* <Support.Router customPages={[{ name: "FAQ", component: FAQPage }]} />
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* // With custom pages as children
|
|
64
|
+
* <Support.Router>
|
|
65
|
+
* <Support.Page name="FAQ" component={FAQPage} />
|
|
66
|
+
* <Support.Page name="SETTINGS" component={SettingsPage} />
|
|
67
|
+
* </Support.Router>
|
|
20
68
|
*/
|
|
21
|
-
const
|
|
69
|
+
const Router = ({ customPages = [], children }) => {
|
|
22
70
|
const { current } = useSupportNavigation();
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
component: ArticlesPage
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
name: "CONVERSATION",
|
|
34
|
-
component: ConversationPage
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
name: "CONVERSATION_HISTORY",
|
|
38
|
-
component: ConversationHistoryPage
|
|
39
|
-
}
|
|
40
|
-
], ...customPages];
|
|
41
|
-
return /* @__PURE__ */ jsxs(Fragment, { children: [children, /* @__PURE__ */ jsx(Router, {
|
|
71
|
+
const extractedPages = React$1.useMemo(() => extractPagesFromChildren(children), [children]);
|
|
72
|
+
const allPages = React$1.useMemo(() => [
|
|
73
|
+
...builtInPages,
|
|
74
|
+
...customPages,
|
|
75
|
+
...extractedPages
|
|
76
|
+
], [customPages, extractedPages]);
|
|
77
|
+
return /* @__PURE__ */ jsx(Router$1, {
|
|
42
78
|
fallback: HomePage,
|
|
43
79
|
page: current.page,
|
|
44
80
|
pages: allPages,
|
|
45
81
|
params: current.params
|
|
46
|
-
})
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Declarative way to register custom pages.
|
|
86
|
+
* This component is collected by the Router and doesn't render anything itself.
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* <Support.Router>
|
|
90
|
+
* <Support.Page name="FAQ" component={FAQPage} />
|
|
91
|
+
* </Support.Router>
|
|
92
|
+
*/
|
|
93
|
+
const Page = (_props) => {
|
|
94
|
+
return null;
|
|
47
95
|
};
|
|
48
96
|
|
|
49
97
|
//#endregion
|
|
50
|
-
export {
|
|
98
|
+
export { Page, Router };
|
|
51
99
|
//# sourceMappingURL=router.js.map
|
package/support/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","names":["
|
|
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"}
|
package/support/store/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { UseSupportStoreResult, initializeSupportStore, useSupportConfig, useSupportNavigation, useSupportStore } from "./support-store.js";
|
|
2
|
-
export { UseSupportStoreResult, initializeSupportStore, useSupportConfig, useSupportNavigation, useSupportStore };
|
|
1
|
+
import { UseSupportConfigResult, UseSupportStoreResult, initializeSupportStore, useSupportConfig, useSupportNavigation, useSupportStore } from "./support-store.js";
|
|
2
|
+
export { UseSupportConfigResult, UseSupportStoreResult, initializeSupportStore, useSupportConfig, useSupportNavigation, useSupportStore };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as _cossistant_core3 from "@cossistant/core";
|
|
2
2
|
import { SupportConfig, SupportStore, SupportStoreState } from "@cossistant/core";
|
|
3
3
|
|
|
4
4
|
//#region src/support/store/support-store.d.ts
|
|
@@ -10,26 +10,32 @@ type UseSupportStoreResult = SupportStoreState & Pick<SupportStore, "navigate" |
|
|
|
10
10
|
* const { isOpen, navigate, toggle } = useSupportStore();
|
|
11
11
|
*/
|
|
12
12
|
declare function useSupportStore(): UseSupportStoreResult;
|
|
13
|
+
type UseSupportConfigResult = {
|
|
14
|
+
isOpen: boolean;
|
|
15
|
+
size: SupportConfig["size"];
|
|
16
|
+
open: () => void;
|
|
17
|
+
close: () => void;
|
|
18
|
+
toggle: () => void;
|
|
19
|
+
};
|
|
13
20
|
/**
|
|
14
21
|
* Access widget configuration (isOpen, size) and toggle helpers.
|
|
22
|
+
* Supports both controlled and uncontrolled modes.
|
|
23
|
+
*
|
|
24
|
+
* In controlled mode (when `open` prop is provided to Support),
|
|
25
|
+
* the `isOpen` state is driven by the prop, and `open`/`close`/`toggle`
|
|
26
|
+
* will call `onOpenChange` instead of updating internal state.
|
|
15
27
|
*
|
|
16
28
|
* @example
|
|
29
|
+
* // Uncontrolled (internal state)
|
|
17
30
|
* const { isOpen, open, close, toggle } = useSupportConfig();
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* // Controlled (external state via Support props)
|
|
34
|
+
* <Support open={isOpen} onOpenChange={setIsOpen}>
|
|
35
|
+
* <MyComponent />
|
|
36
|
+
* </Support>
|
|
18
37
|
*/
|
|
19
|
-
declare const useSupportConfig: () =>
|
|
20
|
-
open: () => void;
|
|
21
|
-
close: () => void;
|
|
22
|
-
toggle: () => void;
|
|
23
|
-
size: "normal" | "larger";
|
|
24
|
-
isOpen: boolean;
|
|
25
|
-
content: {
|
|
26
|
-
home?: {
|
|
27
|
-
header?: string;
|
|
28
|
-
subheader?: string;
|
|
29
|
-
ctaLabel?: string;
|
|
30
|
-
};
|
|
31
|
-
};
|
|
32
|
-
};
|
|
38
|
+
declare const useSupportConfig: () => UseSupportConfigResult;
|
|
33
39
|
/**
|
|
34
40
|
* Access navigation state and routing methods.
|
|
35
41
|
*
|
|
@@ -37,15 +43,15 @@ declare const useSupportConfig: () => {
|
|
|
37
43
|
* const { navigate, goBack, page, params } = useSupportNavigation();
|
|
38
44
|
*/
|
|
39
45
|
declare const useSupportNavigation: () => {
|
|
40
|
-
current:
|
|
46
|
+
current: _cossistant_core3.NavigationState<_cossistant_core3.RouteRegistry>;
|
|
41
47
|
page: "HOME" | "ARTICLES" | "CONVERSATION" | "CONVERSATION_HISTORY";
|
|
42
48
|
params: {
|
|
43
49
|
conversationId: string;
|
|
44
50
|
initialMessage?: string;
|
|
45
51
|
} | undefined;
|
|
46
|
-
previousPages:
|
|
47
|
-
navigate: (state:
|
|
48
|
-
replace: (state:
|
|
52
|
+
previousPages: _cossistant_core3.NavigationState<_cossistant_core3.RouteRegistry>[];
|
|
53
|
+
navigate: (state: _cossistant_core3.NavigationState<_cossistant_core3.RouteRegistry>) => void;
|
|
54
|
+
replace: (state: _cossistant_core3.NavigationState<_cossistant_core3.RouteRegistry>) => void;
|
|
49
55
|
goBack: () => void;
|
|
50
56
|
canGoBack: boolean;
|
|
51
57
|
};
|
|
@@ -57,5 +63,5 @@ declare const initializeSupportStore: (props: {
|
|
|
57
63
|
defaultOpen?: boolean;
|
|
58
64
|
}) => void;
|
|
59
65
|
//#endregion
|
|
60
|
-
export { UseSupportStoreResult, initializeSupportStore, useSupportConfig, useSupportNavigation, useSupportStore };
|
|
66
|
+
export { UseSupportConfigResult, UseSupportStoreResult, initializeSupportStore, useSupportConfig, useSupportNavigation, useSupportStore };
|
|
61
67
|
//# sourceMappingURL=support-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"support-store.d.ts","names":[],"sources":["../../../src/support/store/support-store.ts"],"sourcesContent":[],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"support-store.d.ts","names":[],"sources":["../../../src/support/store/support-store.ts"],"sourcesContent":[],"mappings":";;;;KA+CY,qBAAA,GAAwB,oBACnC,KACC;;;AAFF;;;;AACK,iBAkBW,eAAA,CAAA,CAlBX,EAkB8B,qBAlB9B;AAkBW,KAmBJ,sBAAA,GAnBuB;EAmBvB,MAAA,EAAA,OAAA;EA0BC,IAAA,EAxBN,aAuEN,CAAA,MAAA,CAAA;EAQY,IAAA,EAAA,GAAA,GAAA,IAAA;EAiBZ,KAAA,EAAA,GAAA,GAAA,IAAA;;;;;;;;;AAKD;;;;;;;;;;;;cA7Ea,wBAAuB;;;;;;;cAuDvB;6CAiBZ,iBAAA,CAAA,aAAA;;;;;;;;;;;;;;;cAKY;SACL"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import { useControlledState } from "../context/controlled-state.js";
|
|
5
|
+
import { useCallback, useMemo, useRef, useSyncExternalStore } from "react";
|
|
5
6
|
import { createSupportStore } from "@cossistant/core";
|
|
6
7
|
|
|
7
8
|
//#region src/support/store/support-store.ts
|
|
@@ -37,18 +38,58 @@ function useSupportStore() {
|
|
|
37
38
|
}
|
|
38
39
|
/**
|
|
39
40
|
* Access widget configuration (isOpen, size) and toggle helpers.
|
|
41
|
+
* Supports both controlled and uncontrolled modes.
|
|
42
|
+
*
|
|
43
|
+
* In controlled mode (when `open` prop is provided to Support),
|
|
44
|
+
* the `isOpen` state is driven by the prop, and `open`/`close`/`toggle`
|
|
45
|
+
* will call `onOpenChange` instead of updating internal state.
|
|
40
46
|
*
|
|
41
47
|
* @example
|
|
48
|
+
* // Uncontrolled (internal state)
|
|
42
49
|
* const { isOpen, open, close, toggle } = useSupportConfig();
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* // Controlled (external state via Support props)
|
|
53
|
+
* <Support open={isOpen} onOpenChange={setIsOpen}>
|
|
54
|
+
* <MyComponent />
|
|
55
|
+
* </Support>
|
|
43
56
|
*/
|
|
44
57
|
const useSupportConfig = () => {
|
|
45
58
|
const config = useSelector((state) => state.config);
|
|
59
|
+
const controlledState = useControlledState();
|
|
60
|
+
const isControlled = controlledState?.isControlled ?? false;
|
|
61
|
+
const controlledOpen = controlledState?.open;
|
|
62
|
+
const onOpenChange = controlledState?.onOpenChange;
|
|
63
|
+
const isOpen = isControlled ? controlledOpen ?? false : config.isOpen;
|
|
64
|
+
const open = useCallback(() => {
|
|
65
|
+
if (isControlled && onOpenChange) onOpenChange(true);
|
|
66
|
+
else store.open();
|
|
67
|
+
}, [isControlled, onOpenChange]);
|
|
68
|
+
const close = useCallback(() => {
|
|
69
|
+
if (isControlled && onOpenChange) onOpenChange(false);
|
|
70
|
+
else store.close();
|
|
71
|
+
}, [isControlled, onOpenChange]);
|
|
72
|
+
const toggle = useCallback(() => {
|
|
73
|
+
if (isControlled && onOpenChange) onOpenChange(!controlledOpen);
|
|
74
|
+
else store.toggle();
|
|
75
|
+
}, [
|
|
76
|
+
isControlled,
|
|
77
|
+
onOpenChange,
|
|
78
|
+
controlledOpen
|
|
79
|
+
]);
|
|
46
80
|
return useMemo(() => ({
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
81
|
+
isOpen,
|
|
82
|
+
size: config.size,
|
|
83
|
+
open,
|
|
84
|
+
close,
|
|
85
|
+
toggle
|
|
86
|
+
}), [
|
|
87
|
+
isOpen,
|
|
88
|
+
config.size,
|
|
89
|
+
open,
|
|
90
|
+
close,
|
|
91
|
+
toggle
|
|
92
|
+
]);
|
|
52
93
|
};
|
|
53
94
|
/**
|
|
54
95
|
* Access navigation state and routing methods.
|
|
@@ -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 { useMemo, useRef, useSyncExternalStore } from \"react\";\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\n/**\n * Access widget configuration (isOpen, size) and toggle helpers.\n *\n * @example\n * const { isOpen, open, close, toggle } = useSupportConfig();\n */\nexport const useSupportConfig = () => {\n\tconst config = useSelector((state) => state.config);\n\n\treturn useMemo(\n\t\t() => ({\n\t\t\
|
|
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"}
|
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
|
|
8
8
|
@layer base {
|
|
9
9
|
.cossistant {
|
|
10
|
-
@apply scroll-smooth;
|
|
11
10
|
@apply text-co-primary;
|
|
12
11
|
|
|
13
12
|
color-scheme: inherit;
|
|
@@ -385,4 +384,4 @@
|
|
|
385
384
|
}
|
|
386
385
|
|
|
387
386
|
|
|
388
|
-
/*# sourceMappingURL=support-
|
|
387
|
+
/*# sourceMappingURL=support-C7Xaw-N6.css.map*/
|
|
@@ -0,0 +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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/support/text/index.tsx"],"sourcesContent":["/** biome-ignore-all lint/correctness/useExhaustiveDependencies: dependencies are intentionally managed */\n/** biome-ignore-all lint/correctness/noChildrenProp: children prop is needed for React.createElement */\nimport React from \"react\";\n\nimport { useSupport } from \"../../provider\";\nimport {\n\ttype SupportLocale,\n\ttype SupportTextContentOverrides,\n\ttype SupportTextContext,\n\ttype SupportTextDefinitions,\n\ttype SupportTextKey,\n\ttype SupportTextProviderValue,\n\ttype SupportTextResolvedFormatter,\n\ttype SupportTextVariables,\n\tsupportTextDefinitions,\n} from \"./locales/keys\";\nimport {\n\tbuildLocaleChain,\n\tcreateTextUtils,\n\tevaluateMessage,\n\tnormalizeOverrides,\n\tresolveMessage,\n} from \"./runtime\";\n\ntype SupportTextProviderProps<Locale extends string = SupportLocale> = {\n\tchildren: React.ReactNode;\n\tlocale?: Locale;\n\tcontent?: SupportTextContentOverrides<Locale>;\n};\n\nconst SupportTextRuntimeContext =\n\tReact.createContext<SupportTextProviderValue | null>(null);\n\n/**\n * Supplies localized copy and formatting helpers for the support widget. The\n * provider merges bundled locale strings with optional runtime overrides and\n * exposes a formatter that understands visitor/website context.\n */\nexport function SupportTextProvider<Locale extends string = SupportLocale>({\n\tchildren,\n\tlocale,\n\tcontent,\n}: SupportTextProviderProps<Locale>): React.ReactElement {\n\tconst { website, availableHumanAgents, availableAIAgents, visitor } =\n\t\tuseSupport();\n\tconst [isHydrated, setIsHydrated] = React.useState(false);\n\n\tReact.useEffect(() => {\n\t\tsetIsHydrated(true);\n\t}, []);\n\n\tconst localeChain = React.useMemo(\n\t\t() => buildLocaleChain([locale, visitor?.locale]),\n\t\t[locale, visitor?.locale]\n\t);\n\n\tconst normalizedOverrides = React.useMemo(\n\t\t() => normalizeOverrides(content),\n\t\t[content]\n\t);\n\n\tconst utils = React.useMemo(\n\t\t() => createTextUtils(localeChain[0] ?? \"en\", isHydrated),\n\t\t[localeChain, isHydrated]\n\t);\n\n\tconst textContext = React.useMemo<SupportTextContext>(\n\t\t() => ({\n\t\t\twebsite,\n\t\t\tvisitor: visitor ?? null,\n\t\t\thumanAgents: availableHumanAgents,\n\t\t\taiAgents: availableAIAgents,\n\t\t}),\n\t\t[website, visitor, availableHumanAgents, availableAIAgents]\n\t);\n\n\tconst format = ((key: SupportTextKey, variables?: unknown) => {\n\t\tconst definition = supportTextDefinitions[key];\n\t\tconst requiresVariables =\n\t\t\tdefinition.variables !== undefined &&\n\t\t\t!(\"optional\" in definition && definition.optional === true);\n\n\t\tif (requiresVariables && variables === undefined) {\n\t\t\tthrow new Error(`Missing variables for text key \"${key}\".`);\n\t\t}\n\n\t\tconst resolved = resolveMessage(key, localeChain, normalizedOverrides);\n\t\treturn evaluateMessage(\n\t\t\tkey,\n\t\t\tresolved,\n\t\t\tvariables as SupportTextVariables<typeof key>,\n\t\t\ttextContext,\n\t\t\tutils\n\t\t);\n\t}) as SupportTextResolvedFormatter;\n\n\tconst value = React.useMemo<SupportTextProviderValue>(\n\t\t() => ({\n\t\t\tformat,\n\t\t\tlocale: localeChain[0] ?? \"en\",\n\t\t}),\n\t\t[localeChain, normalizedOverrides, textContext, utils]\n\t);\n\n\treturn (\n\t\t<SupportTextRuntimeContext.Provider value={value}>\n\t\t\t{children}\n\t\t</SupportTextRuntimeContext.Provider>\n\t);\n}\n\n/**\n * Returns the active text formatter for the support widget. Throws if used\n * outside of `SupportTextProvider` to help catch integration mistakes.\n */\nexport function useSupportText(): SupportTextResolvedFormatter {\n\tconst context = React.useContext(SupportTextRuntimeContext);\n\tif (!context) {\n\t\tthrow new Error(\"useSupportText must be used within SupportTextProvider\");\n\t}\n\n\treturn context.format;\n}\n\ntype OptionalVariablesProp<K extends SupportTextKey> =\n\tSupportTextDefinitions[K][\"variables\"] extends undefined\n\t\t? { variables?: undefined }\n\t\t: \"optional\" extends keyof SupportTextDefinitions[K]\n\t\t\t? SupportTextDefinitions[K][\"optional\"] extends true\n\t\t\t\t? { variables?: SupportTextVariables<K> }\n\t\t\t\t: { variables: SupportTextVariables<K> }\n\t\t\t: { variables: SupportTextVariables<K> };\n\ntype TextProps<\n\tK extends SupportTextKey,\n\tAs extends keyof React.JSX.IntrinsicElements = \"span\",\n> = OptionalVariablesProp<K> & {\n\ttextKey: K;\n\tas?: As;\n} & Omit<React.ComponentPropsWithoutRef<As>, \"children\">;\n\nfunction TextInner<\n\tK extends SupportTextKey,\n\tAs extends keyof React.JSX.IntrinsicElements = \"span\",\n>(\n\tprops: TextProps<K, As>,\n\tforwardedRef: React.ComponentPropsWithRef<As>[\"ref\"]\n) {\n\tconst { textKey, variables, as, ...rest } = props as TextProps<K, As>;\n\tconst format = useSupportText();\n\tconst Component = (as ?? \"span\") as As;\n\tconst content =\n\t\tvariables !== undefined\n\t\t\t? format(textKey, variables as SupportTextVariables<K>)\n\t\t\t: format(textKey);\n\n\treturn React.createElement(Component, {\n\t\t...rest,\n\t\tref: forwardedRef,\n\t\t\"data-key-name\": textKey,\n\t\tchildren: content,\n\t});\n}\n\n/**\n * Convenience component that renders localized support copy via the\n * `SupportTextProvider` context while still allowing callers to customize the\n * rendered HTML element.\n */\nexport const Text = React.forwardRef(TextInner) as <\n\tK extends SupportTextKey,\n\tAs extends keyof React.JSX.IntrinsicElements = \"span\",\n>(\n\tprops: TextProps<K, As> & { ref?: React.ComponentPropsWithRef<As>[\"ref\"] }\n) => React.ReactElement | null;\n\n(Text as { displayName?: string }).displayName = \"SupportText\";\n\nexport type {\n\tSupportLocale,\n\tSupportTextContentOverrides,\n\tSupportTextKey,\n\tSupportTextVariables,\n} from \"./locales/keys\";\n"],"mappings":";;;;;;;;;AA8BA,MAAM,4BACL,MAAM,cAA+C,KAAK;;;;;;AAO3D,SAAgB,oBAA2D,EAC1E,UACA,QACA,WACwD;CACxD,MAAM,EAAE,SAAS,sBAAsB,mBAAmB,YACzD,YAAY;CACb,MAAM,CAAC,YAAY,iBAAiB,MAAM,SAAS,MAAM;AAEzD,OAAM,gBAAgB;AACrB,gBAAc,KAAK;IACjB,EAAE,CAAC;CAEN,MAAM,cAAc,MAAM,cACnB,iBAAiB,CAAC,QAAQ,SAAS,OAAO,CAAC,EACjD,CAAC,QAAQ,SAAS,OAAO,CACzB;CAED,MAAM,sBAAsB,MAAM,cAC3B,mBAAmB,QAAQ,EACjC,CAAC,QAAQ,CACT;CAED,MAAM,QAAQ,MAAM,cACb,gBAAgB,YAAY,MAAM,MAAM,WAAW,EACzD,CAAC,aAAa,WAAW,CACzB;CAED,MAAM,cAAc,MAAM,eAClB;EACN;EACA,SAAS,WAAW;EACpB,aAAa;EACb,UAAU;EACV,GACD;EAAC;EAAS;EAAS;EAAsB;EAAkB,CAC3D;CAED,MAAM,WAAW,KAAqB,cAAwB;EAC7D,MAAM,aAAa,uBAAuB;AAK1C,MAHC,WAAW,cAAc,UACzB,EAAE,cAAc,cAAc,WAAW,aAAa,SAE9B,cAAc,OACtC,OAAM,IAAI,MAAM,mCAAmC,IAAI,IAAI;AAI5D,SAAO,gBACN,KAFgB,eAAe,KAAK,aAAa,oBAAoB,EAIrE,WACA,aACA,MACA;;CAGF,MAAM,QAAQ,MAAM,eACZ;EACN;EACA,QAAQ,YAAY,MAAM;EAC1B,GACD;EAAC;EAAa;EAAqB;EAAa;EAAM,CACtD;AAED,QACC,oBAAC,0BAA0B;EAAgB;EACzC;GACmC;;;;;;AAQvC,SAAgB,iBAA+C;CAC9D,MAAM,UAAU,MAAM,WAAW,0BAA0B;AAC3D,KAAI,CAAC,QACJ,OAAM,IAAI,MAAM,yDAAyD;AAG1E,QAAO,QAAQ;;AAoBhB,SAAS,UAIR,OACA,cACC;CACD,MAAM,EAAE,SAAS,WAAW,GAAI,GAAG,SAAS;CAC5C,MAAM,SAAS,gBAAgB;CAC/B,MAAM,YAAa,MAAM;CACzB,MAAM,UACL,cAAc,SACX,OAAO,SAAS,UAAqC,GACrD,OAAO,QAAQ;AAEnB,QAAO,MAAM,cAAc,WAAW;EACrC,GAAG;EACH,KAAK;EACL,iBAAiB;EACjB,UAAU;EACV,CAAC;;;;;;;AAQH,MAAa,OAAO,MAAM,WAAW,UAAU;AAO/C,AAAC,KAAkC,cAAc"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/support/text/index.tsx"],"sourcesContent":["/** biome-ignore-all lint/correctness/useExhaustiveDependencies: dependencies are intentionally managed */\n/** biome-ignore-all lint/correctness/noChildrenProp: children prop is needed for React.createElement */\nimport React from \"react\";\n\nimport { useSupport } from \"../../provider\";\nimport {\n\ttype SupportLocale,\n\ttype SupportTextContentOverrides,\n\ttype SupportTextContext,\n\ttype SupportTextDefinitions,\n\ttype SupportTextKey,\n\ttype SupportTextProviderValue,\n\ttype SupportTextResolvedFormatter,\n\ttype SupportTextVariables,\n\tsupportTextDefinitions,\n} from \"./locales/keys\";\nimport {\n\tbuildLocaleChain,\n\tcreateTextUtils,\n\tevaluateMessage,\n\tnormalizeOverrides,\n\tresolveMessage,\n} from \"./runtime\";\n\ntype SupportTextProviderProps<Locale extends string = SupportLocale> = {\n\tchildren: React.ReactNode;\n\tlocale?: Locale;\n\tcontent?: SupportTextContentOverrides<Locale>;\n};\n\nconst SupportTextRuntimeContext =\n\tReact.createContext<SupportTextProviderValue | null>(null);\n\n/**\n * Supplies localized copy and formatting helpers for the support widget. The\n * provider merges bundled locale strings with optional runtime overrides and\n * exposes a formatter that understands visitor/website context.\n */\nexport function SupportTextProvider<Locale extends string = SupportLocale>({\n\tchildren,\n\tlocale,\n\tcontent,\n}: SupportTextProviderProps<Locale>): React.ReactElement {\n\tconst { website, availableHumanAgents, availableAIAgents, visitor } =\n\t\tuseSupport();\n\tconst [isHydrated, setIsHydrated] = React.useState(false);\n\n\tReact.useEffect(() => {\n\t\tsetIsHydrated(true);\n\t}, []);\n\n\tconst localeChain = React.useMemo(\n\t\t() => buildLocaleChain([locale, visitor?.locale]),\n\t\t[locale, visitor?.locale]\n\t);\n\n\tconst normalizedOverrides = React.useMemo(\n\t\t() => normalizeOverrides(content),\n\t\t[content]\n\t);\n\n\tconst utils = React.useMemo(\n\t\t() => createTextUtils(localeChain[0] ?? \"en\", isHydrated),\n\t\t[localeChain, isHydrated]\n\t);\n\n\tconst textContext = React.useMemo<SupportTextContext>(\n\t\t() => ({\n\t\t\twebsite,\n\t\t\tvisitor: visitor ?? null,\n\t\t\thumanAgents: availableHumanAgents,\n\t\t\taiAgents: availableAIAgents,\n\t\t}),\n\t\t[website, visitor, availableHumanAgents, availableAIAgents]\n\t);\n\n\tconst format = ((key: SupportTextKey, variables?: unknown) => {\n\t\tconst definition = supportTextDefinitions[key];\n\t\tconst requiresVariables =\n\t\t\tdefinition.variables !== undefined &&\n\t\t\t!(\"optional\" in definition && definition.optional === true);\n\n\t\tif (requiresVariables && variables === undefined) {\n\t\t\tthrow new Error(`Missing variables for text key \"${key}\".`);\n\t\t}\n\n\t\tconst resolved = resolveMessage(key, localeChain, normalizedOverrides);\n\t\treturn evaluateMessage(\n\t\t\tkey,\n\t\t\tresolved,\n\t\t\tvariables as SupportTextVariables<typeof key>,\n\t\t\ttextContext,\n\t\t\tutils\n\t\t);\n\t}) as SupportTextResolvedFormatter;\n\n\tconst value = React.useMemo<SupportTextProviderValue>(\n\t\t() => ({\n\t\t\tformat,\n\t\t\tlocale: localeChain[0] ?? \"en\",\n\t\t}),\n\t\t[localeChain, normalizedOverrides, textContext, utils]\n\t);\n\n\treturn (\n\t\t<SupportTextRuntimeContext.Provider value={value}>\n\t\t\t{children}\n\t\t</SupportTextRuntimeContext.Provider>\n\t);\n}\n\n/**\n * Returns the active text formatter for the support widget. Throws if used\n * outside of `SupportTextProvider` to help catch integration mistakes.\n */\nexport function useSupportText(): SupportTextResolvedFormatter {\n\tconst context = React.useContext(SupportTextRuntimeContext);\n\tif (!context) {\n\t\tthrow new Error(\"useSupportText must be used within SupportTextProvider\");\n\t}\n\n\treturn context.format;\n}\n\ntype OptionalVariablesProp<K extends SupportTextKey> =\n\tSupportTextDefinitions[K][\"variables\"] extends undefined\n\t\t? { variables?: undefined }\n\t\t: \"optional\" extends keyof SupportTextDefinitions[K]\n\t\t\t? SupportTextDefinitions[K][\"optional\"] extends true\n\t\t\t\t? { variables?: SupportTextVariables<K> }\n\t\t\t\t: { variables: SupportTextVariables<K> }\n\t\t\t: { variables: SupportTextVariables<K> };\n\ntype TextProps<\n\tK extends SupportTextKey,\n\tAs extends keyof React.JSX.IntrinsicElements = \"span\",\n> = OptionalVariablesProp<K> & {\n\ttextKey: K;\n\tas?: As;\n} & Omit<React.ComponentPropsWithoutRef<As>, \"children\">;\n\nfunction TextInner<\n\tK extends SupportTextKey,\n\tAs extends keyof React.JSX.IntrinsicElements = \"span\",\n>(\n\tprops: Omit<TextProps<K, As>, \"ref\">,\n\tforwardedRef: React.ComponentPropsWithRef<As>[\"ref\"]\n) {\n\tconst { textKey, variables, as, ...rest } = props as TextProps<K, As>;\n\tconst format = useSupportText();\n\tconst Component = (as ?? \"span\") as As;\n\tconst content =\n\t\tvariables !== undefined\n\t\t\t? format(textKey, variables as SupportTextVariables<K>)\n\t\t\t: format(textKey);\n\n\treturn React.createElement(Component, {\n\t\t...rest,\n\t\tref: forwardedRef,\n\t\t\"data-key-name\": textKey,\n\t\tchildren: content,\n\t});\n}\n\n/**\n * Convenience component that renders localized support copy via the\n * `SupportTextProvider` context while still allowing callers to customize the\n * rendered HTML element.\n */\nexport const Text = React.forwardRef(TextInner) as <\n\tK extends SupportTextKey,\n\tAs extends keyof React.JSX.IntrinsicElements = \"span\",\n>(\n\tprops: TextProps<K, As> & { ref?: React.ComponentPropsWithRef<As>[\"ref\"] }\n) => React.ReactElement | null;\n\n(Text as { displayName?: string }).displayName = \"SupportText\";\n\nexport type {\n\tSupportLocale,\n\tSupportTextContentOverrides,\n\tSupportTextKey,\n\tSupportTextVariables,\n} from \"./locales/keys\";\n"],"mappings":";;;;;;;;;AA8BA,MAAM,4BACL,MAAM,cAA+C,KAAK;;;;;;AAO3D,SAAgB,oBAA2D,EAC1E,UACA,QACA,WACwD;CACxD,MAAM,EAAE,SAAS,sBAAsB,mBAAmB,YACzD,YAAY;CACb,MAAM,CAAC,YAAY,iBAAiB,MAAM,SAAS,MAAM;AAEzD,OAAM,gBAAgB;AACrB,gBAAc,KAAK;IACjB,EAAE,CAAC;CAEN,MAAM,cAAc,MAAM,cACnB,iBAAiB,CAAC,QAAQ,SAAS,OAAO,CAAC,EACjD,CAAC,QAAQ,SAAS,OAAO,CACzB;CAED,MAAM,sBAAsB,MAAM,cAC3B,mBAAmB,QAAQ,EACjC,CAAC,QAAQ,CACT;CAED,MAAM,QAAQ,MAAM,cACb,gBAAgB,YAAY,MAAM,MAAM,WAAW,EACzD,CAAC,aAAa,WAAW,CACzB;CAED,MAAM,cAAc,MAAM,eAClB;EACN;EACA,SAAS,WAAW;EACpB,aAAa;EACb,UAAU;EACV,GACD;EAAC;EAAS;EAAS;EAAsB;EAAkB,CAC3D;CAED,MAAM,WAAW,KAAqB,cAAwB;EAC7D,MAAM,aAAa,uBAAuB;AAK1C,MAHC,WAAW,cAAc,UACzB,EAAE,cAAc,cAAc,WAAW,aAAa,SAE9B,cAAc,OACtC,OAAM,IAAI,MAAM,mCAAmC,IAAI,IAAI;AAI5D,SAAO,gBACN,KAFgB,eAAe,KAAK,aAAa,oBAAoB,EAIrE,WACA,aACA,MACA;;CAGF,MAAM,QAAQ,MAAM,eACZ;EACN;EACA,QAAQ,YAAY,MAAM;EAC1B,GACD;EAAC;EAAa;EAAqB;EAAa;EAAM,CACtD;AAED,QACC,oBAAC,0BAA0B;EAAgB;EACzC;GACmC;;;;;;AAQvC,SAAgB,iBAA+C;CAC9D,MAAM,UAAU,MAAM,WAAW,0BAA0B;AAC3D,KAAI,CAAC,QACJ,OAAM,IAAI,MAAM,yDAAyD;AAG1E,QAAO,QAAQ;;AAoBhB,SAAS,UAIR,OACA,cACC;CACD,MAAM,EAAE,SAAS,WAAW,GAAI,GAAG,SAAS;CAC5C,MAAM,SAAS,gBAAgB;CAC/B,MAAM,YAAa,MAAM;CACzB,MAAM,UACL,cAAc,SACX,OAAO,SAAS,UAAqC,GACrD,OAAO,QAAQ;AAEnB,QAAO,MAAM,cAAc,WAAW;EACrC,GAAG;EACH,KAAK;EACL,iBAAiB;EACjB,UAAU;EACV,CAAC;;;;;;;AAQH,MAAa,OAAO,MAAM,WAAW,UAAU;AAO/C,AAAC,KAAkC,cAAc"}
|
package/support/types.d.ts
CHANGED
|
@@ -3,26 +3,89 @@ import React from "react";
|
|
|
3
3
|
//#region src/support/types.d.ts
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* Side of the trigger where the content appears.
|
|
7
7
|
*/
|
|
8
|
-
type
|
|
9
|
-
|
|
8
|
+
type Side = "top" | "bottom" | "left" | "right";
|
|
9
|
+
/**
|
|
10
|
+
* Alignment along the side axis.
|
|
11
|
+
*/
|
|
12
|
+
type Align = "start" | "center" | "end";
|
|
13
|
+
/**
|
|
14
|
+
* Render props provided to the Trigger's children function.
|
|
15
|
+
* Use this when you need dynamic content based on widget state.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* <Support.Trigger>
|
|
19
|
+
* {({ isOpen, isTyping, unreadCount }) => (
|
|
20
|
+
* <span>{isOpen ? "Close" : `Help (${unreadCount})`}</span>
|
|
21
|
+
* )}
|
|
22
|
+
* </Support.Trigger>
|
|
23
|
+
*/
|
|
24
|
+
type TriggerRenderProps = {
|
|
25
|
+
/** Whether the support window is currently open */
|
|
26
|
+
isOpen: boolean;
|
|
27
|
+
/** Whether an agent or AI is currently typing */
|
|
28
|
+
isTyping: boolean;
|
|
29
|
+
/** Number of unread messages */
|
|
30
|
+
unreadCount: number;
|
|
31
|
+
/** Toggle the support window open/closed */
|
|
32
|
+
toggle: () => void;
|
|
10
33
|
};
|
|
11
34
|
/**
|
|
12
|
-
*
|
|
35
|
+
* Padding from viewport edges when avoiding collisions.
|
|
36
|
+
* Can be a single number for all sides, or an object with per-side values.
|
|
13
37
|
*/
|
|
14
|
-
type
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
38
|
+
type CollisionPadding = number | {
|
|
39
|
+
top?: number;
|
|
40
|
+
right?: number;
|
|
41
|
+
bottom?: number;
|
|
42
|
+
left?: number;
|
|
19
43
|
};
|
|
20
44
|
/**
|
|
21
|
-
* Props for
|
|
45
|
+
* Props for the Content component.
|
|
22
46
|
*/
|
|
23
|
-
type
|
|
47
|
+
type ContentProps = {
|
|
48
|
+
className?: string;
|
|
49
|
+
/**
|
|
50
|
+
* Which side of the trigger to place the content.
|
|
51
|
+
* @default "top"
|
|
52
|
+
*/
|
|
53
|
+
side?: Side;
|
|
54
|
+
/**
|
|
55
|
+
* Alignment along the side axis.
|
|
56
|
+
* @default "end"
|
|
57
|
+
*/
|
|
58
|
+
align?: Align;
|
|
59
|
+
/**
|
|
60
|
+
* Distance (in pixels) between the trigger and the content.
|
|
61
|
+
* @default 16
|
|
62
|
+
*/
|
|
63
|
+
sideOffset?: number;
|
|
64
|
+
/**
|
|
65
|
+
* Disable automatic collision avoidance.
|
|
66
|
+
* When true, the content will use static CSS positioning and may overflow the viewport.
|
|
67
|
+
* @default false
|
|
68
|
+
*/
|
|
69
|
+
avoidCollisions?: boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Padding from viewport edges when avoiding collisions.
|
|
72
|
+
* Used by flip and shift middleware to determine when to reposition.
|
|
73
|
+
* @default 8
|
|
74
|
+
*/
|
|
75
|
+
collisionPadding?: CollisionPadding;
|
|
24
76
|
children?: React.ReactNode;
|
|
25
77
|
};
|
|
78
|
+
/**
|
|
79
|
+
* Props for the Root component (full composition mode).
|
|
80
|
+
*/
|
|
81
|
+
type RootProps = {
|
|
82
|
+
/**
|
|
83
|
+
* Whether the widget should open automatically on mount.
|
|
84
|
+
* @default false
|
|
85
|
+
*/
|
|
86
|
+
defaultOpen?: boolean;
|
|
87
|
+
children: React.ReactNode;
|
|
88
|
+
};
|
|
26
89
|
//#endregion
|
|
27
|
-
export {
|
|
90
|
+
export { Align, CollisionPadding, ContentProps, RootProps, Side, TriggerRenderProps };
|
|
28
91
|
//# sourceMappingURL=types.d.ts.map
|
package/support/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../../src/support/types.ts"],"sourcesContent":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../../src/support/types.ts"],"sourcesContent":[],"mappings":";;;;;;AASA;AAKY,KALA,IAAA,GAKK,KAAA,GAAA,QAAA,GAAA,MAAA,GAAA,OAAA;AAiBjB;AAmBA;AAOA;AAMQ,KAjDI,KAAA,GAiDJ,OAAA,GAAA,QAAA,GAAA,KAAA;;;;;AAiCR;;;;;;;KAjEY,kBAAA;;;;;;;;;;;;;;KAmBA,gBAAA;;;;;;;;;KAOA,YAAA;;;;;;SAMJ;;;;;UAKC;;;;;;;;;;;;;;;;;qBAiBW;aACR,KAAA,CAAM;;;;;KAUN,SAAA;;;;;;YAMD,KAAA,CAAM"}
|
package/support.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/*! tailwindcss v4.1.
|
|
2
|
-
@layer base{.cossistant{scroll-behavior:smooth;color:var(--co-primary);color-scheme:normal;--co-font-sans:var(--co-theme-font-sans,"Geist","Inter",sans-serif);--co-font-mono:var(--co-theme-font-mono,"Geist Mono","Inter Mono",monospace);--co-radius:var(--co-theme-radius,.625rem);--co-background-base:var(--co-theme-background,oklch(99% 0 0));--co-foreground-base:var(--co-theme-foreground,oklch(20.5% 0 0));--co-popover-base:var(--co-theme-popover,var(--co-background-base));--co-popover-foreground-base:var(--co-theme-popover-foreground,var(--co-foreground-base));--co-primary-base:var(--co-theme-primary,oklch(14.5% 0 0));--co-primary-foreground-base:var(--co-theme-primary-foreground,oklch(98.5% 0 0));--co-secondary-base:var(--co-theme-secondary,oklch(97% 0 0));--co-secondary-foreground-base:var(--co-theme-secondary-foreground,oklch(14.5% 0 0));--co-border-base:var(--co-theme-border,oklch(92.2% 0 0));--co-input-base:var(--co-theme-input,oklch(92.2% 0 0));--co-ring-base:var(--co-theme-ring,var(--co-primary-base));--co-accent-base:var(--co-theme-accent,var(--co-primary-base));--co-accent-foreground-base:var(--co-theme-accent-foreground,var(--co-primary-foreground-base));--co-background-50-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-50-mix:color-mix(in oklch,var(--co-background-base)98%,var(--co-foreground-base))}}.cossistant{--co-background-100-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-100-mix:color-mix(in oklch,var(--co-background-base)97%,var(--co-foreground-base))}}.cossistant{--co-background-200-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-200-mix:color-mix(in oklch,var(--co-background-base)96%,var(--co-foreground-base))}}.cossistant{--co-background-300-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-300-mix:color-mix(in oklch,var(--co-background-base)95%,var(--co-foreground-base))}}.cossistant{--co-background-400-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-400-mix:color-mix(in oklch,var(--co-background-base)94%,var(--co-foreground-base))}}.cossistant{--co-background-500-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-500-mix:color-mix(in oklch,var(--co-background-base)93%,var(--co-foreground-base))}}.cossistant{--co-background-600-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-600-mix:color-mix(in oklch,var(--co-background-base)92%,var(--co-foreground-base))}}.cossistant{--co-muted-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-muted-mix:color-mix(in oklch,var(--co-background-base)85%,var(--co-foreground-base))}}.cossistant{--co-muted-foreground-mix:var(--co-foreground-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-muted-foreground-mix:color-mix(in oklch,var(--co-foreground-base)70%,white)}}.cossistant{--co-background:var(--co-background-base);--co-background-50:var(--co-theme-background-50,var(--co-background-50-mix,oklch(92% 0 0)));--co-background-100:var(--co-theme-background-100,var(--co-background-100-mix,oklch(93% 0 0)));--co-background-200:var(--co-theme-background-200,var(--co-background-200-mix,oklch(94% 0 0)));--co-background-300:var(--co-theme-background-300,var(--co-background-300-mix,oklch(95% 0 0)));--co-background-400:var(--co-theme-background-400,var(--co-background-400-mix,oklch(96% 0 0)));--co-background-500:var(--co-theme-background-500,var(--co-background-500-mix,oklch(97% 0 0)));--co-background-600:var(--co-theme-background-600,var(--co-background-600-mix,oklch(98% 0 0)));--co-foreground:var(--co-foreground-base);--co-popover:var(--co-popover-base);--co-popover-foreground:var(--co-popover-foreground-base);--co-primary:var(--co-primary-base);--co-primary-foreground:var(--co-primary-foreground-base);--co-secondary:var(--co-secondary-base);--co-secondary-foreground:var(--co-secondary-foreground-base);--co-muted:var(--co-theme-muted,var(--co-muted-mix,oklch(97% 0 0)));--co-muted-foreground:var(--co-theme-muted-foreground,var(--co-muted-foreground-mix,oklch(55.6% 0 0)));--co-border:var(--co-border-base);--co-input:var(--co-input-base);--co-ring:var(--co-ring-base);--co-accent:var(--co-accent-base);--co-accent-foreground:var(--co-accent-foreground-base);--co-pink:var(--co-theme-pink,oklch(76.3% .152 354));--co-yellow:var(--co-theme-yellow,oklch(86.4% .144 99));--co-blue:var(--co-theme-blue,oklch(72.5% .132 241));--co-orange:var(--co-theme-orange,oklch(74.5% .166 50));--co-destructive:var(--co-theme-destructive,oklch(57.7% .245 27.325));--co-destructive-foreground:var(--co-theme-destructive-foreground,oklch(57.7% .245 27.325));--co-success:var(--co-theme-success,oklch(71.7% .18 142));--co-success-foreground:var(--co-theme-success-foreground,oklch(26.5% .052 142.7));--co-neutral:var(--co-theme-neutral,oklch(60.8% 0 0));--co-neutral-foreground:var(--co-theme-neutral-foreground,oklch(25.6% 0 0));--co-warning:var(--co-theme-warning,oklch(86.4% .144 99));--co-warning-foreground:var(--co-theme-warning-foreground,oklch(41.4% .071 99))}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-base:var(--co-theme-background,oklch(15.5% 0 0));--co-foreground-base:var(--co-theme-foreground,oklch(95% 0 0));--co-popover-base:var(--co-theme-popover,oklch(14.5% 0 0));--co-popover-foreground-base:var(--co-theme-popover-foreground,oklch(95% 0 0));--co-primary-base:var(--co-theme-primary,oklch(98.5% 0 0));--co-primary-foreground-base:var(--co-theme-primary-foreground,oklch(14.5% 0 0));--co-secondary-base:var(--co-theme-secondary,oklch(26.9% 0 0));--co-secondary-foreground-base:var(--co-theme-secondary-foreground,oklch(95% 0 0));--co-border-base:var(--co-theme-border,oklch(26.9% 0 0));--co-input-base:var(--co-theme-input,oklch(26.9% 0 0));--co-ring-base:var(--co-theme-ring,var(--co-primary-base));--co-accent-base:var(--co-theme-accent,var(--co-primary-base));--co-accent-foreground-base:var(--co-theme-accent-foreground,var(--co-primary-foreground-base));--co-muted-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-muted-mix:color-mix(in oklch,var(--co-background-base)55%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-muted-foreground-mix:var(--co-foreground-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-muted-foreground-mix:color-mix(in oklch,var(--co-foreground-base)65%,white)}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-50-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-50-mix:color-mix(in oklch,var(--co-background-base)98%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-100-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-100-mix:color-mix(in oklch,var(--co-background-base)96%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-200-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-200-mix:color-mix(in oklch,var(--co-background-base)94%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-300-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-300-mix:color-mix(in oklch,var(--co-background-base)92%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-400-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-400-mix:color-mix(in oklch,var(--co-background-base)90%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-500-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-500-mix:color-mix(in oklch,var(--co-background-base)88%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-600-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-600-mix:color-mix(in oklch,var(--co-background-base)86%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-pink:var(--co-theme-pink,oklch(84.2% .109 354));--co-yellow:var(--co-theme-yellow,oklch(90.3% .111 99));--co-blue:var(--co-theme-blue,oklch(79.8% .089 241));--co-orange:var(--co-theme-orange,oklch(68.2% .194 50));--co-destructive:var(--co-theme-destructive,oklch(39.6% .141 25.723));--co-destructive-foreground:var(--co-theme-destructive-foreground,oklch(63.7% .237 25.331));--co-success:var(--co-theme-success,oklch(60% .15 142));--co-success-foreground:var(--co-theme-success-foreground,oklch(85% .12 142));--co-neutral:var(--co-theme-neutral,oklch(50% 0 0));--co-neutral-foreground:var(--co-theme-neutral-foreground,oklch(85% 0 0));--co-warning:var(--co-theme-warning,oklch(90.3% .111 99));--co-warning-foreground:var(--co-theme-warning-foreground,oklch(85% .1 99))}}@layer utilities{.cossistant .co-scrollbar-thin{scrollbar-width:thin;scrollbar-color:oklch(from var(--co-primary)l c h/.3)transparent}.cossistant .co-scrollbar-thin::-webkit-scrollbar{width:8px;height:8px}.cossistant .co-scrollbar-thin::-webkit-scrollbar-track{background:0 0}.cossistant .co-scrollbar-thin::-webkit-scrollbar-thumb{background-color:oklch(from var(--co-primary)l c h/.3);border-radius:4px}.cossistant .co-scrollbar-thin::-webkit-scrollbar-thumb:hover{background-color:oklch(from var(--co-primary)l c h/.5)}.cossistant .animation-delay-0{animation-delay:0s}.cossistant .animation-delay-200{animation-delay:.2s}.cossistant .animation-delay-400{animation-delay:.4s}.cossistant .dot-bounce-1{animation:1.4s infinite bounce-dot}.cossistant .dot-bounce-2{animation:1.4s .16s infinite bounce-dot}.cossistant .dot-bounce-3{animation:1.4s .32s infinite bounce-dot}}
|
|
1
|
+
/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer base{.cossistant{color:var(--co-primary);color-scheme:normal;--co-font-sans:var(--co-theme-font-sans,"Geist","Inter",sans-serif);--co-font-mono:var(--co-theme-font-mono,"Geist Mono","Inter Mono",monospace);--co-radius:var(--co-theme-radius,.625rem);--co-background-base:var(--co-theme-background,oklch(99% 0 0));--co-foreground-base:var(--co-theme-foreground,oklch(20.5% 0 0));--co-popover-base:var(--co-theme-popover,var(--co-background-base));--co-popover-foreground-base:var(--co-theme-popover-foreground,var(--co-foreground-base));--co-primary-base:var(--co-theme-primary,oklch(14.5% 0 0));--co-primary-foreground-base:var(--co-theme-primary-foreground,oklch(98.5% 0 0));--co-secondary-base:var(--co-theme-secondary,oklch(97% 0 0));--co-secondary-foreground-base:var(--co-theme-secondary-foreground,oklch(14.5% 0 0));--co-border-base:var(--co-theme-border,oklch(92.2% 0 0));--co-input-base:var(--co-theme-input,oklch(92.2% 0 0));--co-ring-base:var(--co-theme-ring,var(--co-primary-base));--co-accent-base:var(--co-theme-accent,var(--co-primary-base));--co-accent-foreground-base:var(--co-theme-accent-foreground,var(--co-primary-foreground-base));--co-background-50-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-50-mix:color-mix(in oklch,var(--co-background-base)98%,var(--co-foreground-base))}}.cossistant{--co-background-100-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-100-mix:color-mix(in oklch,var(--co-background-base)97%,var(--co-foreground-base))}}.cossistant{--co-background-200-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-200-mix:color-mix(in oklch,var(--co-background-base)96%,var(--co-foreground-base))}}.cossistant{--co-background-300-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-300-mix:color-mix(in oklch,var(--co-background-base)95%,var(--co-foreground-base))}}.cossistant{--co-background-400-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-400-mix:color-mix(in oklch,var(--co-background-base)94%,var(--co-foreground-base))}}.cossistant{--co-background-500-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-500-mix:color-mix(in oklch,var(--co-background-base)93%,var(--co-foreground-base))}}.cossistant{--co-background-600-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-background-600-mix:color-mix(in oklch,var(--co-background-base)92%,var(--co-foreground-base))}}.cossistant{--co-muted-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-muted-mix:color-mix(in oklch,var(--co-background-base)85%,var(--co-foreground-base))}}.cossistant{--co-muted-foreground-mix:var(--co-foreground-base)}@supports (color:color-mix(in lab, red, red)){.cossistant{--co-muted-foreground-mix:color-mix(in oklch,var(--co-foreground-base)70%,white)}}.cossistant{--co-background:var(--co-background-base);--co-background-50:var(--co-theme-background-50,var(--co-background-50-mix,oklch(92% 0 0)));--co-background-100:var(--co-theme-background-100,var(--co-background-100-mix,oklch(93% 0 0)));--co-background-200:var(--co-theme-background-200,var(--co-background-200-mix,oklch(94% 0 0)));--co-background-300:var(--co-theme-background-300,var(--co-background-300-mix,oklch(95% 0 0)));--co-background-400:var(--co-theme-background-400,var(--co-background-400-mix,oklch(96% 0 0)));--co-background-500:var(--co-theme-background-500,var(--co-background-500-mix,oklch(97% 0 0)));--co-background-600:var(--co-theme-background-600,var(--co-background-600-mix,oklch(98% 0 0)));--co-foreground:var(--co-foreground-base);--co-popover:var(--co-popover-base);--co-popover-foreground:var(--co-popover-foreground-base);--co-primary:var(--co-primary-base);--co-primary-foreground:var(--co-primary-foreground-base);--co-secondary:var(--co-secondary-base);--co-secondary-foreground:var(--co-secondary-foreground-base);--co-muted:var(--co-theme-muted,var(--co-muted-mix,oklch(97% 0 0)));--co-muted-foreground:var(--co-theme-muted-foreground,var(--co-muted-foreground-mix,oklch(55.6% 0 0)));--co-border:var(--co-border-base);--co-input:var(--co-input-base);--co-ring:var(--co-ring-base);--co-accent:var(--co-accent-base);--co-accent-foreground:var(--co-accent-foreground-base);--co-pink:var(--co-theme-pink,oklch(76.3% .152 354));--co-yellow:var(--co-theme-yellow,oklch(86.4% .144 99));--co-blue:var(--co-theme-blue,oklch(72.5% .132 241));--co-orange:var(--co-theme-orange,oklch(74.5% .166 50));--co-destructive:var(--co-theme-destructive,oklch(57.7% .245 27.325));--co-destructive-foreground:var(--co-theme-destructive-foreground,oklch(57.7% .245 27.325));--co-success:var(--co-theme-success,oklch(71.7% .18 142));--co-success-foreground:var(--co-theme-success-foreground,oklch(26.5% .052 142.7));--co-neutral:var(--co-theme-neutral,oklch(60.8% 0 0));--co-neutral-foreground:var(--co-theme-neutral-foreground,oklch(25.6% 0 0));--co-warning:var(--co-theme-warning,oklch(86.4% .144 99));--co-warning-foreground:var(--co-theme-warning-foreground,oklch(41.4% .071 99))}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-base:var(--co-theme-background,oklch(15.5% 0 0));--co-foreground-base:var(--co-theme-foreground,oklch(95% 0 0));--co-popover-base:var(--co-theme-popover,oklch(14.5% 0 0));--co-popover-foreground-base:var(--co-theme-popover-foreground,oklch(95% 0 0));--co-primary-base:var(--co-theme-primary,oklch(98.5% 0 0));--co-primary-foreground-base:var(--co-theme-primary-foreground,oklch(14.5% 0 0));--co-secondary-base:var(--co-theme-secondary,oklch(26.9% 0 0));--co-secondary-foreground-base:var(--co-theme-secondary-foreground,oklch(95% 0 0));--co-border-base:var(--co-theme-border,oklch(26.9% 0 0));--co-input-base:var(--co-theme-input,oklch(26.9% 0 0));--co-ring-base:var(--co-theme-ring,var(--co-primary-base));--co-accent-base:var(--co-theme-accent,var(--co-primary-base));--co-accent-foreground-base:var(--co-theme-accent-foreground,var(--co-primary-foreground-base));--co-muted-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-muted-mix:color-mix(in oklch,var(--co-background-base)55%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-muted-foreground-mix:var(--co-foreground-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-muted-foreground-mix:color-mix(in oklch,var(--co-foreground-base)65%,white)}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-50-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-50-mix:color-mix(in oklch,var(--co-background-base)98%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-100-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-100-mix:color-mix(in oklch,var(--co-background-base)96%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-200-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-200-mix:color-mix(in oklch,var(--co-background-base)94%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-300-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-300-mix:color-mix(in oklch,var(--co-background-base)92%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-400-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-400-mix:color-mix(in oklch,var(--co-background-base)90%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-500-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-500-mix:color-mix(in oklch,var(--co-background-base)88%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-600-mix:var(--co-background-base)}@supports (color:color-mix(in lab, red, red)){.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-background-600-mix:color-mix(in oklch,var(--co-background-base)86%,var(--co-foreground-base))}}.dark .cossistant,.cossistant[data-color-scheme=dark]{--co-pink:var(--co-theme-pink,oklch(84.2% .109 354));--co-yellow:var(--co-theme-yellow,oklch(90.3% .111 99));--co-blue:var(--co-theme-blue,oklch(79.8% .089 241));--co-orange:var(--co-theme-orange,oklch(68.2% .194 50));--co-destructive:var(--co-theme-destructive,oklch(39.6% .141 25.723));--co-destructive-foreground:var(--co-theme-destructive-foreground,oklch(63.7% .237 25.331));--co-success:var(--co-theme-success,oklch(60% .15 142));--co-success-foreground:var(--co-theme-success-foreground,oklch(85% .12 142));--co-neutral:var(--co-theme-neutral,oklch(50% 0 0));--co-neutral-foreground:var(--co-theme-neutral-foreground,oklch(85% 0 0));--co-warning:var(--co-theme-warning,oklch(90.3% .111 99));--co-warning-foreground:var(--co-theme-warning-foreground,oklch(85% .1 99))}}@layer utilities{.cossistant .co-scrollbar-thin{scrollbar-width:thin;scrollbar-color:oklch(from var(--co-primary)l c h/.3)transparent}.cossistant .co-scrollbar-thin::-webkit-scrollbar{width:8px;height:8px}.cossistant .co-scrollbar-thin::-webkit-scrollbar-track{background:0 0}.cossistant .co-scrollbar-thin::-webkit-scrollbar-thumb{background-color:oklch(from var(--co-primary)l c h/.3);border-radius:4px}.cossistant .co-scrollbar-thin::-webkit-scrollbar-thumb:hover{background-color:oklch(from var(--co-primary)l c h/.5)}.cossistant .animation-delay-0{animation-delay:0s}.cossistant .animation-delay-200{animation-delay:.2s}.cossistant .animation-delay-400{animation-delay:.4s}.cossistant .dot-bounce-1{animation:1.4s infinite bounce-dot}.cossistant .dot-bounce-2{animation:1.4s .16s infinite bounce-dot}.cossistant .dot-bounce-3{animation:1.4s .32s infinite bounce-dot}}
|