@aparte/core 0.4.0-alpha.0 → 0.6.0

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 (35) hide show
  1. package/README.md +5 -2
  2. package/dist/client/aparte-client.d.ts +7 -1
  3. package/dist/client/aparte-client.d.ts.map +1 -1
  4. package/dist/components/bubble/aparte-chat-bubble.d.ts +15 -2
  5. package/dist/components/bubble/aparte-chat-bubble.d.ts.map +1 -1
  6. package/dist/components/composer/aparte-composer-attachments.d.ts +3 -2
  7. package/dist/components/composer/aparte-composer-attachments.d.ts.map +1 -1
  8. package/dist/components/viewport/aparte-chat-viewport.d.ts +4 -2
  9. package/dist/components/viewport/aparte-chat-viewport.d.ts.map +1 -1
  10. package/dist/config/aparte-config.d.ts +54 -5
  11. package/dist/config/aparte-config.d.ts.map +1 -1
  12. package/dist/config/index.d.ts +1 -1
  13. package/dist/config/index.d.ts.map +1 -1
  14. package/dist/custom-elements.json +4501 -4310
  15. package/dist/host/aparte-chat-host.d.ts +11 -0
  16. package/dist/host/aparte-chat-host.d.ts.map +1 -1
  17. package/dist/{index-BBg6dsYx.js → index-Dn7TH14G.js} +137 -59
  18. package/dist/index-Dn7TH14G.js.map +1 -0
  19. package/dist/index.css +15 -2
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +106 -48
  23. package/dist/index.js.map +1 -1
  24. package/dist/index.node.d.ts +1 -1
  25. package/dist/index.node.d.ts.map +1 -1
  26. package/dist/index.node.js +34 -32
  27. package/dist/index.node.js.map +1 -1
  28. package/dist/renderers/index.d.ts +1 -1
  29. package/dist/renderers/index.d.ts.map +1 -1
  30. package/dist/renderers/segment-renderers.d.ts +23 -0
  31. package/dist/renderers/segment-renderers.d.ts.map +1 -1
  32. package/dist/types/models.d.ts +56 -9
  33. package/dist/types/models.d.ts.map +1 -1
  34. package/package.json +1 -1
  35. package/dist/index-BBg6dsYx.js.map +0 -1
package/dist/index.css CHANGED
@@ -822,10 +822,16 @@ aparte-chat-bubble {
822
822
  border: var(--aparte-border-width, 1px) solid var(--aparte-attachment-chip-border, var(--aparte-border));
823
823
  }
824
824
 
