@happyvertical/smrt-chat 0.34.4 → 0.34.6

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 (41) hide show
  1. package/dist/manifest.json +2 -2
  2. package/dist/smrt-knowledge.json +4 -4
  3. package/dist/svelte/components/agent/AgentChat.svelte +23 -26
  4. package/dist/svelte/components/agent/AgentChat.svelte.d.ts.map +1 -1
  5. package/dist/svelte/components/agent/AgentSelector.svelte +1 -0
  6. package/dist/svelte/components/agent/AgentSelector.svelte.d.ts.map +1 -1
  7. package/dist/svelte/components/agent/AgentSessionPanel.svelte +15 -16
  8. package/dist/svelte/components/agent/AgentSessionPanel.svelte.d.ts.map +1 -1
  9. package/dist/svelte/components/agent/ToolCallDisplay.svelte +1 -0
  10. package/dist/svelte/components/agent/ToolCallDisplay.svelte.d.ts.map +1 -1
  11. package/dist/svelte/components/dialogs/RoomCreateDialog.svelte +9 -44
  12. package/dist/svelte/components/dialogs/RoomCreateDialog.svelte.d.ts.map +1 -1
  13. package/dist/svelte/components/dialogs/SearchMessages.svelte +23 -24
  14. package/dist/svelte/components/dialogs/SearchMessages.svelte.d.ts.map +1 -1
  15. package/dist/svelte/components/layout/ChatLayout.svelte +1 -0
  16. package/dist/svelte/components/layout/ChatLayout.svelte.d.ts.map +1 -1
  17. package/dist/svelte/components/layout/MemberList.svelte +10 -15
  18. package/dist/svelte/components/layout/MemberList.svelte.d.ts.map +1 -1
  19. package/dist/svelte/components/layout/RoomHeader.svelte +13 -16
  20. package/dist/svelte/components/layout/RoomHeader.svelte.d.ts.map +1 -1
  21. package/dist/svelte/components/layout/RoomList.svelte +26 -17
  22. package/dist/svelte/components/layout/RoomList.svelte.d.ts.map +1 -1
  23. package/dist/svelte/components/messages/MessageInput.svelte +17 -20
  24. package/dist/svelte/components/messages/MessageInput.svelte.d.ts.map +1 -1
  25. package/dist/svelte/components/messages/MessageItem.svelte +45 -40
  26. package/dist/svelte/components/messages/MessageItem.svelte.d.ts.map +1 -1
  27. package/dist/svelte/components/messages/ThreadPanel.svelte +9 -9
  28. package/dist/svelte/components/messages/ThreadPanel.svelte.d.ts.map +1 -1
  29. package/dist/svelte/components/shared/FileUpload.svelte +22 -54
  30. package/dist/svelte/components/shared/FileUpload.svelte.d.ts.map +1 -1
  31. package/dist/svelte/components/shared/MentionAutocomplete.svelte +1 -0
  32. package/dist/svelte/components/shared/MentionAutocomplete.svelte.d.ts.map +1 -1
  33. package/dist/svelte/components/shared/ReactionPicker.svelte +8 -21
  34. package/dist/svelte/components/shared/ReactionPicker.svelte.d.ts.map +1 -1
  35. package/dist/svelte/components/tabs/ChatTab.svelte +20 -18
  36. package/dist/svelte/components/tabs/ChatTab.svelte.d.ts.map +1 -1
  37. package/dist/svelte/components/tabs/ChatTabList.svelte +13 -10
  38. package/dist/svelte/components/tabs/ChatTabList.svelte.d.ts.map +1 -1
  39. package/dist/svelte/components/tabs/MiniChat.svelte +11 -17
  40. package/dist/svelte/components/tabs/MiniChat.svelte.d.ts.map +1 -1
  41. package/package.json +9 -8
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "version": "1.0.0",
3
- "timestamp": 1782257901323,
3
+ "timestamp": 1782278483770,
4
4
  "packageName": "@happyvertical/smrt-chat",
