@ai-ecoverse/slicc-spectrum 1.4.0 → 1.5.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 (39) hide show
  1. package/README.md +29 -3
  2. package/dist/{chunk-SBRFYELH.js → chunk-4JUIYZ4Q.js} +4 -4
  3. package/dist/{chunk-DKUZSKYB.js → chunk-CDYGCBW7.js} +4 -4
  4. package/dist/{chunk-YPQKCWWG.js → chunk-FXM4K5WL.js} +4 -4
  5. package/dist/{chunk-C6RSQDMS.js → chunk-H57UPFSK.js} +2 -2
  6. package/dist/{chunk-FFZJVWZQ.js → chunk-JCRICTXR.js} +5 -5
  7. package/dist/{chunk-6JNYNXUQ.js → chunk-LR5GBIK7.js} +7 -7
  8. package/dist/{chunk-6GSDEWD5.js → chunk-MJOCPOXZ.js} +8 -8
  9. package/dist/{chunk-JUNZW2NI.js → chunk-N27WNL5Q.js} +3 -3
  10. package/dist/chunk-WCSKGA5W.js +30 -0
  11. package/dist/chunk-WCSKGA5W.js.map +7 -0
  12. package/dist/chunk-YWO2TNED.js +71 -0
  13. package/dist/chunk-YWO2TNED.js.map +7 -0
  14. package/dist/slicc-dummy.js +4 -62
  15. package/dist/slicc-dummy.js.map +4 -4
  16. package/dist/slicc-kernel-model.js +379 -0
  17. package/dist/slicc-kernel-model.js.map +7 -0
  18. package/dist/slicc-terminal.js +3 -26
  19. package/dist/slicc-terminal.js.map +3 -3
  20. package/dist/slicc-ui.js +248 -52
  21. package/dist/slicc-ui.js.map +4 -4
  22. package/dist/types/app/app.d.ts +5 -1
  23. package/dist/types/app/files.d.ts +11 -0
  24. package/dist/types/app/panels.d.ts +3 -3
  25. package/dist/types/app/spectrum.d.ts +2 -0
  26. package/dist/types/kernel/files.d.ts +20 -0
  27. package/dist/types/kernel/idle.d.ts +51 -0
  28. package/dist/types/kernel/index.d.ts +17 -0
  29. package/dist/types/kernel/terminals.d.ts +21 -0
  30. package/dist/types/kernel.d.ts +7 -0
  31. package/package.json +5 -1
  32. /package/dist/{chunk-SBRFYELH.js.map → chunk-4JUIYZ4Q.js.map} +0 -0
  33. /package/dist/{chunk-DKUZSKYB.js.map → chunk-CDYGCBW7.js.map} +0 -0
  34. /package/dist/{chunk-YPQKCWWG.js.map → chunk-FXM4K5WL.js.map} +0 -0
  35. /package/dist/{chunk-C6RSQDMS.js.map → chunk-H57UPFSK.js.map} +0 -0
  36. /package/dist/{chunk-FFZJVWZQ.js.map → chunk-JCRICTXR.js.map} +0 -0
  37. /package/dist/{chunk-6JNYNXUQ.js.map → chunk-LR5GBIK7.js.map} +0 -0
  38. /package/dist/{chunk-6GSDEWD5.js.map → chunk-MJOCPOXZ.js.map} +0 -0
  39. /package/dist/{chunk-JUNZW2NI.js.map → chunk-N27WNL5Q.js.map} +0 -0