825
- .aparte-thumb--image {
825
+ /* Only an image tile the app declared it can preview is a button — see
826
+ AparteConfig.setHostHandlers(). Undeclared, it is a picture, not a control. */
827
+ .aparte-thumb--image[role='button'] {
826
828
  cursor: pointer;
827
829
  }
828
830
 
831
+ .aparte-thumb--image[role='button']:focus-visible {
832
+ box-shadow: var(--aparte-focus-ring, 0 0 0 3px rgba(99, 102, 241, 0.15));
833
+ }
834
+
829
835
  .aparte-thumb__img {
830
836
  width: 100%;
831
837
  height: 100%;
@@ -967,7 +973,14 @@ aparte-chat-bubble:last-of-type .aparte-message[data-role="assistant"]:not(.apar
967
973
  gap: var(--aparte-branch-picker-gap, 4px);
968
974
  }
969
975
 
970
- /* [hidden] is overridden by display:flex — force it back */
976
+ /* [hidden] is overridden by display:flex — force it back. The bar and the footer
977
+ hide themselves when they hold nothing (see _syncFooterVisibility): an empty
978
+ toolbar is announced to screen readers and reserves height for nothing. */
979
+ .aparte-action-bar[hidden],
980
+ .aparte-footer[hidden] {
981
+ display: none;
982
+ }
983
+
971
984
  .aparte-branch-picker[hidden] {
972
985
  display: none;
973
986
  }
package/dist/index.d.ts CHANGED
@@ -38,7 +38,7 @@ export { AparteChatHost, type AparteChatHostBinding, type AparteChatHostOptions,
38
38
  export { AparteStreamParser, parseMarkdownToSegments, deriveArtifactKind } from './parsers/index.js';
39
39
  export type { AparteStreamParserOptions, AparteThinkingDelimiterPair, AparteParserState, AparteParserResult } from './parsers/index.js';
40
40
  export { parseAparteEventStream } from './parsers/index.js';
41
- export { AparteConfig, AparteConfigClass } from './config/index.js';
41
+ export { AparteConfig, AparteConfigClass, DEFAULT_BUBBLE_ACTIONS, DEFAULT_HOST_HANDLERS } from './config/index.js';
42
42
  export { resolveConfig, attachConfig, detachConfig, runWithConfig, contextConfig, APARTE_HOST_ATTR } from './config/index.js';
43
43
  export type { AparteMarkdownProvider, AparteStreamingMarkdownProvider, AparteStreamingMarkdownRenderer, AparteHighlightProvider, AparteSystemPromptVarsProvider, AparteSkeletonProvider, AparteSkeletonType, AparteLocale, AparteAction, AparteActionZone, AparteIconProvider, AparteIconName, AparteAvatarProvider, AparteStatusRenderer, AparteErrorRenderer, AparteAttachmentRenderer, AparteSiblingNavRenderer, AparteBubbleShellRenderer, AparteModelPreference, AparteModelPreferenceProvider, AparteArtifactPreviewBuilder, AparteSanitizer } from './config/index.js';
44
44
  export { DEFAULT_ICON_FALLBACKS, DEFAULT_SKELETON_FALLBACKS, DEFAULT_LOCALE, defaultSanitizer, isSafeUrl } from './config/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,qBAAqB,CAAC;AAC7B,OAAO,gCAAgC,CAAC;AACxC,OAAO,oDAAoD,CAAC;AAG5D,OAAO,sBAAsB,CAAC;AAG9B,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAGzI,YAAY,EACR,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EAErB,gBAAgB,EAChB,aAAa,EACb,2BAA2B,EAC3B,4BAA4B,EAC5B,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,4BAA4B,EAC5B,4BAA4B,EAC5B,4BAA4B,EAC5B,iBAAiB,EACjB,+BAA+B,EAC/B,4BAA4B,EAC5B,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EACzB,uBAAuB,EACvB,8BAA8B,EAC9B,8BAA8B,EAC9B,8BAA8B,EAC9B,6BAA6B,EAE7B,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EAEX,UAAU,EACV,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,+BAA+B,EAC/B,sBAAsB,EAEtB,uBAAuB,EAC1B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAG/E,OAAO,EACH,uBAAuB,EACvB,yBAAyB,EACzB,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,EAC3B,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AACpF,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACpM,YAAY,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,+BAA+B,EAAE,MAAM,uBAAuB,CAAC;AAGnJ,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,YAAY,EAAE,0BAA0B,EAAE,8BAA8B,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AAGxI,YAAY,EACR,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,kCAAkC,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,KAAK,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EACH,4BAA4B,EAC5B,KAAK,iBAAiB,EACtB,KAAK,mCAAmC,GAC3C,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EACH,cAAc,EACd,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,GAC7B,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACrG,YAAY,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxI,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAG5D,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACnH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC9H,YAAY,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,+BAA+B,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,4BAA4B,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC9iB,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,cAAc,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGpI,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAIlF,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAGrE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,YAAY,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAE3H,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAC1F,YAAY,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAG5L,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACnH,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAGzM,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,YAAY,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAGjF,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACjF,YAAY,EACR,uBAAuB,EACvB,sBAAsB,EACtB,0BAA0B,EAC1B,6BAA6B,EAC7B,4BAA4B,EAC5B,6BAA6B,EAC7B,wBAAwB,EACxB,uBAAuB,EACvB,0BAA0B,EAC1B,qBAAqB,GACxB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AAInF,OAAO,kCAAkC,CAAC;AAC1C,OAAO,2CAA2C,CAAC;AACnD,OAAO,2CAA2C,CAAC;AACnD,OAAO,+CAA+C,CAAC;AACvD,OAAO,gDAAgD,CAAC;AAExD,OAAO,sCAAsC,CAAC;AAC9C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,wCAAwC,CAAC;AAEhD;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAU5C"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { P as resolveConfig, z as getSegmentRenderer, Q as runWithConfig, M as MessageRepository, E as isAwaitingReply, J as populateBubbleFromMessage, d as AparteConfig, p as buildElicitationPanel } from "./index-BBg6dsYx.js";
2
- import { A, a, b, c, e, f, g, h, i, B, C, D, j, k, l, m, n, o, q, r, s, t, u, v, w, x, y, F, G, H, I, K, L, N, O, R } from "./index-BBg6dsYx.js";
1
+ import { R as resolveConfig, S as runWithConfig, F as getSegmentRenderer, U as installDefaultRenderersOnce, M as MessageRepository, G as isAwaitingReply, L as populateBubbleFromMessage, d as AparteConfig, r as buildElicitationPanel } from "./index-Dn7TH14G.js";
2
+ import { A, a, b, c, e, f, g, h, i, B, C, D, j, k, l, m, n, o, p, q, s, t, u, v, w, x, y, z, E, H, I, J, K, N, O, P, Q, T } from "./index-Dn7TH14G.js";
3
3
  class AparteOption extends HTMLElement {
4
4
  static get observedAttributes() {
5
5
  return ["value", "disabled", "selected", "data-status"];
@@ -721,7 +721,13 @@ let _warnedNoRenderer = false;
721
721
  function warnMissingRenderer(type) {
722
722
  if (_warnedNoRenderer) return;
723
723
  _warnedNoRenderer = true;
724
- console.warn(`[aparte] No renderer for segment "${type}". Did you call registerDefaultRenderers() from @aparte/core?`);
724
+ console.warn(`[aparte] No renderer for segment "${type}". Register one with registerSegmentRenderer({ type: '${type}', render }) from @aparte/core — see https://apartejs.dev/guides/customization/#custom-segment-types`);
725
+ }
726
+ function resolveSegmentRenderer(type) {
727
+ const renderer = getSegmentRenderer(type);
728
+ if (renderer) return renderer;
729
+ installDefaultRenderersOnce();
730
+ return getSegmentRenderer(type);
725
731
  }
726
732
  function segmentRenderResultToElement(result) {
727
733
  if (result instanceof HTMLElement) return result;
@@ -736,6 +742,7 @@ class AparteChatBubble extends HTMLElement {
736
742
  _attachmentsEl = null;
737
743
  _actionBarEl = null;
738
744
  _branchPickerEl = null;
745
+ _footerEl = null;
739
746
  _content = "";
740
747
  _streaming = false;
741
748
  _segments = [];
@@ -886,8 +893,12 @@ class AparteChatBubble extends HTMLElement {
886
893
  }
887
894
  /**
888
895
  * Set token usage + timing for this message (assistant only).
889
- * Renders the info ("i") action in the action bar; clicking it opens
890
- * the app-owned stats popover (`aparte-message-info`).
896
+ *
897
+ * This is the *precondition* for the info ("i") action, not the trigger: the
898
+ * button appears only if the app also declared it wants it —
899
+ * `AparteConfig.setBubbleActions({ info: true })` — because the stats popover it
900
+ * opens (`aparte-message-info`) is the app's, and core has none. Without usage
901
+ * there is nothing to show, so the button never renders either way.
891
902
  */
892
903
  setUsage(usage) {
893
904
  this._usage = usage ?? null;
@@ -940,7 +951,7 @@ class AparteChatBubble extends HTMLElement {
940
951
  console.warn(`[AparteChatBubble] _appendSegmentEl ABORT: _segmentsEl is null`);
941
952
  return;
942
953
  }
943
- const renderer = getSegmentRenderer(segment.type);
954
+ const renderer = resolveSegmentRenderer(segment.type);
944
955
  if (renderer) {
945
956
  const el = segmentRenderResultToElement(runWithConfig(this._cfg, () => renderer.render(segment)));
946
957
  if (el) {
@@ -963,7 +974,7 @@ class AparteChatBubble extends HTMLElement {
963
974
  this._renderSegments();
964
975
  return;
965
976
  }
966
- const renderer = getSegmentRenderer(segment.type);
977
+ const renderer = resolveSegmentRenderer(segment.type);
967
978
  if (!renderer) return;
968
979
  if (renderer.update) {
969
980
  runWithConfig(this._cfg, () => renderer.update(el, segment));
@@ -1046,6 +1057,7 @@ class AparteChatBubble extends HTMLElement {
1046
1057
  this._attachmentsEl = this.querySelector(".aparte-attachments");
1047
1058
  this._actionBarEl = this.querySelector(".aparte-action-bar");
1048
1059
  this._branchPickerEl = this.querySelector(".aparte-branch-picker");
1060
+ this._footerEl = this.querySelector(".aparte-footer");
1049
1061
  this._setupBranchPickerListeners();
1050
1062
  this._updateActionBar();
1051
1063
  this._renderAvatar();
@@ -1160,7 +1172,7 @@ class AparteChatBubble extends HTMLElement {
1160
1172
  if (!this._segmentsEl) return;
1161
1173
  this._segmentsEl.innerHTML = "";
1162
1174
  for (const segment of this._segments) {
1163
- const renderer = getSegmentRenderer(segment.type);
1175
+ const renderer = resolveSegmentRenderer(segment.type);
1164
1176
  if (renderer) {
1165
1177
  const el = segmentRenderResultToElement(runWithConfig(this._cfg, () => renderer.render(segment)));
1166
1178
  if (el) {
@@ -1238,8 +1250,11 @@ class AparteChatBubble extends HTMLElement {
1238
1250
  }
1239
1251
  return `<div class="aparte-thumb aparte-thumb--file" title="${name}"><span class="aparte-thumb__ext">${this._escapeHtml(this._fileExt(a2.name))}</span><span class="aparte-thumb__name">${name}</span></div>`;
1240
1252
  }).join("");
1253
+ if (!this._cfg.getHostHandlers().attachmentPreview) return;
1241
1254
  this._attachmentsEl.querySelectorAll(".aparte-thumb--image").forEach((tile) => {
1242
- tile.addEventListener("click", () => {
1255
+ tile.setAttribute("role", "button");
1256
+ tile.setAttribute("tabindex", "0");
1257
+ const open = () => {
1243
1258
  const img = tile.querySelector(".aparte-thumb__img");
1244
1259
  if (!img) return;
1245
1260
  this.dispatchEvent(new CustomEvent("aparte-attachment-preview", {
@@ -1247,6 +1262,13 @@ class AparteChatBubble extends HTMLElement {
1247
1262
  composed: true,
1248
1263
  detail: { url: img.src, name: tile.getAttribute("title") ?? "" }
1249
1264
  }));
1265
+ };
1266
+ tile.addEventListener("click", open);
1267
+ tile.addEventListener("keydown", (e2) => {
1268
+ const key = e2.key;
1269
+ if (key !== "Enter" && key !== " ") return;
1270
+ e2.preventDefault();
1271
+ open();
1250
1272
  });
1251
1273
  });
1252
1274
  }
@@ -1278,9 +1300,11 @@ class AparteChatBubble extends HTMLElement {
1278
1300
  if (!this._branchPickerEl) return;
1279
1301
  if (this._siblingCount <= 1 || this._role !== "assistant") {
1280
1302
  this._branchPickerEl.hidden = true;
1303
+ this._syncFooterVisibility();
1281
1304
  return;
1282
1305
  }
1283
1306
  this._branchPickerEl.hidden = false;
1307
+ this._syncFooterVisibility();
1284
1308
  const label = this._branchPickerEl.querySelector(".aparte-branch-label");
1285
1309
  if (label) {
1286
1310
  const customNav = this._cfg.getSiblingNavRenderer?.();
@@ -1327,12 +1351,7 @@ class AparteChatBubble extends HTMLElement {
1327
1351
  buttons.push(this._actionButtonHtml("thumbUp", icons, locale));
1328
1352
  buttons.push(this._actionButtonHtml("thumbDown", icons, locale));
1329
1353
  }
1330
- if (this._usage) {
1331
- const infoLabel = locale.messageInfo ?? "Details";
1332
- buttons.push(`<button class="aparte-action-btn aparte-action-info" data-action="info" aria-label="${infoLabel}" title="${infoLabel}">
1333
- ${INFO_ICON_SVG}
1334
- </button>`);
1335
- }
1354
+ if (config.info) buttons.push(this._actionButtonHtml("info", icons, locale));
1336
1355
  }
1337
1356
  }
1338
1357
  this._actionBarEl.innerHTML = buttons.join("");
@@ -1340,6 +1359,21 @@ class AparteChatBubble extends HTMLElement {
1340
1359
  this._actionBarEl.querySelectorAll(".aparte-action-btn").forEach((btn) => {
1341
1360
  btn.addEventListener("click", (e2) => this._handleActionClick(e2));
1342
1361
  });
1362
+ this._syncFooterVisibility();
1363
+ }
1364
+ /**
1365
+ * An empty action bar is not a bar: with every action off it was still a
1366
+ * `role="toolbar"` with nothing in it (announced as such), and it still reserved
1367
+ * its fixed height plus the footer's under every bubble. So both follow their
1368
+ * contents — the footer stays as long as the branch picker or the bar has
1369
+ * something to show.
1370
+ */
1371
+ _syncFooterVisibility() {
1372
+ if (this._actionBarEl) this._actionBarEl.hidden = this._actionBarEl.children.length === 0;
1373
+ if (!this._footerEl) return;
1374
+ const barEmpty = !this._actionBarEl || this._actionBarEl.hidden;
1375
+ const pickerHidden = !this._branchPickerEl || this._branchPickerEl.hidden;
1376
+ this._footerEl.hidden = barEmpty && pickerHidden;
1343
1377
  }
1344
1378
  /** Append the registered custom action buttons for this bubble's role. */
1345
1379
  _appendCustomActions(icons) {
@@ -1380,6 +1414,11 @@ class AparteChatBubble extends HTMLElement {
1380
1414
  const l2 = locale.feedbackNegative ?? "Bad response";
1381
1415
  return `<button class="aparte-action-btn aparte-action-feedback-neg" data-action="feedback-negative" aria-label="${l2}" title="${l2}">${icons.thumbDown()}</button>`;
1382
1416
  }
1417
+ case "info": {
1418
+ if (!this._usage) return "";
1419
+ const l2 = locale.messageInfo ?? "Details";
1420
+ return `<button class="aparte-action-btn aparte-action-info" data-action="info" aria-label="${l2}" title="${l2}">${INFO_ICON_SVG}</button>`;
1421
+ }
1383
1422
  default:
1384
1423
  return "";
1385
1424
  }
@@ -1394,6 +1433,7 @@ class AparteChatBubble extends HTMLElement {
1394
1433
  this._actionBarEl.querySelectorAll(".aparte-action-btn").forEach((btn) => {
1395
1434
  btn.addEventListener("click", (e2) => this._handleActionClick(e2));
1396
1435
  });
1436
+ this._syncFooterVisibility();
1397
1437
  }
1398
1438
  _handleActionClick(e2) {
1399
1439
  const btn = e2.currentTarget;
@@ -1831,9 +1871,13 @@ class AparteChatViewport extends HTMLElement {
1831
1871
  if (!message.segments) {
1832
1872
  message.segments = [];
1833
1873
  }
1834
- const segment = message.segments.find((s2) => s2.id === segmentId);
1874
+ const index = message.segments.findIndex((s2) => s2.id === segmentId);
1875
+ const segment = index === -1 ? void 0 : message.segments[index];
1835
1876
  if (segment && "content" in segment) {
1836
- segment.content += chunk;
1877
+ message.segments[index] = {
1878
+ ...segment,
1879
+ content: segment.content + chunk
1880
+ };
1837
1881
  }
1838
1882
  this.dispatchEvent(new CustomEvent("aparte-segment-update", {
1839
1883
  bubbles: true,
@@ -1909,8 +1953,10 @@ class AparteChatViewport extends HTMLElement {
1909
1953
  this.updateSegment(messageId, segmentId, { isStreaming: false });
1910
1954
  }
1911
1955
  /**
1912
- * Persist token usage on a message and propagate to the live bubble so the
1913
- * perf chip (tokens/sec) renders in the action bar.
1956
+ * Persist token usage on a message and propagate to the live bubble, which is
1957
+ * what allows the info ("i") action to render — provided the app declared it
1958
+ * with `AparteConfig.setBubbleActions({ info: true })`; it is off by default,
1959
+ * since the popover it opens belongs to the app.
1914
1960
  */
1915
1961
  setUsage(messageId, usage) {
1916
1962
  const message = this._repo.getMessageById(messageId);
@@ -3087,9 +3133,9 @@ class AparteComposerInput extends HTMLElement {
3087
3133
  }
3088
3134
  _updatePlaceholder() {
3089
3135
  if (this._editor) {
3090
- const p = this._getPlaceholder();
3091
- this._editor.setAttribute("data-placeholder", p);
3092
- this._editor.setAttribute("aria-label", p);
3136
+ const p2 = this._getPlaceholder();
3137
+ this._editor.setAttribute("data-placeholder", p2);
3138
+ this._editor.setAttribute("aria-label", p2);
3093
3139
  }
3094
3140
  }
3095
3141
  _updatePlaceholderVisibility() {
@@ -3320,8 +3366,11 @@ class AparteComposerAttachments extends HTMLElement {
3320
3366
  if (root) root.removeAttachment(root.attachments[i2]);
3321
3367
  });
3322
3368
  });
3369
+ if (!resolveConfig(this).getHostHandlers().attachmentPreview) return;
3323
3370
  this.querySelectorAll(".aparte-thumb--image").forEach((tile) => {
3324
- tile.addEventListener("click", () => {
3371
+ tile.setAttribute("role", "button");
3372
+ tile.setAttribute("tabindex", "0");
3373
+ const open = () => {
3325
3374
  const img = tile.querySelector(".aparte-thumb__img");
3326
3375
  if (!img) return;
3327
3376
  this.dispatchEvent(new CustomEvent("aparte-attachment-preview", {
@@ -3329,6 +3378,13 @@ class AparteComposerAttachments extends HTMLElement {
3329
3378
  composed: true,
3330
3379
  detail: { url: img.src, name: tile.getAttribute("title") ?? "" }
3331
3380
  }));
3381
+ };
3382
+ tile.addEventListener("click", open);
3383
+ tile.addEventListener("keydown", (e2) => {
3384
+ const key = e2.key;
3385
+ if (key !== "Enter" && key !== " ") return;
3386
+ e2.preventDefault();
3387
+ open();
3332
3388
  });
3333
3389
  });
3334
3390
  }
@@ -3823,38 +3879,40 @@ export {
3823
3879
  i as AparteStreamParser,
3824
3880
  B as BackendTransport,
3825
3881
  C as ConversationManager,
3826
- D as DEFAULT_ICON_FALLBACKS,
3827
- j as DEFAULT_LOCALE,
3828
- k as DEFAULT_SKELETON_FALLBACKS,
3829
- l as DEFAULT_UI_EVENTS,
3830
- m as DirectTransport,
3882
+ D as DEFAULT_BUBBLE_ACTIONS,
3883
+ j as DEFAULT_HOST_HANDLERS,
3884
+ k as DEFAULT_ICON_FALLBACKS,
3885
+ l as DEFAULT_LOCALE,
3886
+ m as DEFAULT_SKELETON_FALLBACKS,
3887
+ n as DEFAULT_UI_EVENTS,
3888
+ o as DirectTransport,
3831
3889
  MessageRepository,
3832
- n as applyElementProps,
3833
- o as attachConfig,
3890
+ p as applyElementProps,
3891
+ q as attachConfig,
3834
3892
  buildElicitationPanel,
3835
- q as collectRendererStyles,
3836
- r as contentToText,
3837
- s as contextConfig,
3838
- t as createAparteChatHandler,
3839
- u as createStreamAdapter,
3840
- v as defaultSanitizer,
3841
- w as deriveArtifactKind,
3842
- x as detachConfig,
3843
- y as filesToAttachments,
3893
+ s as collectRendererStyles,
3894
+ t as contentToText,
3895
+ u as contextConfig,
3896
+ v as createAparteChatHandler,
3897
+ w as createStreamAdapter,
3898
+ x as defaultSanitizer,
3899
+ y as deriveArtifactKind,
3900
+ z as detachConfig,
3901
+ E as filesToAttachments,
3844
3902
  getSegmentRenderer,
3845
3903
  isAwaitingReply,
3846
- F as isFormatAdapter,
3847
- G as isSafeUrl,
3848
- H as parseAparteEventStream,
3849
- I as parseMarkdownToSegments,
3904
+ H as isFormatAdapter,
3905
+ I as isSafeUrl,
3906
+ J as parseAparteEventStream,
3907
+ K as parseMarkdownToSegments,
3850
3908
  populateBubbleFromMessage,
3851
- K as readableToAsyncIterable,
3909
+ N as readableToAsyncIterable,
3852
3910
  registerAllComponents,
3853
- L as registerDefaultRenderers,
3854
- N as registerSegmentRenderer,
3855
- O as requestUserInput,
3911
+ O as registerDefaultRenderers,
3912
+ P as registerSegmentRenderer,
3913
+ Q as requestUserInput,
3856
3914
  resolveConfig,
3857
3915
  runWithConfig,
3858
- R as unregisterSegmentRenderer
3916
+ T as unregisterSegmentRenderer
3859
3917
  };
3860
3918
  //# sourceMappingURL=index.js.map