@happyvertical/smrt-chat 0.55.15 → 0.55.17

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 (39) hide show
  1. package/dist/chunks/{chat-stream-CXWE2vjb.js → chat-stream-D1xCl9IM.js} +2 -2
  2. package/dist/chunks/{chat-stream-CXWE2vjb.js.map → chat-stream-D1xCl9IM.js.map} +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/manifest.json +1 -1
  5. package/dist/smrt-knowledge.json +3 -3
  6. package/dist/svelte/components/agent/AgentChat.svelte +70 -67
  7. package/dist/svelte/components/agent/AgentSelector.svelte +26 -23
  8. package/dist/svelte/components/agent/AgentSessionPanel.svelte +47 -44
  9. package/dist/svelte/components/agent/ToolCallDisplay.svelte +52 -49
  10. package/dist/svelte/components/assistant/AssistantChoiceCards.svelte +19 -17
  11. package/dist/svelte/components/assistant/AssistantComposer.svelte +31 -28
  12. package/dist/svelte/components/assistant/AssistantDock.svelte +69 -66
  13. package/dist/svelte/components/assistant/AssistantThreadList.svelte +23 -20
  14. package/dist/svelte/components/assistant/FloatingAssistant.svelte +6 -3
  15. package/dist/svelte/components/assistant/captions/CaptionOverlay.svelte +4 -1
  16. package/dist/svelte/components/assistant/captions/HeardCaptions.svelte +5 -2
  17. package/dist/svelte/components/assistant/captions/SpokenCaptions.svelte +5 -2
  18. package/dist/svelte/components/dialogs/RoomCreateDialog.svelte +13 -10
  19. package/dist/svelte/components/dialogs/SearchMessages.svelte +35 -32
  20. package/dist/svelte/components/helper/HelperControlPanel.svelte +4 -1
  21. package/dist/svelte/components/layout/ChatLayout.svelte +14 -10
  22. package/dist/svelte/components/layout/MemberList.svelte +30 -27
  23. package/dist/svelte/components/layout/RoomHeader.svelte +19 -16
  24. package/dist/svelte/components/layout/RoomList.svelte +26 -23
  25. package/dist/svelte/components/messages/MessageInput.svelte +20 -17
  26. package/dist/svelte/components/messages/MessageItem.svelte +45 -42
  27. package/dist/svelte/components/messages/MessageList.svelte +8 -5
  28. package/dist/svelte/components/messages/ThreadPanel.svelte +15 -12
  29. package/dist/svelte/components/shared/FileUpload.svelte +39 -36
  30. package/dist/svelte/components/shared/LinkPreview.svelte +9 -6
  31. package/dist/svelte/components/shared/MentionAutocomplete.svelte +16 -13
  32. package/dist/svelte/components/shared/ReadReceipts.svelte +13 -10
  33. package/dist/svelte/components/shared/UserPresence.svelte +10 -7
  34. package/dist/svelte/components/tabs/ChatTab.svelte +26 -23
  35. package/dist/svelte/components/tabs/ChatTabList.svelte +20 -17
  36. package/dist/svelte/components/tabs/ChatTabs.svelte +7 -4
  37. package/dist/svelte/components/tabs/MiniChat.svelte +26 -23
  38. package/dist/sveltekit.js +1 -1
  39. package/package.json +17 -17
@@ -35,7 +35,7 @@ const visibleLines = $derived(lines.slice(-Math.max(1, maxLines)));
35
35
  </script>
36
36
 
