@composy/chat-core 0.0.1

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 (123) hide show
  1. package/README.md +123 -0
  2. package/dist/index.js +1868 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/index.min.js +1868 -0
  5. package/es/constants/dom.d.ts +41 -0
  6. package/es/constants/dom.d.ts.map +1 -0
  7. package/es/constants/dom.js +30 -0
  8. package/es/constants/dom.js.map +1 -0
  9. package/es/core/chat-manager.d.ts +34 -0
  10. package/es/core/chat-manager.d.ts.map +1 -0
  11. package/es/core/chat-manager.js +93 -0
  12. package/es/core/chat-manager.js.map +1 -0
  13. package/es/core/event-emitter.d.ts +48 -0
  14. package/es/core/event-emitter.d.ts.map +1 -0
  15. package/es/core/event-emitter.js +75 -0
  16. package/es/core/event-emitter.js.map +1 -0
  17. package/es/core/mention-engine.d.ts +41 -0
  18. package/es/core/mention-engine.d.ts.map +1 -0
  19. package/es/core/mention-engine.js +117 -0
  20. package/es/core/mention-engine.js.map +1 -0
  21. package/es/index.d.ts +28 -0
  22. package/es/index.d.ts.map +1 -0
  23. package/es/index.js +140 -0
  24. package/es/index.js.map +1 -0
  25. package/es/renderer/dom-renderer.d.ts +79 -0
  26. package/es/renderer/dom-renderer.d.ts.map +1 -0
  27. package/es/renderer/dom-renderer.js +677 -0
  28. package/es/renderer/dom-renderer.js.map +1 -0
  29. package/es/renderer/style-manager.d.ts +58 -0
  30. package/es/renderer/style-manager.d.ts.map +1 -0
  31. package/es/renderer/style-manager.js +641 -0
  32. package/es/renderer/style-manager.js.map +1 -0
  33. package/es/theme/theme-manager.d.ts +33 -0
  34. package/es/theme/theme-manager.d.ts.map +1 -0
  35. package/es/theme/theme-manager.js +70 -0
  36. package/es/theme/theme-manager.js.map +1 -0
  37. package/es/theme/tokens.d.ts +57 -0
  38. package/es/theme/tokens.d.ts.map +1 -0
  39. package/es/theme/tokens.js +108 -0
  40. package/es/theme/tokens.js.map +1 -0
  41. package/es/types/index.d.ts +204 -0
  42. package/es/types/index.d.ts.map +1 -0
  43. package/es/types/index.js +10 -0
  44. package/esm/constants/dom.d.ts +41 -0
  45. package/esm/constants/dom.d.ts.map +1 -0
  46. package/esm/constants/dom.js +30 -0
  47. package/esm/constants/dom.js.map +1 -0
  48. package/esm/core/chat-manager.d.ts +34 -0
  49. package/esm/core/chat-manager.d.ts.map +1 -0
  50. package/esm/core/chat-manager.js +93 -0
  51. package/esm/core/chat-manager.js.map +1 -0
  52. package/esm/core/event-emitter.d.ts +48 -0
  53. package/esm/core/event-emitter.d.ts.map +1 -0
  54. package/esm/core/event-emitter.js +75 -0
  55. package/esm/core/event-emitter.js.map +1 -0
  56. package/esm/core/mention-engine.d.ts +41 -0
  57. package/esm/core/mention-engine.d.ts.map +1 -0
  58. package/esm/core/mention-engine.js +117 -0
  59. package/esm/core/mention-engine.js.map +1 -0
  60. package/esm/index.d.ts +28 -0
  61. package/esm/index.d.ts.map +1 -0
  62. package/esm/index.js +140 -0
  63. package/esm/index.js.map +1 -0
  64. package/esm/renderer/dom-renderer.d.ts +79 -0
  65. package/esm/renderer/dom-renderer.d.ts.map +1 -0
  66. package/esm/renderer/dom-renderer.js +677 -0
  67. package/esm/renderer/dom-renderer.js.map +1 -0
  68. package/esm/renderer/style-manager.d.ts +58 -0
  69. package/esm/renderer/style-manager.d.ts.map +1 -0
  70. package/esm/renderer/style-manager.js +641 -0
  71. package/esm/renderer/style-manager.js.map +1 -0
  72. package/esm/theme/theme-manager.d.ts +33 -0
  73. package/esm/theme/theme-manager.d.ts.map +1 -0
  74. package/esm/theme/theme-manager.js +70 -0
  75. package/esm/theme/theme-manager.js.map +1 -0
  76. package/esm/theme/tokens.d.ts +57 -0
  77. package/esm/theme/tokens.d.ts.map +1 -0
  78. package/esm/theme/tokens.js +108 -0
  79. package/esm/theme/tokens.js.map +1 -0
  80. package/esm/types/index.d.ts +204 -0
  81. package/esm/types/index.d.ts.map +1 -0
  82. package/esm/types/index.js +10 -0
  83. package/lib/constants/dom.cjs +36 -0
  84. package/lib/constants/dom.cjs.map +1 -0
  85. package/lib/constants/dom.d.ts +41 -0
  86. package/lib/constants/dom.d.ts.map +1 -0
  87. package/lib/core/chat-manager.cjs +94 -0
  88. package/lib/core/chat-manager.cjs.map +1 -0
  89. package/lib/core/chat-manager.d.ts +34 -0
  90. package/lib/core/chat-manager.d.ts.map +1 -0
  91. package/lib/core/event-emitter.cjs +76 -0
  92. package/lib/core/event-emitter.cjs.map +1 -0
  93. package/lib/core/event-emitter.d.ts +48 -0
  94. package/lib/core/event-emitter.d.ts.map +1 -0
  95. package/lib/core/mention-engine.cjs +118 -0
  96. package/lib/core/mention-engine.cjs.map +1 -0
  97. package/lib/core/mention-engine.d.ts +41 -0
  98. package/lib/core/mention-engine.d.ts.map +1 -0
  99. package/lib/index.cjs +160 -0
  100. package/lib/index.cjs.map +1 -0
  101. package/lib/index.d.ts +28 -0
  102. package/lib/index.d.ts.map +1 -0
  103. package/lib/package.json +3 -0
  104. package/lib/renderer/dom-renderer.cjs +678 -0
  105. package/lib/renderer/dom-renderer.cjs.map +1 -0
  106. package/lib/renderer/dom-renderer.d.ts +79 -0
  107. package/lib/renderer/dom-renderer.d.ts.map +1 -0
  108. package/lib/renderer/style-manager.cjs +646 -0
  109. package/lib/renderer/style-manager.cjs.map +1 -0
  110. package/lib/renderer/style-manager.d.ts +58 -0
  111. package/lib/renderer/style-manager.d.ts.map +1 -0
  112. package/lib/theme/theme-manager.cjs +71 -0
  113. package/lib/theme/theme-manager.cjs.map +1 -0
  114. package/lib/theme/theme-manager.d.ts +33 -0
  115. package/lib/theme/theme-manager.d.ts.map +1 -0
  116. package/lib/theme/tokens.cjs +110 -0
  117. package/lib/theme/tokens.cjs.map +1 -0
  118. package/lib/theme/tokens.d.ts +57 -0
  119. package/lib/theme/tokens.d.ts.map +1 -0
  120. package/lib/types/index.cjs +11 -0
  121. package/lib/types/index.d.ts +204 -0
  122. package/lib/types/index.d.ts.map +1 -0
  123. package/package.json +107 -0
