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.
Files changed (40) hide show
  1. package/README.md +16 -1
  2. package/fonts/GazpachoBold.otf +0 -0
  3. package/fonts/GazpachoBoldItalic.otf +0 -0
  4. package/fonts/GazpachoMedium.otf +0 -0
  5. package/fonts/GazpachoMediumItalic.otf +0 -0
  6. package/fonts/GazpachoRegular.otf +0 -0
  7. package/fonts/GazpachoRegularItalic.otf +0 -0
  8. package/fonts/GeistMonoVF.woff +0 -0
  9. package/fonts/GeistVF.woff +0 -0
  10. package/fonts/InstrumentSans-Italic-VariableFont_wdth,wght.ttf +0 -0
  11. package/fonts/InstrumentSans-VariableFont_wdth,wght.ttf +0 -0
  12. package/llm/assistants/README.md +28 -0
  13. package/llm/assistants/claude/CLAUDE.md +48 -0
  14. package/llm/assistants/codex/AGENTS.md +48 -0
  15. package/llm/components/chat-ai.json +89 -0
  16. package/llm/components/chat-footer.json +99 -0
  17. package/llm/components/chat-person-to-person.json +157 -0
  18. package/llm/components/chat.json +11 -80
  19. package/llm/components/demo.json +88 -0
  20. package/llm/components/getting-started.json +14 -5
  21. package/llm/components/icons-reference.json +1 -1
  22. package/llm/components/loader.json +2 -1
  23. package/llm/components/menu.json +10 -0
  24. package/llm/components/popover.json +2 -4
  25. package/llm/examples/chat-ai.html +1 -0
  26. package/llm/examples/chat-footer.html +1 -0
  27. package/llm/examples/chat-person-to-person.html +1 -0
  28. package/llm/examples/chat.html +1 -1
  29. package/llm/examples/demo.html +1 -0
  30. package/llm/examples/getting-started.html +1 -1
  31. package/llm/index.json +84 -11
  32. package/llm/llms.txt +3 -0
  33. package/package.json +3 -1
  34. package/styles/button.css +3 -6
  35. package/styles/chat.css +207 -0
  36. package/styles/font.css +59 -0
  37. package/styles/globals.css +1 -0
  38. package/styles/loader.css +8 -0
  39. package/styles/popover.css +1 -37
  40. 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 Started",
4
- "status": "preview",
5
- "summary": "Documentation and contract metadata for Getting Started in the twntyX design system.",
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 Started usage."
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",
@@ -96,7 +96,8 @@
96
96
  "core-ui-200",
97
97
  "core-ui-700",
98
98
  "core-white",
99
- "line-strong"
99
+ "line-strong",
100
+ "text-default"
100
101
  ],
101
102
  "examples": [
102
103
  {
@@ -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
- "popoverTargetaction",
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>
@@ -1 +1 @@
1
- <div class="chat chat-secondary">Chat</div>
1
+ <div class="chat">Chat</div>
@@ -0,0 +1 @@
1
+ <div class="demo">Demo</div>
@@ -1 +1 @@
1
- <div class="getting-started">Getting Started</div>
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.0",
3
+ "designSystemVersion": "1.0.2",
4
4
  "packageName": "twntyx-css",
5
5
  "apiModel": "html-class",
6
- "sourceFingerprint": "7e17140f9f9bd46722b67daac0578dfe19eed83d9e2a0cffa1585850bde1f505",
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": "Chat component for displaying conversations between users or with AI assistants.",
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
- "communication",
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
- "messages"
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 Started",
738
+ "name": "Getting started",
675
739
  "file": "components/getting-started.json",
676
- "status": "preview",
677
- "summary": "Documentation and contract metadata for Getting Started in the twntyX design system.",
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
- "popoverTargetaction",
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.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 w-[calc(var(--close-size)-2px)] h-[calc(var(--close-size)-2px)];
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
- left-1/2
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
+ }