@aparte/core 0.6.1 → 0.7.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 (45) hide show
  1. package/dist/components/bubble/aparte-chat-bubble.d.ts +13 -0
  2. package/dist/components/bubble/aparte-chat-bubble.d.ts.map +1 -1
  3. package/dist/components/chat/aparte-chat.d.ts +17 -0
  4. package/dist/components/chat/aparte-chat.d.ts.map +1 -1
  5. package/dist/components/composer/aparte-composer-add-attachment.d.ts +11 -0
  6. package/dist/components/composer/aparte-composer-add-attachment.d.ts.map +1 -1
  7. package/dist/components/composer/aparte-composer-attachments.d.ts +14 -0
  8. package/dist/components/composer/aparte-composer-attachments.d.ts.map +1 -1
  9. package/dist/components/composer/aparte-composer-cancel.d.ts +11 -0
  10. package/dist/components/composer/aparte-composer-cancel.d.ts.map +1 -1
  11. package/dist/components/composer/aparte-composer-input.d.ts +10 -0
  12. package/dist/components/composer/aparte-composer-input.d.ts.map +1 -1
  13. package/dist/components/composer/aparte-composer-send.d.ts +10 -0
  14. package/dist/components/composer/aparte-composer-send.d.ts.map +1 -1
  15. package/dist/components/composer/aparte-composer-toolbar.d.ts +53 -0
  16. package/dist/components/composer/aparte-composer-toolbar.d.ts.map +1 -0
  17. package/dist/components/composer/aparte-composer.d.ts +13 -0
  18. package/dist/components/composer/aparte-composer.d.ts.map +1 -1
  19. package/dist/components/composer/index.d.ts +1 -0
  20. package/dist/components/composer/index.d.ts.map +1 -1
  21. package/dist/components/conversation-list/aparte-conversation-list.d.ts +15 -1
  22. package/dist/components/conversation-list/aparte-conversation-list.d.ts.map +1 -1
  23. package/dist/components/elicitation/aparte-elicitation.d.ts +15 -0
  24. package/dist/components/elicitation/aparte-elicitation.d.ts.map +1 -1
  25. package/dist/components/index.d.ts +1 -1
  26. package/dist/components/index.d.ts.map +1 -1
  27. package/dist/components/status/aparte-chat-status.d.ts +6 -0
  28. package/dist/components/status/aparte-chat-status.d.ts.map +1 -1
  29. package/dist/components/viewport/aparte-chat-viewport.d.ts +8 -0
  30. package/dist/components/viewport/aparte-chat-viewport.d.ts.map +1 -1
  31. package/dist/custom-elements.json +4909 -4733
  32. package/dist/index.css +23 -1
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +53 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/primitives/progress-spinner/aparte-progress-spinner.d.ts +5 -0
  38. package/dist/primitives/progress-spinner/aparte-progress-spinner.d.ts.map +1 -1
  39. package/dist/primitives/select/aparte-optgroup.d.ts +11 -0
  40. package/dist/primitives/select/aparte-optgroup.d.ts.map +1 -1
  41. package/dist/primitives/select/aparte-option.d.ts +6 -0
  42. package/dist/primitives/select/aparte-option.d.ts.map +1 -1
  43. package/dist/primitives/select/aparte-select.d.ts +13 -0
  44. package/dist/primitives/select/aparte-select.d.ts.map +1 -1
  45. package/package.json +1 -1
package/dist/index.css CHANGED
@@ -299,6 +299,12 @@
299
299
 
300
300
  /* Viewport */
301
301
  --aparte-viewport-padding: 16px;
302
+ /* Breathing room UNDER the composer, so it does not sit flush against the bottom
303
+ edge of a full-height chat. Same 16px the viewport already puts between the last
304
+ bubble and the composer — this restores the symmetry rather than inventing a
305
+ value. Set it to 0 for a flush composer (a full-bleed mobile shell with a docked
306
+ keyboard is the legitimate case). */
307
+ --aparte-chat-bottom-gap: var(--aparte-space-8, 16px);
302
308
 
