codebay 0.5.0 → 0.7.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 (114) hide show
  1. package/.mochi/manifest.json +286 -227
  2. package/.mochi/svelte-client/HydratableIsland-qyjx1d98.js +1 -0
  3. package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-fkna7bj2.js +2 -0
  4. package/.mochi/svelte-client/_hydrate-AvatarsView_257s9yq1wwr4f-89wtkb86.js +13 -0
  5. package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-eamnbyqk.js +1 -0
  6. package/.mochi/svelte-client/{_hydrate-SettingsView_8hmarwmf8onq-r9vvc7rx.js → _hydrate-SettingsView_8hmarwmf8onq-kdra4mcb.js} +3 -3
  7. package/.mochi/svelte-client/chunk-330mrspw.js +2 -0
  8. package/.mochi/svelte-client/{chunk-dz1019cy.js → chunk-4jgkak13.js} +1 -1
  9. package/.mochi/svelte-client/chunk-fqg2qzj8.js +2 -0
  10. package/.mochi/svelte-client/chunk-k5m4kt20.js +2 -0
  11. package/.mochi/svelte-client/{chunk-nmf4dq86.js → chunk-qj7zy2d9.js} +1 -1
  12. package/.mochi/svelte-client/{chunk-ssa0ad2f.js → chunk-rpdphch7.js} +1 -1
  13. package/.mochi/svelte-compile/{App-9qjy14bc.server.js → App-6rcf0d74.server.js} +113 -46
  14. package/.mochi/svelte-compile/{Avatars-sq8mjn6k.server.js → Avatars-pzyz0tv3.server.js} +75 -15
  15. package/.mochi/svelte-compile/{Instance-13j59daw.server.js → Instance-49ksrp11.server.js} +15 -3
  16. package/.mochi/svelte-compile/{Settings-p0s2awg1.server.js → Settings-sz5d6qj7.server.js} +3 -3
  17. package/.mochi/svelte-compile/{chunk-dfe2km6a.js → chunk-q8rbesaw.js} +324 -123
  18. package/.mochi/svelte-css/Avatar-3pi30db6ozvf0.css +1 -0
  19. package/.mochi/svelte-css/AvatarEditor-2ewwtejaml4e2.css +1 -0
  20. package/.mochi/svelte-css/{AvatarsView-3hq37u4dgtljn.css → AvatarsView-2ughbzc26luyb.css} +1 -1
  21. package/.mochi/svelte-css/InstanceCard-3vnltxnbxkvay.css +1 -0
  22. package/.mochi/svelte-css/InstanceFilter-3q6x0jt0hcgpz.css +1 -0
  23. package/.mochi/svelte-css/{InstanceView-wq85bxtusont.css → InstanceView-3vzow3ttxzlh3.css} +1 -1
  24. package/README.md +2 -0
  25. package/package.json +2 -2
  26. package/src/avatars/anchor.ts +1 -0
  27. package/src/avatars/ant-head.ts +17 -0
  28. package/src/avatars/apple.ts +17 -0
  29. package/src/avatars/bear.ts +1 -0
  30. package/src/avatars/bee.ts +1 -0
  31. package/src/avatars/bodybuilder.ts +17 -0
  32. package/src/avatars/cat.ts +1 -0
  33. package/src/avatars/cherry.ts +1 -0
  34. package/src/avatars/crab.ts +1 -0
  35. package/src/avatars/crown.ts +1 -0
  36. package/src/avatars/diamond.ts +1 -0
  37. package/src/avatars/dog.ts +1 -0
  38. package/src/avatars/editor.ts +17 -0
  39. package/src/avatars/fish.ts +1 -0
  40. package/src/avatars/flower.ts +1 -0
  41. package/src/avatars/fox.ts +1 -0
  42. package/src/avatars/frog.ts +1 -0
  43. package/src/avatars/ghost.ts +1 -0
  44. package/src/avatars/heart.ts +8 -8
  45. package/src/avatars/horse.ts +17 -0
  46. package/src/avatars/index.ts +20 -0
  47. package/src/avatars/invader.ts +1 -0
  48. package/src/avatars/key.ts +1 -0
  49. package/src/avatars/lightning.ts +1 -0
  50. package/src/avatars/mushroom.ts +1 -0
  51. package/src/avatars/octopus.ts +1 -0
  52. package/src/avatars/owl.ts +1 -0
  53. package/src/avatars/penguin.ts +1 -0
  54. package/src/avatars/planet.ts +1 -0
  55. package/src/avatars/praying-mantis.ts +17 -0
  56. package/src/avatars/rabbit.ts +1 -0
  57. package/src/avatars/robot.ts +1 -0
  58. package/src/avatars/rocket.ts +1 -0
  59. package/src/avatars/serialize.ts +4 -3
  60. package/src/avatars/skull.ts +6 -6
  61. package/src/avatars/snail.ts +1 -0
  62. package/src/avatars/snowflake.ts +17 -0
  63. package/src/avatars/star.ts +1 -0
  64. package/src/avatars/strawberry.ts +17 -0
  65. package/src/avatars/target.ts +1 -0
  66. package/src/avatars/tree.ts +1 -0
  67. package/src/avatars/types.ts +6 -3
  68. package/src/avatars/vangogh-almond-blossoms.ts +17 -0
  69. package/src/avatars/wasp.ts +17 -0
  70. package/src/avatars/whale.ts +1 -0
  71. package/src/avatars/windmill.ts +17 -0
  72. package/src/components/AppShell.svelte +13 -0
  73. package/src/components/Avatar.svelte +4 -1
  74. package/src/components/AvatarEditor.svelte +83 -5
  75. package/src/components/AvatarsView.svelte +14 -1
  76. package/src/components/DashboardView.svelte +39 -4
  77. package/src/components/InstanceCard.svelte +55 -6
  78. package/src/components/InstanceFilter.svelte +68 -0
  79. package/src/components/InstanceView.svelte +41 -8
  80. package/src/components/SettingsView.svelte +2 -2
  81. package/src/components/TopBar.svelte +9 -1
  82. package/src/container-injections/attention-hooks.ts +19 -38
  83. package/src/container-injections/claude-aliases.ts +7 -23
  84. package/src/container-injections/claude-code-credentials.ts +12 -8
  85. package/src/container-injections/claude-code-custom.ts +35 -48
  86. package/src/container-injections/claude-code-ide-extension.ts +39 -0
  87. package/src/container-injections/claude-code-models.ts +8 -24
  88. package/src/container-injections/claude-model.ts +5 -28
  89. package/src/container-injections/claude-no-coauthor.ts +5 -17
  90. package/src/container-injections/claude-skip-permissions.ts +7 -17
  91. package/src/container-injections/claude-statusline.ts +16 -18
  92. package/src/container-injections/claude-trust.ts +73 -0
  93. package/src/container-injections/host-env-vars.ts +13 -24
  94. package/src/container-injections/tmux.ts +2 -11
  95. package/src/index.ts +2 -0
  96. package/src/lib/claude-settings.server.ts +35 -0
  97. package/src/lib/container-files.server.ts +219 -0
  98. package/src/lib/devcontainer.server.ts +38 -1
  99. package/src/lib/exec.server.ts +2 -7
  100. package/src/lib/injections.server.ts +4 -0
  101. package/src/lib/instances.server.ts +14 -0
  102. package/src/lib/theme.server.ts +7 -3
  103. package/src/shell.html +2 -0
  104. package/src/types.ts +3 -0
  105. package/.mochi/svelte-client/HydratableIsland-79z9xq4b.js +0 -1
  106. package/.mochi/svelte-client/_hydrate-AppShell_2rtnxn6pgp2rh-f5rzyjm8.js +0 -2
  107. package/.mochi/svelte-client/_hydrate-AvatarsView_257s9yq1wwr4f-fxyd5qx4.js +0 -13
  108. package/.mochi/svelte-client/_hydrate-InstanceView_2ma45l9bybfhl-nv31ptdp.js +0 -1
  109. package/.mochi/svelte-client/chunk-6eexkr6p.js +0 -2
  110. package/.mochi/svelte-client/chunk-7znwaf7t.js +0 -2
  111. package/.mochi/svelte-client/chunk-zmmb1c4b.js +0 -2
  112. package/.mochi/svelte-css/Avatar-24th63awm9mna.css +0 -1
  113. package/.mochi/svelte-css/AvatarEditor-1ryrs1md5g36y.css +0 -1
  114. package/.mochi/svelte-css/InstanceCard-16f77aysm7lgp.css +0 -1