package/dist/slicc-ui.js CHANGED
@@ -1,3 +1,9 @@
1
+ import {
2
+ SlottableRequestEvent,
3
+ conditionAttributeWithId,
4
+ isWebKit,
5
+ randomID
6
+ } from "./chunk-Y4Z7K443.js";
1
7
  import {
2
8
  IS_MOBILE,
3
9
  IS_TOUCH_DEVICE,
@@ -15,16 +21,7 @@ import {
15
21
  import {
16
22
  SizedMixin,
17
23
  n as n2
18
- } from "./chunk-SBRFYELH.js";
19
- import {
20
- defineElement
21
- } from "./chunk-6A6NIESE.js";
22
- import {
23
- SlottableRequestEvent,
24
- conditionAttributeWithId,
25
- isWebKit,
26
- randomID
27
- } from "./chunk-Y4Z7K443.js";
24
+ } from "./chunk-4JUIYZ4Q.js";
28
25
  import "./chunk-364Y2XOJ.js";
29
26
  import {
30
27
  r
@@ -38,6 +35,9 @@ import {
38
35
  o,
39
36
  o2
40
37
  } from "./chunk-2BBOXTOJ.js";
38
+ import {
39
+ defineElement
40
+ } from "./chunk-6A6NIESE.js";
41
41
  import {
42
42
  A,
43
43
  D,
@@ -2048,7 +2048,7 @@ var MenuItem = class extends LikeAnchor(ObserveSlotText(ObserveSlotPresence(Focu
2048
2048
  <sp-icon-chevron100
2049
2049
  class="spectrum-UIIcon-ChevronRight100 chevron icon"
2050
2050
  ></sp-icon-chevron100>
2051
- ` : (this.dependencyManager.add("sp-overlay"), this.dependencyManager.add("sp-popover"), import("./chunk-FFZJVWZQ.js"), import("./chunk-7PY7B3ZW.js"), b`
2051
+ ` : (this.dependencyManager.add("sp-overlay"), this.dependencyManager.add("sp-popover"), import("./chunk-JCRICTXR.js"), import("./chunk-7PY7B3ZW.js"), b`
2052
2052
  <sp-overlay
2053
2053
  receives-focus="false"
2054
2054
  .triggerElement=${this}
@@ -3113,7 +3113,7 @@ var PickerBase = class extends SizedMixin(ExpandableElement, { noDefaultSize: tr
3113
3113
  `;
3114
3114
  }
3115
3115
  renderLoader() {
3116
- return import("./chunk-JUNZW2NI.js"), b`
3116
+ return import("./chunk-N27WNL5Q.js"), b`
3117
3117
  <sp-progress-circle
3118
3118
  size="s"
3119
3119
  indeterminate
@@ -3174,7 +3174,7 @@ var PickerBase = class extends SizedMixin(ExpandableElement, { noDefaultSize: tr
3174
3174
  renderOverlay(e14) {
3175
3175
  var s9;
3176
3176
  const t14 = this.renderContainer(e14);
3177
- return this.dependencyManager.add("sp-overlay"), import("./chunk-FFZJVWZQ.js"), b`
3177
+ return this.dependencyManager.add("sp-overlay"), import("./chunk-JCRICTXR.js"), b`
3178
3178
  <sp-overlay
3179
3179
  @slottable-request=${this.handleSlottableRequest}
3180
3180
  @beforetoggle=${this.handleBeforetoggle}
@@ -3255,7 +3255,7 @@ var PickerBase = class extends SizedMixin(ExpandableElement, { noDefaultSize: tr
3255
3255
  const t14 = b`
3256
3256
  ${this.dismissHelper} ${e14} ${this.dismissHelper}
3257
3257
  `;
3258
- return this.isMobile.matches && !this.forcePopover ? (this.dependencyManager.add("sp-tray"), import("./chunk-6JNYNXUQ.js"), b`
3258
+ return this.isMobile.matches && !this.forcePopover ? (this.dependencyManager.add("sp-tray"), import("./chunk-LR5GBIK7.js"), b`
3259
3259
  <sp-tray
3260
3260
  id="popover"
3261
3261
  role="presentation"
@@ -3488,7 +3488,7 @@ var Picker = class extends SizedMixin(ExpandableElement, { noDefaultSize: true }
3488
3488
  `;
3489
3489
  }
3490
3490
  renderLoader() {
3491
- return import("./chunk-JUNZW2NI.js"), b`
3491
+ return import("./chunk-N27WNL5Q.js"), b`
3492
3492
  <sp-progress-circle
3493
3493
  size="s"
3494
3494
  indeterminate
@@ -3549,7 +3549,7 @@ var Picker = class extends SizedMixin(ExpandableElement, { noDefaultSize: true }
3549
3549
  renderOverlay(e14) {
3550
3550
  var s9;
3551
3551
  const t14 = this.renderContainer(e14);
3552
- return this.dependencyManager.add("sp-overlay"), import("./chunk-FFZJVWZQ.js"), b`
3552
+ return this.dependencyManager.add("sp-overlay"), import("./chunk-JCRICTXR.js"), b`
3553
3553
  <sp-overlay
3554
3554
  @slottable-request=${this.handleSlottableRequest}
3555
3555
  @beforetoggle=${this.handleBeforetoggle}
@@ -3630,7 +3630,7 @@ var Picker = class extends SizedMixin(ExpandableElement, { noDefaultSize: true }
3630
3630
  const t14 = b`
3631
3631
  ${this.dismissHelper} ${e14} ${this.dismissHelper}
3632
3632
  `;
3633
- return this.isMobile.matches && !this.forcePopover ? (this.dependencyManager.add("sp-tray"), import("./chunk-6JNYNXUQ.js"), b`
3633
+ return this.isMobile.matches && !this.forcePopover ? (this.dependencyManager.add("sp-tray"), import("./chunk-LR5GBIK7.js"), b`
3634
3634
  <sp-tray
3635
3635
  id="popover"
3636
3636
  role="presentation"
@@ -3915,7 +3915,7 @@ var ActionMenu = class extends ObserveSlotPresence(ObserveSlotText(SizedMixin(Ex
3915
3915
  `;
3916
3916
  }
3917
3917
  renderLoader() {
3918
- return import("./chunk-JUNZW2NI.js"), b`
3918
+ return import("./chunk-N27WNL5Q.js"), b`
3919
3919
  <sp-progress-circle
3920
3920
  size="s"
3921
3921
  indeterminate
@@ -3948,7 +3948,7 @@ var ActionMenu = class extends ObserveSlotPresence(ObserveSlotText(SizedMixin(Ex
3948
3948
  renderOverlay(e14) {
3949
3949
  var s9;
3950
3950
  const t14 = this.renderContainer(e14);
3951
- return this.dependencyManager.add("sp-overlay"), import("./chunk-FFZJVWZQ.js"), b`
3951
+ return this.dependencyManager.add("sp-overlay"), import("./chunk-JCRICTXR.js"), b`
3952
3952
  <sp-overlay
3953
3953
  @slottable-request=${this.handleSlottableRequest}
3954
3954
  @beforetoggle=${this.handleBeforetoggle}
@@ -4027,7 +4027,7 @@ var ActionMenu = class extends ObserveSlotPresence(ObserveSlotText(SizedMixin(Ex
4027
4027
  const t14 = b`
4028
4028
  ${this.dismissHelper} ${e14} ${this.dismissHelper}
4029
4029
  `;
4030
- return this.isMobile.matches && !this.forcePopover ? (this.dependencyManager.add("sp-tray"), import("./chunk-6JNYNXUQ.js"), b`
4030
+ return this.isMobile.matches && !this.forcePopover ? (this.dependencyManager.add("sp-tray"), import("./chunk-LR5GBIK7.js"), b`
4031
4031
  <sp-tray
4032
4032
  id="popover"
4033
4033
  role="presentation"
@@ -4305,7 +4305,7 @@ var TruncatedValueTooltipController = class {
4305
4305
  return this.refreshTruncationState();
4306
4306
  }
4307
4307
  async ensureTooltipDeps() {
4308
- this._tooltipDepsLoaded || (await Promise.all([import("./chunk-FFZJVWZQ.js"), import("./chunk-6GSDEWD5.js")]), this._tooltipDepsLoaded = true, Promise.resolve().then(() => {
4308
+ this._tooltipDepsLoaded || (await Promise.all([import("./chunk-JCRICTXR.js"), import("./chunk-MJOCPOXZ.js")]), this._tooltipDepsLoaded = true, Promise.resolve().then(() => {
4309
4309
  this.host.requestUpdate(truncatedValueTooltipUpdatedSymbol, false);
4310
4310
  }));
4311
4311
  }
@@ -4995,6 +4995,49 @@ var IconContrast = class extends IconBase {
4995
4995
  // node_modules/@spectrum-web-components/icons-workflow/icons/sp-icon-contrast.js
4996
4996
  defineElement("sp-icon-contrast", IconContrast);
4997
4997
 
4998
+ // node_modules/@spectrum-web-components/icons-workflow/src/icons-s2/Edit.js
4999
+ var EditIcon = ({ width: t14 = 24, height: l10 = 24, hidden: e14 = false, title: r13 = "Edit" } = {}) => tag2`<svg
5000
+ xmlns="http://www.w3.org/2000/svg"
5001
+ width="${t14}"
5002
+ height="${l10}"
5003
+ viewBox="0 0 20 20"
5004
+ aria-hidden=${e14 ? "true" : "false"}
5005
+ role="img"
5006
+ fill="currentColor"
5007
+ aria-label="${r13}"
5008
+ >
5009
+ <path
5010
+ d="m17.78076,1.75684c-1.27197-1.04102-3.22705-.89844-4.4502.32324L3.07764,12.33398c-.32031.31934-.55859.7168-.68896,1.15039l-1.38428,4.58398c-.08008.26465-.00781.55176.1875.74707.14258.14258.33447.21973.53027.21973.07227,0,.14551-.01074.2168-.03223l4.58252-1.38379c.43359-.12988.83154-.36816,1.15088-.68848,0,0,10.16846-10.16797,10.35547-10.35547.64795-.64746.99316-1.54492.94775-2.45996-.0459-.91504-.48145-1.77539-1.19482-2.3584ZM2.84473,17.16309l.97998-3.24609c.02716-.09033.06714-.17578.11377-.25732l2.40869,2.40918c-.08154.04639-.16718.08643-.25781.11377l-3.24463.98047Zm14.12158-11.64746c-.15472.15552-7.09985,7.1001-9.52545,9.52588l-2.47461-2.4751L14.39111,3.14062c.38623-.38672.896-.58594,1.38965-.58594.38086,0,.75244.11914,1.05029.3623.3916.32129.62109.77246.646,1.27246.0249.49316-.16113.97656-.51074,1.32617Z"
5011
+ fill="currentColor"
5012
+ />
5013
+ </svg>`;
5014
+
5015
+ // node_modules/@spectrum-web-components/icons-workflow/src/icons/Edit.js
5016
+ var EditIcon2 = ({ width: t14 = 24, height: e14 = 24, hidden: a11 = false, title: l10 = "Edit" } = {}) => tag2`<svg
5017
+ xmlns="http://www.w3.org/2000/svg"
5018
+ height="${e14}"
5019
+ viewBox="0 0 36 36"
5020
+ width="${t14}"
5021
+ aria-hidden=${a11 ? "true" : "false"}
5022
+ role="img"
5023
+ fill="currentColor"
5024
+ aria-label="${l10}"
5025
+ >
5026
+ <path
5027
+ d="M33.567 8.2 27.8 2.432a1.215 1.215 0 0 0-.866-.353H26.9a1.371 1.371 0 0 0-.927.406L5.084 23.372a.99.99 0 0 0-.251.422L2.055 33.1c-.114.377.459.851.783.851a.251.251 0 0 0 .062-.007c.276-.063 7.866-2.344 9.311-2.778a.972.972 0 0 0 .414-.249l20.888-20.889a1.372 1.372 0 0 0 .4-.883 1.221 1.221 0 0 0-.346-.945ZM11.4 29.316c-2.161.649-4.862 1.465-6.729 2.022l2.009-6.73Z"
5028
+ />
5029
+ </svg>`;
5030
+
5031
+ // node_modules/@spectrum-web-components/icons-workflow/src/elements/IconEdit.js
5032
+ var IconEdit = class extends IconBase {
5033
+ render() {
5034
+ return setCustomTemplateLiteralTag2(b), this.spectrumVersion === 2 ? EditIcon({ hidden: !this.label, title: this.label }) : EditIcon2({ hidden: !this.label, title: this.label });
5035
+ }
5036
+ };
5037
+
5038
+ // node_modules/@spectrum-web-components/icons-workflow/icons/sp-icon-edit.js
5039
+ defineElement("sp-icon-edit", IconEdit);
5040
+
4998
5041
  // node_modules/@spectrum-web-components/icons-workflow/src/icons-s2/Filter.js
4999
5042
  var FilterIcon = ({ width: l10 = 24, height: t14 = 24, hidden: e14 = false, title: r13 = "Filter" } = {}) => tag2`<svg
5000
5043
  xmlns="http://www.w3.org/2000/svg"
@@ -5245,6 +5288,50 @@ var IconLightbulb = class extends IconBase {
5245
5288
  // node_modules/@spectrum-web-components/icons-workflow/icons/sp-icon-lightbulb.js
5246
5289
  defineElement("sp-icon-lightbulb", IconLightbulb);
5247
5290
 
5291
+ // node_modules/@spectrum-web-components/icons-workflow/src/icons-s2/SaveFloppy.js
5292
+ var SaveFloppyIcon = ({ width: e14 = 24, height: t14 = 24, hidden: l10 = false, title: r13 = "Save Floppy" } = {}) => tag2`<svg
5293
+ xmlns="http://www.w3.org/2000/svg"
5294
+ width="${e14}"
5295
+ height="${t14}"
5296
+ viewBox="0 0 20 20"
5297
+ aria-hidden=${l10 ? "true" : "false"}
5298
+ role="img"
5299
+ fill="currentColor"
5300
+ aria-label="${r13}"
5301
+ >
5302
+ <path
5303
+ d="M17.41406,4.10352l-1.51758-1.51758c-.37793-.37793-.87988-.58594-1.41406-.58594H4.25c-1.24072,0-2.25,1.00977-2.25,2.25v11.5c0,1.24023,1.00928,2.25,2.25,2.25h11.5c1.24072,0,2.25-1.00977,2.25-2.25V5.51758c0-.52637-.21338-1.04199-.58594-1.41406ZM7.75,3.5h4.5v3h-4.5v-3ZM13.25,16.5h-6.5v-4.5h6.5v4.5ZM16.5,15.75c0,.41309-.33643.75-.75.75h-1v-4.5c0-.82715-.67285-1.5-1.5-1.5h-6.5c-.82715,0-1.5.67285-1.5,1.5v4.5h-1c-.41357,0-.75-.33691-.75-.75V4.25c0-.41309.33643-.75.75-.75h2v3c0,.82715.67285,1.5,1.5,1.5h4.5c.82715,0,1.5-.67285,1.5-1.5v-3h.73242c.1333,0,.25879.05176.35352.14648l1.51758,1.51758c.09326.09277.14648.22168.14648.35352v10.23242Z"
5304
+ fill="currentColor"
5305
+ />
5306
+ </svg>`;
5307
+
5308
+ // node_modules/@spectrum-web-components/icons-workflow/src/icons/SaveFloppy.js
5309
+ var SaveFloppyIcon2 = ({ width: e14 = 24, height: t14 = 24, hidden: a11 = false, title: l10 = "Save Floppy" } = {}) => tag2`<svg
5310
+ xmlns="http://www.w3.org/2000/svg"
5311
+ height="${t14}"
5312
+ viewBox="0 0 36 36"
5313
+ width="${e14}"
5314
+ aria-hidden=${a11 ? "true" : "false"}
5315
+ role="img"
5316
+ fill="currentColor"
5317
+ aria-label="${l10}"
5318
+ >
5319
+ <path d="M20 4h4v6h-4z" />
5320
+ <path
5321
+ d="M31.708 8.293s-4.015-4-4.146-4.114A.969.969 0 0 0 27 4h-1v8H14V4H5a1 1 0 0 0-1 1v26a1 1 0 0 0 1 1h26a1 1 0 0 0 1-1V9a1 1 0 0 0-.292-.707ZM26 30H10V16h16Z"
5322
+ />
5323
+ </svg>`;
5324
+
5325
+ // node_modules/@spectrum-web-components/icons-workflow/src/elements/IconSaveFloppy.js
5326
+ var IconSaveFloppy = class extends IconBase {
5327
+ render() {
5328
+ return setCustomTemplateLiteralTag2(b), this.spectrumVersion === 2 ? SaveFloppyIcon({ hidden: !this.label, title: this.label }) : SaveFloppyIcon2({ hidden: !this.label, title: this.label });
5329
+ }
5330
+ };
5331
+
5332
+ // node_modules/@spectrum-web-components/icons-workflow/icons/sp-icon-save-floppy.js
5333
+ defineElement("sp-icon-save-floppy", IconSaveFloppy);
5334
+
5248
5335
  // node_modules/@spectrum-web-components/icons-workflow/src/icons-s2/GlobeGrid.js
5249
5336
  var GlobeGridIcon = ({ width: e14 = 24, height: t14 = 24, hidden: r13 = false, title: l10 = "Globe Grid" } = {}) => tag2`<svg
5250
5337
  xmlns="http://www.w3.org/2000/svg"
@@ -6204,13 +6291,17 @@ var SliccFileView = class extends ThemedElement {
6204
6291
  ...ThemedElement.properties,
6205
6292
  path: {},
6206
6293
  text: { state: true },
6207
- missing: { state: true }
6294
+ missing: { state: true },
6295
+ draft: { state: true },
6296
+ saving: { state: true }
6208
6297
  };
6209
6298
  constructor() {
6210
6299
  super();
6211
6300
  this.path = "";
6212
6301
  this.text = null;
6213
6302
  this.missing = false;
6303
+ this.draft = null;
6304
+ this.saving = false;
6214
6305
  }
6215
6306
  static styles = [
6216
6307
  shared,
@@ -6220,8 +6311,81 @@ var SliccFileView = class extends ThemedElement {
6220
6311
  flex: 1;
6221
6312
  min-height: 0;
6222
6313
  }
6314
+ textarea {
6315
+ flex: 1;
6316
+ min-height: 0;
6317
+ margin: 0;
6318
+ padding: 8px 12px;
6319
+ border: 0;
6320
+ resize: none;
6321
+ outline: none;
6322
+ background: var(--spectrum-background-layer-2-color);
6323
+ color: var(--spectrum-neutral-content-color-default);
6324
+ font-family: var(--spectrum-code-font-family-stack, ui-monospace, monospace);
6325
+ font-size: 13px;
6326
+ line-height: 20px;
6327
+ tab-size: 2;
6328
+ }
6223
6329
  `
6224
6330
  ];
6331
+ edit() {
6332
+ this.draft = this.text ?? "";
6333
+ this.focusOn("textarea");
6334
+ }
6335
+ cancel() {
6336
+ this.draft = null;
6337
+ }
6338
+ async save() {
6339
+ const model = this.model;
6340
+ if (!model || this.draft === null) return;
6341
+ const draft = this.draft;
6342
+ this.saving = true;
6343
+ try {
6344
+ await model.files.write(this.path, draft);
6345
+ this.text = draft;
6346
+ this.missing = false;
6347
+ if (this.draft === draft) this.draft = null;
6348
+ } finally {
6349
+ this.saving = false;
6350
+ }
6351
+ }
6352
+ #keydown(event) {
6353
+ if (event.key === "Escape") {
6354
+ event.preventDefault();
6355
+ this.cancel();
6356
+ } else if (event.key === "s" && (event.metaKey || event.ctrlKey)) {
6357
+ event.preventDefault();
6358
+ void this.save();
6359
+ }
6360
+ }
6361
+ #actions() {
6362
+ if (this.draft === null) {
6363
+ return b`<sp-action-button size="s" quiet ?disabled=${this.text === null} @click=${() => this.edit()}>
6364
+ <sp-icon-edit slot="icon"></sp-icon-edit>Edit
6365
+ </sp-action-button>`;
6366
+ }
6367
+ return b`<sp-action-button size="s" quiet @click=${() => this.cancel()}>Cancel</sp-action-button>
6368
+ <sp-action-button size="s" ?disabled=${this.saving} @click=${() => this.save()}>
6369
+ <sp-icon-save-floppy slot="icon"></sp-icon-save-floppy>Save
6370
+ </sp-action-button>`;
6371
+ }
6372
+ #body(change) {
6373
+ if (this.draft !== null) {
6374
+ return b`<textarea
6375
+ aria-label=${`Edit ${this.path}`}
6376
+ spellcheck="false"
6377
+ .value=${this.draft}
6378
+ @input=${(event) => {
6379
+ this.draft = event.target.value;
6380
+ }}
6381
+ @keydown=${this.#keydown}
6382
+ ></textarea>`;
6383
+ }
6384
+ if (this.missing) {
6385
+ return b`<div class="note">This file doesn’t exist${change ? " any more" : ""}.</div>`;
6386
+ }
6387
+ return b`<slicc-code-view path=${this.path} color=${this.color} .contents=${this.text}></slicc-code-view>`;
6388
+ }
6225
6389
  subscribe(model) {
6226
6390
  void this.#read(model);
6227
6391
  return [
@@ -6251,8 +6415,9 @@ var SliccFileView = class extends ThemedElement {
6251
6415
  <sp-action-button size="s" quiet @click=${() => request(this, "open-diff", this.path)}>
6252
6416
  <sp-icon-compare slot="icon"></sp-icon-compare>Diff
6253
6417
  </sp-action-button>` : A}
6418
+ ${this.#actions()}
6254
6419
  </div>
6255
- ${this.missing ? b`<div class="note">This file doesn’t exist${change ? " any more" : ""}.</div>` : b`<slicc-code-view path=${this.path} color=${this.color} .contents=${this.text}></slicc-code-view>`}`;
6420
+ ${this.#body(change)}`;
6256
6421
  }
6257
6422
  };
6258
6423
 
@@ -6354,8 +6519,8 @@ function screenClass(width) {
6354
6519
  if (width < 1200) return "tablet";
6355
6520
  return "desktop";
6356
6521
  }
6357
- function surface(id) {
6358
- return surfaces.find((candidate) => candidate.id === id);
6522
+ function surface(id, items = surfaces) {
6523
+ return items.find((candidate) => candidate.id === id);
6359
6524
  }
6360
6525
  function create(tag3, model, params = {}) {
6361
6526
  const element2 = document.createElement(tag3);
@@ -6422,18 +6587,18 @@ function openDocument(dock, kind, path, screen) {
6422
6587
  dock.focusPanel(id);
6423
6588
  return id;
6424
6589
  }
6425
- function defaultLayout(dock, screen) {
6590
+ function defaultLayout(dock, screen, items = surfaces) {
6426
6591
  dock.clear();
6427
6592
  const order = ["center", "left", "right"];
6428
6593
  for (const side of order) {
6429
- for (const item2 of surfaces) {
6594
+ for (const item2 of items) {
6430
6595
  if (item2.side === side && item2.open.includes(screen)) openSurface(dock, item2, screen);
6431
6596
  }
6432
6597
  }
6433
6598
  dock.api.getPanel("chat")?.api.setActive();
6434
6599
  }
6435
- function closed(dock) {
6436
- return surfaces.filter((item2) => !dock.has(item2.id));
6600
+ function closed(dock, items = surfaces) {
6601
+ return items.filter((item2) => !dock.has(item2.id));
6437
6602
  }
6438
6603
  function sprinkleSurface(sprinkle) {
6439
6604
  return {
@@ -6468,7 +6633,11 @@ function railIcon(icon) {
6468
6633
  return b`<slicc-lucide slot="icon" name=${icon}></slicc-lucide>`;
6469
6634
  }
6470
6635
  var SliccApp = class extends ThemedElement {
6471
- static properties = { ...ThemedElement.properties, screen: { reflect: true } };
6636
+ static properties = {
6637
+ ...ThemedElement.properties,
6638
+ screen: { reflect: true },
6639
+ surfaces: { attribute: false }
6640
+ };
6472
6641
  storage = globalThis.localStorage ?? null;
6473
6642
  layoutKey = "slicc-ui.layout";
6474
6643
  #fontBase = defaultFontBase;
@@ -6478,6 +6647,7 @@ var SliccApp = class extends ThemedElement {
6478
6647
  constructor() {
6479
6648
  super();
6480
6649
  this.screen = screenClass(globalThis.innerWidth ?? 1280);
6650
+ this.surfaces = surfaces;
6481
6651
  }
6482
6652
  static styles = [
6483
6653
  shared,
@@ -6665,7 +6835,7 @@ var SliccApp = class extends ThemedElement {
6665
6835
  const dock = this.dock;
6666
6836
  this.#saving = false;
6667
6837
  dock.factories = {
6668
- ...Object.fromEntries(surfaces.map((item2) => [item2.id, () => create(item2.tag, model)])),
6838
+ ...Object.fromEntries(this.surfaces.map((item2) => [item2.id, () => create(item2.tag, model)])),
6669
6839
  ...Object.fromEntries(
6670
6840
  Object.entries(documents).map(([kind, document2]) => [
6671
6841
  kind,
@@ -6674,12 +6844,18 @@ var SliccApp = class extends ThemedElement {
6674
6844
  ),
6675
6845
  sprinkle: (params) => create("slicc-sprinkle", model, params)
6676
6846
  };
6677
- const restored = dock.restore(this.#saved());
6678
- if (!restored) defaultLayout(dock, this.screen);
6847
+ const saved = this.#saved();
6848
+ const restored = this.#offered(saved, dock.factories) && dock.restore(saved);
6849
+ if (!restored) defaultLayout(dock, this.screen, this.surfaces);
6679
6850
  this.#started = this.screen;
6680
6851
  this.#saving = true;
6681
6852
  this.#save();
6682
6853
  }
6854
+ #offered(layout, factories) {
6855
+ return Object.values(layout?.panels ?? {}).every(
6856
+ (panel) => (panel.contentComponent ?? "") in factories
6857
+ );
6858
+ }
6683
6859
  get storageKey() {
6684
6860
  return `${this.layoutKey}.${this.screen}`;
6685
6861
  }
@@ -6695,7 +6871,7 @@ var SliccApp = class extends ThemedElement {
6695
6871
  this.requestUpdate();
6696
6872
  }
6697
6873
  resetLayout() {
6698
- defaultLayout(this.dock, this.screen);
6874
+ defaultLayout(this.dock, this.screen, this.surfaces);
6699
6875
  this.#save();
6700
6876
  }
6701
6877
  show(id) {
@@ -6704,7 +6880,7 @@ var SliccApp = class extends ThemedElement {
6704
6880
  openSprinkle(this.dock, sprinkle, this.screen);
6705
6881
  return;
6706
6882
  }
6707
- const item2 = surface(id);
6883
+ const item2 = surface(id, this.surfaces);
6708
6884
  if (!item2) return;
6709
6885
  openSurface(this.dock, item2, this.screen);
6710
6886
  this.dock.focusPanel(id);
@@ -6717,7 +6893,7 @@ var SliccApp = class extends ThemedElement {
6717
6893
  #rails() {
6718
6894
  const dock = this.renderRoot.querySelector("slicc-dock");
6719
6895
  const sprinkles = (this.model?.sprinkles.list() ?? []).filter((sprinkle) => !sprinkle.inline).map(sprinkleSurface).filter((item2) => !dock?.has(item2.id));
6720
- const shut = dock && this.#started ? [...sprinkles, ...closed(dock)] : [];
6896
+ const shut = dock && this.#started ? [...sprinkles, ...closed(dock, this.surfaces)] : [];
6721
6897
  const phone = this.screen === "phone";
6722
6898
  return {
6723
6899
  left: this.#rail(phone ? [] : shut.filter((item2) => item2.side !== "right"), "left"),
@@ -6738,7 +6914,7 @@ var SliccApp = class extends ThemedElement {
6738
6914
  #keydown = (event) => {
6739
6915
  if (!event.altKey || event.ctrlKey || event.metaKey) return;
6740
6916
  const digit = event.code.match(/^Digit([1-9])$/)?.[1] ?? event.key.match(/^[1-9]$/)?.[0];
6741
- const surface2 = digit ? surfaces[Number(digit) - 1] : void 0;
6917
+ const surface2 = digit ? this.surfaces[Number(digit) - 1] : void 0;
6742
6918
  if (surface2) {
6743
6919
  event.preventDefault();
6744
6920
  this.show(surface2.id);
@@ -6760,21 +6936,33 @@ var SliccApp = class extends ThemedElement {
6760
6936
  ${surface2.title}<kbd slot="value">Alt+${index + 1}</kbd>
6761
6937
  </sp-menu-item>`;
6762
6938
  }
6763
- #status() {
6939
+ #offers(id) {
6940
+ return this.surfaces.some((item2) => item2.id === id);
6941
+ }
6942
+ #agentStatus() {
6943
+ if (!this.#offers("chat")) return A;
6764
6944
  const model = this.model;
6765
6945
  const agent = model?.agent.list().find((candidate) => candidate.id === model.agent.active());
6766
6946
  const label = model?.settings.models().find((option2) => option2.id === agent?.model)?.label;
6767
- const changes = model?.files.changes().length ?? 0;
6768
- return b`<footer role="status" aria-label="Status">
6769
- ${agent ? b`<span class="item">${dot(agent.status)}${agent.name} · ${agent.status}</span>
6947
+ return agent ? b`<span class="item">${dot(agent.status)}${agent.name} · ${agent.status}</span>
6770
6948
  <span>${label ?? agent.model}</span>
6771
6949
  <span class="item" title="Context fill"
6772
6950
  >Context <span class="bar"><span style=${`width: ${percent(agent.contextFill)}`}></span></span>
6773
6951
  ${percent(agent.contextFill)}</span
6774
- >` : b`<span>No agent</span>`}
6775
- <button class="link" @click=${() => this.show("changes")}>${changes} ${changes === 1 ? "change" : "changes"}</button>
6952
+ >` : b`<span>No agent</span>`;
6953
+ }
6954
+ #changes() {
6955
+ if (!this.#offers("changes")) return A;
6956
+ const changes = this.model?.files.changes().length ?? 0;
6957
+ return b`<button class="link" @click=${() => this.show("changes")}>${changes} ${changes === 1 ? "change" : "changes"}</button>`;
6958
+ }
6959
+ #status() {
6960
+ return b`<footer role="status" aria-label="Status">
6961
+ ${this.#agentStatus()}
6962
+ ${this.#changes()}
6963
+ <slot name="status"></slot>
6776
6964
  <span class="spacer"></span>
6777
- <span class="hints"><kbd>F6</kbd> next group · <kbd>Alt+1–${Math.min(9, surfaces.length)}</kbd> panels · <kbd>Alt+Shift+T</kbd> theme</span>
6965
+ <span class="hints"><kbd>F6</kbd> next group · <kbd>Alt+1–${Math.min(9, this.surfaces.length)}</kbd> panels · <kbd>Alt+Shift+T</kbd> theme</span>
6778
6966
  </footer>`;
6779
6967
  }
6780
6968
  render() {
@@ -6785,23 +6973,23 @@ var SliccApp = class extends ThemedElement {
6785
6973
  <div class="shell">
6786
6974
  <header>
6787
6975
  <span class="brand">slicc</span>
6788
- <sp-picker size="s" label="Agent" value=${this.model?.agent.active() ?? ""} @change=${this.#pick}>
6976
+ ${this.#offers("chat") ? b`<sp-picker size="s" label="Agent" value=${this.model?.agent.active() ?? ""} @change=${this.#pick}>
6789
6977
  ${agents.map(
6790
6978
  (agent) => b`<sp-menu-item value=${agent.id}>${agent.kind === "scoop" ? `\u21B3 ${agent.name}` : agent.name}</sp-menu-item>`
6791
6979
  )}
6792
- </sp-picker>
6980
+ </sp-picker>` : A}
6793
6981
  <span class="spacer"></span>
6794
- <slicc-tray .model=${this.model}></slicc-tray>
6982
+ ${this.#offers("chat") ? b`<slicc-tray .model=${this.model}></slicc-tray>` : A}
6795
6983
  <sp-action-menu size="s" quiet label="View" @change=${this.#view}>
6796
6984
  <sp-icon-view-grid slot="icon"></sp-icon-view-grid>
6797
6985
  <span slot="label">View</span>
6798
- ${surfaces.map((surface2, index) => this.#menuItem(surface2, index))}
6986
+ ${this.surfaces.map((surface2, index) => this.#menuItem(surface2, index))}
6799
6987
  <sp-menu-divider></sp-menu-divider>
6800
6988
  <sp-menu-item value="reset">Reset layout</sp-menu-item>
6801
6989
  </sp-action-menu>
6802
- <sp-action-button size="s" quiet label="Settings" title="Settings" @click=${() => this.show("settings")}>
6990
+ ${this.#offers("settings") ? b`<sp-action-button size="s" quiet label="Settings" title="Settings" @click=${() => this.show("settings")}>
6803
6991
  <sp-icon-settings slot="icon"></sp-icon-settings>
6804
- </sp-action-button>
6992
+ </sp-action-button>` : A}
6805
6993
  <sp-action-button
6806
6994
  size="s"
6807
6995
  quiet
@@ -10997,7 +11185,7 @@ var bundledLanguagesInfo = [
10997
11185
  {
10998
11186
  "id": "html",
10999
11187
  "name": "HTML",
11000
- "import": (() => import("./chunk-YPQKCWWG.js"))
11188
+ "import": (() => import("./chunk-FXM4K5WL.js"))
11001
11189
  },
11002
11190
  {
11003
11191
  "id": "html-derivative",
@@ -61493,8 +61681,16 @@ var SliccFileTree = class extends HTMLElement {
61493
61681
  return this.#paths;
61494
61682
  }
61495
61683
  set paths(value) {
61684
+ const expanded = this.#paths.length > 0 ? this.#expandedNow() : this.#expanded;
61496
61685
  this.#paths = value;
61497
- this.#tree?.resetPaths(value, { initialExpandedPaths: this.#expanded });
61686
+ this.#tree?.resetPaths(value, { initialExpandedPaths: expanded });
61687
+ }
61688
+ #expandedNow() {
61689
+ const tree = this.#tree;
61690
+ return this.#paths.filter((path) => {
61691
+ const item2 = path.endsWith("/") ? tree?.getItem(path) : null;
61692
+ return !!item2 && "isExpanded" in item2 && item2.isExpanded();
61693
+ }).map((path) => path.slice(0, -1));
61498
61694
  }
61499
61695
  get gitStatus() {
61500
61696
  return this.#status;