5
- "packageVersion": "0.34.4",
5
+ "packageVersion": "0.34.6",
6
6
  "objects": {
7
7
  "@happyvertical/smrt-chat:AgentSessionCollection": {
8
8
  "name": "agentsessioncollection",
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "generatedAt": "2026-06-23T23:38:22.310Z",
3
+ "generatedAt": "2026-06-24T05:21:24.161Z",
4
4
  "packageName": "@happyvertical/smrt-chat",
5
- "packageVersion": "0.34.4",
5
+ "packageVersion": "0.34.6",
6
6
  "sourceManifestPath": "dist/manifest.json",
7
7
  "agentDocPath": "AGENTS.md",
8
8
  "sourceHashes": {
9
- "manifest": "d230c1ade8f919f7761ac03c5bacaccd73740efd72945692c1f55defe95894f2",
10
- "packageJson": "31a03b374eddefd5f563815e23aecdf2b665bd9e0d4bb8c0363573f36c58d691",
9
+ "manifest": "2975e8cc9d58e5960d1d59de3dc09523b44a85d6af43e7fbef3e9c03f695b2d9",
10
+ "packageJson": "5fbeb77ade984295729f043140c7db7b16609c4c5ef9333f04af4df283a14f15",
11
11
  "agents": "e0a8c6788fbd48c2619a353295d4538e9ff6863d483bcd354af522fb7c6a31bc"
12
12
  },
13
13
  "exports": [
@@ -6,6 +6,7 @@
6
6
  */
7
7
 
8
8
  import { useI18n } from '@happyvertical/smrt-ui/i18n';
9
+ import { Button } from '@happyvertical/smrt-ui/ui';
9
10
  import { M } from '../../i18n.js';
10
11
  import type {
11
12
  AgentSessionData,
@@ -106,7 +107,8 @@ $effect(() => {
106
107
  disabled={!isActive}
107
108
  aria-label={t(M['chat.agent_chat.message_input'])}
108
109
  ></textarea>
109
- <button
110
+ <Button
111
+ variant="ghost"
110
112
  class="agent-chat__send-btn"
111
113
  type="submit"
112
114
  disabled={!inputValue.trim() || !isActive}
@@ -115,7 +117,7 @@ $effect(() => {
115
117
  <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
116
118
  <path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z" />
117
119
  </svg>
118
- </button>
120
+ </Button>
119
121
  {/if}
120
122
  </form>
121
123
 
@@ -151,19 +153,21 @@ $effect(() => {
151
153
  {:else if block.type === 'fields'}
152
154
  <div class="field-update-block">
153
155
  <span class="applied-badge">{t(M['chat.agent_chat.updated_fields'], { count: Object.keys(block.fields).length, plural: Object.keys(block.fields).length !== 1 ? 's' : '' })}</span>
154
- <button class="diff-btn" type="button" onclick={() => showDiff(block.fields)}>Diff</button>
156
+ <Button variant="ghost" size="sm" class="diff-btn" type="button" onclick={() => showDiff(block.fields)}>Diff</Button>
155
157
  </div>
156
158
  {:else if block.type === 'markdown'}
157
159
  <div class="markdown-block">
158
160
  <pre class="markdown-block__content"><code>{block.content}</code></pre>
159
161
  {#if onapplychange}
160
- <button
162
+ <Button
163
+ variant="ghost"
164
+ size="sm"
161
165
  class="diff-btn"
162
166
  type="button"
163
167
  onclick={() => onapplychange(block.content)}
164
168
  >
165
169
  Apply
166
- </button>
170
+ </Button>
167
171
  {/if}
168
172
  </div>
169
173
  {/if}
@@ -198,7 +202,7 @@ $effect(() => {
198
202
  <dialog bind:this={diffDialog} class="diff-dialog">
199
203
  <div class="diff-dialog__header">
200
204
  <h4>{t(M['chat.agent_chat.field_changes'])}</h4>
201
- <button class="diff-dialog__close" type="button" onclick={closeDiff}>✕</button>
205
+ <Button variant="ghost" size="sm" class="diff-dialog__close" type="button" onclick={closeDiff}>✕</Button>
202
206
  </div>
203
207
  {#if diffDialogFields}
204
208
  <div class="diff-dialog__body">
@@ -349,27 +353,20 @@ $effect(() => {
349
353
  color: var(--smrt-color-outline, #74777f);
350
354
  }
351
355
 
352
- .agent-chat__send-btn {
353
- display: inline-flex;
354
- align-items: center;
355
- justify-content: center;
356
+ /* :global() pierces into the Button child's rendered <button> (see #1589). */
357
+ .agent-chat__input-bar :global(.agent-chat__send-btn) {
356
358
  width: 34px;
357
359
  height: 34px;
358
- border: none;
360
+ padding: 0;
359
361
  background: var(--smrt-color-primary, #005ac1);
360
362
  color: var(--smrt-color-on-primary, #ffffff);
361
363
  border-radius: var(--smrt-radius-full, 9999px);
362
- cursor: pointer;
363
364
  flex-shrink: 0;
364
365
  transition: opacity 150ms;
365
366
  }
366
367
 
367
- .agent-chat__send-btn:disabled {
368
- opacity: 0.4;
369
- cursor: not-allowed;
370
- }
371
-
372
- .agent-chat__send-btn:not(:disabled):hover {
368
+ .agent-chat__input-bar :global(.agent-chat__send-btn:not(:disabled):hover) {
369
+ background: var(--smrt-color-primary, #005ac1);
373
370
  opacity: 0.85;
374
371
  }
375
372
 
@@ -411,7 +408,9 @@ $effect(() => {
411
408
  line-height: var(--smrt-typography-body-medium-line-height, 1.45);
412
409
  }
413
410
 
414
- .diff-btn {
411
+ /* :global() pierces into each Button's rendered <button> (see #1589). */
412
+ .field-update-block :global(.diff-btn),
413
+ .markdown-block :global(.diff-btn) {
415
414
  padding: var(--smrt-spacing-1, 4px) var(--smrt-spacing-2, 8px);
416
415
  font-size: var(--smrt-typography-label-small-size, 0.625rem);
417
416
  font-weight: var(--smrt-typography-weight-semibold, 600);
@@ -419,11 +418,10 @@ $effect(() => {
419
418
  border-radius: var(--smrt-radius-full, 9999px);
420
419
  background: none;
421
420
  color: var(--smrt-color-on-surface-variant, #43474e);
422
- cursor: pointer;
423
- transition: background 0.15s;
424
421
  }
425
422
 
426
- .diff-btn:hover {
423
+ .field-update-block :global(.diff-btn:hover),
424
+ .markdown-block :global(.diff-btn:hover) {
427
425
  background: var(--smrt-color-surface-variant, #e1e2ec);
428
426
  color: var(--smrt-color-primary, #005ac1);
429
427
  }
@@ -457,17 +455,16 @@ $effect(() => {
457
455
  font-weight: var(--smrt-typography-weight-semibold, 600);
458
456
  }
459
457
 
460
- .diff-dialog__close {
458
+ /* :global() pierces into the Button child's rendered <button> (see #1589). */
459
+ .diff-dialog__header :global(.diff-dialog__close) {
461
460
  background: none;
462
- border: none;
463
461
  font-size: var(--smrt-typography-body-large-size, 1rem);
464
- cursor: pointer;
465
462
  color: var(--smrt-color-outline, #74777f);
466
463
  padding: var(--smrt-spacing-1, 4px) var(--smrt-spacing-2, 8px);
467
464
  border-radius: var(--smrt-radius-sm, 4px);
468
465
  }
469
466
 
470
- .diff-dialog__close:hover {
467
+ .diff-dialog__header :global(.diff-dialog__close:hover) {
471
468
  background: var(--smrt-color-surface-variant, #e1e2ec);
472
469
  }
473
470
 
@@ -1 +1 @@
1
- {"version":3,"file":"AgentChat.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/agent/AgentChat.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAEhB,MAAM,gBAAgB,CAAC;AAMxB,MAAM,WAAW,KAAK;IACpB,yBAAyB;IACzB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,gCAAgC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kCAAkC;IAClC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,4CAA4C;IAC5C,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAwKD,QAAA,MAAM,SAAS,2CAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"AgentChat.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/agent/AgentChat.svelte.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAEhB,MAAM,gBAAgB,CAAC;AAMxB,MAAM,WAAW,KAAK;IACpB,yBAAyB;IACzB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,gCAAgC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kCAAkC;IAClC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,4CAA4C;IAC5C,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAyKD,QAAA,MAAM,SAAS,2CAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
@@ -26,6 +26,7 @@ const { t } = useI18n();
26
26
 
27
27
  <div class="agent-selector__grid" role="listbox" aria-label={t(M['chat.agent_selector.available_agents'])}>
28
28
  {#each agents as agent (agent.id)}
29
+ <!-- raw-primitive-allow: large pressable selection card with role=option wrapping rich content (avatar, name, description, unavailable badge) inside a role=listbox; no Button primitive owns this structural listbox-option pattern -->
29
30
  <button
30
31
  class="agent-selector__card"
31
32
  class:agent-selector__card--unavailable={!agent.isAvailable}
@@ -1 +1 @@
1
- {"version":3,"file":"AgentSelector.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/agent/AgentSelector.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAItD,MAAM,WAAW,KAAK;IACpB,uBAAuB;IACvB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,sBAAsB;IACtB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AA6CD,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
1
+ {"version":3,"file":"AgentSelector.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/agent/AgentSelector.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAItD,MAAM,WAAW,KAAK;IACpB,uBAAuB;IACvB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,sBAAsB;IACtB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AA8CD,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
@@ -5,6 +5,7 @@
5
5
  * Allows selecting an existing session or creating a new one.
6
6
  */
7
7
  import { useI18n } from '@happyvertical/smrt-ui/i18n';
8
+ import { Button } from '@happyvertical/smrt-ui/ui';
8
9
  import { M } from '../../i18n.js';
9
10
  import type { AgentSessionData } from '../../types.js';
10
11
  import Avatar from '../shared/Avatar.svelte';
@@ -49,7 +50,8 @@ const statusLabel: Record<string, string> = {
49
50
  <div class="session-panel__header">
50
51
  <h2 class="session-panel__title">Sessions</h2>
51
52
  {#if onnewsession}
52
- <button
53
+ <Button
54
+ variant="ghost"
53
55
  class="session-panel__new-btn"
54
56
  type="button"
55
57
  onclick={onnewsession}
@@ -59,13 +61,14 @@ const statusLabel: Record<string, string> = {
59
61
  <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
60
62
  <path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z" />
61
63
  </svg>
62
- </button>
64
+ </Button>
63
65
  {/if}
64
66
  </div>
65
67
 
66
68
  <div class="session-panel__list" role="listbox" aria-label={t(M['chat.agent_session_panel.session_list'])}>
67
69
  {#each sessions as session (session.id)}
68
70
  {@const isCurrent = session.id === currentSessionId}
71
+ <!-- raw-primitive-allow: large pressable selection card with role=option wrapping rich content (avatar, name, date, status, message count, tool chips) inside a role=listbox; no Button primitive owns this structural listbox-option pattern -->
69
72
  <button
70
73
  class="session-panel__item"
71
74
  class:session-panel__item--active={isCurrent}
@@ -152,29 +155,22 @@ const statusLabel: Record<string, string> = {
152
155
  margin: 0;
153
156
  }
154
157
 
155
- .session-panel__new-btn {
156
- display: inline-flex;
157
- align-items: center;
158
- justify-content: center;
158
+ /* :global() pierces into the Button child's rendered <button> (see #1589). */
159
+ .session-panel__header :global(.session-panel__new-btn) {
159
160
  width: 36px;
160
161
  height: 36px;
161
- border: none;
162
+ padding: 0;
162
163
  background: var(--smrt-color-primary, #005ac1);
163
164
  color: var(--smrt-color-on-primary, #ffffff);
164
165
  border-radius: var(--smrt-radius-full, 9999px);
165
- cursor: pointer;
166
166
  transition: opacity var(--smrt-duration-short2, 150ms);
167
167
  }
168
168
 
169
- .session-panel__new-btn:hover {
169
+ .session-panel__header :global(.session-panel__new-btn:hover) {
170
+ background: var(--smrt-color-primary, #005ac1);
170
171
  opacity: 0.85;
171
172
  }
172
173
 
173
- .session-panel__new-btn:focus-visible {
174
- outline: 2px solid var(--smrt-color-primary, #005ac1);
175
- outline-offset: 2px;
176
- }
177
-
178
174
  .session-panel__list {
179
175
  flex: 1;
180
176
  overflow-y: auto;
@@ -314,8 +310,11 @@ const statusLabel: Record<string, string> = {
314
310
  }
315
311
 
316
312
  @media (prefers-reduced-motion: reduce) {
317
- .session-panel__item,
318
- .session-panel__new-btn {
313
+ .session-panel__item {
314
+ transition: none;
315
+ }
316
+
317
+ .session-panel__header :global(.session-panel__new-btn) {
319
318
  transition: none;
320
319
  }
321
320
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AgentSessionPanel.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/agent/AgentSessionPanel.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIvD,MAAM,WAAW,KAAK;IACpB,yBAAyB;IACzB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,kCAAkC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uBAAuB;IACvB,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAiGD,QAAA,MAAM,iBAAiB,2CAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"AgentSessionPanel.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/agent/AgentSessionPanel.svelte.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAIvD,MAAM,WAAW,KAAK;IACpB,yBAAyB;IACzB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,kCAAkC;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uBAAuB;IACvB,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,2BAA2B;IAC3B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAmGD,QAAA,MAAM,iBAAiB,2CAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
@@ -50,6 +50,7 @@ function formatDuration(ms: number | undefined): string {
50
50
  </script>
51
51
 
52
52
  <div class="tool-call tool-call--{toolCall.status}" aria-label={t(M['chat.tool_call_display.tool_call'], { toolName: toolCall.toolName })}>
53
+ <!-- raw-primitive-allow: full-width disclosure trigger with aria-expanded and aria-controls toggling an externally-rendered collapsible panel, wrapping rich content (status dot, name, duration, status label, rotating chevron); structural accordion header no Button primitive owns -->
53
54
  <button
54
55
  class="tool-call__header"
55
56
  type="button"
@@ -1 +1 @@
1
- {"version":3,"file":"ToolCallDisplay.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/agent/ToolCallDisplay.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1D,MAAM,WAAW,KAAK;IACpB,qBAAqB;IACrB,QAAQ,EAAE,mBAAmB,CAAC;CAC/B;AAkGD,QAAA,MAAM,eAAe,2CAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"ToolCallDisplay.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/agent/ToolCallDisplay.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1D,MAAM,WAAW,KAAK;IACpB,qBAAqB;IACrB,QAAQ,EAAE,mBAAmB,CAAC;CAC/B;AAmGD,QAAA,MAAM,eAAe,2CAAwC,CAAC;AAC9D,KAAK,eAAe,GAAG,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;AAC1D,eAAe,eAAe,CAAC"}
@@ -9,6 +9,7 @@
9
9
  */
10
10
  import { Modal } from '@happyvertical/smrt-ui/feedback';
11
11
  import { useI18n } from '@happyvertical/smrt-ui/i18n';
12
+ import { Button } from '@happyvertical/smrt-ui/ui';
12
13
  import { M } from '../../i18n.js';
13
14
 
14
15
  const { t } = useI18n();
@@ -153,25 +154,26 @@ $effect(() => {
153
154
  </div>
154
155
 
155
156
  <!-- Hidden submit keeps Enter-to-submit working inside the Modal body. -->
157
+ <!-- raw-primitive-allow: off-screen aria-hidden type=submit element with tabindex=-1 used only to enable native Enter-to-submit inside the Modal body; intentionally non-interactive and not a visible action button -->
156
158
  <button type="submit" class="visually-hidden" tabindex="-1" disabled={!canCreate} aria-hidden="true"></button>
157
159
  </form>
158
160
 
159
161
  {#snippet footer()}
160
- <button
162
+ <Button
163
+ variant="secondary"
161
164
  type="button"
162
- class="btn btn--secondary"
163
165
  onclick={handleClose}
164
166
  >
165
167
  Cancel
166
- </button>
167
- <button
168
+ </Button>
169
+ <Button
170
+ variant="primary"
168
171
  type="button"
169
- class="btn btn--primary"
170
172
  disabled={!canCreate}
171
173
  onclick={handleSubmit}
172
174
  >
173
175
  {t(M['chat.room_create_dialog.create_room'])}
174
- </button>
176
+ </Button>
175
177
  {/snippet}
176
178
  </Modal>
177
179
 
@@ -301,45 +303,8 @@ $effect(() => {
301
303
  color: var(--smrt-color-on-surface-variant, #43474e);
302
304
  }
303
305
 
304
- .btn {
305
- display: inline-flex;
306
- align-items: center;
307
- justify-content: center;
308
- padding: 0.625rem 1.5rem;
309
- font: var(--smrt-typography-label-large-font, 500 0.875rem / 1.25 sans-serif);
310
- letter-spacing: 0.1px;
311
- border-radius: var(--smrt-radius-full, 9999px);
312
- border: none;
313
- cursor: pointer;
314
- transition: all var(--smrt-duration-short2, 150ms) var(--smrt-easing-standard, ease);
315
- }
316
-
317
- .btn:disabled {
318
- opacity: 0.38;
319
- cursor: not-allowed;
320
- }
321
-
322
- .btn--primary {
323
- background: var(--smrt-color-primary, #005ac1);
324
- color: var(--smrt-color-on-primary, #fff);
325
- }
326
-
327
- .btn--primary:hover:not(:disabled) {
328
- box-shadow: var(--smrt-elevation-1, 0 1px 2px rgba(0, 0, 0, 0.3), 0 1px 3px 1px rgba(0, 0, 0, 0.15));
329
- }
330
-
331
- .btn--secondary {
332
- background: transparent;
333
- color: var(--smrt-color-primary, #005ac1);
334
- }
335
-
336
- .btn--secondary:hover:not(:disabled) {
337
- background: color-mix(in srgb, var(--smrt-color-primary, #005ac1) 8%, transparent);
338
- }
339
-
340
306
  @media (prefers-reduced-motion: reduce) {
341
- .type-option,
342
- .btn {
307
+ .type-option {
343
308
  transition: none;
344
309
  }
345
310
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RoomCreateDialog.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/dialogs/RoomCreateDialog.svelte.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,KAAK;IACpB,iCAAiC;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,mCAAmC;IACnC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,oCAAoC;IACpC,QAAQ,EAAE,CAAC,MAAM,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB,KAAK,IAAI,CAAC;CACZ;AAwHD,QAAA,MAAM,gBAAgB,2CAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"RoomCreateDialog.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/dialogs/RoomCreateDialog.svelte.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,KAAK;IACpB,iCAAiC;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,mCAAmC;IACnC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,oCAAoC;IACpC,QAAQ,EAAE,CAAC,MAAM,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACrB,KAAK,IAAI,CAAC;CACZ;AA0HD,QAAA,MAAM,gBAAgB,2CAAwC,CAAC;AAC/D,KAAK,gBAAgB,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC5D,eAAe,gBAAgB,CAAC"}
@@ -4,6 +4,7 @@
4
4
  * Provides a search input and displays matching messages
5
5
  */
6
6
  import { useI18n } from '@happyvertical/smrt-ui/i18n';
7
+ import { Button } from '@happyvertical/smrt-ui/ui';
7
8
  import { M } from '../../i18n.js';
8
9
  import type { ChatMessageData } from '../../types.js';
9
10
 
@@ -108,7 +109,9 @@ $effect(() => {
108
109
  >
109
110
  <div class="search-panel__header">
110
111
  <h2 class="search-panel__title">{t(M['chat.search_messages.title'])}</h2>
111
- <button
112
+ <Button
113
+ variant="ghost"
114
+ size="sm"
112
115
  class="close-btn"
113
116
  type="button"
114
117
  onclick={handleClose}
@@ -118,7 +121,7 @@ $effect(() => {
118
121
  <path d="M18 6 6 18" />
119
122
  <path d="m6 6 12 12" />
120
123
  </svg>
121
- </button>
124
+ </Button>
122
125
  </div>
123
126
 
124
127
  <form
@@ -140,7 +143,9 @@ $effect(() => {
140
143
  aria-label={t(M['chat.search_messages.query'])}
141
144
  />
142
145
  {#if hasQuery}
143
- <button
146
+ <Button
147
+ variant="ghost"
148
+ size="sm"
144
149
  class="clear-btn"
145
150
  type="button"
146
151
  onclick={() => { query = ''; searchInput?.focus(); }}
@@ -150,7 +155,7 @@ $effect(() => {
150
155
  <path d="M18 6 6 18" />
151
156
  <path d="m6 6 12 12" />
152
157
  </svg>
153
- </button>
158
+ </Button>
154
159
  {/if}
155
160
  </div>
156
161
  </form>
@@ -163,6 +168,7 @@ $effect(() => {
163
168
  <ul class="results-list" aria-label={t(M['chat.search_messages.results'])}>
164
169
  {#each results as message (message.id)}
165
170
  <li class="results-list__item">
171
+ <!-- raw-primitive-allow: large pressable search-result card wrapping rich content (avatar, sender, date, multi-line highlighted message excerpt); no Button primitive owns this structural selection-card pattern -->
166
172
  <button
167
173
  class="result-item"
168
174
  type="button"
@@ -231,29 +237,21 @@ $effect(() => {
231
237
  color: var(--smrt-color-on-surface, #1a1c1e);
232
238
  }
233
239
 
234
- .close-btn {
235
- display: inline-flex;
236
- align-items: center;
237
- justify-content: center;
240
+ /* :global() pierces into the Button child's rendered <button> (see #1589). */
241
+ .search-panel__header :global(.close-btn) {
238
242
  width: 1.75rem;
239
243
  height: 1.75rem;
240
- border: none;
244
+ padding: 0;
241
245
  background: none;
242
246
  border-radius: var(--smrt-radius-medium, 0.5rem);
243
247
  color: var(--smrt-color-on-surface-variant, #43474e);
244
- cursor: pointer;
245
248
  transition: background var(--smrt-duration-short2, 150ms);
246
249
  }
247
250
 
248
- .close-btn:hover {
251
+ .search-panel__header :global(.close-btn:hover) {
249
252
  background: var(--smrt-color-surface-variant, #e1e2ec);
250
253
  }
251
254
 
252
- .close-btn:focus-visible {
253
- outline: 2px solid var(--smrt-color-primary, #005ac1);
254
- outline-offset: -2px;
255
- }
256
-
257
255
  .close-btn__icon {
258
256
  width: 1rem;
259
257
  height: 1rem;
@@ -300,21 +298,19 @@ $effect(() => {
300
298
  color: var(--smrt-color-on-surface-variant, #43474e);
301
299
  }
302
300
 
303
- .clear-btn {
301
+ /* :global() pierces into the Button child's rendered <button> (see #1589). */
302
+ .search-input-wrap :global(.clear-btn) {
304
303
  flex-shrink: 0;
305
- display: inline-flex;
306
- align-items: center;
307
- justify-content: center;
308
304
  width: 1.25rem;
309
305
  height: 1.25rem;
310
- border: none;
306
+ padding: 0;
311
307
  background: none;
312
308
  border-radius: var(--smrt-radius-full, 9999px);
313
309
  color: var(--smrt-color-on-surface-variant, #43474e);
314
- cursor: pointer;
315
310
  }
316
311
 
317
- .clear-btn:hover {
312
+ .search-input-wrap :global(.clear-btn:hover) {
313
+ background: none;
318
314
  color: var(--smrt-color-on-surface, #1a1c1e);
319
315
  }
320
316
 
@@ -448,10 +444,13 @@ $effect(() => {
448
444
  }
449
445
 
450
446
  @media (prefers-reduced-motion: reduce) {
451
- .close-btn,
452
447
  .result-item,
453
448
  .search-input-wrap {
454
449
  transition: none;
455
450
  }
451
+
452
+ .search-panel__header :global(.close-btn) {
453
+ transition: none;
454
+ }
456
455
  }
457
456
  </style>
@@ -1 +1 @@
1
- {"version":3,"file":"SearchMessages.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/dialogs/SearchMessages.svelte.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtD,MAAM,WAAW,KAAK;IACpB,uCAAuC;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,yCAAyC;IACzC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gDAAgD;IAChD,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,qBAAqB;IACrB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,yCAAyC;IACzC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAyKD,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"SearchMessages.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/dialogs/SearchMessages.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGtD,MAAM,WAAW,KAAK;IACpB,uCAAuC;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,yCAAyC;IACzC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gDAAgD;IAChD,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,qBAAqB;IACrB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,yCAAyC;IACzC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AA2KD,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
@@ -72,6 +72,7 @@ function handlePointerUp() {
72
72
  />
73
73
  </aside>
74
74
 
75
+ <!-- raw-primitive-allow: custom drag-to-resize splitter with pointer capture (pointerdown/move/up) and ArrowLeft/ArrowRight keyboard resizing; a press-and-drag control no Button primitive owns -->
75
76
  <button
76
77
  type="button"
77
78
  class="chat-layout__resize-handle"
@@ -1 +1 @@
1
- {"version":3,"file":"ChatLayout.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/layout/ChatLayout.svelte.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAInD,MAAM,WAAW,KAAK;IACpB,2BAA2B;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,iCAAiC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gCAAgC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,uCAAuC;IACvC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,wBAAwB;IACxB,QAAQ,EAAE,OAAO,CAAC;CACnB;AA+DD,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"ChatLayout.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/layout/ChatLayout.svelte.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAInD,MAAM,WAAW,KAAK;IACpB,2BAA2B;IAC3B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,iCAAiC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gCAAgC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,uCAAuC;IACvC,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,wBAAwB;IACxB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAgED,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
@@ -4,6 +4,7 @@
4
4
  * Lists participants grouped by online status with role badges
5
5
  */
6
6
  import { useI18n } from '@happyvertical/smrt-ui/i18n';
7
+ import { Button } from '@happyvertical/smrt-ui/ui';
7
8
  import { M } from '../../i18n.messages.js';
8
9
  import type { ChatParticipantData } from '../../types.js';
9
10
 
@@ -74,7 +75,9 @@ function getRoleBadgeLabel(role: string): string {
74
75
  <div class="member-list__header">
75
76
  <h2 class="member-list__title">Members</h2>
76
77
  <span class="member-list__count">{participants.length}</span>
77
- <button
78
+ <Button
79
+ variant="ghost"
80
+ size="sm"
78
81
  class="close-btn"
79
82
  type="button"
80
83
  onclick={onclose}
@@ -84,7 +87,7 @@ function getRoleBadgeLabel(role: string): string {
84
87
  <path d="M18 6 6 18" />
85
88
  <path d="m6 6 12 12" />
86
89
  </svg>
87
- </button>
90
+ </Button>
88
91
  </div>
89
92
 
90
93
  <div class="member-list__content">
@@ -235,30 +238,22 @@ function getRoleBadgeLabel(role: string): string {
235
238
  color: var(--smrt-color-on-surface-variant, #43474e);
236
239
  }
237
240
 
238
- .close-btn {
241
+ /* :global() pierces into the Button child's rendered <button> (see #1589). */
242
+ .member-list__header :global(.close-btn) {
239
243
  margin-left: auto;
240
- display: inline-flex;
241
- align-items: center;
242
- justify-content: center;
243
244
  width: 1.75rem;
244
245
  height: 1.75rem;
245
- border: none;
246
+ padding: 0;
246
247
  background: none;
247
248
  border-radius: var(--smrt-radius-medium, 0.5rem);
248
249
  color: var(--smrt-color-on-surface-variant, #43474e);
249
- cursor: pointer;
250
250
  transition: background var(--smrt-duration-short2, 150ms);
251
251
  }
252
252
 
253
- .close-btn:hover {
253
+ .member-list__header :global(.close-btn:hover) {
254
254
  background: var(--smrt-color-surface-variant, #e1e2ec);
255
255
  }
256
256
 
257
- .close-btn:focus-visible {
258
- outline: 2px solid var(--smrt-color-primary, #005ac1);
259
- outline-offset: -2px;
260
- }
261
-
262
257
  .close-btn__icon {
263
258
  width: 1rem;
264
259
  height: 1rem;
@@ -384,7 +379,7 @@ function getRoleBadgeLabel(role: string): string {
384
379
  }
385
380
 
386
381
  @media (prefers-reduced-motion: reduce) {
387
- .close-btn {
382
+ .member-list__header :global(.close-btn) {
388
383
  transition: none;
389
384
  }
390
385
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MemberList.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/layout/MemberList.svelte.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1D,MAAM,WAAW,KAAK;IACpB,wBAAwB;IACxB,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,yCAAyC;IACzC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AA0LD,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"MemberList.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/layout/MemberList.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1D,MAAM,WAAW,KAAK;IACpB,wBAAwB;IACxB,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,yCAAyC;IACzC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AA2LD,QAAA,MAAM,UAAU,2CAAwC,CAAC;AACzD,KAAK,UAAU,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAChD,eAAe,UAAU,CAAC"}