303
309
  /* Content */
304
310
  --aparte-content-line-height: var(--aparte-line-height-loose, 1.7);
@@ -435,6 +441,12 @@ aparte-chat,
435
441
  height: 100%;
436
442
  width: 100%;
437
443
  overflow: hidden;
444
+ /* The composer used to touch the bottom edge as soon as a conversation started: the
445
+ viewport gives 16px above the composer and there was nothing below it. An app
446
+ cannot fix this from outside without padding the container, which also shrinks the
447
+ scroll area — so the transcript would stop before the edge instead of scrolling to
448
+ it. That makes the gap ours. */
449
+ padding-block-end: var(--aparte-chat-bottom-gap, var(--aparte-space-8, 16px));
438
450
  }
439
451
 
440
452
  /* The viewport takes the space left by the composer; the standalone height:100%
@@ -2059,7 +2071,12 @@ aparte-composer.is-dragover:not(:has(.aparte-composer-shell)) {
2059
2071
  justify-content: center;
2060
2072
  }
2061
2073
 
2062
- /* Footer row below the input row (model selector etc.) */
2074
+ /* The composer's bottom row (mode picker, model selector, token counter…).
2075
+ `aparte-composer-toolbar` is the element consumers write — one name for vanilla and
2076
+ every wrapper. `.aparte-composer-footer` is the class the same row used to be built
2077
+ with, kept so markup that predates the element keeps its styling instead of silently
2078
+ rendering as a bare div. Removable at 1.0. */
2079
+ aparte-composer-toolbar,
2063
2080
  .aparte-composer-footer {
2064
2081
  display: flex;
2065
2082
  align-items: center;
@@ -2068,6 +2085,11 @@ aparte-composer.is-dragover:not(:has(.aparte-composer-shell)) {
2068
2085
  border-top: var(--aparte-border-width, 1px) solid var(--aparte-border);
2069
2086
  }
2070
2087
 
2088
+ /* A row with nothing in it must not draw its separator. The element reflects
2089
+ `data-empty` itself (see aparte-composer-toolbar.ts) because `:empty` is defeated by
2090
+ the whitespace text node an indented template leaves behind; the legacy class keeps
2091
+ `:empty`, which is all it ever had. */
2092
+ aparte-composer-toolbar[data-empty],
2071
2093
  .aparte-composer-footer:empty {
2072
2094
  display: none;
2073
2095
  }
package/dist/index.d.ts CHANGED
@@ -26,7 +26,7 @@ export { AparteChatBubble, populateBubbleFromMessage } from './components/index.
26
26
  export type { SyncableBubble } from './components/index.js';
27
27
  export { AparteChatStatus } from './components/index.js';
28
28
  export { AparteChatViewport } from './components/index.js';
29
- export { AparteComposer, AparteComposerInput, AparteComposerSend, AparteComposerCancel, AparteComposerAttachments, AparteComposerAddAttachment, AparteComposerAction } from './components/index.js';
29
+ export { AparteComposer, AparteComposerInput, AparteComposerSend, AparteComposerCancel, AparteComposerAttachments, AparteComposerAddAttachment, AparteComposerAction, AparteComposerToolbar } from './components/index.js';
30
30
  export type { AparteComposerEventMap, AparteComposerEventType, AparteComposerState, AparteComposerChangeEventDetail } from './components/index.js';
31
31
  export { AparteConversationList } from './components/index.js';
32
32
  export type { AparteConversationListItem, AparteConversationSelectDetail, AparteConversationDeleteDetail } from './components/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":"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"}
package/dist/index.js CHANGED
@@ -2749,7 +2749,25 @@ class AparteComposer extends HTMLElement {
2749
2749
  _modelGated = false;
2750
2750
  _onConfigChange = () => {
2751
2751
  this._evaluateModelGate();
2752
+ this._applyDirection();
2752
2753
  };
2754
+ /**
2755
+ * Mirror `locale.direction` onto ourselves, so everything inside — input, buttons,
2756
+ * the toolbar row and whatever the consumer put in it — inherits it.
2757
+ *
2758
+ * The direction used to stop at the transcript: only the viewport applied `dir`, so
2759
+ * an RTL locale flipped the conversation and left the composer left-to-right. It is
2760
+ * also what makes the toolbar's placement idiom real: `margin-inline-start: auto` in
2761
+ * a subtree that inherits no direction is just `margin-left`.
2762
+ *
2763
+ * One attribute on the host rather than a stamp per child: inheritance is the
2764
+ * mechanism, so nothing needs to know about the consumer's markup.
2765
+ */
2766
+ _applyDirection() {
2767
+ const direction = (this._cfg ?? resolveConfig(this)).getLocale().direction;
2768
+ if (direction) this.setAttribute("dir", direction);
2769
+ else this.removeAttribute("dir");
2770
+ }
2753
2771
  static get observedAttributes() {
2754
2772
  return ["placeholder", "disabled", "target"];
2755
2773
  }
@@ -2761,6 +2779,7 @@ class AparteComposer extends HTMLElement {
2761
2779
  this._cfg = resolveConfig(this);
2762
2780
  this._configUnsub = this._cfg.subscribe(this._onConfigChange);
2763
2781
  this._evaluateModelGate();
2782
+ this._applyDirection();
2764
2783
  }
2765
2784
  disconnectedCallback() {
2766
2785
  window.removeEventListener("aparte-message-start", this._onMessageStart);
@@ -3646,6 +3665,39 @@ class AparteComposerAction extends HTMLElement {
3646
3665
  if (!customElements.get("aparte-composer-action")) {
3647
3666
  customElements.define("aparte-composer-action", AparteComposerAction);
3648
3667
  }
3668
+ class AparteComposerToolbar extends HTMLElement {
3669
+ _observer = null;
3670
+ connectedCallback() {
3671
+ this._syncEmpty();
3672
+ this._observer ??= new MutationObserver(() => this._syncEmpty());
3673
+ this._observer.observe(this, { childList: true });
3674
+ }
3675
+ disconnectedCallback() {
3676
+ this._observer?.disconnect();
3677
+ this._observer = null;
3678
+ }
3679
+ /**
3680
+ * Reflect `data-empty` from the presence of an ELEMENT child.
3681
+ *
3682
+ * Not `:empty` in CSS: that selector does not match an element holding a whitespace
3683
+ * text node, so a template that indents its content keeps the row — separator,
3684
+ * padding and all — while it looks empty to the user. Every framework template
3685
+ * indents. An empty row must not draw its own separator (the same rule as an empty
3686
+ * bubble action bar).
3687
+ *
3688
+ * Non-whitespace TEXT counts as content, not just an element child: a hand-written
3689
+ * row holding a bare token count (`<aparte-composer-toolbar>1 240 tokens</…>`) is
3690
+ * not empty, and hiding it would be a twenty-minute mystery for whoever wrote it.
3691
+ */
3692
+ _syncEmpty() {
3693
+ const hasContent = Boolean(this.firstElementChild) || this.textContent?.trim() !== "";
3694
+ if (hasContent) this.removeAttribute("data-empty");
3695
+ else this.setAttribute("data-empty", "");
3696
+ }
3697
+ }
3698
+ if (!customElements.get("aparte-composer-toolbar")) {
3699
+ customElements.define("aparte-composer-toolbar", AparteComposerToolbar);
3700
+ }
3649
3701
  class AparteConversationList extends HTMLElement {
3650
3702
  _conversations = [];
3651
3703
  _activeId = null;
@@ -3931,6 +3983,7 @@ export {
3931
3983
  AparteComposerCancel,
3932
3984
  AparteComposerInput,
3933
3985
  AparteComposerSend,
3986
+ AparteComposerToolbar,
3934
3987
  AparteConfig,
3935
3988
  e as AparteConfigClass,
3936
3989
  f as AparteConversationController,