@atelier-ui/react 0.1.10 → 0.1.12

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 (88) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/package.json +1 -1
  3. package/src/lib/accordion/llm-accordion.css +120 -0
  4. package/src/lib/accordion/llm-accordion.d.ts +3 -3
  5. package/src/lib/accordion/llm-accordion.d.ts.map +1 -1
  6. package/src/lib/alert/llm-alert.css +80 -0
  7. package/src/lib/alert/llm-alert.d.ts +1 -1
  8. package/src/lib/alert/llm-alert.d.ts.map +1 -1
  9. package/src/lib/avatar/llm-avatar.css +106 -0
  10. package/src/lib/avatar/llm-avatar.d.ts +2 -2
  11. package/src/lib/avatar/llm-avatar.d.ts.map +1 -1
  12. package/src/lib/badge/llm-badge.css +60 -0
  13. package/src/lib/badge/llm-badge.d.ts +1 -1
  14. package/src/lib/badge/llm-badge.d.ts.map +1 -1
  15. package/src/lib/breadcrumbs/llm-breadcrumbs.css +62 -0
  16. package/src/lib/breadcrumbs/llm-breadcrumbs.d.ts +2 -2
  17. package/src/lib/breadcrumbs/llm-breadcrumbs.d.ts.map +1 -1
  18. package/src/lib/button/llm-button.css +139 -0
  19. package/src/lib/card/llm-card.css +70 -0
  20. package/src/lib/card/llm-card.d.ts +4 -4
  21. package/src/lib/card/llm-card.d.ts.map +1 -1
  22. package/src/lib/chat/llm-chat.css +446 -0
  23. package/src/lib/chat/llm-chat.d.ts +7 -7
  24. package/src/lib/chat/llm-chat.d.ts.map +1 -1
  25. package/src/lib/checkbox/llm-checkbox.css +123 -0
  26. package/src/lib/checkbox/llm-checkbox.d.ts +1 -1
  27. package/src/lib/checkbox/llm-checkbox.d.ts.map +1 -1
  28. package/src/lib/code-block/llm-code-block.css +112 -0
  29. package/src/lib/code-block/llm-code-block.d.ts +1 -1
  30. package/src/lib/code-block/llm-code-block.d.ts.map +1 -1
  31. package/src/lib/combobox/llm-combobox.css +169 -0
  32. package/src/lib/combobox/llm-combobox.d.ts +1 -1
  33. package/src/lib/combobox/llm-combobox.d.ts.map +1 -1
  34. package/src/lib/dialog/llm-dialog.css +174 -0
  35. package/src/lib/dialog/llm-dialog.d.ts +4 -4
  36. package/src/lib/dialog/llm-dialog.d.ts.map +1 -1
  37. package/src/lib/drawer/llm-drawer.css +228 -0
  38. package/src/lib/drawer/llm-drawer.d.ts +4 -4
  39. package/src/lib/drawer/llm-drawer.d.ts.map +1 -1
  40. package/src/lib/icon/llm-icon.css +29 -0
  41. package/src/lib/icon/llm-icon.d.ts +1 -1
  42. package/src/lib/icon/llm-icon.d.ts.map +1 -1
  43. package/src/lib/input/llm-input.css +94 -0
  44. package/src/lib/input/llm-input.d.ts +1 -1
  45. package/src/lib/input/llm-input.d.ts.map +1 -1
  46. package/src/lib/menu/llm-menu.css +85 -0
  47. package/src/lib/menu/llm-menu.d.ts +4 -4
  48. package/src/lib/menu/llm-menu.d.ts.map +1 -1
  49. package/src/lib/pagination/llm-pagination.css +80 -0
  50. package/src/lib/pagination/llm-pagination.d.ts +1 -1
  51. package/src/lib/pagination/llm-pagination.d.ts.map +1 -1
  52. package/src/lib/progress/llm-progress.css +69 -0
  53. package/src/lib/progress/llm-progress.d.ts +1 -1
  54. package/src/lib/progress/llm-progress.d.ts.map +1 -1
  55. package/src/lib/radio/llm-radio.css +78 -0
  56. package/src/lib/radio/llm-radio.d.ts +1 -1
  57. package/src/lib/radio/llm-radio.d.ts.map +1 -1
  58. package/src/lib/radio-group/llm-radio-group.css +31 -0
  59. package/src/lib/radio-group/llm-radio-group.d.ts +1 -1
  60. package/src/lib/radio-group/llm-radio-group.d.ts.map +1 -1
  61. package/src/lib/select/llm-select.css +83 -0
  62. package/src/lib/select/llm-select.d.ts +2 -2
  63. package/src/lib/select/llm-select.d.ts.map +1 -1
  64. package/src/lib/skeleton/llm-skeleton.css +51 -0
  65. package/src/lib/skeleton/llm-skeleton.d.ts +1 -1
  66. package/src/lib/skeleton/llm-skeleton.d.ts.map +1 -1
  67. package/src/lib/stepper/llm-stepper.css +171 -0
  68. package/src/lib/stepper/llm-stepper.d.ts +1 -1
  69. package/src/lib/stepper/llm-stepper.d.ts.map +1 -1
  70. package/src/lib/table/llm-table.css +200 -0
  71. package/src/lib/table/llm-table.d.ts +6 -6
  72. package/src/lib/table/llm-table.d.ts.map +1 -1
  73. package/src/lib/tabs/llm-tabs.css +120 -0
  74. package/src/lib/tabs/llm-tabs.d.ts +1 -1
  75. package/src/lib/tabs/llm-tabs.d.ts.map +1 -1
  76. package/src/lib/textarea/llm-textarea.css +100 -0
  77. package/src/lib/textarea/llm-textarea.d.ts +1 -1
  78. package/src/lib/textarea/llm-textarea.d.ts.map +1 -1
  79. package/src/lib/toast/llm-toast.css +137 -0
  80. package/src/lib/toast/llm-toast.d.ts +3 -3
  81. package/src/lib/toast/llm-toast.d.ts.map +1 -1
  82. package/src/lib/toggle/llm-toggle.css +118 -0
  83. package/src/lib/toggle/llm-toggle.d.ts +1 -1
  84. package/src/lib/toggle/llm-toggle.d.ts.map +1 -1
  85. package/src/lib/tooltip/llm-tooltip.css +80 -0
  86. package/src/lib/tooltip/llm-tooltip.d.ts +1 -1
  87. package/src/lib/tooltip/llm-tooltip.d.ts.map +1 -1
  88. package/styles/tokens.css +346 -0