37
37
  {#snippet surface()}
38
- <section class="spoken-captions" aria-label={speakerLabel}>
38
+ <section class="spoken-captions" aria-label={speakerLabel} data-smrt-component="SpokenCaptions">
39
39
  <p class="speaker"><span aria-hidden="true">◈</span> {speakerLabel}</p>
40
40
  <div class="caption-lines" aria-live={announce ? 'polite' : 'off'} aria-atomic="false">
41
41
  {#each visibleLines as line (line.id)}
@@ -57,9 +57,12 @@ const visibleLines = $derived(lines.slice(-Math.max(1, maxLines)));
57
57
  {/if}
58
58
 
59
59
  <style>
60
- .spoken-captions { box-sizing: border-box; min-inline-size: 0; max-inline-size: min(42rem, calc(100vw - 2rem)); overflow-wrap: anywhere; padding: .7rem .9rem; border: 2px solid var(--smrt-color-outline, #533b72); background: var(--smrt-color-inverse-surface, #221c2c); color: var(--smrt-color-inverse-on-surface, #fff7ff); border-radius: 1rem; box-shadow: var(--smrt-elevation-4, 0 .35rem 1.2rem color-mix(in srgb, var(--smrt-color-shadow, black) 28%, transparent)); }
60
+ @layer smrt.reset, smrt.structure, smrt.theme;
61
+ @layer smrt.theme {
62
+ .spoken-captions { box-sizing: border-box; min-inline-size: 0; max-inline-size: min(42rem, calc(100vw - 2rem)); overflow-wrap: anywhere; padding: .7rem .9rem; border: 2px solid var(--smrt-color-outline); background: var(--smrt-color-inverse-surface); color: var(--smrt-color-inverse-on-surface); border-radius: 1rem; box-shadow: var(--smrt-elevation-4, 0 .35rem 1.2rem color-mix(in srgb, var(--smrt-color-shadow, black) 28%, transparent)); }
61
63
  .speaker { margin: 0 0 .3rem; font-weight: var(--smrt-typography-weight-bold, 700); font-size: var(--smrt-typography-label-medium-size, .8rem); }
62
64
  .caption-lines p, .interim { margin: .18rem 0 0; }
63
65
  .interim { opacity: .8; }
64
66
  @media (prefers-reduced-motion: reduce) { .spoken-captions { scroll-behavior: auto; } }
67
+ }
65
68
  </style>
@@ -181,6 +181,8 @@ $effect(() => {
181
181
  </Modal>
182
182
 
183
183
  <style>
184
+ @layer smrt.reset, smrt.structure, smrt.theme;
185
+ @layer smrt.theme {
184
186
  /* :global() targets the Form primitive's rendered <form> (see #1589 scoping trap). */
185
187
  :global(.dialog__form) {
186
188
  display: flex;
@@ -211,16 +213,16 @@ $effect(() => {
211
213
 
212
214
  .field__label {
213
215
  font: var(--smrt-typography-label-large-font, 500 0.875rem / 1.25 sans-serif);
214
- color: var(--smrt-color-on-surface, #1a1c1e);
216
+ color: var(--smrt-color-on-surface);
215
217
  }
216
218
 
217
219
  .field__required {
218
- color: var(--smrt-color-error, #b3261e);
220
+ color: var(--smrt-color-error);
219
221
  }
220
222
 
221
223
  .field__hint {
222
224
  font: var(--smrt-typography-body-small-font, 0.75rem / 1.25 sans-serif);
223
- color: var(--smrt-color-on-surface-variant, #43474e);
225
+ color: var(--smrt-color-on-surface-variant);
224
226
  text-align: right;
225
227
  }
226
228
 
@@ -235,7 +237,7 @@ $effect(() => {
235
237
  align-items: flex-start;
236
238
  gap: 0.75rem;
237
239
  padding: 0.75rem;
238
- border: 1px solid var(--smrt-color-outline-variant, #c4c6d0);
240
+ border: 1px solid var(--smrt-color-outline-variant);
239
241
  border-radius: var(--smrt-radius-medium, 0.5rem);
240
242
  cursor: pointer;
241
243
  transition: border-color var(--smrt-duration-short2, 150ms),
@@ -243,17 +245,17 @@ $effect(() => {
243
245
  }
244
246
 
245
247
  .type-option:hover {
246
- background: var(--smrt-color-surface-container, #f0f0f4);
248
+ background: var(--smrt-color-surface-container);
247
249
  }
248
250
 
249
251
  .type-option--selected {
250
- border-color: var(--smrt-color-primary, #005ac1);
251
- background: var(--smrt-color-primary-container, #d6e3ff);
252
+ border-color: var(--smrt-color-primary);
253
+ background: var(--smrt-color-primary-container);
252
254
  }
253
255
 
254
256
  .type-option__radio {
255
257
  margin-top: 0.125rem;
256
- accent-color: var(--smrt-color-primary, #005ac1);
258
+ accent-color: var(--smrt-color-primary);
257
259
  }
258
260
 
259
261
  .type-option__content {
@@ -264,13 +266,13 @@ $effect(() => {
264
266
 
265
267
  .type-option__label {
266
268
  font: var(--smrt-typography-body-medium-font, 0.875rem / 1.25 sans-serif);
267
- color: var(--smrt-color-on-surface, #1a1c1e);
269
+ color: var(--smrt-color-on-surface);
268
270
  font-weight: var(--smrt-typography-weight-medium, 500);
269
271
  }
270
272
 
271
273
  .type-option__description {
272
274
  font: var(--smrt-typography-body-small-font, 0.75rem / 1.25 sans-serif);
273
- color: var(--smrt-color-on-surface-variant, #43474e);
275
+ color: var(--smrt-color-on-surface-variant);
274
276
  }
275
277
 
276
278
  @media (prefers-reduced-motion: reduce) {
@@ -278,4 +280,5 @@ $effect(() => {
278
280
  transition: none;
279
281
  }
280
282
  }
283
+ }
281
284
  </style>
@@ -113,7 +113,7 @@ $effect(() => {
113
113
  <div
114
114
  class="search-panel"
115
115
  role="search"
116
- aria-label={t(M['chat.search_messages.search'])}
116
+ aria-label={t(M['chat.search_messages.search'])} data-smrt-component="SearchMessages"
117
117
  >
118
118
  <div class="search-panel__header">
119
119
  <h2 class="search-panel__title">{t(M['chat.search_messages.title'])}</h2>
@@ -221,13 +221,15 @@ $effect(() => {
221
221
  {/if}
222
222
 
223
223
  <style>
224
+ @layer smrt.reset, smrt.structure, smrt.theme;
225
+ @layer smrt.theme {
224
226
  .search-panel {
225
227
  display: flex;
226
228
  flex-direction: column;
227
229
  width: 320px;
228
230
  height: 100%;
229
- background: var(--smrt-color-surface, #fefbff);
230
- border-left: 1px solid var(--smrt-color-outline-variant, #c4c6d0);
231
+ background: var(--smrt-color-surface);
232
+ border-left: 1px solid var(--smrt-color-outline-variant);
231
233
  overflow: hidden;
232
234
  }
233
235
 
@@ -236,13 +238,13 @@ $effect(() => {
236
238
  align-items: center;
237
239
  justify-content: space-between;
238
240
  padding: 0.75rem 1rem;
239
- border-bottom: 1px solid var(--smrt-color-outline-variant, #c4c6d0);
241
+ border-bottom: 1px solid var(--smrt-color-outline-variant);
240
242
  }
241
243
 
242
244
  .search-panel__title {
243
245
  margin: 0;
244
246
  font: var(--smrt-typography-title-small-font, 600 0.875rem / 1.25 sans-serif);
245
- color: var(--smrt-color-on-surface, #1a1c1e);
247
+ color: var(--smrt-color-on-surface);
246
248
  }
247
249
 
248
250
  /* :global() pierces into the Button child's rendered <button> (see #1589). */
@@ -252,12 +254,12 @@ $effect(() => {
252
254
  padding: 0;
253
255
  background: none;
254
256
  border-radius: var(--smrt-radius-medium, 0.5rem);
255
- color: var(--smrt-color-on-surface-variant, #43474e);
257
+ color: var(--smrt-color-on-surface-variant);
256
258
  transition: background var(--smrt-duration-short2, 150ms);
257
259
  }
258
260
 
259
261
  .search-panel__header :global(.close-btn:hover) {
260
- background: var(--smrt-color-surface-variant, #e1e2ec);
262
+ background: var(--smrt-color-surface-variant);
261
263
  }
262
264
 
263
265
  .close-btn__icon {
@@ -268,7 +270,7 @@ $effect(() => {
268
270
  /* :global() targets the Form primitive's rendered <form> (see #1589 scoping trap). */
269
271
  :global(.search-form) {
270
272
  padding: 0.75rem 1rem;
271
- border-bottom: 1px solid var(--smrt-color-outline-variant, #c4c6d0);
273
+ border-bottom: 1px solid var(--smrt-color-outline-variant);
272
274
  }
273
275
 
274
276
  .search-input-wrap {
@@ -276,22 +278,22 @@ $effect(() => {
276
278
  align-items: center;
277
279
  gap: 0.5rem;
278
280
  padding: 0.5rem 0.75rem;
279
- border: 1px solid var(--smrt-color-outline, #74777f);
281
+ border: 1px solid var(--smrt-color-outline);
280
282
  border-radius: var(--smrt-radius-large, 1rem);
281
- background: var(--smrt-color-surface-container, #f0f0f4);
283
+ background: var(--smrt-color-surface-container);
282
284
  transition: border-color var(--smrt-duration-short2, 150ms);
283
285
  }
284
286
 
285
287
  .search-input-wrap:focus-within {
286
- border-color: var(--smrt-color-primary, #005ac1);
287
- box-shadow: 0 0 0 1px var(--smrt-color-primary, #005ac1);
288
+ border-color: var(--smrt-color-primary);
289
+ box-shadow: 0 0 0 1px var(--smrt-color-primary);
288
290
  }
289
291
 
290
292
  .search-icon {
291
293
  flex-shrink: 0;
292
294
  width: 1.125rem;
293
295
  height: 1.125rem;
294
- color: var(--smrt-color-on-surface-variant, #43474e);
296
+ color: var(--smrt-color-on-surface-variant);
295
297
  }
296
298
 
297
299
  /* The Input primitive sits inside the bordered .search-input-wrap, which owns
@@ -305,7 +307,7 @@ $effect(() => {
305
307
  background: transparent;
306
308
  box-shadow: none;
307
309
  font: var(--smrt-typography-body-medium-font, 0.875rem / 1.25 sans-serif);
308
- color: var(--smrt-color-on-surface, #1a1c1e);
310
+ color: var(--smrt-color-on-surface);
309
311
  }
310
312
 
311
313
  :global(.search-input:focus) {
@@ -321,13 +323,13 @@ $effect(() => {
321
323
  height: 1.25rem;
322
324
  padding: 0;
323
325
  background: none;
324
- border-radius: var(--smrt-radius-full, 9999px);
325
- color: var(--smrt-color-on-surface-variant, #43474e);
326
+ border-radius: var(--smrt-radius-full);
327
+ color: var(--smrt-color-on-surface-variant);
326
328
  }
327
329
 
328
330
  .search-input-wrap :global(.clear-btn:hover) {
329
331
  background: none;
330
- color: var(--smrt-color-on-surface, #1a1c1e);
332
+ color: var(--smrt-color-on-surface);
331
333
  }
332
334
 
333
335
  .clear-btn__icon {
@@ -356,7 +358,7 @@ $effect(() => {
356
358
  margin: 0;
357
359
  padding: 0.375rem 1rem;
358
360
  font: var(--smrt-typography-label-small-font, 500 0.6875rem / 1 sans-serif);
359
- color: var(--smrt-color-on-surface-variant, #43474e);
361
+ color: var(--smrt-color-on-surface-variant);
360
362
  text-transform: uppercase;
361
363
  letter-spacing: 0.05em;
362
364
  }
@@ -375,11 +377,11 @@ $effect(() => {
375
377
  }
376
378
 
377
379
  .result-item:hover {
378
- background: var(--smrt-color-surface-variant, #e1e2ec);
380
+ background: var(--smrt-color-surface-variant);
379
381
  }
380
382
 
381
383
  .result-item:focus-visible {
382
- outline: 2px solid var(--smrt-color-primary, #005ac1);
384
+ outline: 2px solid var(--smrt-color-primary);
383
385
  outline-offset: -2px;
384
386
  }
385
387
 
@@ -392,16 +394,16 @@ $effect(() => {
392
394
  .result-item__avatar {
393
395
  width: 1.25rem;
394
396
  height: 1.25rem;
395
- border-radius: var(--smrt-radius-full, 9999px);
397
+ border-radius: var(--smrt-radius-full);
396
398
  object-fit: cover;
397
399
  }
398
400
 
399
401
  .result-item__avatar-placeholder {
400
402
  width: 1.25rem;
401
403
  height: 1.25rem;
402
- border-radius: var(--smrt-radius-full, 9999px);
403
- background: var(--smrt-color-primary-container, #d6e3ff);
404
- color: var(--smrt-color-on-primary-container, #001a41);
404
+ border-radius: var(--smrt-radius-full);
405
+ background: var(--smrt-color-primary-container);
406
+ color: var(--smrt-color-on-primary-container);
405
407
  display: inline-flex;
406
408
  align-items: center;
407
409
  justify-content: center;
@@ -410,19 +412,19 @@ $effect(() => {
410
412
 
411
413
  .result-item__sender {
412
414
  font: var(--smrt-typography-label-medium-font, 500 0.75rem / 1 sans-serif);
413
- color: var(--smrt-color-on-surface, #1a1c1e);
415
+ color: var(--smrt-color-on-surface);
414
416
  }
415
417
 
416
418
  .result-item__date {
417
419
  margin-left: auto;
418
420
  font: var(--smrt-typography-label-small-font, 500 0.6875rem / 1 sans-serif);
419
- color: var(--smrt-color-on-surface-variant, #43474e);
421
+ color: var(--smrt-color-on-surface-variant);
420
422
  }
421
423
 
422
424
  .result-item__content {
423
425
  margin: 0;
424
426
  font: var(--smrt-typography-body-small-font, 0.75rem / 1.25 sans-serif);
425
- color: var(--smrt-color-on-surface-variant, #43474e);
427
+ color: var(--smrt-color-on-surface-variant);
426
428
  overflow: hidden;
427
429
  display: -webkit-box;
428
430
  -webkit-line-clamp: 3;
@@ -431,9 +433,9 @@ $effect(() => {
431
433
  }
432
434
 
433
435
  .result-item__content :global(.highlight) {
434
- background: var(--smrt-color-tertiary-container, #c2f0dd);
435
- color: var(--smrt-color-on-tertiary-container, #002114);
436
- border-radius: var(--smrt-radius-sm, 4px);
436
+ background: var(--smrt-color-tertiary-container);
437
+ color: var(--smrt-color-on-tertiary-container);
438
+ border-radius: var(--smrt-radius-sm);
437
439
  padding: 0 0.125rem;
438
440
  }
439
441
 
@@ -450,13 +452,13 @@ $effect(() => {
450
452
  .search-empty__text {
451
453
  margin: 0;
452
454
  font: var(--smrt-typography-body-medium-font, 0.875rem / 1.25 sans-serif);
453
- color: var(--smrt-color-on-surface-variant, #43474e);
455
+ color: var(--smrt-color-on-surface-variant);
454
456
  }
455
457
 
456
458
  .search-empty__hint {
457
459
  margin: 0;
458
460
  font: var(--smrt-typography-body-small-font, 0.75rem / 1.25 sans-serif);
459
- color: var(--smrt-color-outline, #74777f);
461
+ color: var(--smrt-color-outline);
460
462
  }
461
463
 
462
464
  @media (prefers-reduced-motion: reduce) {
@@ -469,4 +471,5 @@ $effect(() => {
469
471
  transition: none;
470
472
  }
471
473
  }
474
+ }
472
475
  </style>
@@ -338,7 +338,7 @@ async function customSaved(offering: HelperOffering) {
338
338
  }
339
339
  </script>
340
340
 
341
- <section class="helper-panel" aria-busy={loading || saving} aria-labelledby="helper-panel-title">
341
+ <section class="helper-panel" aria-busy={loading || saving} aria-labelledby="helper-panel-title" data-smrt-component="HelperControlPanel">
342
342
  <h2 id="helper-panel-title">{t(M['chat.helper.title'])}</h2>
343
343
  {#if message}<p class="message" role={messageIsError ? 'alert' : 'status'} aria-live={messageIsError ? 'assertive' : 'polite'}>{message}</p>{/if}
344
344
  {#if snapshot?.recovery}<p class="message" role="status">{snapshot.recovery.message}</p>{/if}
@@ -387,6 +387,8 @@ async function customSaved(offering: HelperOffering) {
387
387
  </section>
388
388
 
389
389
  <style>
390
+ @layer smrt.reset, smrt.structure, smrt.theme;
391
+ @layer smrt.theme {
390
392
  .helper-panel { display: grid; gap: var(--smrt-spacing-4); max-width: 42rem; padding: var(--smrt-spacing-4); color: var(--smrt-color-on-surface); }
391
393
  fieldset { display: grid; gap: var(--smrt-spacing-3); border: 0; margin: 0; padding: 0; }
392
394
  label { display: grid; gap: var(--smrt-spacing-1); font: var(--smrt-typography-label-large-font); }
@@ -398,4 +400,5 @@ async function customSaved(offering: HelperOffering) {
398
400
  .setup-actions, .actions { display: flex; flex-wrap: wrap; gap: var(--smrt-spacing-2); }
399
401
  .custom-setup { display: grid; gap: var(--smrt-spacing-3); padding: var(--smrt-spacing-3); border: 1px solid var(--smrt-color-outline-variant); border-radius: var(--smrt-radius-small); }
400
402
  .message { margin: 0; color: var(--smrt-color-on-surface-variant); }
403
+ }
401
404
  </style>
@@ -58,10 +58,10 @@ function handlePointerUp() {
58
58
  }
59
59
  </script>
60
60
 
61
- <div class="chat-layout" class:chat-layout--resizing={isResizing}>
61
+ <div class="chat-layout" class:chat-layout--resizing={isResizing} data-smrt-component="ChatLayout">
62
62
  <aside
63
63
  class="chat-layout__sidebar"
64
- style:width="{sidebarWidth}px"
64
+ style:--smrt-chat-layout-sidebar-width="{sidebarWidth}px"
65
65
  aria-label={t(M['chat.chat_layout.rooms_label'])}
66
66
  >
67
67
  <RoomList
@@ -92,13 +92,15 @@ function handlePointerUp() {
92
92
  </div>
93
93
 
94
94
  <style>
95
+ @layer smrt.reset, smrt.structure, smrt.theme;
96
+ @layer smrt.theme {
95
97
  .chat-layout {
96
98
  display: flex;
97
99
  height: 100%;
98
100
  width: 100%;
99
101
  overflow: hidden;
100
- background: var(--smrt-color-surface, #fefbff);
101
- color: var(--smrt-color-on-surface, #1a1c1e);
102
+ background: var(--smrt-color-surface);
103
+ color: var(--smrt-color-on-surface);
102
104
  }
103
105
 
104
106
  .chat-layout--resizing {
@@ -108,10 +110,11 @@ function handlePointerUp() {
108
110
 
109
111
  .chat-layout__sidebar {
110
112
  flex-shrink: 0;
113
+ width: var(--smrt-chat-layout-sidebar-width);
111
114
  display: flex;
112
115
  flex-direction: column;
113
- background: var(--smrt-color-surface-container, #f0f0f4);
114
- border-right: 1px solid var(--smrt-color-outline-variant, #c4c6d0);
116
+ background: var(--smrt-color-surface-container);
117
+ border-right: 1px solid var(--smrt-color-outline-variant);
115
118
  overflow-y: auto;
116
119
  overflow-x: hidden;
117
120
  }
@@ -128,12 +131,12 @@ function handlePointerUp() {
128
131
 
129
132
  .chat-layout__resize-handle:hover,
130
133
  .chat-layout__resize-handle:active {
131
- background: var(--smrt-color-primary, #005ac1);
134
+ background: var(--smrt-color-primary);
132
135
  opacity: 0.4;
133
136
  }
134
137
 
135
138
  .chat-layout__resize-handle:focus-visible {
136
- outline: 2px solid var(--smrt-color-primary, #005ac1);
139
+ outline: 2px solid var(--smrt-color-primary);
137
140
  outline-offset: -2px;
138
141
  }
139
142
 
@@ -151,14 +154,15 @@ function handlePointerUp() {
151
154
  }
152
155
 
153
156
  .chat-layout__sidebar {
154
- width: 100% !important;
157
+ width: 100%;
155
158
  max-height: 14rem;
156
159
  border-right: 0;
157
- border-bottom: 1px solid var(--smrt-color-outline-variant, #c4c6d0);
160
+ border-bottom: 1px solid var(--smrt-color-outline-variant);
158
161
  }
159
162
 
160
163
  .chat-layout__resize-handle {
161
164
  display: none;
162
165
  }
163
166
  }
167
+ }
164
168
  </style>
@@ -36,13 +36,13 @@ function getStatusColor(status: string): string {
36
36
  // "online" reconciled to the success token (was --smrt-color-tertiary)
37
37
  // so it matches UserPresence and stays semantically green (T2 #1391).
38
38
  case 'online':
39
- return 'var(--smrt-color-success, #1e8e3e)';
39
+ return 'var(--smrt-color-success)';
40
40
  case 'away':
41
- return 'var(--smrt-color-warning, #f9ab00)';
41
+ return 'var(--smrt-color-warning)';
42
42
  case 'dnd':
43
- return 'var(--smrt-color-error, #b3261e)';
43
+ return 'var(--smrt-color-error)';
44
44
  default:
45
- return 'var(--smrt-color-outline, #74777f)';
45
+ return 'var(--smrt-color-outline)';
46
46
  }
47
47
  }
48
48
 
@@ -71,7 +71,7 @@ function getRoleBadgeLabel(role: string): string {
71
71
  }
72
72
  </script>
73
73
 
74
- <aside class="member-list" aria-label={t(M['chat.member_list.room_members'])}>
74
+ <aside class="member-list" aria-label={t(M['chat.member_list.room_members'])} data-smrt-component="MemberList">
75
75
  <div class="member-list__header">
76
76
  <h2 class="member-list__title">Members</h2>
77
77
  <span class="member-list__count">{participants.length}</span>
@@ -209,13 +209,15 @@ function getRoleBadgeLabel(role: string): string {
209
209
  </aside>
210
210
 
211
211
  <style>
212
+ @layer smrt.reset, smrt.structure, smrt.theme;
213
+ @layer smrt.theme {
212
214
  .member-list {
213
215
  display: flex;
214
216
  flex-direction: column;
215
217
  width: 240px;
216
218
  height: 100%;
217
- background: var(--smrt-color-surface-container, #f0f0f4);
218
- border-left: 1px solid var(--smrt-color-outline-variant, #c4c6d0);
219
+ background: var(--smrt-color-surface-container);
220
+ border-left: 1px solid var(--smrt-color-outline-variant);
219
221
  overflow: hidden;
220
222
  }
221
223
 
@@ -224,18 +226,18 @@ function getRoleBadgeLabel(role: string): string {
224
226
  align-items: center;
225
227
  gap: 0.375rem;
226
228
  padding: 0.75rem 1rem;
227
- border-bottom: 1px solid var(--smrt-color-outline-variant, #c4c6d0);
229
+ border-bottom: 1px solid var(--smrt-color-outline-variant);
228
230
  }
229
231
 
230
232
  .member-list__title {
231
233
  margin: 0;
232
234
  font: var(--smrt-typography-title-small-font, 600 0.875rem / 1.25 sans-serif);
233
- color: var(--smrt-color-on-surface, #1a1c1e);
235
+ color: var(--smrt-color-on-surface);
234
236
  }
235
237
 
236
238
  .member-list__count {
237
239
  font: var(--smrt-typography-label-small-font, 500 0.6875rem / 1 sans-serif);
238
- color: var(--smrt-color-on-surface-variant, #43474e);
240
+ color: var(--smrt-color-on-surface-variant);
239
241
  }
240
242
 
241
243
  /* :global() pierces into the Button child's rendered <button> (see #1589). */
@@ -246,12 +248,12 @@ function getRoleBadgeLabel(role: string): string {
246
248
  padding: 0;
247
249
  background: none;
248
250
  border-radius: var(--smrt-radius-medium, 0.5rem);
249
- color: var(--smrt-color-on-surface-variant, #43474e);
251
+ color: var(--smrt-color-on-surface-variant);
250
252
  transition: background var(--smrt-duration-short2, 150ms);
251
253
  }
252
254
 
253
255
  .member-list__header :global(.close-btn:hover) {
254
- background: var(--smrt-color-surface-variant, #e1e2ec);
256
+ background: var(--smrt-color-surface-variant);
255
257
  }
256
258
 
257
259
  .close-btn__icon {
@@ -276,13 +278,13 @@ function getRoleBadgeLabel(role: string): string {
276
278
  margin: 0;
277
279
  padding: 0.375rem 1rem;
278
280
  font: var(--smrt-typography-label-small-font, 500 0.6875rem / 1 sans-serif);
279
- color: var(--smrt-color-on-surface-variant, #43474e);
281
+ color: var(--smrt-color-on-surface-variant);
280
282
  text-transform: uppercase;
281
283
  letter-spacing: 0.05em;
282
284
  }
283
285
 
284
286
  .member-group__count {
285
- color: var(--smrt-color-outline, #74777f);
287
+ color: var(--smrt-color-outline);
286
288
  }
287
289
 
288
290
  .member-group__list {
@@ -311,16 +313,16 @@ function getRoleBadgeLabel(role: string): string {
311
313
  .member-item__avatar {
312
314
  width: 2rem;
313
315
  height: 2rem;
314
- border-radius: var(--smrt-radius-full, 9999px);
316
+ border-radius: var(--smrt-radius-full);
315
317
  object-fit: cover;
316
318
  }
317
319
 
318
320
  .member-item__avatar-placeholder {
319
321
  width: 2rem;
320
322
  height: 2rem;
321
- border-radius: var(--smrt-radius-full, 9999px);
322
- background: var(--smrt-color-primary-container, #d6e3ff);
323
- color: var(--smrt-color-on-primary-container, #001a41);
323
+ border-radius: var(--smrt-radius-full);
324
+ background: var(--smrt-color-primary-container);
325
+ color: var(--smrt-color-on-primary-container);
324
326
  display: inline-flex;
325
327
  align-items: center;
326
328
  justify-content: center;
@@ -333,8 +335,8 @@ function getRoleBadgeLabel(role: string): string {
333
335
  right: 0;
334
336
  width: 0.625rem;
335
337
  height: 0.625rem;
336
- border-radius: var(--smrt-radius-full, 9999px);
337
- border: 2px solid var(--smrt-color-surface-container, #f0f0f4);
338
+ border-radius: var(--smrt-radius-full);
339
+ border: 2px solid var(--smrt-color-surface-container);
338
340
  }
339
341
 
340
342
  .member-item__info {
@@ -347,7 +349,7 @@ function getRoleBadgeLabel(role: string): string {
347
349
 
348
350
  .member-item__name {
349
351
  font: var(--smrt-typography-body-medium-font, 0.875rem / 1.25 sans-serif);
350
- color: var(--smrt-color-on-surface, #1a1c1e);
352
+ color: var(--smrt-color-on-surface);
351
353
  overflow: hidden;
352
354
  text-overflow: ellipsis;
353
355
  white-space: nowrap;
@@ -356,25 +358,25 @@ function getRoleBadgeLabel(role: string): string {
356
358
  .role-badge {
357
359
  flex-shrink: 0;
358
360
  padding: 0.0625rem 0.375rem;
359
- border-radius: var(--smrt-radius-full, 9999px);
361
+ border-radius: var(--smrt-radius-full);
360
362
  font: var(--smrt-typography-label-small-font, 500 0.6875rem / 1 sans-serif);
361
363
  }
362
364
 
363
365
  .role-badge--owner {
364
- background: var(--smrt-color-tertiary-container, #c2f0dd);
365
- color: var(--smrt-color-on-tertiary-container, #002114);
366
+ background: var(--smrt-color-tertiary-container);
367
+ color: var(--smrt-color-on-tertiary-container);
366
368
  }
367
369
 
368
370
  .role-badge--admin {
369
- background: var(--smrt-color-secondary-container, #d7e3f7);
370
- color: var(--smrt-color-on-secondary-container, #101c2b);
371
+ background: var(--smrt-color-secondary-container);
372
+ color: var(--smrt-color-on-secondary-container);
371
373
  }
372
374
 
373
375
  .member-list__empty {
374
376
  text-align: center;
375
377
  padding: 2rem 1rem;
376
378
  margin: 0;
377
- color: var(--smrt-color-on-surface-variant, #43474e);
379
+ color: var(--smrt-color-on-surface-variant);
378
380
  font: var(--smrt-typography-body-medium-font, 0.875rem / 1.25 sans-serif);
379
381
  }
380
382
 
@@ -383,4 +385,5 @@ function getRoleBadgeLabel(role: string): string {
383
385
  transition: none;
384
386
  }
385
387
  }
388
+ }
386
389
  </style>