@cossistant/react 0.0.5 → 0.0.7
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/README.md +27 -0
- package/conversation.d.ts +3 -3
- package/package.json +4 -3
- package/primitives/avatar/image.d.ts +1 -1
- package/realtime-events.d.ts +3 -3
- package/schemas.d.ts +1 -1
- package/support/components/button.d.ts +1 -1
- package/support/text/index.js +2 -0
- package/support/text/index.js.map +1 -1
- package/support/text/runtime.js +1 -0
- package/support/text/runtime.js.map +1 -1
- package/support.css +1 -1
- package/tailwind.css +404 -0
- package/utils/use-render-element.d.ts.map +1 -1
package/README.md
CHANGED
|
@@ -16,10 +16,37 @@ npm install @cossistant/react
|
|
|
16
16
|
yarn add @cossistant/react
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
+
## CSS Imports
|
|
20
|
+
|
|
21
|
+
The SDK provides two CSS entrypoints to fit your setup:
|
|
22
|
+
|
|
23
|
+
### Option 1: Tailwind v4 Source
|
|
24
|
+
|
|
25
|
+
If you're using Tailwind CSS v4, import the source file to enable full theme customization:
|
|
26
|
+
|
|
27
|
+
```tsx
|
|
28
|
+
import "@cossistant/react/tailwind.css";
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
This imports the raw Tailwind v4 source file, allowing you to override theme variables like `--co-theme-primary` in your own CSS.
|
|
32
|
+
|
|
33
|
+
### Option 2: Plain CSS
|
|
34
|
+
|
|
35
|
+
Import the pre-compiled CSS with no Tailwind dependency:
|
|
36
|
+
|
|
37
|
+
```tsx
|
|
38
|
+
import "@cossistant/react/support.css";
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
This file contains all the compiled styles and works in any React application without requiring Tailwind CSS.
|
|
42
|
+
|
|
43
|
+
> **Note:** Tailwind v3 is not supported. Use the plain CSS import if you're on Tailwind v3.
|
|
44
|
+
|
|
19
45
|
## Render the widget
|
|
20
46
|
|
|
21
47
|
```tsx
|
|
22
48
|
import { SupportProvider, Support } from "@cossistant/react";
|
|
49
|
+
import "@cossistant/react/support.css";
|
|
23
50
|
|
|
24
51
|
export function App() {
|
|
25
52
|
return (
|
package/conversation.d.ts
CHANGED
|
@@ -73,8 +73,8 @@ declare const createConversationResponseSchema: z.ZodObject<{
|
|
|
73
73
|
visitorId: z.ZodString;
|
|
74
74
|
websiteId: z.ZodString;
|
|
75
75
|
status: z.ZodDefault<z.ZodEnum<{
|
|
76
|
-
open: "open";
|
|
77
76
|
resolved: "resolved";
|
|
77
|
+
open: "open";
|
|
78
78
|
spam: "spam";
|
|
79
79
|
}>>;
|
|
80
80
|
deletedAt: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
@@ -170,8 +170,8 @@ declare const listConversationsResponseSchema: z.ZodObject<{
|
|
|
170
170
|
visitorId: z.ZodString;
|
|
171
171
|
websiteId: z.ZodString;
|
|
172
172
|
status: z.ZodDefault<z.ZodEnum<{
|
|
173
|
-
open: "open";
|
|
174
173
|
resolved: "resolved";
|
|
174
|
+
open: "open";
|
|
175
175
|
spam: "spam";
|
|
176
176
|
}>>;
|
|
177
177
|
deletedAt: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
@@ -260,8 +260,8 @@ declare const getConversationResponseSchema: z.ZodObject<{
|
|
|
260
260
|
visitorId: z.ZodString;
|
|
261
261
|
websiteId: z.ZodString;
|
|
262
262
|
status: z.ZodDefault<z.ZodEnum<{
|
|
263
|
-
open: "open";
|
|
264
263
|
resolved: "resolved";
|
|
264
|
+
open: "open";
|
|
265
265
|
spam: "spam";
|
|
266
266
|
}>>;
|
|
267
267
|
deletedAt: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cossistant/react",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.7",
|
|
5
5
|
"private": false,
|
|
6
6
|
"author": "Cossistant team",
|
|
7
7
|
"description": "Headless React SDK for building AI-powered support/chat widgets. Hooks + primitives, WS-driven, TypeScript-first. Next.js-ready, Tailwind optional.",
|
|
@@ -55,6 +55,7 @@
|
|
|
55
55
|
"import": "./hooks/*.js"
|
|
56
56
|
},
|
|
57
57
|
"./support.css": "./support.css",
|
|
58
|
+
"./tailwind.css": "./support.css",
|
|
58
59
|
"./realtime": {
|
|
59
60
|
"types": "./realtime/index.d.ts",
|
|
60
61
|
"import": "./realtime/index.js"
|
|
@@ -75,8 +76,8 @@
|
|
|
75
76
|
"*.css"
|
|
76
77
|
],
|
|
77
78
|
"dependencies": {
|
|
78
|
-
"@cossistant/core": "
|
|
79
|
-
"@cossistant/types": "
|
|
79
|
+
"@cossistant/core": "0.0.7",
|
|
80
|
+
"@cossistant/types": "0.0.7",
|
|
80
81
|
"class-variance-authority": "^0.7.1",
|
|
81
82
|
"clsx": "^2.1.1",
|
|
82
83
|
"nanoid": "^5.1.5",
|
|
@@ -15,7 +15,7 @@ type AvatarImageProps = Omit<React$1.ImgHTMLAttributes<HTMLImageElement>, "src"
|
|
|
15
15
|
* Controlled `<img>` that syncs its loading status back to the avatar context
|
|
16
16
|
* so fallbacks know when to display.
|
|
17
17
|
*/
|
|
18
|
-
declare const AvatarImage: React$1.ForwardRefExoticComponent<Omit<React$1.ImgHTMLAttributes<HTMLImageElement>, "
|
|
18
|
+
declare const AvatarImage: React$1.ForwardRefExoticComponent<Omit<React$1.ImgHTMLAttributes<HTMLImageElement>, "alt" | "src"> & {
|
|
19
19
|
src: string;
|
|
20
20
|
alt?: string;
|
|
21
21
|
asChild?: boolean;
|
package/realtime-events.d.ts
CHANGED
|
@@ -109,8 +109,8 @@ declare const realtimeSchema: {
|
|
|
109
109
|
visitorId: z.ZodString;
|
|
110
110
|
websiteId: z.ZodString;
|
|
111
111
|
status: z.ZodDefault<z.ZodEnum<{
|
|
112
|
-
open: "open";
|
|
113
112
|
resolved: "resolved";
|
|
113
|
+
open: "open";
|
|
114
114
|
spam: "spam";
|
|
115
115
|
}>>;
|
|
116
116
|
deletedAt: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
@@ -180,14 +180,14 @@ declare const realtimeSchema: {
|
|
|
180
180
|
header: z.ZodObject<{
|
|
181
181
|
id: z.ZodString;
|
|
182
182
|
status: z.ZodEnum<{
|
|
183
|
-
open: "open";
|
|
184
183
|
resolved: "resolved";
|
|
184
|
+
open: "open";
|
|
185
185
|
spam: "spam";
|
|
186
186
|
}>;
|
|
187
187
|
priority: z.ZodEnum<{
|
|
188
|
+
normal: "normal";
|
|
188
189
|
high: "high";
|
|
189
190
|
low: "low";
|
|
190
|
-
normal: "normal";
|
|
191
191
|
urgent: "urgent";
|
|
192
192
|
}>;
|
|
193
193
|
organizationId: z.ZodString;
|
package/schemas.d.ts
CHANGED
|
@@ -10,8 +10,8 @@ declare const conversationSchema: z.ZodObject<{
|
|
|
10
10
|
visitorId: z.ZodString;
|
|
11
11
|
websiteId: z.ZodString;
|
|
12
12
|
status: z.ZodDefault<z.ZodEnum<{
|
|
13
|
-
open: "open";
|
|
14
13
|
resolved: "resolved";
|
|
14
|
+
open: "open";
|
|
15
15
|
spam: "spam";
|
|
16
16
|
}>>;
|
|
17
17
|
deletedAt: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
@@ -4,7 +4,7 @@ import * as class_variance_authority_dist_types0 from "class-variance-authority/
|
|
|
4
4
|
|
|
5
5
|
//#region src/support/components/button.d.ts
|
|
6
6
|
declare const coButtonVariants: (props?: ({
|
|
7
|
-
variant?: "
|
|
7
|
+
variant?: "default" | "tab" | "secondary" | "ghost" | "outline" | "tab-selected" | null | undefined;
|
|
8
8
|
size?: "default" | "large" | "icon" | null | undefined;
|
|
9
9
|
} & class_variance_authority_dist_types0.ClassProp) | undefined) => string;
|
|
10
10
|
type CossistantButtonProps = React$1.ComponentProps<"button"> & VariantProps<typeof coButtonVariants>;
|
package/support/text/index.js
CHANGED
|
@@ -5,6 +5,8 @@ import React from "react";
|
|
|
5
5
|
import { jsx } from "react/jsx-runtime";
|
|
6
6
|
|
|
7
7
|
//#region src/support/text/index.tsx
|
|
8
|
+
/** biome-ignore-all lint/correctness/useExhaustiveDependencies: dependencies are intentionally managed */
|
|
9
|
+
/** biome-ignore-all lint/correctness/noChildrenProp: children prop is needed for React.createElement */
|
|
8
10
|
const SupportTextRuntimeContext = React.createContext(null);
|
|
9
11
|
/**
|
|
10
12
|
* Supplies localized copy and formatting helpers for the support widget. The
|
|
@@ -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":"
|
|
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"}
|
package/support/text/runtime.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","names":["BUILTIN_LOCALES: Record<SupportLocale, SupportLocaleMessages>","TIME_OF_DAY_THRESHOLDS: Array<{\n\ttoken: SupportTimeOfDayToken;\n\thour: number;\n}>","fallback: Record<SupportTimeOfDayToken, string>","labels: Partial<Record<SupportTimeOfDayToken, string>>","token: SupportTimeOfDayToken","chain: string[]","map: NormalizedOverrides"],"sources":["../../../src/support/text/runtime.ts"],"sourcesContent":["/** biome-ignore-all lint/nursery/useMaxParams: ok here */\nimport en from \"./locales/en\";\nimport es from \"./locales/es\";\nimport fr from \"./locales/fr\";\nimport type {\n\tSupportLocale,\n\tSupportLocaleMessages,\n\tSupportTextContentOverrides,\n\tSupportTextContext,\n\tSupportTextKey,\n\tSupportTextUtils,\n\tSupportTextVariables,\n\tSupportTimeOfDayToken,\n} from \"./locales/keys\";\n\nexport type NormalizedOverride<K extends SupportTextKey> = {\n\tanyLocale?: SupportLocaleMessages[K];\n\tbyLocale: Map<string, SupportLocaleMessages[K]>;\n};\n\nexport type NormalizedOverrides = Map<\n\tSupportTextKey,\n\tNormalizedOverride<SupportTextKey>\n>;\n\nexport const BUILTIN_LOCALES: Record<SupportLocale, SupportLocaleMessages> = {\n\ten,\n\tfr,\n\tes,\n};\n\nconst TIME_OF_DAY_THRESHOLDS: Array<{\n\ttoken: SupportTimeOfDayToken;\n\thour: number;\n}> = [\n\t{ token: \"morning\", hour: 9 },\n\t{ token: \"afternoon\", hour: 15 },\n\t{ token: \"evening\", hour: 20 },\n];\n\nfunction buildDayPeriodLabels(\n\tlocale: string\n): Record<SupportTimeOfDayToken, string> {\n\tconst fallback: Record<SupportTimeOfDayToken, string> = {\n\t\tmorning: \"morning\",\n\t\tafternoon: \"afternoon\",\n\t\tevening: \"evening\",\n\t};\n\n\ttry {\n\t\tconst formatter = new Intl.DateTimeFormat(locale, {\n\t\t\thour: \"numeric\",\n\t\t\thour12: true,\n\t\t});\n\n\t\tconst labels: Partial<Record<SupportTimeOfDayToken, string>> = {};\n\t\tfor (const { token, hour } of TIME_OF_DAY_THRESHOLDS) {\n\t\t\tconst parts = formatter.formatToParts(new Date(2020, 0, 1, hour));\n\t\t\tconst part = parts.find((segment) => segment.type === \"dayPeriod\");\n\t\t\tif (part?.value) {\n\t\t\t\tconst normalized = part.value.trim();\n\t\t\t\tif (normalized) {\n\t\t\t\t\tlabels[token] = normalized;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tmorning: labels.morning ?? fallback.morning,\n\t\t\tafternoon: labels.afternoon ?? fallback.afternoon,\n\t\t\tevening: labels.evening ?? fallback.evening,\n\t\t};\n\t} catch {\n\t\treturn fallback;\n\t}\n}\n\n/**\n * Builds formatting helpers tailored for the visitor locale. The utilities are\n * memoized by callers and include number formatting, pluralization, title\n * casing and dynamic time-of-day descriptions.\n */\nexport function createTextUtils(\n\tlocale: string,\n\tisHydrated = false\n): SupportTextUtils {\n\tconst numberFormatter = new Intl.NumberFormat(locale);\n\tconst pluralRules = new Intl.PluralRules(locale);\n\tconst dayPeriodLabels = buildDayPeriodLabels(locale);\n\n\treturn {\n\t\tformatNumber: (value: number, options?: Intl.NumberFormatOptions) =>\n\t\t\toptions\n\t\t\t\t? new Intl.NumberFormat(locale, options).format(value)\n\t\t\t\t: numberFormatter.format(value),\n\t\tpluralize: (count: number, options: { one: string; other: string }) => {\n\t\t\tconst rule = pluralRules.select(count);\n\t\t\treturn rule === \"one\" ? options.one : options.other;\n\t\t},\n\t\ttitleCase: (value: string) => {\n\t\t\tif (!value) {\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\treturn value.charAt(0).toUpperCase() + value.slice(1);\n\t\t},\n\t\ttimeOfDay: () => {\n\t\t\t// Return a stable default during SSR to avoid hydration mismatches\n\t\t\tif (!isHydrated) {\n\t\t\t\treturn {\n\t\t\t\t\ttoken: \"morning\" as SupportTimeOfDayToken,\n\t\t\t\t\tlabel: dayPeriodLabels.morning,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst hour = new Date().getHours();\n\t\t\tlet token: SupportTimeOfDayToken;\n\t\t\tif (hour < 12) {\n\t\t\t\ttoken = \"morning\";\n\t\t\t} else if (hour < 18) {\n\t\t\t\ttoken = \"afternoon\";\n\t\t\t} else {\n\t\t\t\ttoken = \"evening\";\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttoken,\n\t\t\t\tlabel: dayPeriodLabels[token],\n\t\t\t};\n\t\t},\n\t};\n}\n\n/**\n * Normalize a locale string to its base language code\n * Examples:\n * - \"en-US\" -> \"en\"\n * - \"en-GB\" -> \"en\"\n * - \"fr-FR\" -> \"fr\"\n */\nfunction normalizeLocaleString(locale: string): string {\n\tconst [base] = locale.toLowerCase().split(\"-\");\n\treturn base || locale.toLowerCase();\n}\n\n/**\n * Derives the locale preference order from visitor/provider hints while\n * guaranteeing an English fallback.\n */\nexport function buildLocaleChain(\n\tpreferences: Array<string | null | undefined>\n): string[] {\n\tconst seen = new Set<string>();\n\tconst chain: string[] = [];\n\n\tconst pushLocale = (value: string) => {\n\t\t// Always normalize to base language (en-US -> en, en-GB -> en)\n\t\tconst normalized = normalizeLocaleString(value);\n\t\tif (!seen.has(normalized)) {\n\t\t\tseen.add(normalized);\n\t\t\tchain.push(normalized);\n\t\t}\n\t};\n\n\tfor (const candidate of preferences) {\n\t\tif (!candidate) {\n\t\t\tcontinue;\n\t\t}\n\t\tpushLocale(candidate);\n\t}\n\n\t// Always fallback to English\n\tif (!seen.has(\"en\")) {\n\t\tchain.push(\"en\");\n\t}\n\n\treturn chain;\n}\n\n/**\n * Canonicalizes text override definitions into a lookup map that can be\n * consumed efficiently at runtime.\n */\nexport function normalizeOverrides(\n\toverrides?: SupportTextContentOverrides<string>\n): NormalizedOverrides {\n\tconst map: NormalizedOverrides = new Map();\n\n\tif (!overrides) {\n\t\treturn map;\n\t}\n\n\tfor (const key of Object.keys(overrides) as SupportTextKey[]) {\n\t\tconst value = overrides[key];\n\t\tif (!value) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (typeof value === \"string\" || typeof value === \"function\") {\n\t\t\tmap.set(key, {\n\t\t\t\tanyLocale: value as SupportLocaleMessages[typeof key],\n\t\t\t\tbyLocale: new Map(),\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst byLocale = new Map<string, SupportLocaleMessages[typeof key]>();\n\t\tfor (const [locale, localizedValue] of Object.entries(value)) {\n\t\t\tif (!localizedValue) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tbyLocale.set(\n\t\t\t\tlocale.toLowerCase(),\n\t\t\t\tlocalizedValue as SupportLocaleMessages[typeof key]\n\t\t\t);\n\t\t}\n\n\t\tmap.set(key, { byLocale });\n\t}\n\n\treturn map;\n}\n\n/**\n * Finds the best matching localized string for a key, consulting overrides\n * before bundled locale dictionaries.\n */\nexport function resolveMessage<K extends SupportTextKey>(\n\tkey: K,\n\tlocaleChain: string[],\n\toverrides: NormalizedOverrides\n): SupportLocaleMessages[K] {\n\tconst override = overrides.get(key) as NormalizedOverride<K> | undefined;\n\tif (override) {\n\t\tfor (const locale of localeChain) {\n\t\t\tconst localized = override.byLocale.get(locale);\n\t\t\tif (localized) {\n\t\t\t\treturn localized;\n\t\t\t}\n\t\t}\n\t\tif (override.anyLocale) {\n\t\t\treturn override.anyLocale;\n\t\t}\n\t}\n\n\tfor (const locale of localeChain) {\n\t\tif (locale in BUILTIN_LOCALES) {\n\t\t\treturn BUILTIN_LOCALES[locale as SupportLocale][key];\n\t\t}\n\t}\n\n\treturn BUILTIN_LOCALES.en[key];\n}\n\n/**\n * Produces the final rendered string by executing function overrides or\n * interpolating variables into template literals.\n */\nexport function evaluateMessage<K extends SupportTextKey>(\n\tkey: K,\n\tmessage: SupportLocaleMessages[K],\n\tvariables: SupportTextVariables<K> | undefined,\n\tcontext: SupportTextContext,\n\tutils: SupportTextUtils\n): string {\n\tif (typeof message === \"function\") {\n\t\treturn message({\n\t\t\tvariables: variables as never,\n\t\t\tcontext,\n\t\t\tutils,\n\t\t});\n\t}\n\n\treturn message;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime.js","names":["BUILTIN_LOCALES: Record<SupportLocale, SupportLocaleMessages>","TIME_OF_DAY_THRESHOLDS: Array<{\n\ttoken: SupportTimeOfDayToken;\n\thour: number;\n}>","fallback: Record<SupportTimeOfDayToken, string>","labels: Partial<Record<SupportTimeOfDayToken, string>>","token: SupportTimeOfDayToken","chain: string[]","map: NormalizedOverrides"],"sources":["../../../src/support/text/runtime.ts"],"sourcesContent":["/** biome-ignore-all lint/nursery/useMaxParams: ok here */\nimport en from \"./locales/en\";\nimport es from \"./locales/es\";\nimport fr from \"./locales/fr\";\nimport type {\n\tSupportLocale,\n\tSupportLocaleMessages,\n\tSupportTextContentOverrides,\n\tSupportTextContext,\n\tSupportTextKey,\n\tSupportTextUtils,\n\tSupportTextVariables,\n\tSupportTimeOfDayToken,\n} from \"./locales/keys\";\n\nexport type NormalizedOverride<K extends SupportTextKey> = {\n\tanyLocale?: SupportLocaleMessages[K];\n\tbyLocale: Map<string, SupportLocaleMessages[K]>;\n};\n\nexport type NormalizedOverrides = Map<\n\tSupportTextKey,\n\tNormalizedOverride<SupportTextKey>\n>;\n\nexport const BUILTIN_LOCALES: Record<SupportLocale, SupportLocaleMessages> = {\n\ten,\n\tfr,\n\tes,\n};\n\nconst TIME_OF_DAY_THRESHOLDS: Array<{\n\ttoken: SupportTimeOfDayToken;\n\thour: number;\n}> = [\n\t{ token: \"morning\", hour: 9 },\n\t{ token: \"afternoon\", hour: 15 },\n\t{ token: \"evening\", hour: 20 },\n];\n\nfunction buildDayPeriodLabels(\n\tlocale: string\n): Record<SupportTimeOfDayToken, string> {\n\tconst fallback: Record<SupportTimeOfDayToken, string> = {\n\t\tmorning: \"morning\",\n\t\tafternoon: \"afternoon\",\n\t\tevening: \"evening\",\n\t};\n\n\ttry {\n\t\tconst formatter = new Intl.DateTimeFormat(locale, {\n\t\t\thour: \"numeric\",\n\t\t\thour12: true,\n\t\t});\n\n\t\tconst labels: Partial<Record<SupportTimeOfDayToken, string>> = {};\n\t\tfor (const { token, hour } of TIME_OF_DAY_THRESHOLDS) {\n\t\t\tconst parts = formatter.formatToParts(new Date(2020, 0, 1, hour));\n\t\t\tconst part = parts.find((segment) => segment.type === \"dayPeriod\");\n\t\t\tif (part?.value) {\n\t\t\t\tconst normalized = part.value.trim();\n\t\t\t\tif (normalized) {\n\t\t\t\t\tlabels[token] = normalized;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tmorning: labels.morning ?? fallback.morning,\n\t\t\tafternoon: labels.afternoon ?? fallback.afternoon,\n\t\t\tevening: labels.evening ?? fallback.evening,\n\t\t};\n\t} catch {\n\t\treturn fallback;\n\t}\n}\n\n/**\n * Builds formatting helpers tailored for the visitor locale. The utilities are\n * memoized by callers and include number formatting, pluralization, title\n * casing and dynamic time-of-day descriptions.\n */\nexport function createTextUtils(\n\tlocale: string,\n\tisHydrated = false\n): SupportTextUtils {\n\tconst numberFormatter = new Intl.NumberFormat(locale);\n\tconst pluralRules = new Intl.PluralRules(locale);\n\tconst dayPeriodLabels = buildDayPeriodLabels(locale);\n\n\treturn {\n\t\tformatNumber: (value: number, options?: Intl.NumberFormatOptions) =>\n\t\t\toptions\n\t\t\t\t? new Intl.NumberFormat(locale, options).format(value)\n\t\t\t\t: numberFormatter.format(value),\n\t\tpluralize: (count: number, options: { one: string; other: string }) => {\n\t\t\tconst rule = pluralRules.select(count);\n\t\t\treturn rule === \"one\" ? options.one : options.other;\n\t\t},\n\t\ttitleCase: (value: string) => {\n\t\t\tif (!value) {\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\treturn value.charAt(0).toUpperCase() + value.slice(1);\n\t\t},\n\t\ttimeOfDay: () => {\n\t\t\t// Return a stable default during SSR to avoid hydration mismatches\n\t\t\tif (!isHydrated) {\n\t\t\t\treturn {\n\t\t\t\t\ttoken: \"morning\" as SupportTimeOfDayToken,\n\t\t\t\t\tlabel: dayPeriodLabels.morning,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst hour = new Date().getHours();\n\t\t\tlet token: SupportTimeOfDayToken;\n\t\t\tif (hour < 12) {\n\t\t\t\ttoken = \"morning\";\n\t\t\t} else if (hour < 18) {\n\t\t\t\ttoken = \"afternoon\";\n\t\t\t} else {\n\t\t\t\ttoken = \"evening\";\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttoken,\n\t\t\t\tlabel: dayPeriodLabels[token],\n\t\t\t};\n\t\t},\n\t};\n}\n\n/**\n * Normalize a locale string to its base language code\n * Examples:\n * - \"en-US\" -> \"en\"\n * - \"en-GB\" -> \"en\"\n * - \"fr-FR\" -> \"fr\"\n */\nfunction normalizeLocaleString(locale: string): string {\n\tconst [base] = locale.toLowerCase().split(\"-\");\n\treturn base || locale.toLowerCase();\n}\n\n/**\n * Derives the locale preference order from visitor/provider hints while\n * guaranteeing an English fallback.\n */\nexport function buildLocaleChain(\n\tpreferences: Array<string | null | undefined>\n): string[] {\n\tconst seen = new Set<string>();\n\tconst chain: string[] = [];\n\n\tconst pushLocale = (value: string) => {\n\t\t// Always normalize to base language (en-US -> en, en-GB -> en)\n\t\tconst normalized = normalizeLocaleString(value);\n\t\tif (!seen.has(normalized)) {\n\t\t\tseen.add(normalized);\n\t\t\tchain.push(normalized);\n\t\t}\n\t};\n\n\tfor (const candidate of preferences) {\n\t\tif (!candidate) {\n\t\t\tcontinue;\n\t\t}\n\t\tpushLocale(candidate);\n\t}\n\n\t// Always fallback to English\n\tif (!seen.has(\"en\")) {\n\t\tchain.push(\"en\");\n\t}\n\n\treturn chain;\n}\n\n/**\n * Canonicalizes text override definitions into a lookup map that can be\n * consumed efficiently at runtime.\n */\nexport function normalizeOverrides(\n\toverrides?: SupportTextContentOverrides<string>\n): NormalizedOverrides {\n\tconst map: NormalizedOverrides = new Map();\n\n\tif (!overrides) {\n\t\treturn map;\n\t}\n\n\tfor (const key of Object.keys(overrides) as SupportTextKey[]) {\n\t\tconst value = overrides[key];\n\t\tif (!value) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (typeof value === \"string\" || typeof value === \"function\") {\n\t\t\tmap.set(key, {\n\t\t\t\tanyLocale: value as SupportLocaleMessages[typeof key],\n\t\t\t\tbyLocale: new Map(),\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst byLocale = new Map<string, SupportLocaleMessages[typeof key]>();\n\t\tfor (const [locale, localizedValue] of Object.entries(value)) {\n\t\t\tif (!localizedValue) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tbyLocale.set(\n\t\t\t\tlocale.toLowerCase(),\n\t\t\t\tlocalizedValue as SupportLocaleMessages[typeof key]\n\t\t\t);\n\t\t}\n\n\t\tmap.set(key, { byLocale });\n\t}\n\n\treturn map;\n}\n\n/**\n * Finds the best matching localized string for a key, consulting overrides\n * before bundled locale dictionaries.\n */\nexport function resolveMessage<K extends SupportTextKey>(\n\tkey: K,\n\tlocaleChain: string[],\n\toverrides: NormalizedOverrides\n): SupportLocaleMessages[K] {\n\tconst override = overrides.get(key) as NormalizedOverride<K> | undefined;\n\tif (override) {\n\t\tfor (const locale of localeChain) {\n\t\t\tconst localized = override.byLocale.get(locale);\n\t\t\tif (localized) {\n\t\t\t\treturn localized;\n\t\t\t}\n\t\t}\n\t\tif (override.anyLocale) {\n\t\t\treturn override.anyLocale;\n\t\t}\n\t}\n\n\tfor (const locale of localeChain) {\n\t\tif (locale in BUILTIN_LOCALES) {\n\t\t\treturn BUILTIN_LOCALES[locale as SupportLocale][key];\n\t\t}\n\t}\n\n\treturn BUILTIN_LOCALES.en[key];\n}\n\n/**\n * Produces the final rendered string by executing function overrides or\n * interpolating variables into template literals.\n */\nexport function evaluateMessage<K extends SupportTextKey>(\n\tkey: K,\n\tmessage: SupportLocaleMessages[K],\n\tvariables: SupportTextVariables<K> | undefined,\n\tcontext: SupportTextContext,\n\tutils: SupportTextUtils\n): string {\n\tif (typeof message === \"function\") {\n\t\treturn message({\n\t\t\tvariables: variables as never,\n\t\t\tcontext,\n\t\t\tutils,\n\t\t});\n\t}\n\n\treturn message;\n}\n"],"mappings":"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"}
|
package/support.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/*! tailwindcss v4.1.
|
|
1
|
+
/*! tailwindcss v4.1.17 | MIT License | https://tailwindcss.com */
|
|
2
2
|
@layer base{.cossistant{border-color:var(--co-border);scroll-behavior:smooth;color-scheme:normal;--co-font-sans:var(--co-theme-font-sans,var(--font-sans,"Geist","Inter",sans-serif));--co-font-mono:var(--co-theme-font-mono,var(--font-mono,"Geist Mono","Inter Mono",monospace));--co-border-color:var(--co-theme-border-color,var(--color-border,oklch(92.2% 0 0)));--co-radius:var(--co-theme-radius,var(--radius,.625rem));--co-background-base:var(--co-theme-background,var(--background,oklch(99% 0 0)));--co-foreground-base:var(--co-theme-foreground,var(--foreground,oklch(14.5% 0 0)));--co-popover-base:var(--co-theme-popover,var(--popover,var(--co-background-base)));--co-popover-foreground-base:var(--co-theme-popover-foreground,var(--popover-foreground,var(--co-foreground-base)));--co-primary-base:var(--co-theme-primary,var(--primary,oklch(20.5% 0 0)));--co-primary-foreground-base:var(--co-theme-primary-foreground,var(--primary-foreground,oklch(98.5% 0 0)));--co-secondary-base:var(--co-theme-secondary,var(--secondary,oklch(97% 0 0)));--co-secondary-foreground-base:var(--co-theme-secondary-foreground,var(--secondary-foreground,oklch(20.5% 0 0)));--co-border-base:var(--co-theme-border,var(--border,oklch(92.2% 0 0)));--co-input-base:var(--co-theme-input,var(--input,oklch(92.2% 0 0)));--co-ring-base:var(--co-theme-ring,var(--ring,var(--co-primary-base)));--co-accent-base:var(--co-theme-accent,var(--accent,var(--co-primary-base)));--co-accent-foreground-base:var(--co-theme-accent-foreground,var(--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(--muted,var(--co-muted-mix,oklch(97% 0 0))));--co-muted-foreground:var(--co-theme-muted-foreground,var(--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,var(--background,oklch(15.5% 0 0)));--co-foreground-base:var(--co-theme-foreground,var(--foreground,oklch(98.5% 0 0)));--co-border-color:var(--co-theme-border-color,var(--color-border,oklch(26.9% 0 0)));--co-popover-base:var(--co-theme-popover,var(--popover,oklch(14.5% 0 0)));--co-popover-foreground-base:var(--co-theme-popover-foreground,var(--popover-foreground,oklch(98.5% 0 0)));--co-primary-base:var(--co-theme-primary,var(--primary,oklch(98.5% 0 0)));--co-primary-foreground-base:var(--co-theme-primary-foreground,var(--primary-foreground,oklch(20.5% 0 0)));--co-secondary-base:var(--co-theme-secondary,var(--secondary,oklch(26.9% 0 0)));--co-secondary-foreground-base:var(--co-theme-secondary-foreground,var(--secondary-foreground,oklch(98.5% 0 0)));--co-border-base:var(--co-theme-border,var(--border,oklch(26.9% 0 0)));--co-input-base:var(--co-theme-input,var(--input,oklch(26.9% 0 0)));--co-ring-base:var(--co-theme-ring,var(--ring,var(--co-primary-base)));--co-accent-base:var(--co-theme-accent,var(--accent,var(--co-primary-base)));--co-accent-foreground-base:var(--co-theme-accent-foreground,var(--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 .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}}
|
package/tailwind.css
ADDED
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
@custom-variant dark (&:is(.dark *));
|
|
2
|
+
|
|
3
|
+
@layer base {
|
|
4
|
+
.cossistant {
|
|
5
|
+
@apply border-co-border;
|
|
6
|
+
@apply scroll-smooth;
|
|
7
|
+
|
|
8
|
+
color-scheme: inherit;
|
|
9
|
+
|
|
10
|
+
/* Typeface tokens */
|
|
11
|
+
--co-font-sans: var(
|
|
12
|
+
--co-theme-font-sans,
|
|
13
|
+
var(--font-sans, "Geist", "Inter", sans-serif)
|
|
14
|
+
);
|
|
15
|
+
--co-font-mono: var(
|
|
16
|
+
--co-theme-font-mono,
|
|
17
|
+
var(--font-mono, "Geist Mono", "Inter Mono", monospace)
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
--co-border-color: var(
|
|
21
|
+
--co-theme-border-color,
|
|
22
|
+
var(--color-border, oklch(92.2% 0 0))
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
/* Core surfaces */
|
|
26
|
+
--co-radius: var(--co-theme-radius, var(--radius, 0.625rem));
|
|
27
|
+
--co-background-base: var(
|
|
28
|
+
--co-theme-background,
|
|
29
|
+
var(--background, oklch(99% 0 0))
|
|
30
|
+
);
|
|
31
|
+
--co-foreground-base: var(
|
|
32
|
+
--co-theme-foreground,
|
|
33
|
+
var(--foreground, oklch(14.5% 0 0))
|
|
34
|
+
);
|
|
35
|
+
--co-popover-base: var(
|
|
36
|
+
--co-theme-popover,
|
|
37
|
+
var(--popover, var(--co-background-base))
|
|
38
|
+
);
|
|
39
|
+
--co-popover-foreground-base: var(
|
|
40
|
+
--co-theme-popover-foreground,
|
|
41
|
+
var(--popover-foreground, var(--co-foreground-base))
|
|
42
|
+
);
|
|
43
|
+
--co-primary-base: var(
|
|
44
|
+
--co-theme-primary,
|
|
45
|
+
var(--primary, oklch(20.5% 0 0))
|
|
46
|
+
);
|
|
47
|
+
--co-primary-foreground-base: var(
|
|
48
|
+
--co-theme-primary-foreground,
|
|
49
|
+
var(--primary-foreground, oklch(98.5% 0 0))
|
|
50
|
+
);
|
|
51
|
+
--co-secondary-base: var(
|
|
52
|
+
--co-theme-secondary,
|
|
53
|
+
var(--secondary, oklch(97% 0 0))
|
|
54
|
+
);
|
|
55
|
+
--co-secondary-foreground-base: var(
|
|
56
|
+
--co-theme-secondary-foreground,
|
|
57
|
+
var(--secondary-foreground, oklch(20.5% 0 0))
|
|
58
|
+
);
|
|
59
|
+
--co-border-base: var(--co-theme-border, var(--border, oklch(92.2% 0 0)));
|
|
60
|
+
--co-input-base: var(--co-theme-input, var(--input, oklch(92.2% 0 0)));
|
|
61
|
+
--co-ring-base: var(--co-theme-ring, var(--ring, var(--co-primary-base)));
|
|
62
|
+
--co-accent-base: var(
|
|
63
|
+
--co-theme-accent,
|
|
64
|
+
var(--accent, var(--co-primary-base))
|
|
65
|
+
);
|
|
66
|
+
--co-accent-foreground-base: var(
|
|
67
|
+
--co-theme-accent-foreground,
|
|
68
|
+
var(--accent-foreground, var(--co-primary-foreground-base))
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
/* Neutral shades derived from the background */
|
|
72
|
+
--co-background-50-mix: color-mix(
|
|
73
|
+
in oklch,
|
|
74
|
+
var(--co-background-base) 98%,
|
|
75
|
+
var(--co-foreground-base)
|
|
76
|
+
);
|
|
77
|
+
--co-background-100-mix: color-mix(
|
|
78
|
+
in oklch,
|
|
79
|
+
var(--co-background-base) 97%,
|
|
80
|
+
var(--co-foreground-base)
|
|
81
|
+
);
|
|
82
|
+
--co-background-200-mix: color-mix(
|
|
83
|
+
in oklch,
|
|
84
|
+
var(--co-background-base) 96%,
|
|
85
|
+
var(--co-foreground-base)
|
|
86
|
+
);
|
|
87
|
+
--co-background-300-mix: color-mix(
|
|
88
|
+
in oklch,
|
|
89
|
+
var(--co-background-base) 95%,
|
|
90
|
+
var(--co-foreground-base)
|
|
91
|
+
);
|
|
92
|
+
--co-background-400-mix: color-mix(
|
|
93
|
+
in oklch,
|
|
94
|
+
var(--co-background-base) 94%,
|
|
95
|
+
var(--co-foreground-base)
|
|
96
|
+
);
|
|
97
|
+
--co-background-500-mix: color-mix(
|
|
98
|
+
in oklch,
|
|
99
|
+
var(--co-background-base) 93%,
|
|
100
|
+
var(--co-foreground-base)
|
|
101
|
+
);
|
|
102
|
+
--co-background-600-mix: color-mix(
|
|
103
|
+
in oklch,
|
|
104
|
+
var(--co-background-base) 92%,
|
|
105
|
+
var(--co-foreground-base)
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
/* Muted tones */
|
|
109
|
+
--co-muted-mix: color-mix(
|
|
110
|
+
in oklch,
|
|
111
|
+
var(--co-background-base) 85%,
|
|
112
|
+
var(--co-foreground-base)
|
|
113
|
+
);
|
|
114
|
+
--co-muted-foreground-mix: color-mix(
|
|
115
|
+
in oklch,
|
|
116
|
+
var(--co-foreground-base) 70%,
|
|
117
|
+
white
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
/* Public tokens consumed by Tailwind theme */
|
|
121
|
+
--co-background: var(--co-background-base);
|
|
122
|
+
--co-background-50: var(
|
|
123
|
+
--co-theme-background-50,
|
|
124
|
+
var(--co-background-50-mix, oklch(92% 0 0))
|
|
125
|
+
);
|
|
126
|
+
--co-background-100: var(
|
|
127
|
+
--co-theme-background-100,
|
|
128
|
+
var(--co-background-100-mix, oklch(93% 0 0))
|
|
129
|
+
);
|
|
130
|
+
--co-background-200: var(
|
|
131
|
+
--co-theme-background-200,
|
|
132
|
+
var(--co-background-200-mix, oklch(94% 0 0))
|
|
133
|
+
);
|
|
134
|
+
--co-background-300: var(
|
|
135
|
+
--co-theme-background-300,
|
|
136
|
+
var(--co-background-300-mix, oklch(95% 0 0))
|
|
137
|
+
);
|
|
138
|
+
--co-background-400: var(
|
|
139
|
+
--co-theme-background-400,
|
|
140
|
+
var(--co-background-400-mix, oklch(96% 0 0))
|
|
141
|
+
);
|
|
142
|
+
--co-background-500: var(
|
|
143
|
+
--co-theme-background-500,
|
|
144
|
+
var(--co-background-500-mix, oklch(97% 0 0))
|
|
145
|
+
);
|
|
146
|
+
--co-background-600: var(
|
|
147
|
+
--co-theme-background-600,
|
|
148
|
+
var(--co-background-600-mix, oklch(98% 0 0))
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
--co-foreground: var(--co-foreground-base);
|
|
152
|
+
--co-popover: var(--co-popover-base);
|
|
153
|
+
--co-popover-foreground: var(--co-popover-foreground-base);
|
|
154
|
+
--co-primary: var(--co-primary-base);
|
|
155
|
+
--co-primary-foreground: var(--co-primary-foreground-base);
|
|
156
|
+
--co-secondary: var(--co-secondary-base);
|
|
157
|
+
--co-secondary-foreground: var(--co-secondary-foreground-base);
|
|
158
|
+
--co-muted: var(
|
|
159
|
+
--co-theme-muted,
|
|
160
|
+
var(--muted, var(--co-muted-mix, oklch(97% 0 0)))
|
|
161
|
+
);
|
|
162
|
+
--co-muted-foreground: var(
|
|
163
|
+
--co-theme-muted-foreground,
|
|
164
|
+
var(--muted-foreground, var(--co-muted-foreground-mix, oklch(55.6% 0 0)))
|
|
165
|
+
);
|
|
166
|
+
--co-border: var(--co-border-base);
|
|
167
|
+
--co-input: var(--co-input-base);
|
|
168
|
+
--co-ring: var(--co-ring-base);
|
|
169
|
+
--co-accent: var(--co-accent-base);
|
|
170
|
+
--co-accent-foreground: var(--co-accent-foreground-base);
|
|
171
|
+
|
|
172
|
+
/* Accent palette */
|
|
173
|
+
--co-pink: var(--co-theme-pink, oklch(76.3% 0.152 354));
|
|
174
|
+
--co-yellow: var(--co-theme-yellow, oklch(86.4% 0.144 99));
|
|
175
|
+
--co-blue: var(--co-theme-blue, oklch(72.5% 0.132 241));
|
|
176
|
+
--co-orange: var(--co-theme-orange, oklch(74.5% 0.166 50));
|
|
177
|
+
|
|
178
|
+
/* Status colors */
|
|
179
|
+
--co-destructive: var(--co-theme-destructive, oklch(57.7% 0.245 27.325));
|
|
180
|
+
--co-destructive-foreground: var(
|
|
181
|
+
--co-theme-destructive-foreground,
|
|
182
|
+
oklch(57.7% 0.245 27.325)
|
|
183
|
+
);
|
|
184
|
+
--co-success: var(--co-theme-success, oklch(71.7% 0.18 142));
|
|
185
|
+
--co-success-foreground: var(
|
|
186
|
+
--co-theme-success-foreground,
|
|
187
|
+
oklch(26.5% 0.052 142.7)
|
|
188
|
+
);
|
|
189
|
+
--co-neutral: var(--co-theme-neutral, oklch(60.8% 0 0));
|
|
190
|
+
--co-neutral-foreground: var(
|
|
191
|
+
--co-theme-neutral-foreground,
|
|
192
|
+
oklch(25.6% 0 0)
|
|
193
|
+
);
|
|
194
|
+
--co-warning: var(--co-theme-warning, oklch(86.4% 0.144 99));
|
|
195
|
+
--co-warning-foreground: var(
|
|
196
|
+
--co-theme-warning-foreground,
|
|
197
|
+
oklch(41.4% 0.071 99)
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.dark .cossistant,
|
|
202
|
+
.cossistant[data-color-scheme="dark"] {
|
|
203
|
+
/* Provide dark defaults without overriding host tokens */
|
|
204
|
+
--co-background-base: var(
|
|
205
|
+
--co-theme-background,
|
|
206
|
+
var(--background, oklch(15.5% 0 0))
|
|
207
|
+
);
|
|
208
|
+
--co-foreground-base: var(
|
|
209
|
+
--co-theme-foreground,
|
|
210
|
+
var(--foreground, oklch(98.5% 0 0))
|
|
211
|
+
);
|
|
212
|
+
--co-border-color: var(
|
|
213
|
+
--co-theme-border-color,
|
|
214
|
+
var(--color-border, oklch(26.9% 0 0))
|
|
215
|
+
);
|
|
216
|
+
--co-popover-base: var(
|
|
217
|
+
--co-theme-popover,
|
|
218
|
+
var(--popover, oklch(14.5% 0 0))
|
|
219
|
+
);
|
|
220
|
+
--co-popover-foreground-base: var(
|
|
221
|
+
--co-theme-popover-foreground,
|
|
222
|
+
var(--popover-foreground, oklch(98.5% 0 0))
|
|
223
|
+
);
|
|
224
|
+
--co-primary-base: var(
|
|
225
|
+
--co-theme-primary,
|
|
226
|
+
var(--primary, oklch(98.5% 0 0))
|
|
227
|
+
);
|
|
228
|
+
--co-primary-foreground-base: var(
|
|
229
|
+
--co-theme-primary-foreground,
|
|
230
|
+
var(--primary-foreground, oklch(20.5% 0 0))
|
|
231
|
+
);
|
|
232
|
+
--co-secondary-base: var(
|
|
233
|
+
--co-theme-secondary,
|
|
234
|
+
var(--secondary, oklch(26.9% 0 0))
|
|
235
|
+
);
|
|
236
|
+
--co-secondary-foreground-base: var(
|
|
237
|
+
--co-theme-secondary-foreground,
|
|
238
|
+
var(--secondary-foreground, oklch(98.5% 0 0))
|
|
239
|
+
);
|
|
240
|
+
--co-border-base: var(--co-theme-border, var(--border, oklch(26.9% 0 0)));
|
|
241
|
+
--co-input-base: var(--co-theme-input, var(--input, oklch(26.9% 0 0)));
|
|
242
|
+
--co-ring-base: var(--co-theme-ring, var(--ring, var(--co-primary-base)));
|
|
243
|
+
--co-accent-base: var(
|
|
244
|
+
--co-theme-accent,
|
|
245
|
+
var(--accent, var(--co-primary-base))
|
|
246
|
+
);
|
|
247
|
+
--co-accent-foreground-base: var(
|
|
248
|
+
--co-theme-accent-foreground,
|
|
249
|
+
var(--accent-foreground, var(--co-primary-foreground-base))
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
--co-muted-mix: color-mix(
|
|
253
|
+
in oklch,
|
|
254
|
+
var(--co-background-base) 55%,
|
|
255
|
+
var(--co-foreground-base)
|
|
256
|
+
);
|
|
257
|
+
--co-muted-foreground-mix: color-mix(
|
|
258
|
+
in oklch,
|
|
259
|
+
var(--co-foreground-base) 65%,
|
|
260
|
+
white
|
|
261
|
+
);
|
|
262
|
+
|
|
263
|
+
--co-background-50-mix: color-mix(
|
|
264
|
+
in oklch,
|
|
265
|
+
var(--co-background-base) 98%,
|
|
266
|
+
var(--co-foreground-base)
|
|
267
|
+
);
|
|
268
|
+
--co-background-100-mix: color-mix(
|
|
269
|
+
in oklch,
|
|
270
|
+
var(--co-background-base) 96%,
|
|
271
|
+
var(--co-foreground-base)
|
|
272
|
+
);
|
|
273
|
+
--co-background-200-mix: color-mix(
|
|
274
|
+
in oklch,
|
|
275
|
+
var(--co-background-base) 94%,
|
|
276
|
+
var(--co-foreground-base)
|
|
277
|
+
);
|
|
278
|
+
--co-background-300-mix: color-mix(
|
|
279
|
+
in oklch,
|
|
280
|
+
var(--co-background-base) 92%,
|
|
281
|
+
var(--co-foreground-base)
|
|
282
|
+
);
|
|
283
|
+
--co-background-400-mix: color-mix(
|
|
284
|
+
in oklch,
|
|
285
|
+
var(--co-background-base) 90%,
|
|
286
|
+
var(--co-foreground-base)
|
|
287
|
+
);
|
|
288
|
+
--co-background-500-mix: color-mix(
|
|
289
|
+
in oklch,
|
|
290
|
+
var(--co-background-base) 88%,
|
|
291
|
+
var(--co-foreground-base)
|
|
292
|
+
);
|
|
293
|
+
--co-background-600-mix: color-mix(
|
|
294
|
+
in oklch,
|
|
295
|
+
var(--co-background-base) 86%,
|
|
296
|
+
var(--co-foreground-base)
|
|
297
|
+
);
|
|
298
|
+
|
|
299
|
+
--co-pink: var(--co-theme-pink, oklch(84.2% 0.109 354));
|
|
300
|
+
--co-yellow: var(--co-theme-yellow, oklch(90.3% 0.111 99));
|
|
301
|
+
--co-blue: var(--co-theme-blue, oklch(79.8% 0.089 241));
|
|
302
|
+
--co-orange: var(--co-theme-orange, oklch(68.2% 0.194 50));
|
|
303
|
+
|
|
304
|
+
--co-destructive: var(--co-theme-destructive, oklch(39.6% 0.141 25.723));
|
|
305
|
+
--co-destructive-foreground: var(
|
|
306
|
+
--co-theme-destructive-foreground,
|
|
307
|
+
oklch(63.7% 0.237 25.331)
|
|
308
|
+
);
|
|
309
|
+
--co-success: var(--co-theme-success, oklch(60% 0.15 142));
|
|
310
|
+
--co-success-foreground: var(
|
|
311
|
+
--co-theme-success-foreground,
|
|
312
|
+
oklch(85% 0.12 142)
|
|
313
|
+
);
|
|
314
|
+
--co-neutral: var(--co-theme-neutral, oklch(50% 0 0));
|
|
315
|
+
--co-neutral-foreground: var(--co-theme-neutral-foreground, oklch(85% 0 0));
|
|
316
|
+
--co-warning: var(--co-theme-warning, oklch(90.3% 0.111 99));
|
|
317
|
+
--co-warning-foreground: var(
|
|
318
|
+
--co-theme-warning-foreground,
|
|
319
|
+
oklch(85% 0.1 99)
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
@theme inline {
|
|
325
|
+
--font-co-sans: var(--co-font-sans);
|
|
326
|
+
--font-co-mono: var(--co-font-mono);
|
|
327
|
+
--color-co-background: var(--co-background);
|
|
328
|
+
--color-co-background-50: var(--co-background-50);
|
|
329
|
+
--color-co-background-100: var(--co-background-100);
|
|
330
|
+
--color-co-background-200: var(--co-background-200);
|
|
331
|
+
--color-co-background-300: var(--co-background-300);
|
|
332
|
+
--color-co-background-400: var(--co-background-400);
|
|
333
|
+
--color-co-background-500: var(--co-background-500);
|
|
334
|
+
--color-co-background-600: var(--co-background-600);
|
|
335
|
+
|
|
336
|
+
--color-co-foreground: var(--co-foreground);
|
|
337
|
+
|
|
338
|
+
--color-co-primary: var(--co-primary);
|
|
339
|
+
--color-co-primary-foreground: var(--co-primary-foreground);
|
|
340
|
+
--color-co-secondary: var(--co-secondary);
|
|
341
|
+
--color-co-secondary-foreground: var(--co-secondary-foreground);
|
|
342
|
+
--color-co-muted: var(--co-muted);
|
|
343
|
+
--color-co-muted-foreground: var(--co-muted-foreground);
|
|
344
|
+
--color-co-border: var(--co-border);
|
|
345
|
+
--color-co-input: var(--co-input);
|
|
346
|
+
--color-co-ring: var(--co-ring);
|
|
347
|
+
--radius-co: var(--co-radius);
|
|
348
|
+
|
|
349
|
+
/* custom colors */
|
|
350
|
+
--color-co-pink: var(--co-pink);
|
|
351
|
+
--color-co-yellow: var(--co-yellow);
|
|
352
|
+
--color-co-blue: var(--co-blue);
|
|
353
|
+
--color-co-orange: var(--co-orange);
|
|
354
|
+
|
|
355
|
+
/* status colors */
|
|
356
|
+
--color-co-destructive: var(--co-destructive);
|
|
357
|
+
--color-co-destructive-foreground: var(--co-destructive-foreground);
|
|
358
|
+
--color-co-success: var(--co-success);
|
|
359
|
+
--color-co-success-foreground: var(--co-success-foreground);
|
|
360
|
+
--color-co-neutral: var(--co-neutral);
|
|
361
|
+
--color-co-neutral-foreground: var(--co-neutral-foreground);
|
|
362
|
+
--color-co-warning: var(--co-warning);
|
|
363
|
+
--color-co-warning-foreground: var(--co-warning-foreground);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
@layer utilities {
|
|
367
|
+
.cossistant {
|
|
368
|
+
.animation-delay-0 {
|
|
369
|
+
animation-delay: 0ms;
|
|
370
|
+
}
|
|
371
|
+
.animation-delay-200 {
|
|
372
|
+
animation-delay: 200ms;
|
|
373
|
+
}
|
|
374
|
+
.animation-delay-400 {
|
|
375
|
+
animation-delay: 400ms;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
@keyframes bounce-dot {
|
|
379
|
+
0%,
|
|
380
|
+
80%,
|
|
381
|
+
100% {
|
|
382
|
+
transform: translateY(0);
|
|
383
|
+
}
|
|
384
|
+
40% {
|
|
385
|
+
transform: translateY(-6px);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
.dot-bounce-1 {
|
|
390
|
+
animation: bounce-dot 1.4s infinite;
|
|
391
|
+
animation-delay: 0s;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
.dot-bounce-2 {
|
|
395
|
+
animation: bounce-dot 1.4s infinite;
|
|
396
|
+
animation-delay: 0.16s;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
.dot-bounce-3 {
|
|
400
|
+
animation: bounce-dot 1.4s infinite;
|
|
401
|
+
animation-delay: 0.32s;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-render-element.d.ts","names":[],"sources":["../../src/utils/use-render-element.tsx"],"sourcesContent":[],"mappings":";;;;AAI+B,KAE1B,YAAA,GAAY,MAAS,GAAA,CAAI,iBAAA;AAAiB,KAE1C,SAAA,CAAA,KAAS,CAAA,GAAA,MAAA,
|
|
1
|
+
{"version":3,"file":"use-render-element.d.ts","names":[],"sources":["../../src/utils/use-render-element.tsx"],"sourcesContent":[],"mappings":";;;;AAI+B,KAE1B,YAAA,GAAY,MAAS,GAAA,CAAI,iBAAA;AAAiB,KAE1C,SAAA,CAAA,KAAS,CAAA,GAAA,MAAA,GAAA,CAA4B,CAAA,KAAK,EAAL,KAAK,EAAA,GAAA,MAAA,CAAA;AAAA,KAE1C,QAAA,CAAA,KAAQ,EAAA,KAAA,CAAA,GAAA,CAAA,KAAA,EACL,KADK,EAAA,KAAA,EAEL,KAFK,EAAA,GAGR,OAAA,CAAM,YAHE;KAKR,WAJG,CAAA,KAAA,EAAA,YAI4B,YAJ5B,CAAA,GAAA;EACA,MAAA,CAAA,EAIE,OAAA,CAAM,YAJR,GAIuB,QAJvB,CAIgC,GAAA,CAAI,iBAJpC,CAIsD,GAJtD,CAAA,EAI4D,KAJ5D,CAAA;EACH,SAAM,CAAA,EAIE,SAJF,CAIY,KAJZ,CAAA;EAAY,OAAA,CAAA,EAAA,OAAA;AAAA,CAAA;KAQlB,YAN+B,CAAA,KAAA,EAAA,YAMC,YAND,CAAA,GAAA;EAC1B,KAAM,CAAA,EAMP,KANO;EAAwB,GAAI,CAAA,EAOrC,OAAA,CAAM,GAP+B,CAAA,GAAA,CAAA;EAAkB,KAAA,CAAA,EAQrD,OARqD,CAQ7C,GAAA,CAAI,iBARyC,CAQvB,GARuB,CAAA,CAAA;EAAM,OAAA,CAAA,EAAA,OAAA;CAArC;;;;AAK1B,iBAyBW,gBAzBC,CAAA,cA0BF,MA1BE,CAAA,MAAA,EAAA,GAAA,CAAA,EAAA,YA2BJ,YA3BI,CAAA,CAAA,GAAA,EA6BX,GA7BW,EAAA,cAAA,EA8BA,WA9BA,CA8BY,KA9BZ,EA8BmB,GA9BnB,CAAA,EAAA,MAAA,CAAA,EA+BP,YA/BO,CA+BM,KA/BN,EA+Ba,GA/Bb,CAAA,CAAA,EAgCd,OAAA,CAAM,YAhCQ,GAAA,IAAA"}
|