@@ -0,0 +1,139 @@
1
+ .llm-button {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ gap: var(--ui-spacing-2);
6
+ border: 1px solid transparent;
7
+ border-radius: var(--ui-radius-md);
8
+ font-family: var(--ui-font-family);
9
+ font-size: var(--ui-font-size-md);
10
+ font-weight: var(--ui-font-weight-semibold);
11
+ line-height: var(--ui-line-height-tight);
12
+ letter-spacing: -0.01em;
13
+ cursor: pointer;
14
+ transition: background-color var(--ui-transition-fast),
15
+ border-color var(--ui-transition-fast),
16
+ color var(--ui-transition-fast),
17
+ box-shadow var(--ui-transition-fast);
18
+ white-space: nowrap;
19
+ text-decoration: none;
20
+ user-select: none;
21
+ }
22
+
23
+ .llm-button:focus-visible {
24
+ outline: none;
25
+ box-shadow: var(--ui-focus-ring);
26
+ }
27
+
28
+ /* Variants — flat by default; subtle state shifts only */
29
+ .llm-button.variant-primary {
30
+ background-color: var(--ui-color-primary);
31
+ color: var(--ui-color-text-on-primary);
32
+ border-color: var(--ui-color-primary);
33
+ }
34
+
35
+ .llm-button.variant-primary:hover:not(.is-disabled) {
36
+ background-color: var(--ui-color-primary-hover);
37
+ border-color: var(--ui-color-primary-hover);
38
+ }
39
+
40
+ .llm-button.variant-primary:active:not(.is-disabled) {
41
+ background-color: var(--ui-color-primary-active);
42
+ border-color: var(--ui-color-primary-active);
43
+ }
44
+
45
+ .llm-button.variant-secondary {
46
+ background-color: var(--ui-color-secondary);
47
+ color: var(--ui-color-text-on-secondary);
48
+ border-color: var(--ui-color-secondary);
49
+ }
50
+
51
+ .llm-button.variant-secondary:hover:not(.is-disabled) {
52
+ background-color: var(--ui-color-secondary-hover);
53
+ border-color: var(--ui-color-secondary-hover);
54
+ }
55
+
56
+ .llm-button.variant-secondary:active:not(.is-disabled) {
57
+ background-color: var(--ui-color-secondary-active);
58
+ border-color: var(--ui-color-secondary-active);
59
+ }
60
+
61
+ .llm-button.variant-outline {
62
+ background-color: var(--ui-color-surface-raised);
63
+ color: var(--ui-color-primary);
64
+ border-color: var(--ui-color-border-strong);
65
+ }
66
+
67
+ .llm-button.variant-outline:hover:not(.is-disabled) {
68
+ background-color: var(--ui-color-surface-sunken);
69
+ border-color: var(--ui-color-primary);
70
+ }
71
+
72
+ .llm-button.variant-outline:active:not(.is-disabled) {
73
+ background-color: var(--ui-color-surface-sunken);
74
+ border-color: var(--ui-color-primary-active);
75
+ }
76
+
77
+ /* Non-color differentiation (WCAG 1.4.1): danger variant carries
78
+ * a darker inset border so its silhouette is recognizable in greyscale
79
+ * and color-blind simulations, not only by red fill. */
80
+ .llm-button.variant-danger {
81
+ background-color: var(--ui-color-danger);
82
+ color: var(--ui-color-text-on-danger);
83
+ border-color: var(--ui-color-danger);
84
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.18);
85
+ }
86
+
87
+ .llm-button.variant-danger:hover:not(.is-disabled) {
88
+ background-color: var(--ui-color-danger-hover);
89
+ border-color: var(--ui-color-danger-hover);
90
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.18);
91
+ }
92
+
93
+ .llm-button.variant-danger:active:not(.is-disabled) {
94
+ background-color: var(--ui-color-danger-active);
95
+ border-color: var(--ui-color-danger-active);
96
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.18);
97
+ }
98
+
99
+ /* Sizes — modern target heights (sm 32px / md 40px / lg 48px) */
100
+ .llm-button.size-sm {
101
+ padding: 0.375rem 0.875rem;
102
+ font-size: var(--ui-font-size-sm);
103
+ min-height: 2rem;
104
+ }
105
+
106
+ .llm-button.size-md {
107
+ padding: 0.5625rem 1.125rem;
108
+ font-size: var(--ui-font-size-md);
109
+ min-height: 2.5rem;
110
+ }
111
+
112
+ .llm-button.size-lg {
113
+ padding: 0.75rem 1.5rem;
114
+ font-size: var(--ui-font-size-lg);
115
+ min-height: 3rem;
116
+ }
117
+
118
+ /* Disabled */
119
+ .llm-button.is-disabled {
120
+ opacity: var(--ui-opacity-disabled);
121
+ cursor: not-allowed;
122
+ pointer-events: none;
123
+ }
124
+
125
+ /* Loading spinner */
126
+ .spinner {
127
+ display: inline-block;
128
+ width: 1em;
129
+ height: 1em;
130
+ border: 1.5px solid currentColor;
131
+ border-top-color: transparent;
132
+ border-radius: var(--ui-radius-full);
133
+ animation: llm-spin 0.7s linear infinite;
134
+ flex-shrink: 0;
135
+ }
136
+
137
+ @keyframes llm-spin {
138
+ to { transform: rotate(360deg); }
139
+ }
@@ -0,0 +1,70 @@
1
+ .llm-card {
2
+ display: block;
3
+ border-radius: var(--ui-radius-xl);
4
+ background-color: var(--ui-color-surface-raised);
5
+ overflow: hidden;
6
+ }
7
+
8
+ /* Modernised variants — single soft shadow on elevated, no shadow on
9
+ * outlined or flat. Cards rest on the page; they don't float off it. */
10
+ .llm-card.variant-elevated {
11
+ box-shadow: var(--ui-shadow-sm);
12
+ border: 1px solid var(--ui-color-border);
13
+ }
14
+
15
+ .llm-card.variant-outlined {
16
+ border: 1px solid var(--ui-color-border);
17
+ background-color: var(--ui-color-surface-raised);
18
+ }
19
+
20
+ .llm-card.variant-flat {
21
+ background-color: var(--ui-color-surface-sunken);
22
+ }
23
+
24
+ /* Padding on .llm-card directly affects all slots */
25
+ .llm-card.padding-none .llm-card-header,
26
+ .llm-card.padding-none .llm-card-content,
27
+ .llm-card.padding-none .llm-card-footer {
28
+ padding: 0;
29
+ }
30
+
31
+ .llm-card.padding-sm .llm-card-header,
32
+ .llm-card.padding-sm .llm-card-content,
33
+ .llm-card.padding-sm .llm-card-footer {
34
+ padding: var(--ui-spacing-4);
35
+ }
36
+
37
+ .llm-card.padding-md .llm-card-header,
38
+ .llm-card.padding-md .llm-card-content,
39
+ .llm-card.padding-md .llm-card-footer {
40
+ padding: var(--ui-spacing-6);
41
+ }
42
+
43
+ .llm-card.padding-lg .llm-card-header,
44
+ .llm-card.padding-lg .llm-card-content,
45
+ .llm-card.padding-lg .llm-card-footer {
46
+ padding: var(--ui-spacing-8);
47
+ }
48
+
49
+ /* Sub-component layouts */
50
+ .llm-card-header {
51
+ display: block;
52
+ font-size: var(--ui-font-size-lg);
53
+ font-weight: var(--ui-font-weight-semibold);
54
+ color: var(--ui-color-text);
55
+ border-bottom: 1px solid var(--ui-color-border);
56
+ letter-spacing: var(--ui-letter-spacing-tight);
57
+ }
58
+
59
+ .llm-card-content {
60
+ display: block;
61
+ color: var(--ui-color-text);
62
+ line-height: var(--ui-line-height-normal);
63
+ }
64
+
65
+ .llm-card-footer {
66
+ display: flex;
67
+ align-items: center;
68
+ gap: var(--ui-spacing-3);
69
+ border-top: 1px solid var(--ui-color-border);
70
+ }
@@ -28,7 +28,7 @@ export interface LlmCardProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role
28
28
  /**
29
29
  * A card component for grouping related content.
30
30
  */
