@ai-ecoverse/slicc-spectrum 1.99.3 → 1.100.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.
package/dist/slicc-ui.js CHANGED
@@ -25699,7 +25699,7 @@ var titleBefore = {
25699
25699
  };
25700
25700
  function tokenizeDefinition(effects, ok4, nok) {
25701
25701
  const self2 = this;
25702
- let identifier;
25702
+ let identifier2;
25703
25703
  return start2;
25704
25704
  function start2(code3) {
25705
25705
  effects.enter("definition");
@@ -25718,7 +25718,7 @@ function tokenizeDefinition(effects, ok4, nok) {
25718
25718
  )(code3);
25719
25719
  }
25720
25720
  function labelAfter(code3) {
25721
- identifier = normalizeIdentifier(self2.sliceSerialize(self2.events[self2.events.length - 1][1]).slice(1, -1));
25721
+ identifier2 = normalizeIdentifier(self2.sliceSerialize(self2.events[self2.events.length - 1][1]).slice(1, -1));
25722
25722
  if (code3 === 58) {
25723
25723
  effects.enter("definitionMarker");
25724
25724
  effects.consume(code3);
@@ -25752,7 +25752,7 @@ function tokenizeDefinition(effects, ok4, nok) {
25752
25752
  function afterWhitespace(code3) {
25753
25753
  if (code3 === null || markdownLineEnding(code3)) {
25754
25754
  effects.exit("definition");
25755
- self2.parser.defined.push(identifier);
25755
+ self2.parser.defined.push(identifier2);
25756
25756
  return ok4(code3);
25757
25757
  }
25758
25758
  return nok(code3);
@@ -29073,16 +29073,16 @@ function findUrl(_9, protocol, domain2, path2, match) {
29073
29073
  if (!isCorrectDomain(domain2)) {
29074
29074
  return false;
29075
29075
  }
29076
- const parts2 = splitUrl(domain2 + path2);
29077
- if (!parts2[0]) return false;
29076
+ const parts3 = splitUrl(domain2 + path2);
29077
+ if (!parts3[0]) return false;
29078
29078
  const result = {
29079
29079
  type: "link",
29080
29080
  title: null,
29081
- url: prefix + protocol + parts2[0],
29082
- children: [{ type: "text", value: protocol + parts2[0] }]
29081
+ url: prefix + protocol + parts3[0],
29082
+ children: [{ type: "text", value: protocol + parts3[0] }]
29083
29083
  };
29084
- if (parts2[1]) {
29085
- return [result, { type: "text", value: parts2[1] }];
29084
+ if (parts3[1]) {
29085
+ return [result, { type: "text", value: parts3[1] }];
29086
29086
  }
29087
29087
  return result;
29088
29088
  }
@@ -29102,8 +29102,8 @@ function findEmail(_9, atext, label, match) {
29102
29102
  };
29103
29103
  }
29104
29104
  function isCorrectDomain(domain2) {
29105
- const parts2 = domain2.split(".");
29106
- if (parts2.length < 2 || parts2[parts2.length - 1] && (/_/.test(parts2[parts2.length - 1]) || !/[a-zA-Z\d]/.test(parts2[parts2.length - 1])) || parts2[parts2.length - 2] && (/_/.test(parts2[parts2.length - 2]) || !/[a-zA-Z\d]/.test(parts2[parts2.length - 2]))) {
29105
+ const parts3 = domain2.split(".");
29106
+ if (parts3.length < 2 || parts3[parts3.length - 1] && (/_/.test(parts3[parts3.length - 1]) || !/[a-zA-Z\d]/.test(parts3[parts3.length - 1])) || parts3[parts3.length - 2] && (/_/.test(parts3[parts3.length - 2]) || !/[a-zA-Z\d]/.test(parts3[parts3.length - 2]))) {
29107
29107
  return false;
29108
29108
  }
29109
29109
  return true;
@@ -30329,7 +30329,7 @@ var options = {
30329
30329
  var empty2 = { text: "", blocks: [], starts: [], keep: 0, definitions: /* @__PURE__ */ new Map() };
30330
30330
  var cache = /* @__PURE__ */ new Map();
30331
30331
  var streams = [];
30332
- var rendered = /* @__PURE__ */ new WeakMap();
30332
+ var rendered = /* @__PURE__ */ new Map();
30333
30333
  function collect(nodes, found) {
30334
30334
  for (const node2 of nodes) {
30335
30335
  if (node2.type === "definition" && !found.has(node2.identifier)) found.set(node2.identifier, node2);
@@ -30369,103 +30369,115 @@ function parse2(text5) {
30369
30369
  streams.length = Math.min(streams.length, 8);
30370
30370
  return parsed;
30371
30371
  }
30372
- function safeUrl(url, images = false) {
30372
+ function inert(value, strict) {
30373
+ return strict ? value.replace(/<[^>]*>/g, "") : value;
30374
+ }
30375
+ function safeUrl(url, images = false, strict = false) {
30376
+ if (strict) return /^https:\/\//i.test(url);
30373
30377
  return /^https?:\/\//.test(url) || !images && /^mailto:/.test(url) || images && /^data:image\/(png|jpeg|gif|webp|svg\+xml)[;,]/.test(url);
30374
30378
  }
30375
- function link(url, title, label) {
30376
- return safeUrl(url) ? b`<a href=${url} title=${title ?? A} target="_blank" rel="noopener noreferrer">${label}</a>` : b`${label}`;
30379
+ function link(url, title, label, strict) {
30380
+ return safeUrl(url, false, strict) ? b`<a href=${url} title=${title ?? A} target="_blank" rel="noopener noreferrer">${label}</a>` : b`${label}`;
30377
30381
  }
30378
- function image(url, title, alt) {
30382
+ function image(url, title, alt, strict) {
30383
+ if (strict) return link(url, title, alt || url, true);
30379
30384
  return safeUrl(url, true) ? b`<img src=${url} alt=${alt} title=${title ?? A} />` : alt;
30380
30385
  }
30381
- function inline3(node2, definitions) {
30382
- return node2.children.map((child) => phrasing(child, definitions));
30386
+ function inline3(node2, context) {
30387
+ return node2.children.map((child) => phrasing(child, context));
30383
30388
  }
30384
- function phrasing(node2, definitions) {
30389
+ function phrasing(node2, context) {
30385
30390
  switch (node2.type) {
30386
30391
  case "text":
30387
- case "html":
30388
30392
  return node2.value;
30393
+ case "html":
30394
+ return inert(node2.value, context.strict);
30389
30395
  case "inlineCode":
30390
30396
  return b`<code>${node2.value}</code>`;
30391
30397
  case "strong":
30392
- return b`<strong>${inline3(node2, definitions)}</strong>`;
30398
+ return b`<strong>${inline3(node2, context)}</strong>`;
30393
30399
  case "emphasis":
30394
- return b`<em>${inline3(node2, definitions)}</em>`;
30400
+ return b`<em>${inline3(node2, context)}</em>`;
30395
30401
  case "delete":
30396
- return b`<s>${inline3(node2, definitions)}</s>`;
30402
+ return b`<s>${inline3(node2, context)}</s>`;
30397
30403
  case "break":
30398
30404
  return b`<br />`;
30399
30405
  case "link":
30400
- return link(node2.url, node2.title, inline3(node2, definitions));
30406
+ return link(node2.url, node2.title, inline3(node2, context), context.strict);
30401
30407
  case "linkReference": {
30402
- const target2 = definitions.get(node2.identifier);
30403
- return link(target2.url, target2.title, inline3(node2, definitions));
30408
+ const target2 = context.definitions.get(node2.identifier);
30409
+ return link(target2.url, target2.title, inline3(node2, context), context.strict);
30404
30410
  }
30405
30411
  case "image":
30406
- return image(node2.url, node2.title, node2.alt);
30412
+ return image(node2.url, node2.title, node2.alt, context.strict);
30407
30413
  default: {
30408
- const target2 = definitions.get(node2.identifier);
30409
- return image(target2.url, target2.title, node2.alt);
30414
+ const target2 = context.definitions.get(node2.identifier);
30415
+ return image(target2.url, target2.title, node2.alt, context.strict);
30410
30416
  }
30411
30417
  }
30412
30418
  }
30413
- function paragraph(node2, definitions, tight, lead) {
30414
- const content3 = inline3(node2, definitions);
30419
+ function paragraph(node2, context, tight, lead) {
30420
+ const content3 = inline3(node2, context);
30415
30421
  return tight ? b`${lead}${content3}` : b`<p>${lead}${content3}</p>`;
30416
30422
  }
30417
- function item(node2, definitions, tight) {
30423
+ function item(node2, context, tight) {
30418
30424
  const box = typeof node2.checked === "boolean" ? b`<span class="task" data-done=${node2.checked ? "true" : "false"} aria-label=${node2.checked ? "done" : "open"}>${node2.checked ? "\u2611" : "\u2610"}</span> ` : A;
30419
30425
  return b`<li>${node2.children.map(
30420
- (child, index2) => child.type === "paragraph" ? paragraph(child, definitions, tight, index2 ? A : box) : flow3(child, definitions)
30426
+ (child, index2) => child.type === "paragraph" ? paragraph(child, context, tight, index2 ? A : box) : flow3(child, context)
30421
30427
  )}</li>`;
30422
30428
  }
30423
- function list3(node2, definitions) {
30429
+ function list3(node2, context) {
30424
30430
  const tight = !node2.spread && !node2.children.some((entry) => entry.spread);
30425
- const items = node2.children.map((entry) => item(entry, definitions, tight));
30431
+ const items = node2.children.map((entry) => item(entry, context, tight));
30426
30432
  return node2.ordered ? b`<ol start=${node2.start === 1 ? A : node2.start}>${items}</ol>` : b`<ul>${items}</ul>`;
30427
30433
  }
30428
- function table(node2, definitions) {
30434
+ function table(node2, context) {
30429
30435
  const [head2, ...body4] = node2.children;
30430
30436
  const align = (index2) => node2.align[index2] ?? A;
30431
30437
  return b`<div class="table"><table>
30432
- <thead><tr>${head2.children.map((cell, index2) => b`<th data-align=${align(index2)}>${inline3(cell, definitions)}</th>`)}</tr></thead>
30433
- <tbody>${body4.map((row) => b`<tr>${row.children.map((cell, index2) => b`<td data-align=${align(index2)}>${inline3(cell, definitions)}</td>`)}</tr>`)}</tbody>
30438
+ <thead><tr>${head2.children.map((cell, index2) => b`<th data-align=${align(index2)}>${inline3(cell, context)}</th>`)}</tr></thead>
30439
+ <tbody>${body4.map((row) => b`<tr>${row.children.map((cell, index2) => b`<td data-align=${align(index2)}>${inline3(cell, context)}</td>`)}</tr>`)}</tbody>
30434
30440
  </table></div>`;
30435
30441
  }
30436
- function flow3(node2, definitions) {
30442
+ function flow3(node2, context) {
30437
30443
  switch (node2.type) {
30438
30444
  case "paragraph":
30439
- return paragraph(node2, definitions, false, A);
30445
+ return paragraph(node2, context, false, A);
30440
30446
  case "heading":
30441
- return b`<p class="heading" role="heading" aria-level=${Math.min(node2.depth + 2, 6)}>${inline3(node2, definitions)}</p>`;
30447
+ return b`<p class="heading" role="heading" aria-level=${Math.min(context.level === null ? node2.depth + 2 : context.level + 1, 6)}>${inline3(node2, context)}</p>`;
30442
30448
  case "code":
30443
30449
  return b`<pre class="code" data-lang=${node2.lang || A}><code>${node2.value}</code></pre>`;
30444
30450
  case "list":
30445
- return list3(node2, definitions);
30451
+ return list3(node2, context);
30446
30452
  case "table":
30447
- return table(node2, definitions);
30453
+ return table(node2, context);
30448
30454
  case "blockquote":
30449
- return b`<blockquote>${node2.children.map((child) => flow3(child, definitions))}</blockquote>`;
30455
+ return b`<blockquote>${node2.children.map((child) => flow3(child, context))}</blockquote>`;
30450
30456
  case "thematicBreak":
30451
30457
  return b`<hr />`;
30452
- case "html":
30453
- return b`<p>${node2.value}</p>`;
30458
+ case "html": {
30459
+ const text5 = inert(node2.value, context.strict).trim();
30460
+ return text5 ? b`<p>${text5}</p>` : A;
30461
+ }
30454
30462
  default:
30455
30463
  return A;
30456
30464
  }
30457
30465
  }
30458
- function block(node2, definitions) {
30459
- let output = rendered.get(node2);
30466
+ function block(node2, context) {
30467
+ const key2 = `${context.strict}:${context.level}`;
30468
+ const cache5 = rendered.get(key2) ?? /* @__PURE__ */ new WeakMap();
30469
+ rendered.set(key2, cache5);
30470
+ let output = cache5.get(node2);
30460
30471
  if (output === void 0) {
30461
- output = flow3(node2, definitions);
30462
- rendered.set(node2, output);
30472
+ output = flow3(node2, context);
30473
+ cache5.set(node2, output);
30463
30474
  }
30464
30475
  return output;
30465
30476
  }
30466
- function markdown(text5) {
30477
+ function markdown(text5, options2 = {}) {
30467
30478
  const { blocks, definitions } = parse2(text5);
30468
- return b`${blocks.map((node2) => block(node2, definitions))}`;
30479
+ const context = { definitions, strict: options2.strict === true, level: options2.level ?? null };
30480
+ return b`${blocks.map((node2) => block(node2, context))}`;
30469
30481
  }
30470
30482
  var markdownCss = i`
30471
30483
  .markdown :is(p, ul, ol, .table, pre, blockquote) {
@@ -35217,8 +35229,8 @@ function treeStatus(changes2) {
35217
35229
  function ancestors(paths) {
35218
35230
  const out = /* @__PURE__ */ new Set();
35219
35231
  for (const path2 of paths) {
35220
- const parts2 = relative(path2).split("/").slice(0, -1);
35221
- for (let i26 = 1; i26 <= parts2.length; i26++) out.add(parts2.slice(0, i26).join("/"));
35232
+ const parts3 = relative(path2).split("/").slice(0, -1);
35233
+ for (let i26 = 1; i26 <= parts3.length; i26++) out.add(parts3.slice(0, i26).join("/"));
35222
35234
  }
35223
35235
  return [...out];
35224
35236
  }
@@ -36772,7 +36784,7 @@ function block2(text5, copied, copy, first2 = false) {
36772
36784
  }
36773
36785
  function breakable(text5) {
36774
36786
  return text5.split("/").map(
36775
- (part2, index2, parts2) => b`${part2}${index2 < parts2.length - 1 ? b`/<wbr />` : A}`
36787
+ (part2, index2, parts3) => b`${part2}${index2 < parts3.length - 1 ? b`/<wbr />` : A}`
36776
36788
  );
36777
36789
  }
36778
36790
  function reach({ intro, extensionUrl, copied, uncopied, copy }) {
@@ -39113,11 +39125,11 @@ function budgetVariant(percent2) {
39113
39125
  return variant === "informative" ? "neutral" : variant;
39114
39126
  }
39115
39127
  function spendLine(status2) {
39116
- const parts2 = [
39128
+ const parts3 = [
39117
39129
  status2.spent ? `Spent $${status2.spent.toFixed(2)}` : "",
39118
39130
  status2.rate ? `$${status2.rate.toFixed(2)}/h` : ""
39119
39131
  ];
39120
- const line = parts2.filter(Boolean).join(" \xB7 ");
39132
+ const line = parts3.filter(Boolean).join(" \xB7 ");
39121
39133
  return line ? `${line}. ` : "";
39122
39134
  }
39123
39135
  function budgetLine(status2, budget) {
@@ -44662,8 +44674,8 @@ function placed(item2) {
44662
44674
  const installs = item2.installs ?? [];
44663
44675
  if (!installs.length) return item2;
44664
44676
  const version2 = item2.version ?? installs[0].version;
44665
- const newer = item2.offered !== null && item2.offered !== version2;
44666
- const state2 = item2.state === "available" ? newer ? "outdated" : "installed" : item2.state;
44677
+ const newer2 = item2.offered !== null && item2.offered !== version2;
44678
+ const state2 = item2.state === "available" ? newer2 ? "outdated" : "installed" : item2.state;
44667
44679
  const owned = installs.some((install) => install.manager === "panel");
44668
44680
  const hidden = new Set(owned ? ["install"] : ["install", "remove"]);
44669
44681
  return { ...item2, version: version2, state: state2, actions: item2.actions.filter((action) => !hidden.has(action)) };
@@ -44693,11 +44705,11 @@ function requiresText(item2, all3) {
44693
44705
  });
44694
44706
  const present = needs.filter((need) => !need.missing).map((need) => need.label);
44695
44707
  const missing = needs.filter((need) => need.missing).map((need) => need.label);
44696
- const parts2 = [
44708
+ const parts3 = [
44697
44709
  present.length ? `Uses ${list5(present)}` : "",
44698
44710
  item2.version === null && missing.length ? `Installs ${list5(missing)} too` : ""
44699
44711
  ].filter(Boolean);
44700
- return parts2.length ? parts2.join("; ") : null;
44712
+ return parts3.length ? parts3.join("; ") : null;
44701
44713
  }
44702
44714
  var fetched = (progress) => progress.phase === "download" && (progress.bytes?.total ?? 0) > 0 ? progress.bytes : null;
44703
44715
  var phased = (progress) => {
@@ -44712,6 +44724,62 @@ var counted = (progress, unit = "") => {
44712
44724
  };
44713
44725
  var itemBusy = (item2) => running.has(item2.state) || item2.state === "starting" || item2.progress !== null;
44714
44726
  var packageBusy = (item2) => packageRunning.has(item2.state) || item2.progress !== null;
44727
+ var parts2 = (version2) => {
44728
+ const main2 = version2.replace(/^v/, "").split("+")[0];
44729
+ const dash2 = main2.indexOf("-");
44730
+ return dash2 < 0 ? [main2, null] : [main2.slice(0, dash2), main2.slice(dash2 + 1)];
44731
+ };
44732
+ var identifier = (a23, b13) => {
44733
+ const numeric = [/^\d+$/.test(a23), /^\d+$/.test(b13)];
44734
+ if (numeric[0] && numeric[1]) return Math.sign(Number(a23) - Number(b13));
44735
+ if (numeric[0] !== numeric[1]) return numeric[0] ? -1 : 1;
44736
+ return a23 < b13 ? -1 : a23 > b13 ? 1 : 0;
44737
+ };
44738
+ var dotted = (a23, b13) => {
44739
+ const left = a23.split(".");
44740
+ const right = b13.split(".");
44741
+ for (let index2 = 0; index2 < Math.min(left.length, right.length); index2++) {
44742
+ const order = identifier(left[index2], right[index2]);
44743
+ if (order) return order;
44744
+ }
44745
+ return Math.sign(left.length - right.length);
44746
+ };
44747
+ var newer = (a23, b13) => {
44748
+ const [coreA, preA] = parts2(a23);
44749
+ const [coreB, preB] = parts2(b13);
44750
+ const core2 = dotted(coreA, coreB);
44751
+ if (core2 || preA === preB) return core2;
44752
+ if (preA === null) return 1;
44753
+ return preB === null ? -1 : dotted(preA, preB);
44754
+ };
44755
+ var certBlock = /<!--\s*cert-verify\s*-->([\s\S]*?)<!--\s*\/cert-verify\s*-->/g;
44756
+ var notesLimit = 8192;
44757
+ var noted = /* @__PURE__ */ new WeakMap();
44758
+ function releaseNotes(release2) {
44759
+ const known = noted.get(release2);
44760
+ if (known) return known;
44761
+ const text5 = release2.notes ?? "";
44762
+ const certified = [...text5.matchAll(certBlock)].some(
44763
+ ([, inner]) => /^certified\b/.test(inner.trim())
44764
+ );
44765
+ const lines = text5.replace(certBlock, "").trim().split("\n");
44766
+ const heading = /^#{1,6}\s/.test(lines[0]) && lines[0].includes(release2.version.replace(/^v/, ""));
44767
+ const full = lines.slice(heading ? 1 : 0).join("\n").trim();
44768
+ const cut = full.length > notesLimit;
44769
+ const head2 = full.slice(0, notesLimit);
44770
+ const line = head2.lastIndexOf("\n");
44771
+ const body4 = cut ? `${(line > notesLimit / 2 ? head2.slice(0, line) : head2).trimEnd()}\u2026` : full;
44772
+ const notes2 = { release: release2, body: body4, certified, cut };
44773
+ noted.set(release2, notes2);
44774
+ return notes2;
44775
+ }
44776
+ function whatsNew(releases, from, to) {
44777
+ if (!releases || from === null || to === null || to === from) return [];
44778
+ const range3 = releases.filter((release2) => newer(release2.version, from) > 0 && newer(release2.version, to) <= 0).sort((a23, b13) => newer(b13.version, a23.version)).map(releaseNotes);
44779
+ return range3.some((entry) => entry.body) ? range3 : [];
44780
+ }
44781
+ var secure = (url) => /^https:\/\//i.test(url);
44782
+ var installed2 = (releases, version2) => releases?.find((release2) => newer(release2.version, version2) === 0 && secure(release2.url));
44715
44783
  var snapshot = (items) => new Map(items.map(({ id, state: state2, error }) => [id, { state: state2, error }]));
44716
44784
  function settled2(failures, before, after) {
44717
44785
  return new Map(
@@ -44783,7 +44851,9 @@ var SliccUpdates = class extends ModelElement {
44783
44851
  return running2 ? "a package is installing" : null;
44784
44852
  }
44785
44853
  static styles = [
44854
+ r(link_default),
44786
44855
  disclosureStyles,
44856
+ markdownCss,
44787
44857
  i`
44788
44858
  :host {
44789
44859
  display: block;
@@ -44881,12 +44951,12 @@ var SliccUpdates = class extends ModelElement {
44881
44951
  section > .hint {
44882
44952
  margin-block-end: var(--swc-spacing-100);
44883
44953
  }
44884
- ul {
44954
+ .rows {
44885
44955
  margin: 0;
44886
44956
  padding: 0;
44887
44957
  list-style: none;
44888
44958
  }
44889
- li {
44959
+ .rows > li {
44890
44960
  display: grid;
44891
44961
  grid-template-columns: minmax(0, 1fr) auto;
44892
44962
  grid-template-areas: 'name buttons' 'description buttons';
@@ -44895,7 +44965,7 @@ var SliccUpdates = class extends ModelElement {
44895
44965
  padding: var(--swc-spacing-200) 0;
44896
44966
  border-bottom: var(--swc-border-width-100) solid var(--swc-gray-200);
44897
44967
  }
44898
- li > :not(.name, .buttons, .description) {
44968
+ .rows > li > :not(.name, .buttons, .description) {
44899
44969
  grid-column: 1 / -1;
44900
44970
  margin: 0;
44901
44971
  }
@@ -44926,11 +44996,11 @@ var SliccUpdates = class extends ModelElement {
44926
44996
  text-overflow: ellipsis;
44927
44997
  white-space: nowrap;
44928
44998
  }
44929
- li .meta {
44999
+ .rows > li > .meta {
44930
45000
  justify-content: flex-start;
44931
45001
  gap: 0;
44932
45002
  }
44933
- li .meta > * + *::before {
45003
+ .rows > li > .meta > * + *::before {
44934
45004
  content: '·';
44935
45005
  margin-inline: var(--swc-spacing-100);
44936
45006
  }
@@ -44984,6 +45054,55 @@ var SliccUpdates = class extends ModelElement {
44984
45054
  .package {
44985
45055
  color: var(--swc-neutral-subdued-content-color-default);
44986
45056
  }
45057
+ .swc-Link {
45058
+ font-size: inherit;
45059
+ }
45060
+ .title .swc-Link {
45061
+ font-weight: inherit;
45062
+ }
45063
+ .installed {
45064
+ display: flex;
45065
+ flex-wrap: wrap;
45066
+ align-items: baseline;
45067
+ gap: var(--swc-spacing-200);
45068
+ }
45069
+ .releases {
45070
+ display: grid;
45071
+ grid-template-columns: minmax(0, 1fr);
45072
+ gap: var(--swc-spacing-400);
45073
+ margin-block-start: var(--swc-spacing-200);
45074
+ padding: var(--swc-spacing-300);
45075
+ border: var(--swc-border-width-100) solid transparent;
45076
+ background: var(--swc-background-layer-1-color);
45077
+ border-radius: var(--swc-corner-radius-medium-default);
45078
+ overflow-wrap: anywhere;
45079
+ }
45080
+ .release {
45081
+ min-width: 0;
45082
+ }
45083
+ .title {
45084
+ margin: 0;
45085
+ font-size: var(--swc-font-size-100);
45086
+ font-weight: var(--swc-bold-font-weight);
45087
+ color: var(--swc-heading-color);
45088
+ display: flex;
45089
+ align-items: center;
45090
+ flex-wrap: wrap;
45091
+ gap: var(--swc-spacing-100);
45092
+ }
45093
+ .cut {
45094
+ margin: var(--swc-spacing-100) 0 0;
45095
+ }
45096
+ .release > .markdown {
45097
+ margin-block-start: var(--swc-spacing-100);
45098
+ line-height: var(--swc-line-height-200);
45099
+ }
45100
+ .release .markdown .heading[aria-level] {
45101
+ font-size: var(--swc-font-size-100);
45102
+ font-weight: var(--swc-bold-font-weight);
45103
+ color: var(--swc-neutral-subdued-content-color-default);
45104
+ margin-block: var(--swc-spacing-200) var(--swc-spacing-75);
45105
+ }
44987
45106
  @container (max-width: 480px) {
44988
45107
  .page {
44989
45108
  padding: var(--swc-spacing-300);
@@ -44993,7 +45112,7 @@ var SliccUpdates = class extends ModelElement {
44993
45112
  flex-direction: column;
44994
45113
  gap: var(--swc-spacing-50);
44995
45114
  }
44996
- li {
45115
+ .rows > li {
44997
45116
  grid-template-areas: 'name buttons' 'description description';
44998
45117
  }
44999
45118
  .description {
@@ -45142,6 +45261,37 @@ var SliccUpdates = class extends ModelElement {
45142
45261
  const shown4 = date.toLocaleString("en-GB", { dateStyle: "medium", timeStyle: "short" });
45143
45262
  return b`<span>Checked <time datetime=${date.toISOString()}>${shown4}</time></span>`;
45144
45263
  }
45264
+ #whatsNew(key2, label, entries, level) {
45265
+ if (!entries.length) return A;
45266
+ return b`<details data-releases ?open=${this.#logs.has(key2)} @toggle=${this.#logs.details(key2)}>
45267
+ <summary data-action="whats-new">${chevron}What’s new</summary>
45268
+ <div class="releases">${entries.map(
45269
+ ({
45270
+ release: release2,
45271
+ body: body4,
45272
+ certified,
45273
+ cut
45274
+ }) => b`<div class="release" data-version=${release2.version}>
45275
+ <p class="title" role="heading" aria-level=${level}>${secure(release2.url) ? b`<a class="swc-Link swc-Link--standalone" href=${release2.url} target="_blank" rel="noopener noreferrer" data-action="release-notes" aria-label=${`${label} ${release2.version} release notes`}>${release2.version}</a>` : release2.version}${certified ? b`<swc-badge size="s" variant="positive" subtle data-certified>Certified</swc-badge>` : A}</p>
45276
+ ${body4 ? b`<div class="markdown">${markdown(body4, { strict: true, level })}</div>` : A}
45277
+ ${cut && secure(release2.url) ? b`<p class="cut" data-cut><a class="swc-Link swc-Link--standalone" href=${release2.url} target="_blank" rel="noopener noreferrer" data-action="release-notes" aria-label=${`Read the full notes for ${label} ${release2.version}`}>Read the full notes</a></p>` : A}
45278
+ </div>`
45279
+ )}</div>
45280
+ </details>`;
45281
+ }
45282
+ #releaseLink(label, version2, releases, npm) {
45283
+ const release2 = installed2(releases, version2);
45284
+ if (release2) {
45285
+ return b`<a class="swc-Link swc-Link--standalone" href=${release2.url} target="_blank" rel="noopener noreferrer" data-action="release-notes" aria-label=${`${label} ${version2} release notes`}>Release notes</a>`;
45286
+ }
45287
+ if (!npm) return A;
45288
+ return b`<a class="swc-Link swc-Link--standalone" href=${`https://www.npmjs.com/package/${npm}/v/${version2}`} target="_blank" rel="noopener noreferrer" data-action="npm-page" aria-label=${`npm page for ${label} ${version2}`}>npm page</a>`;
45289
+ }
45290
+ #version(item2) {
45291
+ const text5 = b`<span class="version">${item2.from ?? "Not installed"}${item2.to && item2.to !== item2.from ? b` → ${item2.to}` : A}</span>`;
45292
+ const link2 = item2.from !== null && (item2.to === null || item2.to === item2.from) ? this.#releaseLink(item2.label, item2.from, item2.releases) : A;
45293
+ return link2 === A ? text5 : b`<span class="installed">${text5}${link2}</span>`;
45294
+ }
45145
45295
  #item(item2) {
45146
45296
  const [variant, state2] = states[item2.state];
45147
45297
  const label = item2.state === "failed" && item2.from !== null ? "Update failed" : state2;
@@ -45153,7 +45303,7 @@ var SliccUpdates = class extends ModelElement {
45153
45303
  <swc-status-light variant=${variant}>${label}</swc-status-light>
45154
45304
  </div>
45155
45305
  <div class="meta">
45156
- <span class="version">${item2.from ?? "Not installed"}${item2.to && item2.to !== item2.from ? b` → ${item2.to}` : A}</span>
45306
+ ${this.#version(item2)}
45157
45307
  ${item2.state === "starting" ? A : this.#checked(item2.checkedAt)}
45158
45308
  </div>
45159
45309
  ${this.#progress(item2)}
@@ -45162,6 +45312,7 @@ var SliccUpdates = class extends ModelElement {
45162
45312
  <span>${error}</span>
45163
45313
  </div>` : A}
45164
45314
  ${this.#actions(item2)}
45315
+ ${this.#whatsNew(`releases:item:${item2.id}`, item2.label, whatsNew(item2.releases, item2.from, item2.to), 3)}
45165
45316
  ${item2.log ? b`<details ?open=${this.#logs.has(`item:${item2.id}`)} @toggle=${this.#logs.details(`item:${item2.id}`)}><summary>${chevron}Install log</summary><pre>${item2.log}</pre></details>` : A}
45166
45317
  </article>`;
45167
45318
  }
@@ -45183,8 +45334,14 @@ var SliccUpdates = class extends ModelElement {
45183
45334
  ${elsewhere(item2).map((install) => b`<span data-install>${installText(install, item2.version)}</span>`)}
45184
45335
  ${download2 ? b`<span>${size3(item2.size)}</span>` : A}
45185
45336
  ${requires ? b`<span data-requires>${requires}</span>` : A}
45337
+ ${this.#packageLink(item2)}
45186
45338
  </p>`;
45187
45339
  }
45340
+ #packageLink(item2) {
45341
+ if (item2.version === null || item2.offered !== null && item2.offered !== item2.version)
45342
+ return A;
45343
+ return b`<span>${this.#releaseLink(item2.label, item2.version, item2.releases, item2.package)}</span>`;
45344
+ }
45188
45345
  #packageProgress(item2) {
45189
45346
  const progress = item2.progress;
45190
45347
  const phase = progress ? progress.phase === "download" ? "downloading" : "linking" : null;
@@ -45226,6 +45383,7 @@ var SliccUpdates = class extends ModelElement {
45226
45383
  ${item2.commands.length ? b`<p class="commands"><span class="hidden">Commands: </span>${item2.commands.map(
45227
45384
  (command3) => b`<code>${command3}</code>`
45228
45385
  )}</p>` : A}
45386
+ ${this.#whatsNew(`releases:package:${item2.id}`, item2.label, whatsNew(item2.releases, item2.version, item2.offered), 4)}
45229
45387
  ${this.#packageProgress(item2)}
45230
45388
  ${error ? b`<div class="error" role="alert" data-error>
45231
45389
  <swc-icon-alert-triangle size="s" aria-hidden="true"></swc-icon-alert-triangle>
@@ -45235,7 +45393,7 @@ var SliccUpdates = class extends ModelElement {
45235
45393
  </li>`;
45236
45394
  }
45237
45395
  #list(items, all3, port) {
45238
- return b`<ul>${c(
45396
+ return b`<ul class="rows">${c(
45239
45397
  items,
45240
45398
  (item2) => item2.id,
45241
45399
  (item2) => this.#package(item2, all3, Boolean(port.actPackage))
@@ -46253,16 +46411,16 @@ function sudo(approval) {
46253
46411
  var rulePaths = ["/etc/fnox", "/etc/fnox/config.toml", "/etc/slicc/secrets-policy.toml"];
46254
46412
  var ruleParents = ["/", "/etc", "/etc/slicc"];
46255
46413
  function absolute(cwd, word) {
46256
- const parts2 = [];
46414
+ const parts3 = [];
46257
46415
  for (const part2 of `${word.startsWith("/") ? "" : cwd}/${word}`.split("/")) {
46258
- if (part2 === "..") parts2.pop();
46259
- else if (part2 && part2 !== ".") parts2.push(part2);
46260
- const alias = parts2.join("/").match(/^proc\/([^/]+)\/(?:task\/[^/]+\/)?(root|cwd)$/);
46261
- if (alias?.[2] === "root") parts2.length = 0;
46416
+ if (part2 === "..") parts3.pop();
46417
+ else if (part2 && part2 !== ".") parts3.push(part2);
46418
+ const alias = parts3.join("/").match(/^proc\/([^/]+)\/(?:task\/[^/]+\/)?(root|cwd)$/);
46419
+ if (alias?.[2] === "root") parts3.length = 0;
46262
46420
  else if (alias && /^(?:self|thread-self)$/.test(alias[1]))
46263
- parts2.splice(0, parts2.length, ...cwd.split("/").filter(Boolean));
46421
+ parts3.splice(0, parts3.length, ...cwd.split("/").filter(Boolean));
46264
46422
  }
46265
- return `/${parts2.join("/")}`;
46423
+ return `/${parts3.join("/")}`;
46266
46424
  }
46267
46425
  function pattern(path2) {
46268
46426
  const source = path2.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*\*\//g, "").replace(/\*\*/g, "").replace(/\*/g, "[^/]*").replace(/\?/g, "[^/]").replace(/\u0001/g, "(?:.*/)?").replace(/\u0002/g, ".*");
@@ -48098,12 +48256,12 @@ function groups(changes2) {
48098
48256
  return [...byRepo];
48099
48257
  }
48100
48258
  function commands2(text5) {
48101
- const parts2 = text5.split("`").map((part2, index2) => index2 % 2 ? { code: part2 } : part2);
48102
- if (parts2.length % 2 === 0) return { parts: [text5], codes: [] };
48103
- const codes = parts2.flatMap(
48259
+ const parts3 = text5.split("`").map((part2, index2) => index2 % 2 ? { code: part2 } : part2);
48260
+ if (parts3.length % 2 === 0) return { parts: [text5], codes: [] };
48261
+ const codes = parts3.flatMap(
48104
48262
  (part2) => typeof part2 === "string" || !part2.code ? [] : [part2.code]
48105
48263
  );
48106
- return { parts: parts2, codes: [...new Set(codes)] };
48264
+ return { parts: parts3, codes: [...new Set(codes)] };
48107
48265
  }
48108
48266
  function errorLine(error) {
48109
48267
  return b`<div class="error" role="status" aria-live="polite">${error ? b`<swc-icon-alert-diamond size="s" aria-hidden="true"></swc-icon-alert-diamond><span>${error}</span>` : A}</div>`;
@@ -48363,10 +48521,10 @@ var SliccChanges = class extends ModelElement {
48363
48521
  }
48364
48522
  #unavailable(text5, extra) {
48365
48523
  const found = commands2(text5);
48366
- const { parts: parts2 } = found;
48524
+ const { parts: parts3 } = found;
48367
48525
  const codes = [.../* @__PURE__ */ new Set([...found.codes, ...extra])];
48368
48526
  return b`<div class="unavailable">
48369
- <p data-unavailable>${parts2.map((part2) => typeof part2 === "string" ? part2 : b`<code>${part2.code}</code>`)}</p>
48527
+ <p data-unavailable>${parts3.map((part2) => typeof part2 === "string" ? part2 : b`<code>${part2.code}</code>`)}</p>
48370
48528
  ${codes.map(
48371
48529
  (code3) => b`<div class="command" data-command=${code3}>
48372
48530
  <code>${breakable(code3)}</code>
@@ -48834,10 +48992,17 @@ var SliccMemory = class extends ModelElement {
48834
48992
  .row {
48835
48993
  --lead: var(--swc-spacing-300);
48836
48994
  --indent: calc(var(--swc-spacing-100) + var(--lead) + var(--swc-spacing-75));
48995
+ position: relative;
48837
48996
  border-radius: var(--swc-corner-radius-medium-default);
48838
48997
  }
48839
- li.row + li.row {
48840
- border-block-start: var(--swc-border-width-100) solid var(--swc-gray-200);
48998
+ li.row + li.row::before {
48999
+ content: '';
49000
+ position: absolute;
49001
+ inset-block-start: 0;
49002
+ inset-inline: 0;
49003
+ block-size: var(--swc-border-width-100);
49004
+ background: var(--swc-gray-200);
49005
+ pointer-events: none;
48841
49006
  }
48842
49007
  .row:not([data-open]):hover,
48843
49008
  .row[data-open] .head:hover {
@@ -48894,9 +49059,12 @@ var SliccMemory = class extends ModelElement {
48894
49059
  .mark {
48895
49060
  display: inline-flex;
48896
49061
  }
49062
+ .row[data-open] .head :is(.tag, .scope) {
49063
+ visibility: hidden;
49064
+ }
48897
49065
  .content {
48898
49066
  overflow: hidden;
48899
- max-height: 2lh;
49067
+ max-height: calc(2lh + var(--swc-spacing-100));
48900
49068
  margin: 0 var(--swc-spacing-100) var(--swc-spacing-100) var(--indent);
48901
49069
  line-height: var(--swc-line-height-100);
48902
49070
  color: var(--swc-neutral-subdued-content-color-default);
@@ -48910,7 +49078,7 @@ var SliccMemory = class extends ModelElement {
48910
49078
  @supports (height: calc-size(auto, size)) {
48911
49079
  .content {
48912
49080
  max-height: none;
48913
- height: calc-size(auto, min(size, 2lh));
49081
+ height: calc-size(auto, min(size, 2lh + var(--swc-spacing-100)));
48914
49082
  transition: height var(--swc-animation-duration-100) var(--swc-animation-ease-in-out);
48915
49083
  }
48916
49084
  .row[data-open] .content {
@@ -48940,10 +49108,30 @@ var SliccMemory = class extends ModelElement {
48940
49108
  }
48941
49109
  .actions {
48942
49110
  display: flex;
49111
+ flex-wrap: wrap;
49112
+ align-items: center;
48943
49113
  justify-content: flex-end;
48944
49114
  gap: var(--swc-spacing-75);
48945
49115
  padding-block-start: var(--swc-spacing-100);
48946
49116
  }
49117
+ .meta {
49118
+ display: flex;
49119
+ flex-wrap: wrap;
49120
+ align-items: center;
49121
+ gap: var(--swc-spacing-50) var(--swc-spacing-200);
49122
+ margin-inline-end: auto;
49123
+ font-size: var(--swc-font-size-75);
49124
+ }
49125
+ .meta .label {
49126
+ display: inline-flex;
49127
+ align-items: center;
49128
+ gap: var(--swc-spacing-75);
49129
+ }
49130
+ .buttons {
49131
+ display: flex;
49132
+ gap: var(--swc-spacing-75);
49133
+ margin-inline-start: auto;
49134
+ }
48947
49135
  .actions [data-action='forget'] {
48948
49136
  --swc-action-button-content-color-default: var(--swc-negative-content-color-default);
48949
49137
  --swc-action-button-content-color-hover: var(--swc-negative-content-color-hover);
@@ -49038,6 +49226,12 @@ var SliccMemory = class extends ModelElement {
49038
49226
  }
49039
49227
  return marks;
49040
49228
  }
49229
+ #meta(marks) {
49230
+ const labelled = marks.filter((mark2) => mark2.kind !== "from");
49231
+ return labelled.length ? b`<div class="meta">${labelled.map(
49232
+ (mark2) => b`<span class="label" data-label=${mark2.kind}>${mark2.icon}${mark2.label}</span>`
49233
+ )}</div>` : A;
49234
+ }
49041
49235
  #row(memory, section) {
49042
49236
  if (this.editing === memory.id)
49043
49237
  return b`<li class="row" data-id=${memory.id}>${this.#form(memory)}</li>`;
@@ -49057,12 +49251,15 @@ var SliccMemory = class extends ModelElement {
49057
49251
  <div class="content" id=${`content-${memory.id}`} @click=${() => open || toggle()}>
49058
49252
  <div class="body markdown">${markdown(memory.body)}</div>
49059
49253
  ${open ? b`<div class="actions">
49254
+ ${this.#meta(marks)}
49255
+ <div class="buttons">
49060
49256
  <swc-action-button size="s" quiet data-action="edit" @click=${() => this.editing = memory.id}>
49061
49257
  <swc-icon-edit slot="icon"></swc-icon-edit>Edit
49062
49258
  </swc-action-button>
49063
49259
  <swc-action-button size="s" quiet data-action="forget" @click=${(event2) => this.#forget(memory, event2.currentTarget)}>
49064
49260
  <swc-icon-delete slot="icon"></swc-icon-delete>Forget
49065
49261
  </swc-action-button>
49262
+ </div>
49066
49263
  </div>` : A}
49067
49264
  </div>
49068
49265
  </li>`;
@@ -49402,24 +49599,24 @@ function changes(entry, devices) {
49402
49599
  }
49403
49600
  var listed = (items, one3) => items.map((item2, index2) => b`${index2 ? ", " : ""}${one3(item2)}`);
49404
49601
  function endpointsLine(entry, named2 = (provider) => provider) {
49405
- const parts2 = [];
49602
+ const parts3 = [];
49406
49603
  if (entry.purged?.length)
49407
- parts2.push(
49604
+ parts3.push(
49408
49605
  b`<span class="part" data-part="purged">Removed custom model URLs an agent set, automatically: ${listed(entry.purged, (item2) => b`${named2(item2.provider)} at <code>${item2.host ?? item2.url}</code>`)}. Only you can set a model URL now, in Settings › Accounts</span>`
49409
49606
  );
49410
49607
  if (entry.adopted?.length)
49411
- parts2.push(
49608
+ parts3.push(
49412
49609
  b`<span class="part" data-part="adopted">Kept the MCP servers your tokens use, automatically: ${listed(entry.adopted, (item2) => b`${item2.server} at <code>${item2.host}</code>`)}</span>`
49413
49610
  );
49414
49611
  if (entry.pinned)
49415
- parts2.push(
49612
+ parts3.push(
49416
49613
  b`<span class="part" data-part="pinned"><code>${entry.pinned.name ?? entry.pinned.server}</code> pinned to <code>${entry.pinned.host}</code> automatically, on first use</span>`
49417
49614
  );
49418
49615
  if (entry.unpinned)
49419
- parts2.push(
49616
+ parts3.push(
49420
49617
  b`<span class="part" data-part="unpinned"><code>${entry.unpinned.name ?? entry.unpinned.server}</code> unpinned from <code>${entry.unpinned.host}</code>; the next use pins it again</span>`
49421
49618
  );
49422
- return b`${parts2.map((part2, index2) => b`${index2 ? ". " : ""}${part2}`)}`;
49619
+ return b`${parts3.map((part2, index2) => b`${index2 ? ". " : ""}${part2}`)}`;
49423
49620
  }
49424
49621
  function auditLine(entry, devices, named2) {
49425
49622
  switch (entry.type) {
@@ -51984,7 +52181,7 @@ function closure(found, source) {
51984
52181
  return used;
51985
52182
  }
51986
52183
  function args(value, start2) {
51987
- const parts2 = [];
52184
+ const parts3 = [];
51988
52185
  let depth = 0;
51989
52186
  let from = start2;
51990
52187
  let at = start2;
@@ -51994,18 +52191,18 @@ function args(value, start2) {
51994
52191
  else if (char === ")" && depth === 0) break;
51995
52192
  else if (char === ")") depth--;
51996
52193
  else if (char === "," && depth === 0) {
51997
- parts2.push(value.slice(from, at));
52194
+ parts3.push(value.slice(from, at));
51998
52195
  from = at + 1;
51999
52196
  }
52000
52197
  }
52001
- parts2.push(value.slice(from, at));
52002
- return [parts2, at];
52198
+ parts3.push(value.slice(from, at));
52199
+ return [parts3, at];
52003
52200
  }
52004
52201
  function branch(value, side) {
52005
52202
  const at = value.indexOf("light-dark(");
52006
52203
  if (at < 0) return value;
52007
- const [parts2, end] = args(value, at + "light-dark(".length);
52008
- const picked = branch((parts2[side] ?? "").trim(), side);
52204
+ const [parts3, end] = args(value, at + "light-dark(".length);
52205
+ const picked = branch((parts3[side] ?? "").trim(), side);
52009
52206
  return value.slice(0, at) + picked + branch(value.slice(end + 1), side);
52010
52207
  }
52011
52208
  function frameTokens(found) {
@@ -57430,9 +57627,9 @@ function nameMatcher(identifers, scopes) {
57430
57627
  return false;
57431
57628
  }
57432
57629
  let lastIndex = 0;
57433
- return identifers.every((identifier) => {
57630
+ return identifers.every((identifier2) => {
57434
57631
  for (let i26 = lastIndex; i26 < scopes.length; i26++) {
57435
- if (scopesAreMatching(scopes[i26], identifier)) {
57632
+ if (scopesAreMatching(scopes[i26], identifier2)) {
57436
57633
  lastIndex = i26 + 1;
57437
57634
  return true;
57438
57635
  }
@@ -58400,14 +58597,14 @@ function isSpecialTheme(theme3) {
58400
58597
  var RE_NEWLINE = /(\r?\n)/g;
58401
58598
  function splitLines(code3, preserveEnding = false) {
58402
58599
  if (code3.length === 0) return [["", 0]];
58403
- const parts2 = code3.split(RE_NEWLINE);
58600
+ const parts3 = code3.split(RE_NEWLINE);
58404
58601
  let index2 = 0;
58405
58602
  const lines = [];
58406
- for (let i26 = 0; i26 < parts2.length; i26 += 2) {
58407
- const line = preserveEnding ? parts2[i26] + (parts2[i26 + 1] || "") : parts2[i26];
58603
+ for (let i26 = 0; i26 < parts3.length; i26 += 2) {
58604
+ const line = preserveEnding ? parts3[i26] + (parts3[i26 + 1] || "") : parts3[i26];
58408
58605
  lines.push([line, index2]);
58409
- index2 += parts2[i26].length;
58410
- index2 += parts2[i26 + 1]?.length || 0;
58606
+ index2 += parts3[i26].length;
58607
+ index2 += parts3[i26 + 1]?.length || 0;
58411
58608
  }
58412
58609
  return lines;
58413
58610
  }
@@ -61050,7 +61247,7 @@ function element2(node2, index2, parent, state2) {
61050
61247
  const schema = state2.schema;
61051
61248
  const omit = schema.space === "svg" ? false : state2.settings.omitOptionalTags;
61052
61249
  let selfClosing = schema.space === "svg" ? state2.settings.closeEmptyElements : state2.settings.voids.includes(node2.tagName.toLowerCase());
61053
- const parts2 = [];
61250
+ const parts3 = [];
61054
61251
  let last;
61055
61252
  if (schema.space === "html" && node2.tagName === "svg") {
61056
61253
  state2.schema = svg3;
@@ -61062,21 +61259,21 @@ function element2(node2, index2, parent, state2) {
61062
61259
  state2.schema = schema;
61063
61260
  if (content3) selfClosing = false;
61064
61261
  if (attributes || !omit || !opening(node2, index2, parent)) {
61065
- parts2.push("<", node2.tagName, attributes ? " " + attributes : "");
61262
+ parts3.push("<", node2.tagName, attributes ? " " + attributes : "");
61066
61263
  if (selfClosing && (schema.space === "svg" || state2.settings.closeSelfClosing)) {
61067
61264
  last = attributes.charAt(attributes.length - 1);
61068
61265
  if (!state2.settings.tightSelfClosing || last === "/" || last && last !== '"' && last !== "'") {
61069
- parts2.push(" ");
61266
+ parts3.push(" ");
61070
61267
  }
61071
- parts2.push("/");
61268
+ parts3.push("/");
61072
61269
  }
61073
- parts2.push(">");
61270
+ parts3.push(">");
61074
61271
  }
61075
- parts2.push(content3);
61272
+ parts3.push(content3);
61076
61273
  if (!selfClosing && (!omit || !closing(node2, index2, parent))) {
61077
- parts2.push("</" + node2.tagName + ">");
61274
+ parts3.push("</" + node2.tagName + ">");
61078
61275
  }
61079
- return parts2.join("");
61276
+ return parts3.join("");
61080
61277
  }
61081
61278
  function serializeAttributes(state2, properties) {
61082
61279
  const values = [];
@@ -68623,8 +68820,8 @@ function getFunctionalAlpha(color2) {
68623
68820
  const slashIndex = inner.lastIndexOf("/");
68624
68821
  if (slashIndex !== -1) return inner.slice(slashIndex + 1).trim();
68625
68822
  if (/^(?:rgba|hsla)$/i.test(fn)) {
68626
- const parts2 = inner.split(",");
68627
- if (parts2.length === 4) return parts2[3]?.trim();
68823
+ const parts3 = inner.split(",");
68824
+ if (parts3.length === 4) return parts3[3]?.trim();
68628
68825
  }
68629
68826
  }
68630
68827
  function parseHexRgba(color2) {
@@ -71808,17 +72005,17 @@ function splitAtLinePrefix(contents, prefix) {
71808
72005
  ${prefix}`;
71809
72006
  const firstBoundaryIndex = contents.startsWith(prefix) ? 0 : findLinePrefixIndex(contents, newlinePrefix, 0);
71810
72007
  if (firstBoundaryIndex === -1) return [contents];
71811
- const parts2 = [];
71812
- if (firstBoundaryIndex > 0) parts2.push(contents.slice(0, firstBoundaryIndex));
72008
+ const parts3 = [];
72009
+ if (firstBoundaryIndex > 0) parts3.push(contents.slice(0, firstBoundaryIndex));
71813
72010
  let startIndex = firstBoundaryIndex;
71814
72011
  for (; ; ) {
71815
72012
  const nextBoundaryIndex = findLinePrefixIndex(contents, newlinePrefix, startIndex + 1);
71816
72013
  if (nextBoundaryIndex === -1) break;
71817
- parts2.push(contents.slice(startIndex, nextBoundaryIndex));
72014
+ parts3.push(contents.slice(startIndex, nextBoundaryIndex));
71818
72015
  startIndex = nextBoundaryIndex;
71819
72016
  }
71820
- parts2.push(contents.slice(startIndex));
71821
- return parts2;
72017
+ parts3.push(contents.slice(startIndex));
72018
+ return parts3;
71822
72019
  }
71823
72020
  function findLinePrefixIndex(contents, newlinePrefix, fromIndex) {
71824
72021
  const index2 = contents.indexOf(newlinePrefix, fromIndex);
@@ -72143,16 +72340,16 @@ function overlapCount(a23, b13) {
72143
72340
  return k8;
72144
72341
  }
72145
72342
  function segment(string3, segmenter) {
72146
- const parts2 = [];
72343
+ const parts3 = [];
72147
72344
  for (const segmentObj of Array.from(segmenter.segment(string3))) {
72148
72345
  const segment2 = segmentObj.segment;
72149
- if (parts2.length && /\s/.test(parts2[parts2.length - 1]) && /\s/.test(segment2)) {
72150
- parts2[parts2.length - 1] += segment2;
72346
+ if (parts3.length && /\s/.test(parts3[parts3.length - 1]) && /\s/.test(segment2)) {
72347
+ parts3[parts3.length - 1] += segment2;
72151
72348
  } else {
72152
- parts2.push(segment2);
72349
+ parts3.push(segment2);
72153
72350
  }
72154
72351
  }
72155
- return parts2;
72352
+ return parts3;
72156
72353
  }
72157
72354
  function trailingWs(string3, segmenter) {
72158
72355
  if (segmenter) {
@@ -72200,19 +72397,19 @@ var WordDiff = class extends Diff {
72200
72397
  return left.trim() === right.trim();
72201
72398
  }
72202
72399
  tokenize(value, options2 = {}) {
72203
- let parts2;
72400
+ let parts3;
72204
72401
  if (options2.intlSegmenter) {
72205
72402
  const segmenter = options2.intlSegmenter;
72206
72403
  if (segmenter.resolvedOptions().granularity != "word") {
72207
72404
  throw new Error('The segmenter passed must have a granularity of "word"');
72208
72405
  }
72209
- parts2 = segment(value, segmenter);
72406
+ parts3 = segment(value, segmenter);
72210
72407
  } else {
72211
- parts2 = value.match(tokenizeIncludingWhitespace) || [];
72408
+ parts3 = value.match(tokenizeIncludingWhitespace) || [];
72212
72409
  }
72213
72410
  const tokens = [];
72214
72411
  let prevPart = null;
72215
- parts2.forEach((part2) => {
72412
+ parts3.forEach((part2) => {
72216
72413
  if (/\s/.test(part2)) {
72217
72414
  if (prevPart == null) {
72218
72415
  tokens.push(part2);
@@ -95113,7 +95310,7 @@ var SliccFileTree = class extends HTMLElement {
95113
95310
  const item2 = tree?.getItem(path2);
95114
95311
  return item2 && "isExpanded" in item2 ? item2.isExpanded() : null;
95115
95312
  };
95116
- const shown4 = (path2) => path2.split("/").slice(0, -2).every((_9, i26, parts2) => open(`${parts2.slice(0, i26 + 1).join("/")}/`) !== false);
95313
+ const shown4 = (path2) => path2.split("/").slice(0, -2).every((_9, i26, parts3) => open(`${parts3.slice(0, i26 + 1).join("/")}/`) !== false);
95117
95314
  return this.#paths.filter((path2) => path2.endsWith("/") && open(path2) === true && shown4(path2)).map((path2) => path2.slice(0, -1));
95118
95315
  }
95119
95316
  get gitStatus() {