@@ -19,7 +19,7 @@ import {
19
19
  Button,
20
20
  Toaster,
21
21
  dist_default
22
- } from "./chunk-dfe2km6a.js";
22
+ } from "./chunk-q8rbesaw.js";
23
23
  import {
24
24
  HydratableBoundary,
25
25
  Icon,
@@ -31,16 +31,16 @@ import"./chunk-we0ggtws.js";
31
31
 
32
32
  // src/pages/App.svelte
33
33
  import"svelte/internal/flags/async";
34
- import * as $23 from "svelte/internal/server";
34
+ import * as $24 from "svelte/internal/server";
35
35
 
36
36
  // src/components/AppShell.svelte
37
37
  import"svelte/internal/flags/async";
38
- import * as $22 from "svelte/internal/server";
38
+ import * as $23 from "svelte/internal/server";
39
39
  import { SvelteSet } from "svelte/reactivity";
40
40
 
41
41
  // src/components/DashboardView.svelte
42
42
  import"svelte/internal/flags/async";
43
- import * as $19 from "svelte/internal/server";
43
+ import * as $20 from "svelte/internal/server";
44
44
 
45
45
  // src/components/FolderBrowser.svelte
46
46
  import"svelte/internal/flags/async";
@@ -378,13 +378,27 @@ function InstanceCard($$renderer, $$props) {
378
378
  instance,
379
379
  editing,
380
380
  editingName = undefined,
381
+ pending = null,
381
382
  onact,
382
383
  onstartrename,
383
384
  oncommitrename,
384
385
  oncancelrename
385
386
  } = $$props;
386
387
  const canRebuild = $10.derived(() => instance.status === "running" || instance.status === "stopped" || instance.status === "error" && !!instance.container_id);
387
- $$renderer2.push(`<li class="card panel svelte-13338y7"><div class="card-head svelte-13338y7">`);
388
+ const BUSY_LABEL = {
389
+ start: "Starting\u2026",
390
+ stop: "Stopping\u2026",
391
+ delete: "Deleting\u2026",
392
+ rebuild: "Rebuilding\u2026"
393
+ };
394
+ $$renderer2.push(`<li${$10.attr_class("card panel svelte-13338y7", undefined, { busy: !!pending })}${$10.attr("aria-busy", !!pending || undefined)}>`);
395
+ if (pending) {
396
+ $$renderer2.push("<!--[0-->");
397
+ $$renderer2.push(`<div class="busy-overlay svelte-13338y7" aria-live="polite"><span class="busy-label svelte-13338y7">${$10.escape(BUSY_LABEL[pending])}</span></div>`);
398
+ } else {
399
+ $$renderer2.push("<!--[-1-->");
400
+ }
401
+ $$renderer2.push(`<!--]--> <div class="card-head svelte-13338y7">`);
388
402
  Avatar($$renderer2, { id: instance.id, name: instance.name, interactive: true });
389
403
  $$renderer2.push(`<!----> `);
390
404
  if (editing) {
@@ -518,7 +532,7 @@ function InstanceCard($$renderer, $$props) {
518
532
 
519
533
  // src/components/TopBar.svelte
520
534
  import"svelte/internal/flags/async";
521
- import * as $18 from "svelte/internal/server";
535
+ import * as $19 from "svelte/internal/server";
522
536
 
523
537
  // node_modules/@lucide/svelte/dist/icons/component.svelte
524
538
  import"svelte/internal/flags/async";
@@ -591,13 +605,34 @@ function Brand($$renderer, $$props) {
591
605
  });
592
606
  }
593
607
 
608
+ // src/components/InstanceFilter.svelte
609
+ import"svelte/internal/flags/async";
610
+ import * as $14 from "svelte/internal/server";
611
+ function InstanceFilter($$renderer, $$props) {
612
+ $$renderer.component(($$renderer2) => {
613
+ let { value, onchange } = $$props;
614
+ const options = [
615
+ { value: "all", label: "All" },
616
+ { value: "active", label: "Active" },
617
+ { value: "stopped", label: "Stopped" }
618
+ ];
619
+ $$renderer2.push(`<div class="picker svelte-12yor8r" role="radiogroup" aria-label="Filter instances"><!--[-->`);
620
+ const each_array = $14.ensure_array_like(options);
621
+ for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
622
+ let opt = each_array[$$index];
623
+ $$renderer2.push(`<button type="button"${$14.attr_class("segment svelte-12yor8r", undefined, { active: value === opt.value })} role="radio"${$14.attr("aria-checked", value === opt.value)}>${$14.escape(opt.label)}</button>`);
624
+ }
625
+ $$renderer2.push(`<!--]--></div>`);
626
+ });
627
+ }
628
+
594
629
  // src/components/SettingsCog.svelte