31
- export declare function LlmCard({ variant, padding, children, className, ...rest }: LlmCardProps): import("react/jsx-runtime").JSX.Element;
31
+ export declare function LlmCard({ variant, padding, children, className, ...rest }: LlmCardProps): import("react").JSX.Element;
32
32
  /**
33
33
  * The header component for an LlmCard.
34
34
  */
@@ -37,7 +37,7 @@ export declare function LlmCardHeader({ children, className, ...rest }: HTMLAttr
37
37
  * The content of the card header.
38
38
  */
39
39
  children?: ReactNode;
40
- }): import("react/jsx-runtime").JSX.Element;
40
+ }): import("react").JSX.Element;
41
41
  /**
42
42
  * The main content component for an LlmCard.
43
43
  */
@@ -46,7 +46,7 @@ export declare function LlmCardContent({ children, className, ...rest }: HTMLAtt
46
46
  * The main content of the card.
47
47
  */
48
48
  children?: ReactNode;
49
- }): import("react/jsx-runtime").JSX.Element;
49
+ }): import("react").JSX.Element;
50
50
  /**
51
51
  * The footer component for an LlmCard.
52
52
  */
@@ -55,5 +55,5 @@ export declare function LlmCardFooter({ children, className, ...rest }: HTMLAttr
55
55
  * The content of the card footer.
56
56
  */
57
57
  children?: ReactNode;
58
- }): import("react/jsx-runtime").JSX.Element;
58
+ }): import("react").JSX.Element;
59
59
  //# sourceMappingURL=llm-card.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"llm-card.d.ts","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/card/llm-card.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,gBAAgB,CAAC;AAExB;;GAEG;AACH,MAAM,WAAW,YACf,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,EAClD,WAAW;IACb;;OAEG;IACH,OAAO,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;IAC3C;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACtC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,EACtB,OAAoB,EACpB,OAAc,EACd,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,EAAE,YAAY,2CASd;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,EAAE,cAAc,CAAC,cAAc,CAAC,GAAG;IAClC;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,2CAMA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,EAAE,cAAc,CAAC,cAAc,CAAC,GAAG;IAClC;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,2CAMA;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,EAAE,cAAc,CAAC,cAAc,CAAC,GAAG;IAClC;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,2CAMA"}
