@ai-ecoverse/slicc-spectrum 2.3.0 → 2.3.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.
package/README.md CHANGED
@@ -354,7 +354,7 @@ Renders nothing without the port.
354
354
  The message box uses Spectrum Web Components 2.0.0-beta.6. Its explicit accessible names stay "Message" for the textarea, "Send" ("Steer" while busy) for send, "Add" for upload and "Stop" for stop, using `accessible-label`, `send-accessible-label`, `upload-accessible-label` and `stop-accessible-label`. Attachment navigation stays "Show previous attachments" / "Show more attachments", and the strip stays "Uploaded assets strip", through their `*-accessible-label` attributes.
355
355
  <kbd>Enter</kbd> sends, or steers a running reply: the message joins after the current tool round, without interrupting; <kbd>Ctrl</kbd>/<kbd>⌘</kbd>+<kbd>Enter</kbd> queues a follow-up that runs after the reply and can be withdrawn; <kbd>Shift</kbd>+<kbd>Enter</kbd> adds a line; <kbd>Tab</kbd> takes the suggested follow-up; <kbd>↑</kbd>/<kbd>↓</kbd> at the start or end walk this agent's history; <kbd>Esc</kbd> stops.
356
356
  `/` completes commands (`/clear`, `/compact`, `/model`, `/thinking`, `/scoop`, `/stop`, `/freeze` when the port can freeze, `/theme`) and their arguments, `@` mentions agents and files.
357
- Attach from the computer, from SLICC's files, a browser screenshot or a shared secret (with a `vault.put`, the popup takes the value too, checks it like Settings › Secrets, puts it in the vault and attaches the name, showing errors inline and clearing the field; an empty value shares a name the vault already has, and a new value for one asks before it replaces it; while the vault is away (`availability()` `connecting` or `waiting`) or locked, it takes no value and says so; without one, it attaches the name and says to add the value in Settings › Secrets), or paste and drop files (25 MB each; a dropped folder, told apart by its drag entry, becomes a “Folders can’t be attached” chip, and a file that can't be read a “Could not read the file” chip, instead of an attachment).
357
+ Attach from the computer, from SLICC's files, a browser screenshot or a shared secret (with a `vault.put`, the popup takes the value too, checks it like Settings › Secrets, puts it in the vault and attaches the name, showing errors inline and clearing the field; an empty value shares a name the vault already has, and a new value for one asks before it replaces it; while the vault is away (`availability()` `connecting` or `waiting`) or locked, it takes no value and says so; without one, it attaches the name and says to add the value in Settings › Secrets; the popup closes on Cancel (`data-action="cancel-secret"`, disabled while a share is pending), on a press outside the form (ignored while a share is pending) and on Escape, each clearing the typed value), or paste and drop files (25 MB each; a dropped folder, told apart by its drag entry, becomes a “Folders can’t be attached” chip, and a file that can't be read a “Could not read the file” chip, instead of an attachment).
358
358
  <kbd>Esc</kbd> in the `+` menu closes it, from any item, and puts focus back on `+`; it goes no further, so it doesn't also stop a reply.
359
359
  Queued messages wait above it in a dashed box (`--swc-neutral-visual-color`, 3:1 or more against the composer in both themes), to send now or drop; a steer the agent still holds (`mode: 'steer'`, `li.queued[data-mode=steer]`) reads "Sends at the next step" and can only be dropped.
360
360
  Model and thinking pickers.
package/dist/slicc-ui.js CHANGED
@@ -35601,6 +35601,10 @@ var SliccComposer = class extends ThemedElement {
35601
35601
  const released = event2 instanceof KeyboardEvent && (event2.code === "KeyM" || event2.key === "Alt");
35602
35602
  if (this.dictating && (released || event2.type === "blur")) this.dictate();
35603
35603
  };
35604
+ #outside = (event2) => {
35605
+ const form = this.renderRoot.querySelector("form.secret");
35606
+ if (form && !this.sharing && !event2.composedPath().includes(form)) this.closeSecret();
35607
+ };
35604
35608
  #keys = { capture: true, handleEvent: (event2) => this.#keydown(event2) };