595
630
  import"svelte/internal/flags/async";
596
- import * as $15 from "svelte/internal/server";
631
+ import * as $16 from "svelte/internal/server";
597
632
 
598
633
  // node_modules/@lucide/svelte/dist/icons/settings.svelte
599
634
  import"svelte/internal/flags/async";
600
- import * as $14 from "svelte/internal/server";
635
+ import * as $15 from "svelte/internal/server";
601
636
  function Settings($$renderer, $$props) {
602
637
  let { $$slots, $$events, ...props } = $$props;
603
638
  const iconNode = [
@@ -609,12 +644,12 @@ function Settings($$renderer, $$props) {
609
644
  ],
610
645
  ["circle", { cx: "12", cy: "12", r: "3" }]
611
646
  ];
612
- Icon($$renderer, $14.spread_props([{ name: "settings" }, props, { iconNode }]));
647
+ Icon($$renderer, $15.spread_props([{ name: "settings" }, props, { iconNode }]));
613
648
  }
614
649
  // src/components/SettingsCog.svelte
615
650
  function SettingsCog($$renderer, $$props) {
616
651
  $$renderer.component(($$renderer2) => {
617
- $$renderer2.push(`<a class="cog svelte-1e745g8"${$15.attr("href", withPopupMarker("/settings"))} target="_blank" rel="noopener noreferrer" aria-label="Settings" title="Settings">`);
652
+ $$renderer2.push(`<a class="cog svelte-1e745g8"${$16.attr("href", withPopupMarker("/settings"))} target="_blank" rel="noopener noreferrer" aria-label="Settings" title="Settings">`);
618
653
  Settings($$renderer2, { size: 16 });
619
654
  $$renderer2.push(`<!----></a>`);
620
655
  });
@@ -622,11 +657,11 @@ function SettingsCog($$renderer, $$props) {
622
657
 
623
658
  // src/components/CredMenu.svelte
624
659
  import"svelte/internal/flags/async";
625
- import * as $17 from "svelte/internal/server";
660
+ import * as $18 from "svelte/internal/server";
626
661
 
627
662
  // node_modules/@lucide/svelte/dist/icons/link.svelte
628
663
  import"svelte/internal/flags/async";
629
- import * as $16 from "svelte/internal/server";
664
+ import * as $17 from "svelte/internal/server";
630
665
  function Link($$renderer, $$props) {
631
666
  let { $$slots, $$events, ...props } = $$props;
632
667
  const iconNode = [
@@ -643,17 +678,17 @@ function Link($$renderer, $$props) {
643
678
  }
644
679
  ]
645
680
  ];
646
- Icon($$renderer, $16.spread_props([{ name: "link" }, props, { iconNode }]));
681
+ Icon($$renderer, $17.spread_props([{ name: "link" }, props, { iconNode }]));
647
682
  }
648
683
  // src/components/CredMenu.svelte
649
684
  function CredMenu($$renderer, $$props) {
650
685
  $$renderer.component(($$renderer2) => {
651
686
  let { auth } = $$props;
652
687
  let credOpen = false;
653
- const authedCount = $17.derived(() => auth.filter((a) => a.available).length);
654
- const credState = $17.derived(() => authedCount() === auth.length ? "ok" : authedCount() === 0 ? "error" : "warn");
688
+ const authedCount = $18.derived(() => auth.filter((a) => a.available).length);
689
+ const credState = $18.derived(() => authedCount() === auth.length ? "ok" : authedCount() === 0 ? "error" : "warn");
655
690
  const credIcon = { ok: Link, warn: Triangle_alert, error: X };
656
- const CredIcon = $17.derived(() => credIcon[credState()]);
691
+ const CredIcon = $18.derived(() => credIcon[credState()]);
657
692
  function explainProvider(provider) {
658
693
  if (provider.available) {
659
694
  dist_default.success(`${provider.label} credentials come from ${provider.source}.`);
@@ -662,7 +697,7 @@ function CredMenu($$renderer, $$props) {
662
697
  dist_default.error(`No ${provider.label} credentials found${hint}.`);
663
698
  }
664
699
  }
665
- $$renderer2.push(`<div class="cred-menu svelte-vongf9"><button${$17.attr_class(`cred ${credState()}`, "svelte-vongf9")}${$17.attr("aria-expanded", credOpen)} aria-haspopup="menu" aria-label="Credentials" title="Credentials">`);
700
+ $$renderer2.push(`<div class="cred-menu svelte-vongf9"><button${$18.attr_class(`cred ${credState()}`, "svelte-vongf9")}${$18.attr("aria-expanded", credOpen)} aria-haspopup="menu" aria-label="Credentials" title="Credentials">`);
666
701
  if (CredIcon()) {
667
702
  $$renderer2.push("<!--[-->");
668
703
  CredIcon()($$renderer2, { size: 16 });
@@ -675,10 +710,10 @@ function CredMenu($$renderer, $$props) {
675
710
  if (credOpen) {
676
711
  $$renderer2.push("<!--[0-->");
677
712
  $$renderer2.push(`<div class="cred-dropdown panel svelte-vongf9" role="menu"><!--[-->`);
678
- const each_array = $17.ensure_array_like(auth);
713
+ const each_array = $18.ensure_array_like(auth);
679
714
  for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
680
715
  let provider = each_array[$$index];
681
- $$renderer2.push(`<button type="button" class="cred-row svelte-vongf9" role="menuitem"${$17.attr("title", provider.available ? `Credentials from ${provider.source}, copied into each new instance.` : `No credentials found on this computer${provider.hint ? ` \u2014 ${provider.hint}` : ""}.`)}><span${$17.attr_class(`dot ${provider.available ? "on" : "off"}`, "svelte-vongf9")}></span> <span class="cred-label">${$17.escape(provider.label)}</span> <span class="cred-state svelte-vongf9">${$17.escape(provider.available ? "Authorized" : "Not found")}</span></button>`);
716
+ $$renderer2.push(`<button type="button" class="cred-row svelte-vongf9" role="menuitem"${$18.attr("title", provider.available ? `Credentials from ${provider.source}, copied into each new instance.` : `No credentials found on this computer${provider.hint ? ` \u2014 ${provider.hint}` : ""}.`)}><span${$18.attr_class(`dot ${provider.available ? "on" : "off"}`, "svelte-vongf9")}></span> <span class="cred-label">${$18.escape(provider.label)}</span> <span class="cred-state svelte-vongf9">${$18.escape(provider.available ? "Authorized" : "Not found")}</span></button>`);
682
717
  }
683
718
  $$renderer2.push(`<!--]--></div>`);
684
719
  } else {
@@ -696,6 +731,8 @@ function TopBar($$renderer, $$props) {
696
731
  canDelete = false,
697
732
  ready = true,
698
733
  creating = false,
734
+ filter,
735
+ onFilter,
699
736
  onNew,
700
737
  onDeleteAll
701
738
  } = $$props;
@@ -718,6 +755,13 @@ function TopBar($$renderer, $$props) {
718
755
  $$renderer.push("<!--[-1-->");
719
756
  }
720
757
  $$renderer.push(`<!--]--> `);
758
+ if (filter && onFilter) {
759
+ $$renderer.push("<!--[0-->");
760
+ InstanceFilter($$renderer, { value: filter, onchange: onFilter });
761
+ } else {
762
+ $$renderer.push("<!--[-1-->");
763
+ }
764
+ $$renderer.push(`<!--]--> `);
721
765
  SettingsCog($$renderer, {});
722
766
  $$renderer.push(`<!----> `);
723
767
  CredMenu($$renderer, { auth });
@@ -739,7 +783,7 @@ function TopBar($$renderer, $$props) {
739
783
  onclick: onNew,
740
784
  disabled: !ready || creating,
741
785
  children: ($$renderer2) => {
742
- $$renderer2.push(`<!---->${$18.escape(creating ? "Creating\u2026" : "New instance")}`);
786
+ $$renderer2.push(`<!---->${$19.escape(creating ? "Creating\u2026" : "New instance")}`);
743
787
  },
744
788
  $$slots: { default: true }
745
789
  });
@@ -751,11 +795,24 @@ function DashboardView($$renderer, $$props) {
751
795
  $$renderer.component(($$renderer2) => {
752
796
  let { preflight, instances, loaded, pet } = $$props;
753
797
  let browserOpen = false;
798
+ let filter = "all";
754
799
  let creating = false;
755
800
  let actionError = null;
756
801
  let editingId = null;
757
802
  let editingName = "";
758
- const ready = $19.derived(() => preflight.docker && preflight.cli);
803
+ let pending = {};
804
+ const ready = $20.derived(() => preflight.docker && preflight.cli);
805
+ const visible = $20.derived(() => instances.filter((i) => {
806
+ if (filter === "active")
807
+ return i.status === "running" || i.status === "creating";
808
+ if (filter === "stopped")
809
+ return i.status === "stopped" || i.status === "error";
810
+ return true;
811
+ }));
812
+ function clearPending(id) {
813
+ const { [id]: _, ...rest } = pending;
814
+ pending = rest;
815
+ }
759
816
  async function createFrom(sourcePath, opts) {
760
817
  browserOpen = false;
761
818
  creating = true;
@@ -774,10 +831,14 @@ function DashboardView($$renderer, $$props) {
774
831
  return;
775
832
  if (action === "rebuild" && !confirm("Recreate this container and re-run setup? The workspace is kept."))
776
833
  return;
834
+ const since = instances.find((i) => i.id === id)?.status;
835
+ if (since)
836
+ pending = { ...pending, [id]: { action, since } };
777
837
  try {
778
838
  await apiPost(`/api/instances/${id}/${action}`, undefined, `Failed to ${action}`);
779
839
  } catch (err) {
780
840
  actionError = err.message;
841
+ clearPending(id);
781
842
  }
782
843
  }
783
844
  function startRename(instance) {
@@ -822,6 +883,8 @@ function DashboardView($$renderer, $$props) {
822
883
  canDelete: instances.length > 0,
823
884
  ready: ready(),
824
885
  creating,
886
+ filter,
887
+ onFilter: (v) => filter = v,
825
888
  onNew: () => browserOpen = true,
826
889
  onDeleteAll: deleteAll
827
890
  });
@@ -849,7 +912,7 @@ function DashboardView($$renderer, $$props) {
849
912
  $$renderer3.push(`<!--]--> `);
850
913
  if (actionError) {
851
914
  $$renderer3.push("<!--[0-->");
852
- $$renderer3.push(`<div class="banner error svelte-146pixd"><strong>Error.</strong> <span>${$19.escape(actionError)}</span></div>`);
915
+ $$renderer3.push(`<div class="banner error svelte-146pixd"><strong>Error.</strong> <span>${$20.escape(actionError)}</span></div>`);
853
916
  } else {
854
917
  $$renderer3.push("<!--[-1-->");
855
918
  }
@@ -871,15 +934,19 @@ function DashboardView($$renderer, $$props) {
871
934
  $$slots: { default: true }
872
935
  });
873
936
  $$renderer3.push(`<!----></div>`);
937
+ } else if (visible().length === 0) {
938
+ $$renderer3.push("<!--[2-->");
939
+ $$renderer3.push(`<div class="empty svelte-146pixd"><p class="empty-sub svelte-146pixd">No ${$20.escape(filter)} instances.</p></div>`);
874
940
  } else {
875
941
  $$renderer3.push("<!--[-1-->");
876
942
  $$renderer3.push(`<ul class="grid svelte-146pixd"><!--[-->`);
877
- const each_array = $19.ensure_array_like(instances);
943
+ const each_array = $20.ensure_array_like(visible());
878
944
  for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
879
945
  let instance = each_array[$$index];
880
946
  InstanceCard($$renderer3, {
881
947
  instance,
882
948
  editing: editingId === instance.id,
949
+ pending: pending[instance.id]?.action ?? null,
883
950
  onact: (action) => act(instance.id, action),
884
951
  onstartrename: () => startRename(instance),
885
952
  oncommitrename: () => commitRename(instance.id),
@@ -915,7 +982,7 @@ function DashboardView($$renderer, $$props) {
915
982
 
916
983
  // src/components/IdeBar.svelte
917
984
  import"svelte/internal/flags/async";
918
- import * as $20 from "svelte/internal/server";
985
+ import * as $21 from "svelte/internal/server";
919
986
  function IdeBar($$renderer, $$props) {
920
987
  $$renderer.component(($$renderer2) => {
921
988
  let {
@@ -934,10 +1001,10 @@ function IdeBar($$renderer, $$props) {
934
1001
  if (running.length > 0) {
935
1002
  $$renderer3.push("<!--[0-->");
936
1003
  $$renderer3.push(`<nav class="tabs svelte-r39acv"><!--[-->`);
937
- const each_array = $20.ensure_array_like(running);
1004
+ const each_array = $21.ensure_array_like(running);
938
1005
  for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
939
1006
  let inst = each_array[$$index];
940
- $$renderer3.push(`<div${$20.attr_class("tab svelte-r39acv", undefined, {
1007
+ $$renderer3.push(`<div${$21.attr_class("tab svelte-r39acv", undefined, {
941
1008
  active: inst.id === active,
942
1009
  "attn-done": inst.id !== active && attention[inst.id] === "done",
943
1010
  "attn-waiting": inst.id !== active && attention[inst.id] === "waiting"
@@ -946,12 +1013,12 @@ function IdeBar($$renderer, $$props) {
946
1013
  $$renderer3.push("<!--[0-->");
947
1014
  $$renderer3.push(`<div class="tab-label editing svelte-r39acv">`);
948
1015
  Avatar($$renderer3, { id: inst.id, name: inst.name, scale: 4 });
949
- $$renderer3.push(`<!----> <input class="tab-name-edit svelte-r39acv"${$20.attr("value", editingName)} autofocus=""/></div>`);
1016
+ $$renderer3.push(`<!----> <input class="tab-name-edit svelte-r39acv"${$21.attr("value", editingName)} autofocus=""/></div>`);
950
1017
  } else {
951
1018
  $$renderer3.push("<!--[-1-->");
952
- $$renderer3.push(`<button type="button" class="tab-label svelte-r39acv"${$20.attr("title", inst.name)}>`);
1019
+ $$renderer3.push(`<button type="button" class="tab-label svelte-r39acv"${$21.attr("title", inst.name)}>`);
953
1020
  Avatar($$renderer3, { id: inst.id, name: inst.name, scale: 4 });
954
- $$renderer3.push(`<!----> <span class="tab-name svelte-r39acv">${$20.escape(inst.name)}</span></button>`);
1021
+ $$renderer3.push(`<!----> <span class="tab-name svelte-r39acv">${$21.escape(inst.name)}</span></button>`);
955
1022
  }
956
1023
  $$renderer3.push(`<!--]--></div>`);
957
1024
  }
@@ -959,19 +1026,19 @@ function IdeBar($$renderer, $$props) {
959
1026
  } else {
960
1027
  $$renderer3.push("<!--[-1-->");
961
1028
  }
962
- $$renderer3.push(`<!--]--> <a class="cog svelte-r39acv"${$20.attr("href", withPopupMarker("/settings"))} target="_blank" rel="noopener noreferrer" title="Settings" aria-label="Settings">`);
1029
+ $$renderer3.push(`<!--]--> <a class="cog svelte-r39acv"${$21.attr("href", withPopupMarker("/settings"))} target="_blank" rel="noopener noreferrer" title="Settings" aria-label="Settings">`);
963
1030
  Settings($$renderer3, { size: 18 });
964
1031
  $$renderer3.push(`<!----></a>`);
965
1032
  },
966
1033
  $$slots: { default: true }
967
1034
  });
968
- $20.bind_props($$props, { editingName });
1035
+ $21.bind_props($$props, { editingName });
969
1036
  });
970
1037
  }
971
1038
 
972
1039
  // src/components/IdeLoader.svelte
973
1040
  import"svelte/internal/flags/async";
974
- import * as $21 from "svelte/internal/server";
1041
+ import * as $22 from "svelte/internal/server";
975
1042
  function IdeLoader($$renderer, $$props) {
976
1043
  $$renderer.component(($$renderer2) => {
977
1044
  let { speed = 1, stalledAfterMs, onoverride } = $$props;
@@ -980,14 +1047,14 @@ function IdeLoader($$renderer, $$props) {
980
1047
  const COLS = 22;
981
1048
  const BASE_TICK_MS = 140;
982
1049
  const FLIPS_PER_TICK = 7;
983
- const tickMs = $21.derived(() => Math.max(20, BASE_TICK_MS / speed));
1050
+ const tickMs = $22.derived(() => Math.max(20, BASE_TICK_MS / speed));
984
1051
  const seed = () => Array.from({ length: ROWS }, () => Array.from({ length: COLS }, () => Math.random() < 0.5 ? 0 : 1));
985
1052
  let grid = seed();
986
1053
  $$renderer2.push(`<div class="loader svelte-w5e143"><div class="grid svelte-w5e143" aria-hidden="true"><!--[-->`);
987
- const each_array = $21.ensure_array_like(grid);
1054
+ const each_array = $22.ensure_array_like(grid);
988
1055
  for (let i = 0, $$length = each_array.length;i < $$length; i++) {
989
1056
  let row = each_array[i];
990
- $$renderer2.push(`<div class="row svelte-w5e143">${$21.escape(row.join(""))}</div>`);
1057
+ $$renderer2.push(`<div class="row svelte-w5e143">${$22.escape(row.join(""))}</div>`);
991
1058
  }
992
1059
  $$renderer2.push(`<!--]--></div> <div class="label svelte-w5e143">Loading editor<span class="dot svelte-w5e143">.</span><span class="dot svelte-w5e143">.</span><span class="dot svelte-w5e143">.</span></div> `);
993
1060
  if (stalled) {
@@ -1022,7 +1089,7 @@ function AppShell($$renderer, $$props) {
1022
1089
  let livePreflight = preflight;
1023
1090
  let livePet = pet;
1024
1091
  let loaded = snapshot.length > 0;
1025
- const running = $22.derived(() => instances.filter((i) => i.status === "running"));
1092
+ const running = $23.derived(() => instances.filter((i) => i.status === "running"));
1026
1093
  let attention = Object.fromEntries(snapshot.map((i) => [i.id, i.attention]));
1027
1094
  let editingId = null;
1028
1095
  let editingName = "";
@@ -1049,9 +1116,9 @@ function AppShell($$renderer, $$props) {
1049
1116
  }
1050
1117
  }
1051
1118
  let path = initialPath;
1052
- const onIde = $22.derived(() => path.startsWith("/ide"));
1053
- const requestedId = $22.derived(() => path.startsWith("/ide/") ? path.slice("/ide/".length) : "");
1054
- const active = $22.derived(() => onIde() ? running().some((i) => i.id === requestedId()) ? requestedId() : running()[0]?.id ?? "" : "");
1119
+ const onIde = $23.derived(() => path.startsWith("/ide"));
1120
+ const requestedId = $23.derived(() => path.startsWith("/ide/") ? path.slice("/ide/".length) : "");
1121
+ const active = $23.derived(() => onIde() ? running().some((i) => i.id === requestedId()) ? requestedId() : running()[0]?.id ?? "" : "");
1055
1122
  function navigate(to) {
1056
1123
  if (to === path)
1057
1124
  return;
@@ -1067,7 +1134,7 @@ function AppShell($$renderer, $$props) {
1067
1134
  let $$settled = true;
1068
1135
  let $$inner_renderer;
1069
1136
  function $$render_inner($$renderer3) {
1070
- $$renderer3.push(`<div${$22.attr_class("app svelte-1duc7gd", undefined, { ide: onIde() })}>`);
1137
+ $$renderer3.push(`<div${$23.attr_class("app svelte-1duc7gd", undefined, { ide: onIde() })}>`);
1071
1138
  if (onIde()) {
1072
1139
  $$renderer3.push("<!--[0-->");
1073
1140
  IdeBar($$renderer3, {
@@ -1091,16 +1158,16 @@ function AppShell($$renderer, $$props) {
1091
1158
  $$renderer3.push("<!--[-1-->");
1092
1159
  DashboardView($$renderer3, { preflight: livePreflight, instances, loaded, pet: livePet });
1093
1160
  }
1094
- $$renderer3.push(`<!--]--> <div${$22.attr_class("panes svelte-1duc7gd", undefined, { hidden: !onIde() })}><!--[-->`);
1095
- const each_array = $22.ensure_array_like(running());
1161
+ $$renderer3.push(`<!--]--> <div${$23.attr_class("panes svelte-1duc7gd", undefined, { hidden: !onIde() })}><!--[-->`);
1162
+ const each_array = $23.ensure_array_like(running());
1096
1163
  for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
1097
1164
  let inst = each_array[$$index];
1098
1165
  if (visited.has(inst.id)) {
1099
1166
  $$renderer3.push("<!--[0-->");
1100
- $$renderer3.push(`<div${$22.attr_class("pane svelte-1duc7gd", undefined, { active: inst.id === active() })}>`);
1167
+ $$renderer3.push(`<div${$23.attr_class("pane svelte-1duc7gd", undefined, { active: inst.id === active() })}>`);
1101
1168
  if (mountable(inst.id)) {
1102
1169
  $$renderer3.push("<!--[0-->");
1103
- $$renderer3.push(`<iframe${$22.attr("src", ideUrl(inst))}${$22.attr("title", inst.name)} class="svelte-1duc7gd" onload="this.__e=event"></iframe>`);
1170
+ $$renderer3.push(`<iframe${$23.attr("src", ideUrl(inst))}${$23.attr("title", inst.name)} class="svelte-1duc7gd" onload="this.__e=event"></iframe>`);
1104
1171
  } else {
1105
1172
  $$renderer3.push("<!--[-1-->");
1106
1173
  }
@@ -1153,7 +1220,7 @@ function App($$renderer, $$props) {
1153
1220
  let { preflight, initialPath, snapshot, pet } = $$props;
1154
1221
  if (true) {
1155
1222
  let failed = function($$renderer3, error) {
1156
- $$renderer3.push(`<mochi-island-failure data-component="AppShell"${$23.attr("data-message", error.message)}></mochi-island-failure>`);
1223
+ $$renderer3.push(`<mochi-island-failure data-component="AppShell"${$24.attr("data-message", error.message)}></mochi-island-failure>`);
1157
1224
  };
1158
1225
  $$renderer2.push("<!--[0-->");
1159
1226
  $$renderer2.boundary({ failed }, ($$renderer3) => {
@@ -1161,7 +1228,7 @@ function App($$renderer, $$props) {
1161
1228
  {
1162
1229
  HydratableBoundary($$renderer3, {
1163
1230
  children: ($$renderer4) => {
1164
- $$renderer4.push(`<mochi-hydratable-island component-name="AppShell_2rtnxn6pgp2rh" component-url="__MOCHI_COMPONENT_URL__AppShell_2rtnxn6pgp2rh__"${$23.attr("props-ref", emitIslandProps({ preflight, initialPath, snapshot, pet }))}>`);
1231
+ $$renderer4.push(`<mochi-hydratable-island component-name="AppShell_2rtnxn6pgp2rh" component-url="__MOCHI_COMPONENT_URL__AppShell_2rtnxn6pgp2rh__"${$24.attr("props-ref", emitIslandProps({ preflight, initialPath, snapshot, pet }))}>`);
1165
1232
  $$renderer4.push(`<!--[-->`);
1166
1233
  {
1167
1234
  AppShell($$renderer4, { preflight, initialPath, snapshot, pet });
@@ -4,13 +4,14 @@ import {
4
4
  Avatar,
5
5
  Button,
6
6
  COLS,
7
+ GRAY,
7
8
  OFF,
8
9
  ON,
9
10
  ROWS,
10
11
  Toaster,
11
12
  avatars,
12
13
  dist_default
13
- } from "./chunk-dfe2km6a.js";
14
+ } from "./chunk-q8rbesaw.js";
14
15
  import {
15
16
  HydratableBoundary,
16
17
  Icon,
@@ -20,11 +21,11 @@ import"./chunk-we0ggtws.js";
20
21
 
21
22
  // src/pages/Avatars.svelte
22
23
  import"svelte/internal/flags/async";
23
- import * as $7 from "svelte/internal/server";
24
+ import * as $8 from "svelte/internal/server";
24
25
 
25
26
  // src/components/AvatarsView.svelte
26
27
  import"svelte/internal/flags/async";
27
- import * as $6 from "svelte/internal/server";
28
+ import * as $7 from "svelte/internal/server";
28
29
 
29
30
  // src/components/AvatarEditor.svelte
30
31
  import"svelte/internal/flags/async";
@@ -91,6 +92,20 @@ function External_link($$renderer, $$props) {
91
92
  ];
92
93
  Icon($$renderer, $4.spread_props([{ name: "external-link" }, props, { iconNode }]));
93
94
  }
95
+ // src/avatars/editor.ts
96
+ var MODES = [
97
+ { id: "black", label: "Black" },
98
+ { id: "gray", label: "Gray" },
99
+ { id: "cycle", label: "Cycle" }
100
+ ];
101
+ function nextValue(mode, current) {
102
+ if (mode === "black")
103
+ return current === ON ? OFF : ON;
104
+ if (mode === "gray")
105
+ return current === GRAY ? OFF : GRAY;
106
+ return current === OFF ? GRAY : current === GRAY ? ON : OFF;
107
+ }
108
+
94
109
  // src/avatars/serialize.ts
95
110
  var REPO_URL = "https://github.com/khromov/codebay";
96
111
  function normalizeName(raw) {
@@ -101,7 +116,8 @@ function cellsToPixels(cells) {
101
116
  for (let r = 0;r < ROWS; r++) {
102
117
  let row = "";
103
118
  for (let c = 0;c < COLS; c++) {
104
- row += cells[r * COLS + c] === ON ? "#" : ".";
119
+ const cell = cells[r * COLS + c];
120
+ row += cell === ON ? "#" : cell === GRAY ? "+" : ".";
105
121
  }
106
122
  rows.push(row);
107
123
  }
@@ -137,7 +153,7 @@ function toIssueUrl(art) {
137
153
  toModuleSource(art).trimEnd(),
138
154
  "```",
139
155
  "",
140
- "_It should satisfy `src/avatars/avatars.test.ts`: exactly 8\xD78, only `#`/`.` pixels, unique name._"
156
+ "_It should satisfy `src/avatars/avatars.test.ts`: exactly 8\xD78, only `#`/`+`/`.` pixels, unique name._"
141
157
  ].join(`
142
158
  `);
143
159
  const params = new URLSearchParams({ title, body });
@@ -152,7 +168,18 @@ function AvatarEditor($$renderer, $$props) {
152
168
  let avatarName = "";
153
169
  const slug = $5.derived(() => normalizeName(avatarName));
154
170
  const art = $5.derived(() => ({ name: slug() || "my-avatar", pixels: cellsToPixels(cells) }));
155
- const canContribute = $5.derived(() => slug().length > 0 && cells.some((c) => c === ON));
171
+ const canContribute = $5.derived(() => slug().length > 0 && cells.some((c) => c !== OFF));
172
+ let mode = "cycle";
173
+ let modeButtons = [];
174
+ function onModeKeydown(e, i) {
175
+ const dir = e.key === "ArrowRight" || e.key === "ArrowDown" ? 1 : e.key === "ArrowLeft" || e.key === "ArrowUp" ? -1 : 0;
176
+ if (dir === 0)
177
+ return;
178
+ e.preventDefault();
179
+ const next = (i + dir + MODES.length) % MODES.length;
180
+ mode = MODES[next].id;
181
+ modeButtons[next]?.focus();
182
+ }
156
183
  let gridEl = null;
157
184
  let painting = false;
158
185
  let paintValue = ON;
@@ -173,7 +200,7 @@ function AvatarEditor($$renderer, $$props) {
173
200
  return;
174
201
  e.currentTarget.setPointerCapture?.(e.pointerId);
175
202
  painting = true;
176
- paintValue = cells[i] === ON ? OFF : ON;
203
+ paintValue = nextValue(mode, cells[i]);
177
204
  cells[i] = paintValue;
178
205
  }
179
206
  function onpointermove(e) {
@@ -190,7 +217,7 @@ function AvatarEditor($$renderer, $$props) {
190
217
  cells = Array(ROWS * COLS).fill(OFF);
191
218
  }
192
219
  function invert() {
193
- cells = cells.map((c) => c === ON ? OFF : ON);
220
+ cells = cells.map((c) => c === ON ? OFF : c === OFF ? ON : c);
194
221
  }
195
222
  async function copyModule() {
196
223
  try {
@@ -210,13 +237,19 @@ function AvatarEditor($$renderer, $$props) {
210
237
  const each_array_1 = $5.ensure_array_like(cells);
211
238
  for (let i = 0, $$length = each_array_1.length;i < $$length; i++) {
212
239
  let cell = each_array_1[i];
213
- $$renderer2.push(`<span${$5.attr_class("cell svelte-qu6vp4", undefined, { on: cell === ON })}></span>`);
240
+ $$renderer2.push(`<span${$5.attr_class("cell svelte-qu6vp4", undefined, { on: cell === ON, gray: cell === GRAY })}></span>`);
214
241
  }
215
242
  $$renderer2.push(`<!--]--></div></div> <div class="side svelte-qu6vp4"><div class="preview"><div class="preview-label svelte-qu6vp4">Preview</div> <div class="preview-row svelte-qu6vp4">`);
216
243
  Avatar($$renderer2, { art: art(), name: art().name, scale: 6 });
217
244
  $$renderer2.push(`<!----> `);
218
245
  Avatar($$renderer2, { art: art(), name: art().name, scale: 3 });
219
- $$renderer2.push(`<!----></div></div> <label class="name-field svelte-qu6vp4"><span class="preview-label svelte-qu6vp4">Name</span> <input type="text"${$5.attr("value", avatarName)}${$5.attr("placeholder", namePlaceholder)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off" maxlength="24" class="svelte-qu6vp4"/></label> <div class="tools svelte-qu6vp4">`);
246
+ $$renderer2.push(`<!----></div></div> <label class="name-field svelte-qu6vp4"><span class="preview-label svelte-qu6vp4">Name</span> <input type="text"${$5.attr("value", avatarName)}${$5.attr("placeholder", namePlaceholder)} spellcheck="false" autocapitalize="off" autocorrect="off" autocomplete="off" maxlength="24" class="svelte-qu6vp4"/></label> <div class="mode-field svelte-qu6vp4"><span class="preview-label svelte-qu6vp4">Mode</span> <div class="modes svelte-qu6vp4" role="radiogroup" aria-label="Drawing mode"><!--[-->`);
247
+ const each_array_2 = $5.ensure_array_like(MODES);
248
+ for (let i = 0, $$length = each_array_2.length;i < $$length; i++) {
249
+ let m = each_array_2[i];
250
+ $$renderer2.push(`<button type="button"${$5.attr_class("mode svelte-qu6vp4", undefined, { active: mode === m.id })} role="radio"${$5.attr("aria-checked", mode === m.id)}${$5.attr("tabindex", mode === m.id ? 0 : -1)}>${$5.escape(m.label)}</button>`);
251
+ }
252
+ $$renderer2.push(`<!--]--></div></div> <div class="tools svelte-qu6vp4">`);
220
253
  Button($$renderer2, {
221
254
  size: "sm",
222
255
  icon: Eraser,
@@ -265,6 +298,24 @@ function AvatarEditor($$renderer, $$props) {
265
298
  });
266
299
  }
267
300
 
301
+ // node_modules/@lucide/svelte/dist/icons/bot.svelte
302
+ import"svelte/internal/flags/async";
303
+ import * as $6 from "svelte/internal/server";
304
+ function Bot($$renderer, $$props) {
305
+ let { $$slots, $$events, ...props } = $$props;
306
+ const iconNode = [
307
+ ["path", { d: "M12 8V4H8" }],
308
+ [
309
+ "rect",
310
+ { width: "16", height: "12", x: "4", y: "8", rx: "2" }
311
+ ],
312
+ ["path", { d: "M2 14h2" }],
313
+ ["path", { d: "M20 14h2" }],
314
+ ["path", { d: "M15 13v2" }],
315
+ ["path", { d: "M9 13v2" }]
316
+ ];
317
+ Icon($$renderer, $6.spread_props([{ name: "bot" }, props, { iconNode }]));
318
+ }
268
319
  // src/components/AvatarsView.svelte
269
320
  function AvatarsView($$renderer, $$props) {
270
321
  $$renderer.component(($$renderer2) => {
@@ -278,13 +329,22 @@ function AvatarsView($$renderer, $$props) {
278
329
  });
279
330
  $$renderer2.push(`<!----> <main class="content svelte-fkq7sr">`);
280
331
  AvatarEditor($$renderer2, { namePlaceholder });
281
- $$renderer2.push(`<!----> <section class="catalog svelte-fkq7sr"><header class="svelte-fkq7sr"><h2 class="svelte-fkq7sr">The set</h2> <p class="svelte-fkq7sr">${$6.escape(avatars.length)} hand-crafted 8\xD78 sprites</p></header> <ul class="svelte-fkq7sr"><!--[-->`);
282
- const each_array = $6.ensure_array_like(avatars);
332
+ $$renderer2.push(`<!----> <section class="catalog svelte-fkq7sr"><header class="svelte-fkq7sr"><h2 class="svelte-fkq7sr">The set</h2> <p class="svelte-fkq7sr">${$7.escape(avatars.length)} hand-crafted 8\xD78 sprites</p></header> <ul class="svelte-fkq7sr"><!--[-->`);
333
+ const each_array = $7.ensure_array_like(avatars);
283
334
  for (let $$index = 0, $$length = each_array.length;$$index < $$length; $$index++) {
284
335
  let art = each_array[$$index];
285
336
  $$renderer2.push(`<li class="svelte-fkq7sr">`);
286
337
  Avatar($$renderer2, { art, name: art.name, scale: 8, interactive: true });
287
- $$renderer2.push(`<!----> <span class="label svelte-fkq7sr">${$6.escape(art.name)}</span></li>`);
338
+ $$renderer2.push(`<!----> <span class="label svelte-fkq7sr">`);
339
+ if (art.robot) {
340
+ $$renderer2.push("<!--[0-->");
341
+ $$renderer2.push(`<span class="robot-mark svelte-fkq7sr" title="AI-generated">`);
342
+ Bot($$renderer2, { size: 11 });
343
+ $$renderer2.push(`<!----></span>`);
344
+ } else {
345
+ $$renderer2.push("<!--[-1-->");
346
+ }
347
+ $$renderer2.push(`<!--]--> ${$7.escape(art.name)}</span></li>`);
288
348
  }
289
349
  $$renderer2.push(`<!--]--></ul></section></main></div> `);
290
350
  Toaster($$renderer2, {
@@ -302,7 +362,7 @@ function Avatars($$renderer, $$props) {
302
362
  let { namePlaceholder } = $$props;
303
363
  if (true) {
304
364
  let failed = function($$renderer3, error) {
305
- $$renderer3.push(`<mochi-island-failure data-component="AvatarsView"${$7.attr("data-message", error.message)}></mochi-island-failure>`);
365
+ $$renderer3.push(`<mochi-island-failure data-component="AvatarsView"${$8.attr("data-message", error.message)}></mochi-island-failure>`);
306
366
  };
307
367
  $$renderer2.push("<!--[0-->");
308
368
  $$renderer2.boundary({ failed }, ($$renderer3) => {
@@ -310,7 +370,7 @@ function Avatars($$renderer, $$props) {
310
370
  {
311
371
  HydratableBoundary($$renderer3, {
312
372
  children: ($$renderer4) => {
313
- $$renderer4.push(`<mochi-hydratable-island component-name="AvatarsView_257s9yq1wwr4f" component-url="__MOCHI_COMPONENT_URL__AvatarsView_257s9yq1wwr4f__"${$7.attr("props-ref", emitIslandProps({ namePlaceholder }))}>`);
373
+ $$renderer4.push(`<mochi-hydratable-island component-name="AvatarsView_257s9yq1wwr4f" component-url="__MOCHI_COMPONENT_URL__AvatarsView_257s9yq1wwr4f__"${$8.attr("props-ref", emitIslandProps({ namePlaceholder }))}>`);
314
374
  $$renderer4.push(`<!--[-->`);
315
375
  {
316
376
  AvatarsView($$renderer4, { namePlaceholder });