1
+ {"version":3,"file":"llm-card.d.ts","sourceRoot":"","sources":["../../../../../../libs/react/src/lib/card/llm-card.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,gBAAgB,CAAC;AAExB;;GAEG;AACH,MAAM,WAAW,YACf,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,EAClD,WAAW;IACb;;OAEG;IACH,OAAO,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;IAC3C;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACtC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,EACtB,OAAoB,EACpB,OAAc,EACd,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,EAAE,YAAY,+BASd;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,EAAE,cAAc,CAAC,cAAc,CAAC,GAAG;IAClC;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,+BAMA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAC7B,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,EAAE,cAAc,CAAC,cAAc,CAAC,GAAG;IAClC;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,+BAMA;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,EACT,GAAG,IAAI,EACR,EAAE,cAAc,CAAC,cAAc,CAAC,GAAG;IAClC;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,+BAMA"}
@@ -0,0 +1,446 @@
1
+ /* ── Host wrapper ──────────────────────────────────────────────────────────── */
2
+ .llm-chat {
3
+ display: contents;
4
+ }
5
+
6
+ /* ── Shared surface (header / messages / input column) ─────────────────────── */
7
+ .llm-chat .surface {
8
+ display: flex;
9
+ flex-direction: column;
10
+ background: var(--ui-color-surface);
11
+ color: var(--ui-color-text);
12
+ overflow: hidden;
13
+ }
14
+
15
+ /* ═══════════════════════════════════════════════════════════════════════════ */
16
+ /* DRAWER variant */
17
+ /* ═══════════════════════════════════════════════════════════════════════════ */
18
+ .llm-chat.variant-drawer dialog {
19
+ all: unset;
20
+ position: fixed;
21
+ inset: 0 0 0 auto;
22
+ height: 100dvh;
23
+ width: 28rem;
24
+ display: none;
25
+ flex-direction: column;
26
+ background: var(--ui-color-surface);
27
+ box-shadow: var(--ui-shadow-xl, -8px 0 32px rgba(0, 0, 0, 0.12));
28
+ color: var(--ui-color-text);
29
+ overflow: hidden;
30
+ transform: translateX(100%);
31
+ transition:
32
+ transform var(--ui-duration-slow) var(--ui-ease-out, ease-out),
33
+ display var(--ui-duration-slow) allow-discrete,
34
+ overlay var(--ui-duration-slow) allow-discrete;
35
+ }
36
+
37
+ .llm-chat.variant-drawer dialog[open] {
38
+ display: flex;
39
+ transform: translateX(0);
40
+ }
41
+
42
+ @starting-style {
43
+ .llm-chat.variant-drawer dialog[open] {
44
+ transform: translateX(100%);
45
+ }
46
+ }
47
+
48
+ .llm-chat.variant-drawer dialog::backdrop {
49
+ background: var(--ui-color-overlay);
50
+ backdrop-filter: blur(2px);
51
+ transition:
52
+ opacity var(--ui-duration-slow) var(--ui-ease-out, ease-out),
53
+ display var(--ui-duration-slow) allow-discrete,
54
+ overlay var(--ui-duration-slow) allow-discrete;
55
+ }
56
+
57
+ .llm-chat.variant-drawer .drawer-surface {
58
+ width: 100%;
59
+ height: 100%;
60
+ }
61
+
62
+ /* ═══════════════════════════════════════════════════════════════════════════ */
63
+ /* POPUP variant */
64
+ /* ═══════════════════════════════════════════════════════════════════════════ */
65
+ .llm-chat.variant-popup .popup-surface {
66
+ position: fixed;
67
+ bottom: calc(var(--ui-spacing-6) + 3.5rem + var(--ui-spacing-4));
68
+ right: var(--ui-spacing-6);
69
+ width: 23.75rem;
70
+ height: 35rem;
71
+ border-radius: var(--ui-radius-xl);
72
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.18);
73
+ z-index: 100;
74
+ }
75
+
76
+ .llm-chat.variant-popup .fab-bubble {
77
+ position: fixed;
78
+ bottom: var(--ui-spacing-6);
79
+ right: var(--ui-spacing-6);
80
+ width: 3.5rem;
81
+ height: 3.5rem;
82
+ border-radius: var(--ui-radius-full);
83
+ background: var(--ui-color-brand-ai, #b5e61c);
84
+ color: var(--ui-color-text);
85
+ border: none;
86
+ font-family: var(--ui-font-family);
87
+ font-size: var(--ui-font-size-lg);
88
+ font-weight: var(--ui-font-weight-semibold);
89
+ cursor: pointer;
90
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.18);
91
+ transition:
92
+ transform var(--ui-transition-fast),
93
+ box-shadow var(--ui-transition-fast);
94
+ z-index: 101;
95
+ }
96
+
97
+ .llm-chat.variant-popup .fab-bubble:hover {
98
+ transform: scale(1.05);
99
+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.22);
100
+ }
101
+
102
+ .llm-chat.variant-popup .fab-bubble:focus-visible {
103
+ outline: none;
104
+ box-shadow: var(--ui-focus-ring), 0 6px 16px rgba(0, 0, 0, 0.18);
105
+ }
106
+
107
+ /* ═══════════════════════════════════════════════════════════════════════════ */
108
+ /* INLINE variant */
109
+ /* ═══════════════════════════════════════════════════════════════════════════ */
110
+ .llm-chat.variant-inline .inline-surface {
111
+ width: 100%;
112
+ height: 100%;
113
+ min-height: 24rem;
114
+ border: 1px solid var(--ui-color-border);
115
+ border-radius: var(--ui-radius-xl);
116
+ }
117
+
118
+ .llm-chat.variant-inline .llm-chat-header .close-btn {
119
+ display: none;
120
+ }
121
+
122
+ /* ═══════════════════════════════════════════════════════════════════════════ */
123
+ /* SUB-COMPONENT: header */
124
+ /* ═══════════════════════════════════════════════════════════════════════════ */
125
+ .llm-chat-header {
126
+ display: flex;
127
+ align-items: center;
128
+ justify-content: space-between;
129
+ gap: var(--ui-spacing-3);
130
+ padding: var(--ui-spacing-3) var(--ui-spacing-4);
131
+ border-bottom: 1px solid var(--ui-color-border);
132
+ flex-shrink: 0;
133
+ }
134
+
135
+ .llm-chat-header .title-block {
136
+ display: flex;
137
+ align-items: center;
138
+ gap: var(--ui-spacing-3);
139
+ font-size: var(--ui-font-size-md);
140
+ font-weight: var(--ui-font-weight-semibold);
141
+ color: var(--ui-color-text);
142
+ letter-spacing: var(--ui-letter-spacing-tight);
143
+ flex: 1;
144
+ min-width: 0;
145
+ }
146
+
147
+ .llm-chat-header .close-btn {
148
+ display: inline-flex;
149
+ align-items: center;
150
+ justify-content: center;
151
+ flex-shrink: 0;
152
+ width: 2rem;
153
+ height: 2rem;
154
+ padding: 0;
155
+ background: transparent;
156
+ border: 1px solid var(--ui-color-border);
157
+ border-radius: var(--ui-radius-sm);
158
+ cursor: pointer;
159
+ color: var(--ui-color-text-muted);
160
+ transition:
161
+ background-color var(--ui-transition-fast),
162
+ color var(--ui-transition-fast);
163
+ }
164
+
165
+ .llm-chat-header .close-btn:hover {
166
+ background-color: var(--ui-color-surface-sunken);
167
+ color: var(--ui-color-text);
168
+ }
169
+
170
+ .llm-chat-header .close-btn:focus-visible {
171
+ outline: none;
172
+ box-shadow: var(--ui-focus-ring);
173
+ }
174
+
175
+ /* ═══════════════════════════════════════════════════════════════════════════ */
176
+ /* SUB-COMPONENT: messages */
177
+ /* ═══════════════════════════════════════════════════════════════════════════ */
178
+ .llm-chat-messages {
179
+ display: flex;
180
+ flex-direction: column;
181
+ gap: var(--ui-spacing-3);
182
+ padding: var(--ui-spacing-4);
183
+ overflow-y: auto;
184
+ overflow-anchor: auto;
185
+ scroll-behavior: smooth;
186
+ flex: 1;
187
+ background: var(--ui-color-surface);
188
+ }
189
+
190
+ /* ═══════════════════════════════════════════════════════════════════════════ */
191
+ /* SUB-COMPONENT: message bubble */
192
+ /* ═══════════════════════════════════════════════════════════════════════════ */
193
+ .llm-chat-message {
194
+ display: block;
195
+ max-width: 85%;
196
+ padding: var(--ui-spacing-3) var(--ui-spacing-4);
197
+ border-radius: var(--ui-radius-lg);
198
+ font-size: var(--ui-font-size-sm);
199
+ line-height: var(--ui-line-height-normal);
200
+ word-wrap: break-word;
201
+ }
202
+
203
+ .llm-chat-message.role-assistant,
204
+ .llm-chat-message.role-system {
205
+ background: var(--ui-color-surface-sunken);
206
+ color: var(--ui-color-text);
207
+ align-self: flex-start;
208
+ }
209
+
210
+ .llm-chat-message.role-user {
211
+ background: var(--ui-color-primary);
212
+ color: var(--ui-color-text-on-primary);
213
+ align-self: flex-end;
214
+ }
215
+
216
+ .llm-chat-message.role-system {
217
+ font-style: italic;
218
+ color: var(--ui-color-text-muted);
219
+ }
220
+
221
+ .llm-chat-message.is-failed {
222
+ background: var(--ui-color-surface-sunken);
223
+ border: 1px dashed var(--ui-color-danger);
224
+ color: var(--ui-color-text);
225
+ }
226
+
227
+ /* ═══════════════════════════════════════════════════════════════════════════ */
228
+ /* SUB-COMPONENT: typing indicator */
229
+ /* ═══════════════════════════════════════════════════════════════════════════ */
230
+ .llm-chat-typing {
231
+ display: inline-flex;
232
+ align-items: center;
233
+ gap: var(--ui-spacing-1);
234
+ padding: var(--ui-spacing-2) var(--ui-spacing-3);
235
+ background: var(--ui-color-surface-sunken);
236
+ border-radius: var(--ui-radius-lg);
237
+ align-self: flex-start;
238
+ }
239
+
240
+ .llm-chat-typing .dot {
241
+ width: 0.375rem;
242
+ height: 0.375rem;
243
+ border-radius: 50%;
244
+ background: var(--ui-color-text-muted);
245
+ animation: llm-chat-typing 1.4s infinite ease-in-out;
246
+ }
247
+
248
+ .llm-chat-typing .dot:nth-child(2) {
249
+ animation-delay: 0.16s;
250
+ }
251
+
252
+ .llm-chat-typing .dot:nth-child(3) {
253
+ animation-delay: 0.32s;
254
+ }
255
+
256
+ /* Inline cursor variant — drops the bubble chrome so the dots can sit at the
257
+ end of a streaming assistant message. */
258
+ .llm-chat-typing.is-inline {
259
+ display: inline-flex;
260
+ padding: 0;
261
+ margin-left: var(--ui-spacing-1);
262
+ background: transparent;
263
+ border-radius: 0;
264
+ vertical-align: baseline;
265
+ align-self: auto;
266
+ }
267
+
268
+ .llm-chat-typing.is-inline .dot {
269
+ width: 0.25rem;
270
+ height: 0.25rem;
271
+ }
272
+
273
+ @keyframes llm-chat-typing {
274
+ 0%, 60%, 100% { opacity: 0.3; transform: translateY(0); }
275
+ 30% { opacity: 1; transform: translateY(-2px); }
276
+ }
277
+
278
+ @media (prefers-reduced-motion: reduce) {
279
+ .llm-chat-typing .dot {
280
+ animation: none;
281
+ opacity: 0.6;
282
+ }
283
+ }
284
+
285
+ .llm-chat-typing .sr-only {
286
+ position: absolute;
287
+ width: 1px;
288
+ height: 1px;
289
+ padding: 0;
290
+ margin: -1px;
291
+ overflow: hidden;
292
+ clip: rect(0, 0, 0, 0);
293
+ white-space: nowrap;
294
+ border: 0;
295
+ }
296
+
297
+ /* ═══════════════════════════════════════════════════════════════════════════ */
298
+ /* SUB-COMPONENT: suggestion chip */
299
+ /* ═══════════════════════════════════════════════════════════════════════════ */
300
+ .llm-chat-suggestion {
301
+ display: block;
302
+ }
303
+
304
+ .llm-chat-suggestion .chip {
305
+ display: flex;
306
+ flex-direction: column;
307
+ align-items: flex-start;
308
+ gap: var(--ui-spacing-1);
309
+ width: 100%;
310
+ padding: var(--ui-spacing-3) var(--ui-spacing-4);
311
+ background: var(--ui-color-surface);
312
+ color: var(--ui-color-text);
313
+ border: 1px solid var(--ui-color-border);
314
+ border-radius: var(--ui-radius-lg);
315
+ font-family: var(--ui-font-family);
316
+ text-align: left;
317
+ cursor: pointer;
318
+ transition:
319
+ background-color var(--ui-transition-fast),
320
+ border-color var(--ui-transition-fast);
321
+ }
322
+
323
+ .llm-chat-suggestion .chip:hover {
324
+ background-color: var(--ui-color-surface-sunken);
325
+ border-color: var(--ui-color-border-hover);
326
+ }
327
+
328
+ .llm-chat-suggestion .chip:focus-visible {
329
+ outline: none;
330
+ box-shadow: var(--ui-focus-ring);
331
+ }
332
+
333
+ .llm-chat-suggestion .chip-label {
334
+ font-size: var(--ui-font-size-sm);
335
+ font-weight: var(--ui-font-weight-medium);
336
+ color: var(--ui-color-text);
337
+ }
338
+
339
+ .llm-chat-suggestion .chip-hint {
340
+ font-size: var(--ui-font-size-xs);
341
+ color: var(--ui-color-text-muted);
342
+ }
343
+
344
+ /* ═══════════════════════════════════════════════════════════════════════════ */
345
+ /* SUB-COMPONENT: input footer */
346
+ /* ═══════════════════════════════════════════════════════════════════════════ */
347
+ .llm-chat-input {
348
+ display: flex;
349
+ align-items: flex-end;
350
+ gap: var(--ui-spacing-2);
351
+ padding: var(--ui-spacing-3) var(--ui-spacing-4);
352
+ border-top: 1px solid var(--ui-color-border);
353
+ background: var(--ui-color-surface);
354
+ flex-shrink: 0;
355
+ }
356
+
357
+ .llm-chat-input .field {
358
+ flex: 1;
359
+ min-width: 0;
360
+ padding: var(--ui-spacing-2) var(--ui-spacing-3);
361
+ border: 1px solid var(--ui-color-input-border, var(--ui-color-border));
362
+ border-radius: var(--ui-radius-md);
363
+ background: var(--ui-color-surface-sunken);
364
+ color: var(--ui-color-text);
365
+ font-family: var(--ui-font-family);
366
+ font-size: var(--ui-font-size-sm);
367
+ line-height: var(--ui-line-height-normal);
368
+ resize: none;
369
+ transition: border-color var(--ui-transition-fast);
370
+ }
371
+
372
+ .llm-chat-input .field::placeholder {
373
+ color: var(--ui-color-text-muted);
374
+ }
375
+
376
+ .llm-chat-input .field:hover:not(:disabled) {
377
+ border-color: var(--ui-color-input-border-hover, var(--ui-color-border-hover));
378
+ }
379
+
380
+ .llm-chat-input .field:focus-visible {
381
+ outline: none;
382
+ border-color: var(--ui-color-primary);
383
+ box-shadow: var(--ui-focus-ring);
384
+ }
385
+
386
+ .llm-chat-input .field:disabled {
387
+ opacity: var(--ui-opacity-disabled);
388
+ cursor: not-allowed;
389
+ }
390
+
391
+ .llm-chat-input .action-btn {
392
+ display: inline-flex;
393
+ align-items: center;
394
+ justify-content: center;
395
+ flex-shrink: 0;
396
+ padding: var(--ui-spacing-2) var(--ui-spacing-4);
397
+ border: 1px solid transparent;
398
+ border-radius: var(--ui-radius-md);
399
+ font-family: var(--ui-font-family);
400
+ font-size: var(--ui-font-size-sm);
401
+ font-weight: var(--ui-font-weight-medium);
402
+ cursor: pointer;
403
+ transition:
404
+ background-color var(--ui-transition-fast),
405
+ border-color var(--ui-transition-fast),
406
+ transform var(--ui-transition-fast);
407
+ }
408
+
409
+ .llm-chat-input .action-btn.variant-primary {
410
+ background: var(--ui-color-primary);
411
+ color: var(--ui-color-text-on-primary);
412
+ border-color: var(--ui-color-primary);
413
+ }
414
+
415
+ .llm-chat-input .action-btn.variant-primary:hover:not(:disabled) {
416
+ background: var(--ui-color-primary-hover);
417
+ border-color: var(--ui-color-primary-hover);
418
+ }
419
+
420
+ .llm-chat-input .action-btn.variant-danger {
421
+ background: var(--ui-color-danger);
422
+ color: var(--ui-color-text-on-danger);
423
+ border-color: var(--ui-color-danger);
424
+ }
425
+
426
+ .llm-chat-input .action-btn.variant-danger:hover {
427
+ background: var(--ui-color-danger-hover);
428
+ border-color: var(--ui-color-danger-hover);
429
+ }
430
+
431
+ .llm-chat-input .action-btn:disabled {
432
+ opacity: var(--ui-opacity-disabled);
433
+ cursor: not-allowed;
434
+ }
435
+
436
+ .llm-chat-input .action-btn:focus-visible {
437
+ outline: none;
438
+ box-shadow: var(--ui-focus-ring);
439
+ }
440
+
441
+ /* ═══════════════════════════════════════════════════════════════════════════ */
442
+ /* STATUS-aware tweaks */
443
+ /* ═══════════════════════════════════════════════════════════════════════════ */
444
+ .llm-chat.status-streaming .llm-chat-input .field {
445
+ cursor: wait;
446
+ }