35605
35609
  constructor() {
35606
35610
  super();
@@ -35894,8 +35898,10 @@ var SliccComposer = class extends ThemedElement {
35894
35898
  outline: var(--swc-focus-indicator-thickness) solid var(--swc-focus-indicator-color);
35895
35899
  outline-offset: var(--swc-focus-ring-gap);
35896
35900
  }
35897
- .secret swc-button {
35898
- justify-self: start;
35901
+ .secret .buttons {
35902
+ display: flex;
35903
+ flex-wrap: wrap;
35904
+ gap: var(--swc-spacing-100);
35899
35905
  }
35900
35906
  .secret-error {
35901
35907
  display: flex;
@@ -35933,6 +35939,7 @@ var SliccComposer = class extends ThemedElement {
35933
35939
  clearTimeout(this.#abandon);
35934
35940
  globalThis.addEventListener("keyup", this.#release);
35935
35941
  globalThis.addEventListener("blur", this.#release);
35942
+ globalThis.addEventListener("pointerdown", this.#outside, true);
35936
35943
  if (this.hasUpdated) this.#wire();
35937
35944
  }
35938
35945
  firstUpdated() {
@@ -35942,6 +35949,7 @@ var SliccComposer = class extends ThemedElement {
35942
35949
  super.disconnectedCallback();
35943
35950
  globalThis.removeEventListener("keyup", this.#release);
35944
35951
  globalThis.removeEventListener("blur", this.#release);
35952
+ globalThis.removeEventListener("pointerdown", this.#outside, true);
35945
35953
  clearValues(this.renderRoot);
35946
35954
  const kept3 = this.#waiting.draft?.attachments;
35947
35955
  const held2 = [
@@ -36288,6 +36296,10 @@ ${this.value}` : text4;
36288
36296
  const takes = commands.some((command2) => command2.name === name && command2.args);
36289
36297
  this.popup = found && (found.kind !== "argument" || takes) ? { ...found, items: this.#choices(found.kind, found.query), index: 0 } : null;
36290
36298
  }
36299
+ closeSecret() {
36300
+ clearValues(this.renderRoot);
36301
+ this.popup = null;
36302
+ }
36291
36303
  openPopup(kind) {
36292
36304
  clearValues(this.renderRoot);
36293
36305
  this.secretError = null;
@@ -36531,9 +36543,7 @@ ${this.value}` : text4;
36531
36543
  );
36532
36544
  };
36533
36545
  const close = (event2) => {
36534
- if (event2.key !== "Escape") return;
36535
- clearValues(this.renderRoot);
36536
- this.popup = null;
36546
+ if (event2.key === "Escape") this.closeSecret();
36537
36547
  };
36538
36548
  const bad = (name) => this.secretField === name ? "true" : A;
36539
36549
  const described2 = (name) => this.secretField === name ? "secret-error" : A;
@@ -36543,7 +36553,10 @@ ${this.value}` : text4;
36543
36553
  <label class="field"><span>Name</span><input name="name" placeholder="API_TOKEN" autocomplete="off" spellcheck="false" aria-invalid=${bad("name")} aria-describedby=${described2("name")} /></label>
36544
36554
  ${valued ? b`<label class="field"><span>Value</span><input name="value" type="password" autocomplete="off" spellcheck="false" aria-invalid=${bad("value")} aria-describedby=${described2("value")} /></label>` : A}
36545
36555
  ${this.secretError ? b`<span class="secret-error" role="alert" id="secret-error" data-error><swc-icon-alert-triangle size="s" aria-hidden="true"></swc-icon-alert-triangle><span>${this.secretError}</span></span>` : A}
36546
- <swc-button size="s" variant="accent" data-action="share-secret" ?pending=${this.sharing} @click=${(event2) => event2.currentTarget.closest("form")?.requestSubmit()}>Share</swc-button>
36556
+ <span class="buttons">
36557
+ <swc-button size="s" variant="accent" data-action="share-secret" ?pending=${this.sharing} @click=${(event2) => event2.currentTarget.closest("form")?.requestSubmit()}>Share</swc-button>
36558
+ <swc-button size="s" variant="secondary" fill-style="outline" data-action="cancel-secret" ?disabled=${this.sharing} @click=${() => this.closeSecret()}>Cancel</swc-button>
36559
+ </span>
36547
36560
  </form>`;
36548
36561
  }
36549
36562
  const title2 = {