@@ -0,0 +1,646 @@
1
+ /*!
2
+ * ***********************************
3
+ * @composy/chat-core v0.0.1 *
4
+ * Built with rollup *
5
+ * Build time: 2024-08-17 11:30:32 *
6
+ * Build mode: production *
7
+ * Minified: No *
8
+ * ***********************************
9
+ */
10
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
11
+ const require_dom = require("../constants/dom.cjs");
12
+ //#region src/renderer/style-manager.ts
13
+ const styleRefs = /* @__PURE__ */ new Map();
14
+ function injectStyles(tokens, prefix = require_dom.DEFAULT_CLASS_PREFIX) {
15
+ const normalizedPrefix = require_dom.normalizeClassPrefix(prefix);
16
+ const styleId = require_dom.getStyleElementId(normalizedPrefix);
17
+ styleRefs.set(styleId, (styleRefs.get(styleId) ?? 0) + 1);
18
+ upsertStyle(styleId, generateCSS(tokens, normalizedPrefix));
19
+ }
20
+ function updateStyles(tokens, prefix = require_dom.DEFAULT_CLASS_PREFIX) {
21
+ const normalizedPrefix = require_dom.normalizeClassPrefix(prefix);
22
+ upsertStyle(require_dom.getStyleElementId(normalizedPrefix), generateCSS(tokens, normalizedPrefix));
23
+ }
24
+ function removeStyles(prefix = require_dom.DEFAULT_CLASS_PREFIX) {
25
+ const styleId = require_dom.getStyleElementId(prefix);
26
+ const refs = styleRefs.get(styleId) ?? 0;
27
+ if (refs > 1) {
28
+ styleRefs.set(styleId, refs - 1);
29
+ return;
30
+ }
31
+ styleRefs.delete(styleId);
32
+ document.getElementById(styleId)?.remove();
33
+ }
34
+ function cls(prefix, ...parts) {
35
+ const normalizedPrefix = require_dom.normalizeClassPrefix(prefix);
36
+ return parts.map((part) => `${normalizedPrefix}-${part}`).join(" ");
37
+ }
38
+ const clsx = require_dom.cx;
39
+ function upsertStyle(styleId, cssText) {
40
+ let style = document.getElementById(styleId);
41
+ if (!style) {
42
+ style = document.createElement("style");
43
+ style.id = styleId;
44
+ style.dataset.ldesignChat = "true";
45
+ document.head.appendChild(style);
46
+ }
47
+ style.textContent = cssText;
48
+ }
49
+ function tokenVars(t) {
50
+ const vars = {
51
+ bgPrimary: t.bgPrimary,
52
+ bgSecondary: t.bgSecondary,
53
+ bgBubbleOutgoing: t.bgBubbleOutgoing,
54
+ bgBubbleIncoming: t.bgBubbleIncoming,
55
+ bgInput: t.bgInput,
56
+ bgMention: t.bgMention,
57
+ bgMentionHover: t.bgMentionHover,
58
+ bgMentionActive: t.bgMentionActive,
59
+ bgLoadMore: t.bgLoadMore,
60
+ bgSystemMessage: t.bgSystemMessage,
61
+ bgDropOverlay: t.bgDropOverlay,
62
+ bgDangerSoft: t.bgDangerSoft,
63
+ textPrimary: t.textPrimary,
64
+ textSecondary: t.textSecondary,
65
+ textBubbleOutgoing: t.textBubbleOutgoing,
66
+ textBubbleIncoming: t.textBubbleIncoming,
67
+ textMention: t.textMention,
68
+ textMentionTag: t.textMentionTag,
69
+ textTimestamp: t.textTimestamp,
70
+ textSystem: t.textSystem,
71
+ textPlaceholder: t.textPlaceholder,
72
+ borderPrimary: t.borderPrimary,
73
+ borderInput: t.borderInput,
74
+ borderInputFocus: t.borderInputFocus,
75
+ borderMention: t.borderMention,
76
+ colorSending: t.colorSending,
77
+ colorSent: t.colorSent,
78
+ colorDelivered: t.colorDelivered,
79
+ colorRead: t.colorRead,
80
+ colorFailed: t.colorFailed,
81
+ colorLink: t.colorLink,
82
+ shadowPanel: t.shadowPanel,
83
+ shadowMention: t.shadowMention,
84
+ avatarBg: t.avatarBg,
85
+ avatarText: t.avatarText,
86
+ btnPrimaryBg: t.btnPrimaryBg,
87
+ btnPrimaryText: t.btnPrimaryText,
88
+ btnPrimaryHover: t.btnPrimaryHover,
89
+ scrollbarThumb: t.scrollbarThumb,
90
+ scrollbarTrack: t.scrollbarTrack,
91
+ bgToolbar: t.bgToolbar,
92
+ borderToolbar: t.borderToolbar,
93
+ toolbarIconColor: t.toolbarIconColor,
94
+ toolbarIconHover: t.toolbarIconHover,
95
+ toolbarVoiceActive: t.toolbarVoiceActive
96
+ };
97
+ return Object.entries(vars).map(([key, value]) => ` ${require_dom.COMPONENT_CSS_VAR_PREFIX}-${toKebab(key)}: ${value};`).join("\n");
98
+ }
99
+ function sizeVars() {
100
+ return `
101
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
102
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-font-size: var(--size-font-base);
103
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-font-size-sm: var(--size-font-sm);
104
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-font-size-xs: var(--size-font-xs);
105
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-font-size-lg: var(--size-font-lg);
106
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-font-weight-regular: var(--size-font-weight-regular);
107
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-font-weight-medium: var(--size-font-weight-medium);
108
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-font-weight-semibold: var(--size-font-weight-semibold);
109
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-line-height: var(--size-line-normal);
110
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-line-height-bubble: var(--size-line-relaxed);
111
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-space-1: var(--size-1);
112
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-space-2: var(--size-2);
113
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-space-3: var(--size-3);
114
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-space-4: var(--size-4);
115
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-space-5: var(--size-5);
116
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-space-6: var(--size-6);
117
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-space-8: var(--size-8);
118
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-avatar-size: var(--size-11);
119
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-mention-avatar-size: var(--size-9);
120
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-toolbar-button-size: var(--size-9);
121
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-input-button-size: var(--size-11);
122
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-file-icon-size: var(--size-12);
123
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-image-max-size: calc(var(--size-13) * 5);
124
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-panel-max-height: calc(var(--size-24) + var(--size-4));
125
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-textarea-min-height: var(--size-11);
126
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-textarea-max-height: calc(var(--size-12) * 3);
127
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-message-max-width: 65%;
128
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-system-message-max-width: 80%;
129
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-file-bubble-min-width: calc(var(--size-24) + var(--size-4));
130
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-border-width: var(--size-border-width-thin);
131
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-border-width-drop: var(--size-border-width-medium);
132
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-radius-xs: var(--size-radius-sm);
133
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-radius-sm: var(--size-radius-md);
134
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-radius-md: var(--size-radius-lg);
135
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-radius-lg: var(--size-radius-xl);
136
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-radius-pill: var(--size-radius-full);
137
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-radius-circle: var(--size-radius-circle);
138
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-transition-fast: var(--size-duration-fast) var(--size-ease-out);
139
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-transition-normal: var(--size-duration-normal) var(--size-ease-out);
140
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-z-overlay: var(--size-z-dropdown);
141
+ ${require_dom.COMPONENT_CSS_VAR_PREFIX}-z-mention: var(--size-z-popover);
142
+ `;
143
+ }
144
+ function generateCSS(tokens, p) {
145
+ return `
146
+ /* @composy/chat-core styles */
147
+ .${p}-container,
148
+ .${p}-container * {
149
+ box-sizing: border-box;
150
+ }
151
+
152
+ .${p}-container {
153
+ ${tokenVars(tokens)}
154
+ ${sizeVars()}
155
+ display: flex;
156
+ flex-direction: column;
157
+ width: 100%;
158
+ height: 100%;
159
+ overflow: hidden;
160
+ position: relative;
161
+ background: ${v("bg-primary")};
162
+ color: ${v("text-primary")};
163
+ font-family: ${v("font-family")};
164
+ font-size: ${v("font-size")};
165
+ line-height: ${v("line-height")};
166
+ border: ${v("border-width")} solid ${v("border-primary")};
167
+ border-radius: ${v("radius-md")};
168
+ box-shadow: ${v("shadow-panel")};
169
+ }
170
+
171
+ .${p}-message-list {
172
+ flex: 1;
173
+ min-width: 0;
174
+ overflow-y: auto;
175
+ overflow-x: hidden;
176
+ padding: ${v("space-6")};
177
+ scroll-behavior: smooth;
178
+ }
179
+
180
+ .${p}-message-list::-webkit-scrollbar {
181
+ width: var(--size-3);
182
+ }
183
+
184
+ .${p}-message-list::-webkit-scrollbar-thumb {
185
+ background: ${v("scrollbar-thumb")};
186
+ border-radius: ${v("radius-pill")};
187
+ }
188
+
189
+ .${p}-message-list::-webkit-scrollbar-track {
190
+ background: ${v("scrollbar-track")};
191
+ }
192
+
193
+ .${p}-load-more {
194
+ margin-bottom: ${v("space-5")};
195
+ padding: ${v("space-5")};
196
+ text-align: center;
197
+ color: ${v("color-link")};
198
+ font-size: ${v("font-size-sm")};
199
+ background: ${v("bg-load-more")};
200
+ border-radius: ${v("radius-sm")};
201
+ cursor: pointer;
202
+ user-select: none;
203
+ transition: opacity ${v("transition-fast")}, background ${v("transition-fast")};
204
+ }
205
+
206
+ .${p}-load-more:hover {
207
+ background: ${v("bg-mention-hover")};
208
+ }
209
+
210
+ .${p}-load-more--loading {
211
+ cursor: default;
212
+ opacity: .6;
213
+ }
214
+
215
+ .${p}-time-divider {
216
+ padding: ${v("space-4")} 0;
217
+ color: ${v("text-timestamp")};
218
+ font-size: ${v("font-size-sm")};
219
+ text-align: center;
220
+ user-select: none;
221
+ }
222
+
223
+ .${p}-time-divider span {
224
+ padding: ${v("space-1")} ${v("space-5")};
225
+ background: ${v("bg-secondary")};
226
+ border-radius: ${v("radius-pill")};
227
+ }
228
+
229
+ .${p}-message-row {
230
+ display: flex;
231
+ align-items: flex-start;
232
+ gap: ${v("space-4")};
233
+ margin-bottom: ${v("space-5")};
234
+ }
235
+
236
+ .${p}-message-row--outgoing {
237
+ flex-direction: row-reverse;
238
+ }
239
+
240
+ .${p}-message-row--system {
241
+ justify-content: center;
242
+ }
243
+
244
+ .${p}-avatar {
245
+ display: flex;
246
+ align-items: center;
247
+ justify-content: center;
248
+ width: ${v("avatar-size")};
249
+ height: ${v("avatar-size")};
250
+ overflow: hidden;
251
+ flex-shrink: 0;
252
+ color: ${v("avatar-text")};
253
+ background: ${v("avatar-bg")};
254
+ border-radius: ${v("radius-circle")};
255
+ font-size: ${v("font-size")};
256
+ font-weight: ${v("font-weight-semibold")};
257
+ }
258
+
259
+ .${p}-avatar img {
260
+ width: 100%;
261
+ height: 100%;
262
+ object-fit: cover;
263
+ }
264
+
265
+ .${p}-message-body {
266
+ display: flex;
267
+ flex-direction: column;
268
+ max-width: ${v("message-max-width")};
269
+ min-width: 0;
270
+ }
271
+
272
+ .${p}-message-row--outgoing .${p}-message-body {
273
+ align-items: flex-end;
274
+ }
275
+
276
+ .${p}-nickname {
277
+ margin-bottom: ${v("space-2")};
278
+ padding: 0 ${v("space-2")};
279
+ color: ${v("text-secondary")};
280
+ font-size: ${v("font-size-sm")};
281
+ }
282
+
283
+ .${p}-bubble {
284
+ position: relative;
285
+ max-width: 100%;
286
+ padding: ${v("space-5")} ${v("space-6")};
287
+ border-radius: ${v("radius-lg")};
288
+ word-break: break-word;
289
+ overflow-wrap: unknownwhere;
290
+ white-space: pre-wrap;
291
+ line-height: ${v("line-height-bubble")};
292
+ }
293
+
294
+ .${p}-bubble--incoming {
295
+ color: ${v("text-bubble-incoming")};
296
+ background: ${v("bg-bubble-incoming")};
297
+ border-top-left-radius: ${v("radius-xs")};
298
+ }
299
+
300
+ .${p}-bubble--outgoing {
301
+ color: ${v("text-bubble-outgoing")};
302
+ background: ${v("bg-bubble-outgoing")};
303
+ border-top-right-radius: ${v("radius-xs")};
304
+ }
305
+
306
+ .${p}-bubble--image {
307
+ padding: ${v("space-2")};
308
+ background: unset;
309
+ }
310
+
311
+ .${p}-bubble--image img {
312
+ display: block;
313
+ max-width: ${v("image-max-size")};
314
+ max-height: ${v("image-max-size")};
315
+ border-radius: ${v("radius-md")};
316
+ cursor: pointer;
317
+ }
318
+
319
+ .${p}-bubble--file {
320
+ display: flex;
321
+ align-items: center;
322
+ gap: ${v("space-5")};
323
+ min-width: ${v("file-bubble-min-width")};
324
+ }
325
+
326
+ .${p}-file-icon {
327
+ display: flex;
328
+ align-items: center;
329
+ justify-content: center;
330
+ width: ${v("file-icon-size")};
331
+ height: ${v("file-icon-size")};
332
+ flex-shrink: 0;
333
+ background: ${v("bg-secondary")};
334
+ border-radius: ${v("radius-sm")};
335
+ font-size: ${v("font-size-lg")};
336
+ }
337
+
338
+ .${p}-file-info {
339
+ flex: 1;
340
+ min-width: 0;
341
+ overflow: hidden;
342
+ }
343
+
344
+ .${p}-file-name {
345
+ overflow: hidden;
346
+ font-size: ${v("font-size")};
347
+ text-overflow: ellipsis;
348
+ white-space: nowrap;
349
+ }
350
+
351
+ .${p}-file-size {
352
+ margin-top: ${v("space-1")};
353
+ color: ${v("text-secondary")};
354
+ font-size: ${v("font-size-sm")};
355
+ }
356
+
357
+ .${p}-system-message {
358
+ max-width: ${v("system-message-max-width")};
359
+ padding: ${v("space-2")} ${v("space-6")};
360
+ color: ${v("text-system")};
361
+ background: ${v("bg-system-message")};
362
+ border-radius: ${v("radius-pill")};
363
+ font-size: ${v("font-size-sm")};
364
+ text-align: center;
365
+ }
366
+
367
+ .${p}-message-footer {
368
+ display: flex;
369
+ align-items: center;
370
+ gap: ${v("space-3")};
371
+ margin-top: ${v("space-1")};
372
+ padding: 0 ${v("space-2")};
373
+ }
374
+
375
+ .${p}-message-row--outgoing .${p}-message-footer {
376
+ flex-direction: row-reverse;
377
+ }
378
+
379
+ .${p}-timestamp,
380
+ .${p}-status {
381
+ font-size: ${v("font-size-xs")};
382
+ }
383
+
384
+ .${p}-timestamp {
385
+ color: ${v("text-timestamp")};
386
+ }
387
+
388
+ .${p}-status--sending { color: ${v("color-sending")}; }
389
+ .${p}-status--sent { color: ${v("color-sent")}; }
390
+ .${p}-status--delivered { color: ${v("color-delivered")}; }
391
+ .${p}-status--read { color: ${v("color-read")}; }
392
+ .${p}-status--failed {
393
+ color: ${v("color-failed")};
394
+ cursor: pointer;
395
+ }
396
+
397
+ .${p}-mention-tag,
398
+ .${p}-link {
399
+ color: ${v("text-mention-tag")};
400
+ font-weight: ${v("font-weight-medium")};
401
+ }
402
+
403
+ .${p}-mention-tag {
404
+ cursor: pointer;
405
+ }
406
+
407
+ .${p}-mention-tag:hover,
408
+ .${p}-link:hover {
409
+ text-decoration: underline;
410
+ }
411
+
412
+ .${p}-input-area {
413
+ display: flex;
414
+ align-items: flex-end;
415
+ gap: ${v("space-4")};
416
+ position: relative;
417
+ padding: ${v("space-5")} ${v("space-6")};
418
+ border-top: ${v("border-width")} solid ${v("border-primary")};
419
+ background: ${v("bg-input")};
420
+ }
421
+
422
+ .${p}-input-wrapper {
423
+ flex: 1;
424
+ min-width: 0;
425
+ position: relative;
426
+ }
427
+
428
+ .${p}-textarea {
429
+ width: 100%;
430
+ min-height: ${v("textarea-min-height")};
431
+ max-height: ${v("textarea-max-height")};
432
+ padding: ${v("space-4")} ${v("space-5")};
433
+ overflow-y: auto;
434
+ resize: none;
435
+ outline: none;
436
+ color: ${v("text-primary")};
437
+ background: ${v("bg-primary")};
438
+ border: ${v("border-width")} solid ${v("border-input")};
439
+ border-radius: ${v("radius-md")};
440
+ font-family: inherit;
441
+ font-size: ${v("font-size")};
442
+ line-height: ${v("line-height")};
443
+ transition: border-color ${v("transition-fast")}, box-shadow ${v("transition-fast")};
444
+ }
445
+
446
+ .${p}-textarea:focus {
447
+ border-color: ${v("border-input-focus")};
448
+ box-shadow: 0 0 0 ${v("border-width-drop")} ${v("bg-drop-overlay")};
449
+ }
450
+
451
+ .${p}-textarea::placeholder {
452
+ color: ${v("text-placeholder")};
453
+ }
454
+
455
+ .${p}-send-btn {
456
+ display: flex;
457
+ align-items: center;
458
+ justify-content: center;
459
+ width: ${v("input-button-size")};
460
+ height: ${v("input-button-size")};
461
+ flex-shrink: 0;
462
+ color: ${v("btn-primary-text")};
463
+ background: ${v("btn-primary-bg")};
464
+ border: 0;
465
+ border-radius: ${v("radius-md")};
466
+ cursor: pointer;
467
+ transition: background ${v("transition-fast")}, opacity ${v("transition-fast")};
468
+ }
469
+
470
+ .${p}-send-btn:hover {
471
+ background: ${v("btn-primary-hover")};
472
+ }
473
+
474
+ .${p}-send-btn:disabled {
475
+ cursor: default;
476
+ opacity: .5;
477
+ }
478
+
479
+ .${p}-send-btn svg {
480
+ width: var(--size-7);
481
+ height: var(--size-7);
482
+ }
483
+
484
+ .${p}-mention-panel {
485
+ position: absolute;
486
+ left: 0;
487
+ right: 0;
488
+ bottom: 100%;
489
+ z-index: ${v("z-mention")};
490
+ max-height: ${v("panel-max-height")};
491
+ margin-bottom: ${v("space-2")};
492
+ overflow-y: auto;
493
+ background: ${v("bg-mention")};
494
+ border: ${v("border-width")} solid ${v("border-mention")};
495
+ border-radius: ${v("radius-md")};
496
+ box-shadow: ${v("shadow-mention")};
497
+ }
498
+
499
+ .${p}-mention-item {
500
+ display: flex;
501
+ align-items: center;
502
+ gap: ${v("space-4")};
503
+ padding: ${v("space-4")} ${v("space-5")};
504
+ color: ${v("text-mention")};
505
+ cursor: pointer;
506
+ transition: background ${v("transition-fast")};
507
+ }
508
+
509
+ .${p}-mention-item:hover {
510
+ background: ${v("bg-mention-hover")};
511
+ }
512
+
513
+ .${p}-mention-item--active {
514
+ background: ${v("bg-mention-active")};
515
+ }
516
+
517
+ .${p}-mention-item-avatar {
518
+ display: flex;
519
+ align-items: center;
520
+ justify-content: center;
521
+ width: ${v("mention-avatar-size")};
522
+ height: ${v("mention-avatar-size")};
523
+ flex-shrink: 0;
524
+ overflow: hidden;
525
+ color: ${v("avatar-text")};
526
+ background: ${v("avatar-bg")};
527
+ border-radius: ${v("radius-circle")};
528
+ font-size: ${v("font-size-sm")};
529
+ font-weight: ${v("font-weight-semibold")};
530
+ }
531
+
532
+ .${p}-mention-item-avatar img {
533
+ width: 100%;
534
+ height: 100%;
535
+ object-fit: cover;
536
+ }
537
+
538
+ .${p}-mention-item-name {
539
+ font-size: ${v("font-size")};
540
+ }
541
+
542
+ .${p}-empty {
543
+ display: flex;
544
+ align-items: center;
545
+ justify-content: center;
546
+ height: 100%;
547
+ color: ${v("text-secondary")};
548
+ font-size: ${v("font-size")};
549
+ }
550
+
551
+ .${p}-toolbar {
552
+ display: flex;
553
+ align-items: center;
554
+ gap: ${v("space-1")};
555
+ padding: ${v("space-3")} ${v("space-4")};
556
+ background: ${v("bg-toolbar")};
557
+ border-bottom: ${v("border-width")} solid ${v("border-toolbar")};
558
+ border-radius: ${v("radius-md")} ${v("radius-md")} 0 0;
559
+ }
560
+
561
+ .${p}-toolbar-btn {
562
+ display: flex;
563
+ align-items: center;
564
+ justify-content: center;
565
+ width: ${v("toolbar-button-size")};
566
+ height: ${v("toolbar-button-size")};
567
+ flex-shrink: 0;
568
+ padding: 0;
569
+ color: ${v("toolbar-icon-color")};
570
+ background: unset;
571
+ border: 0;
572
+ border-radius: ${v("radius-sm")};
573
+ cursor: pointer;
574
+ transition: background ${v("transition-fast")}, color ${v("transition-fast")};
575
+ }
576
+
577
+ .${p}-toolbar-btn svg {
578
+ width: var(--size-6);
579
+ height: var(--size-6);
580
+ }
581
+
582
+ .${p}-toolbar-btn:hover {
583
+ color: ${v("toolbar-icon-hover")};
584
+ background: ${v("bg-drop-overlay")};
585
+ }
586
+
587
+ .${p}-toolbar-btn--active {
588
+ color: ${v("toolbar-voice-active")};
589
+ background: ${v("bg-danger-soft")};
590
+ }
591
+
592
+ .${p}-toolbar-btn--active:hover {
593
+ color: ${v("toolbar-voice-active")};
594
+ background: ${v("bg-danger-soft")};
595
+ }
596
+
597
+ .${p}-drop-overlay {
598
+ position: absolute;
599
+ inset: 0;
600
+ z-index: ${v("z-overlay")};
601
+ display: flex;
602
+ align-items: center;
603
+ justify-content: center;
604
+ pointer-events: none;
605
+ background: ${v("bg-drop-overlay")};
606
+ border: ${v("border-width-drop")} dashed ${v("toolbar-icon-hover")};
607
+ border-radius: ${v("radius-md")};
608
+ }
609
+
610
+ .${p}-drop-overlay span {
611
+ color: ${v("toolbar-icon-hover")};
612
+ font-size: ${v("font-size-sm")};
613
+ font-weight: ${v("font-weight-medium")};
614
+ }
615
+
616
+ @keyframes ${p}-blink {
617
+ 0%, 100% { opacity: 1; }
618
+ 50% { opacity: 0; }
619
+ }
620
+
621
+ .${p}-bubble--streaming::after {
622
+ content: '';
623
+ display: inline-block;
624
+ width: ${v("border-width-drop")};
625
+ height: 1em;
626
+ margin-left: ${v("space-1")};
627
+ vertical-align: text-bottom;
628
+ background: currentColor;
629
+ animation: ${p}-blink 800ms infinite;
630
+ }
631
+ `;
632
+ }
633
+ function v(name) {
634
+ return `var(${require_dom.COMPONENT_CSS_VAR_PREFIX}-${name})`;
635
+ }
636
+ function toKebab(key) {
637
+ return key.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);
638
+ }
639
+ //#endregion
640
+ exports.cls = cls;
641
+ exports.clsx = clsx;
642
+ exports.injectStyles = injectStyles;
643
+ exports.removeStyles = removeStyles;
644
+ exports.updateStyles = updateStyles;
645
+ /*! End of @composy/chat-core | Powered by @composy/builder */
646
+ //# sourceMappingURL=style-manager.cjs.map