twntyx-css 1.0.0 → 1.0.2
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 +16 -1
- package/fonts/GazpachoBold.otf +0 -0
- package/fonts/GazpachoBoldItalic.otf +0 -0
- package/fonts/GazpachoMedium.otf +0 -0
- package/fonts/GazpachoMediumItalic.otf +0 -0
- package/fonts/GazpachoRegular.otf +0 -0
- package/fonts/GazpachoRegularItalic.otf +0 -0
- package/fonts/GeistMonoVF.woff +0 -0
- package/fonts/GeistVF.woff +0 -0
- package/fonts/InstrumentSans-Italic-VariableFont_wdth,wght.ttf +0 -0
- package/fonts/InstrumentSans-VariableFont_wdth,wght.ttf +0 -0
- package/llm/assistants/README.md +28 -0
- package/llm/assistants/claude/CLAUDE.md +48 -0
- package/llm/assistants/codex/AGENTS.md +48 -0
- package/llm/components/chat-ai.json +89 -0
- package/llm/components/chat-footer.json +99 -0
- package/llm/components/chat-person-to-person.json +157 -0
- package/llm/components/chat.json +11 -80
- package/llm/components/demo.json +88 -0
- package/llm/components/getting-started.json +14 -5
- package/llm/components/icons-reference.json +1 -1
- package/llm/components/loader.json +2 -1
- package/llm/components/menu.json +10 -0
- package/llm/components/popover.json +2 -4
- package/llm/examples/chat-ai.html +1 -0
- package/llm/examples/chat-footer.html +1 -0
- package/llm/examples/chat-person-to-person.html +1 -0
- package/llm/examples/chat.html +1 -1
- package/llm/examples/demo.html +1 -0
- package/llm/examples/getting-started.html +1 -1
- package/llm/index.json +84 -11
- package/llm/llms.txt +3 -0
- package/package.json +3 -1
- package/styles/button.css +3 -6
- package/styles/chat.css +207 -0
- package/styles/font.css +59 -0
- package/styles/globals.css +1 -0
- package/styles/loader.css +8 -0
- package/styles/popover.css +1 -37
- package/styles/typography.css +0 -56
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "demo",
|
|
3
|
+
"name": "Demo",
|
|
4
|
+
"status": "preview",
|
|
5
|
+
"summary": "Documentation and contract metadata for Demo in the twntyX design system.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"demo"
|
|
8
|
+
],
|
|
9
|
+
"sourcePaths": [
|
|
10
|
+
"app/design-system/demo/page.js",
|
|
11
|
+
"assets/styles/modal.css"
|
|
12
|
+
],
|
|
13
|
+
"apiModel": "html-class",
|
|
14
|
+
"baseClass": "demo",
|
|
15
|
+
"variants": [],
|
|
16
|
+
"sizes": [],
|
|
17
|
+
"states": [],
|
|
18
|
+
"structure": {
|
|
19
|
+
"rootElement": "div",
|
|
20
|
+
"requiredClasses": [
|
|
21
|
+
"demo"
|
|
22
|
+
],
|
|
23
|
+
"optionalClasses": [],
|
|
24
|
+
"requiredChildren": [],
|
|
25
|
+
"optionalChildren": []
|
|
26
|
+
},
|
|
27
|
+
"attributes": {
|
|
28
|
+
"allowed": [
|
|
29
|
+
"class"
|
|
30
|
+
],
|
|
31
|
+
"required": [],
|
|
32
|
+
"dataAttributes": [],
|
|
33
|
+
"roles": [
|
|
34
|
+
"status",
|
|
35
|
+
"tab",
|
|
36
|
+
"tablist"
|
|
37
|
+
],
|
|
38
|
+
"aria": [
|
|
39
|
+
"aria-label",
|
|
40
|
+
"aria-selected"
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
"a11y": {
|
|
44
|
+
"interactive": false,
|
|
45
|
+
"requiredRoles": [
|
|
46
|
+
"status",
|
|
47
|
+
"tab",
|
|
48
|
+
"tablist"
|
|
49
|
+
],
|
|
50
|
+
"requiredAria": [
|
|
51
|
+
"aria-label",
|
|
52
|
+
"aria-selected"
|
|
53
|
+
],
|
|
54
|
+
"keyboardSupport": [],
|
|
55
|
+
"focusBehavior": "No keyboard interaction is required unless nested interactive children are introduced."
|
|
56
|
+
},
|
|
57
|
+
"dos": [
|
|
58
|
+
"Apply the base class 'demo' on the root element.",
|
|
59
|
+
"Use documented modifiers for visual variants instead of ad-hoc custom classes.",
|
|
60
|
+
"Keep semantic color usage aligned with token classes for light/dark support."
|
|
61
|
+
],
|
|
62
|
+
"donts": [
|
|
63
|
+
"Do not combine conflicting state classes on the same element.",
|
|
64
|
+
"Do not rely on undocumented internal classes in production templates.",
|
|
65
|
+
"Do not remove required accessibility attributes when component is interactive."
|
|
66
|
+
],
|
|
67
|
+
"tokenUsage": [
|
|
68
|
+
"background-overlay",
|
|
69
|
+
"background-surface",
|
|
70
|
+
"line-default"
|
|
71
|
+
],
|
|
72
|
+
"examples": [
|
|
73
|
+
{
|
|
74
|
+
"id": "canonical",
|
|
75
|
+
"file": "examples/demo.html",
|
|
76
|
+
"description": "Minimal canonical Demo usage."
|
|
77
|
+
}
|
|
78
|
+
],
|
|
79
|
+
"composition": {
|
|
80
|
+
"patterns": [],
|
|
81
|
+
"relatedComponents": [],
|
|
82
|
+
"notes": []
|
|
83
|
+
},
|
|
84
|
+
"breakingChangePolicy": {
|
|
85
|
+
"classContract": "Base class, documented modifiers, and state class names are semver-protected for consumer markup.",
|
|
86
|
+
"a11yContract": "Documented role and aria requirements are semver-protected for generated markup."
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "getting-started",
|
|
3
|
-
"name": "Getting
|
|
4
|
-
"status": "
|
|
5
|
-
"summary": "
|
|
3
|
+
"name": "Getting started",
|
|
4
|
+
"status": "stable",
|
|
5
|
+
"summary": "Install **twntyx-css**, import the global stylesheet, extend your Tailwind config, and start building with framework-agnostic components and machine-readable LLM metadata.",
|
|
6
6
|
"keywords": [
|
|
7
|
+
"ai",
|
|
7
8
|
"getting started",
|
|
8
|
-
"getting-started"
|
|
9
|
+
"getting-started",
|
|
10
|
+
"install",
|
|
11
|
+
"installation",
|
|
12
|
+
"llm",
|
|
13
|
+
"nextjs",
|
|
14
|
+
"setup",
|
|
15
|
+
"tailwind",
|
|
16
|
+
"vite",
|
|
17
|
+
"webpack"
|
|
9
18
|
],
|
|
10
19
|
"sourcePaths": [
|
|
11
20
|
"app/design-system/getting-started/page.js"
|
|
@@ -55,7 +64,7 @@
|
|
|
55
64
|
{
|
|
56
65
|
"id": "canonical",
|
|
57
66
|
"file": "examples/getting-started.html",
|
|
58
|
-
"description": "Minimal canonical Getting
|
|
67
|
+
"description": "Minimal canonical Getting started usage."
|
|
59
68
|
}
|
|
60
69
|
],
|
|
61
70
|
"composition": {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "icons-reference",
|
|
3
3
|
"name": "Icons reference",
|
|
4
4
|
"status": "stable",
|
|
5
|
-
"summary": "Collection of icons used throughout the application, twntyX uses [Google's Material Symbols and Icons](https://fonts.google.com/icons), which provides us with an extensive icon library with over 2,500 glyphs",
|
|
5
|
+
"summary": "Collection of icons used throughout the application, twntyX uses [Google's Material Symbols and Icons](https://fonts.google.com/icons?icon.style=Rounded&icon.query=soun&icon.size=24) (weight 300, rounded), which provides us with an extensive icon library with over 2,500 glyphs",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"assets",
|
|
8
8
|
"collection",
|
package/llm/components/menu.json
CHANGED
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
],
|
|
22
22
|
"sourcePaths": [
|
|
23
23
|
"app/design-system/menu/page.js",
|
|
24
|
+
"assets/styles/chat.css",
|
|
24
25
|
"assets/styles/menu.css"
|
|
25
26
|
],
|
|
26
27
|
"apiModel": "html-class",
|
|
@@ -162,12 +163,21 @@
|
|
|
162
163
|
],
|
|
163
164
|
"tokenUsage": [
|
|
164
165
|
"background-brand",
|
|
166
|
+
"background-error",
|
|
167
|
+
"background-page",
|
|
165
168
|
"background-surface",
|
|
169
|
+
"background-surface-elevated",
|
|
170
|
+
"background-surface-sunken",
|
|
171
|
+
"core-black",
|
|
172
|
+
"core-white",
|
|
166
173
|
"line-brand",
|
|
167
174
|
"line-default",
|
|
175
|
+
"line-strong",
|
|
168
176
|
"text-brand",
|
|
169
177
|
"text-default",
|
|
170
178
|
"text-disabled",
|
|
179
|
+
"text-link",
|
|
180
|
+
"text-link-hover",
|
|
171
181
|
"text-secondary",
|
|
172
182
|
"text-tertiary"
|
|
173
183
|
],
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"panel",
|
|
12
12
|
"popover",
|
|
13
13
|
"popoverTarget",
|
|
14
|
-
"
|
|
14
|
+
"popoverTargetAction",
|
|
15
15
|
"popup",
|
|
16
16
|
"tooltip"
|
|
17
17
|
],
|
|
@@ -151,9 +151,7 @@
|
|
|
151
151
|
"tokenUsage": [
|
|
152
152
|
"background-surface",
|
|
153
153
|
"line-default",
|
|
154
|
-
"text-default"
|
|
155
|
-
"text-secondary",
|
|
156
|
-
"text-tertiary"
|
|
154
|
+
"text-default"
|
|
157
155
|
],
|
|
158
156
|
"examples": [
|
|
159
157
|
{
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<div class="chat-ai">AI chat structure</div>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<div class="chat-footer">Chat footer</div>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<div class="chat">Person to person chat structure</div>
|
package/llm/examples/chat.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<div class="chat
|
|
1
|
+
<div class="chat">Chat</div>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<div class="demo">Demo</div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<div class="getting-started">Getting
|
|
1
|
+
<div class="getting-started">Getting started</div>
|
package/llm/index.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"llmSchemaVersion": "1.0.0",
|
|
3
|
-
"designSystemVersion": "1.0.
|
|
3
|
+
"designSystemVersion": "1.0.2",
|
|
4
4
|
"packageName": "twntyx-css",
|
|
5
5
|
"apiModel": "html-class",
|
|
6
|
-
"sourceFingerprint": "
|
|
6
|
+
"sourceFingerprint": "a3ddc83af58ecd5ab60ff5baae77e3b421a6e9687177f04288a3c00ee03e8130",
|
|
7
7
|
"files": {
|
|
8
8
|
"schema": "schema.json",
|
|
9
9
|
"tokens": "tokens.json",
|
|
@@ -375,15 +375,69 @@
|
|
|
375
375
|
"id": "chat",
|
|
376
376
|
"name": "Chat",
|
|
377
377
|
"file": "components/chat.json",
|
|
378
|
+
"status": "preview",
|
|
379
|
+
"summary": "Documentation and contract metadata for Chat in the twntyX design system.",
|
|
380
|
+
"keywords": [
|
|
381
|
+
"chat"
|
|
382
|
+
]
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
"id": "chat-ai",
|
|
386
|
+
"name": "AI chat structure",
|
|
387
|
+
"file": "components/chat-ai.json",
|
|
378
388
|
"status": "stable",
|
|
379
|
-
"summary": "
|
|
389
|
+
"summary": "AI chat conversation patterns with text, media, MCP bubbles, loading, and assistant response loop simulations.",
|
|
380
390
|
"keywords": [
|
|
381
391
|
"ai chat",
|
|
392
|
+
"assistant",
|
|
382
393
|
"chat",
|
|
394
|
+
"chat ai",
|
|
395
|
+
"chat-ai",
|
|
383
396
|
"chatbot",
|
|
384
|
-
"
|
|
397
|
+
"loading state",
|
|
398
|
+
"mcp fallback",
|
|
399
|
+
"mcp result",
|
|
400
|
+
"mcp tool action",
|
|
401
|
+
"new message state"
|
|
402
|
+
]
|
|
403
|
+
},
|
|
404
|
+
{
|
|
405
|
+
"id": "chat-footer",
|
|
406
|
+
"name": "Chat footer",
|
|
407
|
+
"file": "components/chat-footer.json",
|
|
408
|
+
"status": "stable",
|
|
409
|
+
"summary": "Chat composer/footer patterns including the current footer and a full variant with file upload trigger, model selector, and dictation simulation.",
|
|
410
|
+
"keywords": [
|
|
411
|
+
"attachment",
|
|
412
|
+
"chat",
|
|
413
|
+
"chat footer",
|
|
414
|
+
"chat input",
|
|
415
|
+
"chat-footer",
|
|
416
|
+
"composer",
|
|
417
|
+
"dictation",
|
|
418
|
+
"footer",
|
|
419
|
+
"ghost select",
|
|
420
|
+
"model selector"
|
|
421
|
+
]
|
|
422
|
+
},
|
|
423
|
+
{
|
|
424
|
+
"id": "chat-person-to-person",
|
|
425
|
+
"name": "Person to person chat structure",
|
|
426
|
+
"file": "components/chat-person-to-person.json",
|
|
427
|
+
"status": "stable",
|
|
428
|
+
"summary": "Conversation patterns between people, including text, image attachments, MCP content, loading and new-message simulation states.",
|
|
429
|
+
"keywords": [
|
|
430
|
+
"chat",
|
|
431
|
+
"chat person to person",
|
|
432
|
+
"chat structure",
|
|
433
|
+
"chat-person-to-person",
|
|
385
434
|
"conversation",
|
|
386
|
-
"
|
|
435
|
+
"human chat",
|
|
436
|
+
"loading state",
|
|
437
|
+
"mcp",
|
|
438
|
+
"message attachments",
|
|
439
|
+
"messages",
|
|
440
|
+
"person to person"
|
|
387
441
|
]
|
|
388
442
|
},
|
|
389
443
|
{
|
|
@@ -558,6 +612,16 @@
|
|
|
558
612
|
"time"
|
|
559
613
|
]
|
|
560
614
|
},
|
|
615
|
+
{
|
|
616
|
+
"id": "demo",
|
|
617
|
+
"name": "Demo",
|
|
618
|
+
"file": "components/demo.json",
|
|
619
|
+
"status": "preview",
|
|
620
|
+
"summary": "Documentation and contract metadata for Demo in the twntyX design system.",
|
|
621
|
+
"keywords": [
|
|
622
|
+
"demo"
|
|
623
|
+
]
|
|
624
|
+
},
|
|
561
625
|
{
|
|
562
626
|
"id": "divider",
|
|
563
627
|
"name": "Divider",
|
|
@@ -671,13 +735,22 @@
|
|
|
671
735
|
},
|
|
672
736
|
{
|
|
673
737
|
"id": "getting-started",
|
|
674
|
-
"name": "Getting
|
|
738
|
+
"name": "Getting started",
|
|
675
739
|
"file": "components/getting-started.json",
|
|
676
|
-
"status": "
|
|
677
|
-
"summary": "
|
|
740
|
+
"status": "stable",
|
|
741
|
+
"summary": "Install **twntyx-css**, import the global stylesheet, extend your Tailwind config, and start building with framework-agnostic components and machine-readable LLM metadata.",
|
|
678
742
|
"keywords": [
|
|
743
|
+
"ai",
|
|
679
744
|
"getting started",
|
|
680
|
-
"getting-started"
|
|
745
|
+
"getting-started",
|
|
746
|
+
"install",
|
|
747
|
+
"installation",
|
|
748
|
+
"llm",
|
|
749
|
+
"nextjs",
|
|
750
|
+
"setup",
|
|
751
|
+
"tailwind",
|
|
752
|
+
"vite",
|
|
753
|
+
"webpack"
|
|
681
754
|
]
|
|
682
755
|
},
|
|
683
756
|
{
|
|
@@ -685,7 +758,7 @@
|
|
|
685
758
|
"name": "Icons reference",
|
|
686
759
|
"file": "components/icons-reference.json",
|
|
687
760
|
"status": "stable",
|
|
688
|
-
"summary": "Collection of icons used throughout the application, twntyX uses [Google's Material Symbols and Icons](https://fonts.google.com/icons), which provides us with an extensive icon library with over 2,500 glyphs",
|
|
761
|
+
"summary": "Collection of icons used throughout the application, twntyX uses [Google's Material Symbols and Icons](https://fonts.google.com/icons?icon.style=Rounded&icon.query=soun&icon.size=24) (weight 300, rounded), which provides us with an extensive icon library with over 2,500 glyphs",
|
|
689
762
|
"keywords": [
|
|
690
763
|
"assets",
|
|
691
764
|
"collection",
|
|
@@ -983,7 +1056,7 @@
|
|
|
983
1056
|
"panel",
|
|
984
1057
|
"popover",
|
|
985
1058
|
"popoverTarget",
|
|
986
|
-
"
|
|
1059
|
+
"popoverTargetAction",
|
|
987
1060
|
"popup",
|
|
988
1061
|
"tooltip"
|
|
989
1062
|
]
|
package/llm/llms.txt
CHANGED
|
@@ -10,6 +10,9 @@ This package ships machine-readable design-system metadata for coding assistants
|
|
|
10
10
|
- Patterns: ./patterns.json
|
|
11
11
|
- Rules: ./rules.json
|
|
12
12
|
- Canonical HTML Examples: ./examples/*.html
|
|
13
|
+
- Assistant guides (no skills): ./assistants/
|
|
14
|
+
- Codex guide: ./assistants/codex/AGENTS.md
|
|
15
|
+
- Claude guide: ./assistants/claude/CLAUDE.md
|
|
13
16
|
|
|
14
17
|
Lookup contract:
|
|
15
18
|
1. Resolve component by id/name/keywords from index.json.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "twntyx-css",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"exports": {
|
|
5
5
|
"./llm": "./llm/index.json",
|
|
6
6
|
"./llm/components/*": "./llm/components/*.json",
|
|
@@ -9,11 +9,13 @@
|
|
|
9
9
|
"./llm/rules": "./llm/rules.json",
|
|
10
10
|
"./llm/schema": "./llm/schema.json",
|
|
11
11
|
"./*": "./*",
|
|
12
|
+
"./fonts/*": "./fonts/*",
|
|
12
13
|
"./styles": "./styles/globals.css",
|
|
13
14
|
"./styles/*": "./styles/*",
|
|
14
15
|
"./tailwind.config": "./tailwind.config.cjs"
|
|
15
16
|
},
|
|
16
17
|
"files": [
|
|
18
|
+
"fonts/**/*",
|
|
17
19
|
"styles/**/*",
|
|
18
20
|
"llm/**/*",
|
|
19
21
|
"README.md",
|
package/styles/button.css
CHANGED
|
@@ -343,7 +343,7 @@
|
|
|
343
343
|
}
|
|
344
344
|
|
|
345
345
|
&::before {
|
|
346
|
-
@apply
|
|
346
|
+
@apply size-[calc(var(--close-size)-4px)];
|
|
347
347
|
}
|
|
348
348
|
|
|
349
349
|
&.button-xs {
|
|
@@ -383,11 +383,8 @@
|
|
|
383
383
|
&::before {
|
|
384
384
|
@apply content-['']
|
|
385
385
|
absolute
|
|
386
|
-
block
|
|
387
|
-
|
|
388
|
-
top-1/2
|
|
389
|
-
-translate-x-1/2
|
|
390
|
-
-translate-y-1/2
|
|
386
|
+
/* block
|
|
387
|
+
inset-0 */
|
|
391
388
|
transform-gpu
|
|
392
389
|
mask-close;
|
|
393
390
|
}
|
package/styles/chat.css
CHANGED
|
@@ -33,6 +33,8 @@
|
|
|
33
33
|
gap-6
|
|
34
34
|
p-4
|
|
35
35
|
w-full;
|
|
36
|
+
|
|
37
|
+
|
|
36
38
|
}
|
|
37
39
|
|
|
38
40
|
/* Message groups */
|
|
@@ -415,9 +417,14 @@
|
|
|
415
417
|
/* AI Chat variant */
|
|
416
418
|
@utility chat-secondary {
|
|
417
419
|
|
|
420
|
+
&:has(.chat-footer-full) {
|
|
421
|
+
@apply bg-background-surface-sunken;
|
|
422
|
+
}
|
|
423
|
+
|
|
418
424
|
.chat-feed {
|
|
419
425
|
@apply
|
|
420
426
|
bg-background-surface-sunken;
|
|
427
|
+
|
|
421
428
|
}
|
|
422
429
|
.chat-group {
|
|
423
430
|
@apply
|
|
@@ -482,6 +489,145 @@
|
|
|
482
489
|
}
|
|
483
490
|
}
|
|
484
491
|
|
|
492
|
+
/* Media attachments inside bubbles */
|
|
493
|
+
@utility chat-media-grid {
|
|
494
|
+
@apply
|
|
495
|
+
grid
|
|
496
|
+
grid-cols-2
|
|
497
|
+
gap-2
|
|
498
|
+
mt-2;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
@utility chat-media-item {
|
|
502
|
+
@apply
|
|
503
|
+
overflow-hidden
|
|
504
|
+
rounded-xl
|
|
505
|
+
border
|
|
506
|
+
border-line-default
|
|
507
|
+
bg-background-surface-sunken;
|
|
508
|
+
|
|
509
|
+
img {
|
|
510
|
+
@apply
|
|
511
|
+
block
|
|
512
|
+
w-full
|
|
513
|
+
h-24
|
|
514
|
+
md:h-28
|
|
515
|
+
object-cover;
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
/* Loading -> message loop simulation */
|
|
520
|
+
@utility chat-loop-simulation {
|
|
521
|
+
@apply overflow-x-hidden;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
@utility chat-loop-stack {
|
|
525
|
+
@apply
|
|
526
|
+
relative
|
|
527
|
+
mt-6;
|
|
528
|
+
|
|
529
|
+
min-height: 9.25rem;
|
|
530
|
+
|
|
531
|
+
> .chat-group {
|
|
532
|
+
@apply
|
|
533
|
+
absolute
|
|
534
|
+
inset-0
|
|
535
|
+
mt-0;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
.chat-loop-loading {
|
|
539
|
+
animation: chat-loop-loading 4.8s ease-in-out infinite;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
.chat-loop-message {
|
|
543
|
+
animation: chat-loop-message 4.8s ease-in-out infinite;
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
@utility chat-loop-stack-lg {
|
|
548
|
+
min-height: 10.75rem;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/* Extended chat footer demo */
|
|
552
|
+
@utility chat-footer-full {
|
|
553
|
+
|
|
554
|
+
@apply flex flex-col gap-2 w-full rounded-2xl! surface mb-4;
|
|
555
|
+
|
|
556
|
+
.chat-input-full {
|
|
557
|
+
@apply
|
|
558
|
+
flex-wrap
|
|
559
|
+
items-end;
|
|
560
|
+
|
|
561
|
+
.chat-add-menu-trigger,
|
|
562
|
+
.chat-add-menu-button {
|
|
563
|
+
@apply shrink-0;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
.chat-footer-actions {
|
|
567
|
+
@apply
|
|
568
|
+
order-3
|
|
569
|
+
flex
|
|
570
|
+
gap-2
|
|
571
|
+
flex-1
|
|
572
|
+
items-center
|
|
573
|
+
justify-end
|
|
574
|
+
sm:order-none
|
|
575
|
+
sm:flex-none
|
|
576
|
+
sm:ml-auto;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
.chat-model-select {
|
|
580
|
+
@apply
|
|
581
|
+
w-36
|
|
582
|
+
sm:w-44;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
.chat-dictate {
|
|
587
|
+
@apply
|
|
588
|
+
relative;
|
|
589
|
+
|
|
590
|
+
&.is-listening::after {
|
|
591
|
+
content: "";
|
|
592
|
+
@apply
|
|
593
|
+
absolute
|
|
594
|
+
-top-1
|
|
595
|
+
-right-1
|
|
596
|
+
size-2
|
|
597
|
+
rounded-full
|
|
598
|
+
bg-background-error
|
|
599
|
+
border
|
|
600
|
+
border-background-surface;
|
|
601
|
+
animation: chat-dictate-pulse 1.4s ease-in-out infinite;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
.chat-send-button {
|
|
606
|
+
@apply
|
|
607
|
+
shrink-0;
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
.chat-add-menu {
|
|
612
|
+
@apply min-w-56;
|
|
613
|
+
|
|
614
|
+
.menu {
|
|
615
|
+
@apply gap-0;
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
.menu > li > button {
|
|
619
|
+
@apply justify-start;
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
.chat-dictate-hint {
|
|
624
|
+
@apply
|
|
625
|
+
mt-2
|
|
626
|
+
text-xs
|
|
627
|
+
text-text-secondary;
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
|
|
485
631
|
/* Loading animation */
|
|
486
632
|
@keyframes loading-gradient {
|
|
487
633
|
0% {
|
|
@@ -504,3 +650,64 @@
|
|
|
504
650
|
transform: scale(1);
|
|
505
651
|
}
|
|
506
652
|
}
|
|
653
|
+
|
|
654
|
+
@keyframes chat-loop-loading {
|
|
655
|
+
0%,
|
|
656
|
+
48% {
|
|
657
|
+
opacity: 1;
|
|
658
|
+
transform: translateY(0);
|
|
659
|
+
visibility: visible;
|
|
660
|
+
}
|
|
661
|
+
52%,
|
|
662
|
+
100% {
|
|
663
|
+
opacity: 0;
|
|
664
|
+
transform: translateY(-0.35rem);
|
|
665
|
+
visibility: hidden;
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
@keyframes chat-loop-message {
|
|
670
|
+
0%,
|
|
671
|
+
48% {
|
|
672
|
+
opacity: 0;
|
|
673
|
+
transform: translateY(0.35rem);
|
|
674
|
+
visibility: hidden;
|
|
675
|
+
}
|
|
676
|
+
52%,
|
|
677
|
+
100% {
|
|
678
|
+
opacity: 1;
|
|
679
|
+
transform: translateY(0);
|
|
680
|
+
visibility: visible;
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
@keyframes chat-dictate-pulse {
|
|
685
|
+
0%,
|
|
686
|
+
100% {
|
|
687
|
+
opacity: 1;
|
|
688
|
+
transform: scale(1);
|
|
689
|
+
}
|
|
690
|
+
50% {
|
|
691
|
+
opacity: 0.35;
|
|
692
|
+
transform: scale(1.35);
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
@media (prefers-reduced-motion: reduce) {
|
|
697
|
+
.chat-loop-stack .chat-loop-loading,
|
|
698
|
+
.chat-loop-stack .chat-loop-message,
|
|
699
|
+
.chat-footer-full .chat-input-full .chat-dictate.is-listening::after {
|
|
700
|
+
animation: none;
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
.chat-loop-stack .chat-loop-loading {
|
|
704
|
+
opacity: 0;
|
|
705
|
+
visibility: hidden;
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
.chat-loop-stack .chat-loop-message {
|
|
709
|
+
opacity: 1;
|
|
710
|
+
visibility: visible;
|
|
711
|
+
transform: none;
|
|
712
|
+
}
|
|
713
|
+
}
|