boo-flash 0.1.6 → 0.1.8

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/app.js CHANGED
@@ -2547,12 +2547,37 @@ var palette = (() => {
2547
2547
  // src/App.tsx
2548
2548
  import { TextAttributes as TextAttributes2 } from "@opentui/core";
2549
2549
 
2550
+ // ../../apps/shared/BooLogoData.ts
2551
+ var LIGHT_COLORS = { inkColor: "#002B8F", accentColor: "#00E5FF", highlightColor: "#D0FAFF" };
2552
+ var DARK_COLORS = { inkColor: "#8EEDFC", accentColor: "#235664", highlightColor: "#173D4B" };
2553
+ var PATTERNS = {
2554
+ ".": [" ", 0, 0],
2555
+ A: [" ", 1, 1],
2556
+ B: ["\u2582", 1, 0],
2557
+ C: [" ", 2, 2],
2558
+ D: [" ", 3, 3],
2559
+ E: ["\u{1FB85}", 1, 0]
2560
+ };
2561
+ var ROWS = [
2562
+ "....AAAAAAAAAAAABB............................",
2563
+ "BBAACCDD........EEBB..........................",
2564
+ "AACCDD............AA....................AAAAAA",
2565
+ "AACCCCDD..BB..BB..AA....AA......AAAAAA..AA..AA",
2566
+ "EEAACCDD..AA..AA..AA....AAAAAA..AA..AA..AACCAA",
2567
+ "..AACCDD..AA..AA..AA....AA..AA..AACCAA..AACCAA",
2568
+ "..AACCDD..EE..EE..AA....AACCAA..AACCAA..AACCAA",
2569
+ "..AACCDD..........AA....AACCAA..AACCAA..AACCAA",
2570
+ "..AACCDD..........AA....AACCAA..AACCAA..AACCAA",
2571
+ "..AACCDD..........AA....AAAAAA..AAAAAA..AAAAAA",
2572
+ "..AACCAA..AA..AA..AA..........................",
2573
+ "....AA..AA..AA..AA............................"
2574
+ ];
2575
+
2550
2576
  // src/backend.ts
2551
2577
  import { createHash as createHash2 } from "node:crypto";
2552
2578
  import { chmod as chmod2, mkdtemp, open as open2, rm } from "node:fs/promises";
2553
2579
  import { tmpdir as tmpdir4 } from "node:os";
2554
2580
  import { dirname as dirname3, join as join5 } from "node:path";
2555
- import { setTimeout as delay } from "node:timers/promises";
2556
2581
  import { fileURLToPath as fileURLToPath2 } from "node:url";
2557
2582
 
2558
2583
  // src/backends/macos.ts
@@ -3567,105 +3592,40 @@ async function discoverCandidates(signal) {
3567
3592
  ], signal, { limit: 1024 ** 2 })));
3568
3593
  }
3569
3594
  var FlashBackend = class {
3570
- constructor(demo2) {
3571
- this.demo = demo2;
3572
- }
3573
- demo;
3574
- demoInstalled = false;
3575
3595
  requirePlatform() {
3576
3596
  if (process.platform === "darwin") return platform;
3577
3597
  if (process.platform === "linux") return platform2;
3578
- throw new Error("Boo Flash supports macOS and Linux. Use --demo for a non-writing preview.");
3598
+ throw new Error("Boo Flash supports macOS and Linux.");
3579
3599
  }
3580
3600
  get platformLabel() {
3581
- return this.demo ? "DEMO - no disks written" : this.requirePlatform().label;
3601
+ return this.requirePlatform().label;
3582
3602
  }
3583
3603
  get successTitle() {
3584
- return this.demo ? "Demo complete" : this.requirePlatform().successTitle;
3604
+ return this.requirePlatform().successTitle;
3585
3605
  }
3586
3606
  get successDetail() {
3587
- return this.demo ? "Simulated success only. No USB was written or ejected." : this.requirePlatform().successDetail;
3607
+ return this.requirePlatform().successDetail;
3588
3608
  }
3589
3609
  async clearCache(signal) {
3590
- if (this.demo) return "Demo only: no cached images or USB contents were changed.";
3591
3610
  return clearCachedImages(signal);
3592
3611
  }
3593
3612
  dependencies() {
3594
- if (!this.demo) return this.requirePlatform().dependencies();
3595
- const setup = this.demo.startsWith("setup") || this.demo === "no-homebrew";
3596
- return {
3597
- missing: !setup || this.demoInstalled ? [] : ["zstd"],
3598
- installer: this.demo === "no-homebrew" ? null : "Homebrew",
3599
- guidance: "Demo dependency guidance."
3600
- };
3613
+ return this.requirePlatform().dependencies();
3601
3614
  }
3602
3615
  async installDependencies(approved, signal, terminal) {
3603
- if (!this.demo) {
3604
- return terminal(() => this.requirePlatform().installDependencies(approved, signal));
3605
- }
3606
- await delay(2e3, void 0, { signal });
3607
- return terminal(async () => {
3608
- process.stdout.write("\nDEMO dependency setup: no software is installed.\nSimulating Homebrew terminal handoff. Ctrl-C cancels and quits.\n");
3609
- await delay(3e3);
3610
- if (this.demo === "setup-interrupted") process.stdout.write("Simulated Homebrew interruption result, without signaling Boo Flash. Quitting.\n");
3611
- if (signal.aborted || this.demo === "setup-interrupted") return "cancelled";
3612
- if (this.demo === "setup-error") throw new Error("Simulated Homebrew failure. No software was installed. Resolve the reported issue, then refresh to retry.");
3613
- this.demoInstalled = true;
3614
- return "installed";
3615
- });
3616
+ return terminal(() => this.requirePlatform().installDependencies(approved, signal));
3616
3617
  }
3617
3618
  async catalog(signal) {
3618
- if (!this.demo) return discoverImages(signal);
3619
- await delay(350, void 0, { signal });
3620
- return { run: 149, version: "0.1.0+149", revision: "9b7574859120add5a1a478bc7923aeb1629be4ba", timestamp: new Date(Date.now() - 10 * 60 * 1e3).toISOString(), images: profiles.map((profile, index) => ({
3621
- profile,
3622
- id: index,
3623
- name: `demo-${profile}`,
3624
- bytes: 1083197973,
3625
- digest: "demo"
3626
- })) };
3619
+ return discoverImages(signal);
3627
3620
  }
3628
3621
  async candidates(signal) {
3629
- if (!this.demo) return discoverCandidates(signal);
3630
- const catalog = await this.catalog(signal);
3631
- return this.demo === "empty" ? [] : [{
3632
- ...catalog,
3633
- timestamp: new Date(Date.now() - 5 * 60 * 1e3).toISOString(),
3634
- images: [catalog.images[0]],
3635
- candidate: { number: 1 }
3636
- }];
3622
+ return discoverCandidates(signal);
3637
3623
  }
3638
3624
  async disks(signal, staging = tmpdir4(), unmounted) {
3639
- if (this.demo) {
3640
- await delay(250, void 0, { signal });
3641
- return this.demo === "empty" ? [] : [
3642
- { id: "demo-usb-a", name: "SanDisk Ultra USB 3.0", bytes: 32 * 1024 ** 3, identity: "demo-a" },
3643
- { id: "demo-usb-b", name: "Kingston DataTraveler", bytes: 64 * 1024 ** 3, identity: "demo-b" }
3644
- ];
3645
- }
3646
3625
  if (process.getuid?.() === 0) throw new Error(`Run Boo Flash on ${this.requirePlatform().id === "macos" ? "macOS" : "Linux"} as your normal user, not with sudo.`);
3647
3626
  return this.requirePlatform().disks(signal, moduleDirectory, staging, unmounted);
3648
3627
  }
3649
3628
  async flash(catalog, image, disk, signal, update, authorize2) {
3650
- if (this.demo) {
3651
- if (!disk.id.startsWith("demo-") || image.digest !== "demo") throw new Error("Invalid demo selection.");
3652
- for (const stage of ["Downloading", "Verifying", "Unmounting", "Writing", "Flushing", "Ejecting"]) {
3653
- const total = stage === "Downloading" ? image.bytes : stage === "Writing" ? 8 * 1024 ** 3 : void 0;
3654
- for (let i = 0; i <= (total ? 30 : 5); i++) {
3655
- signal.throwIfAborted();
3656
- update({
3657
- stage,
3658
- detail: "Simulated activity. No disk commands are run.",
3659
- total,
3660
- bytes: total ? Math.round(total * i / 30) : void 0,
3661
- speed: total ? total / 3 : void 0
3662
- });
3663
- await delay(100, void 0, { signal });
3664
- if (this.demo === "error" && stage === "Writing" && i === 13) throw new Error("Demo write failure. No disks were written or ejected. Refresh to choose again.");
3665
- }
3666
- }
3667
- return;
3668
- }
3669
3629
  const platform3 = this.requirePlatform();
3670
3630
  if (process.getuid?.() === 0) throw new Error(`Run Boo Flash on ${platform3.id === "macos" ? "macOS" : "Linux"} as your normal user, not with sudo.`);
3671
3631
  if (!diskID3.test(disk.id) || !catalog.images.includes(image) || !profiles.includes(image.profile) || !positive(image.id) || !positive(image.bytes) || !sha256.test(image.digest)) throw new Error("Invalid flash selection.");
@@ -3790,13 +3750,54 @@ var FlashBackend = class {
3790
3750
  }
3791
3751
  }
3792
3752
  async authorize(signal) {
3793
- if (this.demo) return;
3794
3753
  if (process.getuid?.() === 0) throw new Error("Run Boo Flash as your normal user, not with sudo.");
3795
3754
  await this.requirePlatform().authorize(signal);
3796
3755
  }
3797
3756
  };
3798
3757
 
3758
+ // package.json
3759
+ var version = "0.1.8";
3760
+
3799
3761
  // src/App.tsx
3762
+ function FlashLogo() {
3763
+ const theme = themes.find((entry) => entry.ui === palette && !entry.error)?.kind === "Light" ? LIGHT_COLORS : DARK_COLORS;
3764
+ const colors2 = [palette.background, theme.inkColor, theme.accentColor, theme.highlightColor];
3765
+ const rows = Array.from({
3766
+ length: 6
3767
+ }, (_, y) => Array.from({
3768
+ length: 23
3769
+ }, (_2, x) => [PATTERNS[ROWS[y * 2][x * 2]][1], PATTERNS[ROWS[y * 2 + 1][x * 2]][1]]));
3770
+ return (() => {
3771
+ var _el$ = createElement("box");
3772
+ setProp(_el$, "id", "flash-logo");
3773
+ setProp(_el$, "width", 23);
3774
+ setProp(_el$, "height", 6);
3775
+ setProp(_el$, "flexShrink", 0);
3776
+ setProp(_el$, "marginBottom", 1);
3777
+ insert(_el$, createComponent2(For, {
3778
+ each: rows,
3779
+ children: (row) => (() => {
3780
+ var _el$2 = createElement("text");
3781
+ setProp(_el$2, "height", 1);
3782
+ setProp(_el$2, "wrapMode", "none");
3783
+ insert(_el$2, createComponent2(For, {
3784
+ each: row,
3785
+ children: ([top, bottom]) => (() => {
3786
+ var _el$3 = createElement("span");
3787
+ insert(_el$3, top === bottom ? " " : "\u2580");
3788
+ effect((_$p) => setProp(_el$3, "style", {
3789
+ fg: colors2[top],
3790
+ bg: colors2[bottom]
3791
+ }, _$p));
3792
+ return _el$3;
3793
+ })()
3794
+ }));
3795
+ return _el$2;
3796
+ })()
3797
+ }));
3798
+ return _el$;
3799
+ })();
3800
+ }
3800
3801
  function App(props) {
3801
3802
  const renderer = useRenderer();
3802
3803
  const dimensions = useTerminalDimensions();
@@ -3845,7 +3846,12 @@ function App(props) {
3845
3846
  const visible = () => dimensions().width >= 40 && dimensions().height >= 16;
3846
3847
  const options = () => screen() === "profile" ? 5 : screen() === "cleared" ? 1 : screen() === "candidates" ? Math.max(1, candidates().length) : screen() === "disks" ? disks3().length : 2;
3847
3848
  const percent = () => progress().total ? Math.min(100, Math.floor((progress().bytes ?? 0) / progress().total * 100)) : void 0;
3848
- const path = (d) => props.backend.demo ? d.id : `/dev/${d.id}`;
3849
+ const path = (d) => `/dev/${d.id}`;
3850
+ const selection = () => {
3851
+ const c = catalog(), i = image();
3852
+ if (!c || !i) return "";
3853
+ return `Boo ${c.version}${c.candidate ? ` candidate #${c.candidate.number}` : ""} / ${i.profile.toUpperCase()}${c.candidate ? ` / ${c.revision.slice(0, 7)}` : ""}`;
3854
+ };
3849
3855
  const operation = (work) => {
3850
3856
  controller = new AbortController();
3851
3857
  setStopping(false);
@@ -3856,7 +3862,7 @@ function App(props) {
3856
3862
  } catch (e) {
3857
3863
  if (!closing) {
3858
3864
  const setup = screen() === "installing";
3859
- setError(controller.signal.aborted && setup ? "Setup cancelled. Refresh to check what is still missing." : controller.signal.aborted && props.backend.demo ? "Demo cancelled. No disks were written or ejected." : e instanceof Error ? e.message : "Operation failed. Refresh and try again.");
3865
+ setError(controller.signal.aborted && setup ? "Setup cancelled. Refresh to check what is still missing." : e instanceof Error ? e.message : "Operation failed. Refresh and try again.");
3860
3866
  if (setup) setDependencies(props.backend.dependencies());
3861
3867
  setScreen(setup ? "setup" : "error");
3862
3868
  setCursor(0);
@@ -3881,6 +3887,7 @@ function App(props) {
3881
3887
  const refresh = () => {
3882
3888
  setError("");
3883
3889
  setCatalog(void 0);
3890
+ setImage(void 0);
3884
3891
  setDisk(void 0);
3885
3892
  setScreen("profile");
3886
3893
  setCursor(0);
@@ -3910,6 +3917,7 @@ function App(props) {
3910
3917
  if (state.missing.length) {
3911
3918
  setDependencies(state);
3912
3919
  setCatalog(void 0);
3920
+ setImage(void 0);
3913
3921
  setScreen("setup");
3914
3922
  setCursor(0);
3915
3923
  return;
@@ -4013,6 +4021,9 @@ function App(props) {
4013
4021
  await props.backend.flash(catalog(), image(), disk(), signal, setProgress, async () => {
4014
4022
  renderer.suspend();
4015
4023
  try {
4024
+ process.stdout.write(`
4025
+ ${selection()}
4026
+ `);
4016
4027
  await props.backend.authorize(signal);
4017
4028
  } finally {
4018
4029
  renderer.resume();
@@ -4059,31 +4070,31 @@ function App(props) {
4059
4070
  if (key.name === "return" && !key.repeated) activate();
4060
4071
  });
4061
4072
  const row = (label, detail, index, danger = false, detailWhenTight = false) => (() => {
4062
- var _el$ = createElement("box"), _el$2 = createElement("text");
4063
- insertNode(_el$, _el$2);
4064
- setProp(_el$, "paddingX", 1);
4065
- setProp(_el$, "flexShrink", 0);
4066
- setProp(_el$2, "wrapMode", "none");
4067
- insert(_el$2, () => cursor() === index ? "> " : " ", null);
4068
- insert(_el$2, label, null);
4069
- insert(_el$, createComponent2(Show, {
4073
+ var _el$4 = createElement("box"), _el$5 = createElement("text");
4074
+ insertNode(_el$4, _el$5);
4075
+ setProp(_el$4, "paddingX", 1);
4076
+ setProp(_el$4, "flexShrink", 0);
4077
+ setProp(_el$5, "wrapMode", "none");
4078
+ insert(_el$5, () => cursor() === index ? "> " : " ", null);
4079
+ insert(_el$5, label, null);
4080
+ insert(_el$4, createComponent2(Show, {
4070
4081
  get when() {
4071
4082
  return detail && (!tight() || detailWhenTight);
4072
4083
  },
4073
4084
  get children() {
4074
- var _el$3 = createElement("text");
4075
- setProp(_el$3, "wrapMode", "none");
4076
- insert(_el$3, ` ${detail}`);
4077
- effect((_$p) => setProp(_el$3, "fg", palette.muted, _$p));
4078
- return _el$3;
4085
+ var _el$6 = createElement("text");
4086
+ setProp(_el$6, "wrapMode", "none");
4087
+ insert(_el$6, ` ${detail}`);
4088
+ effect((_$p) => setProp(_el$6, "fg", palette.muted, _$p));
4089
+ return _el$6;
4079
4090
  }
4080
4091
  }), null);
4081
4092
  effect((_p$) => {
4082
4093
  var _v$ = detail && (!tight() || detailWhenTight) ? compact() ? 2 : 3 : 1, _v$2 = cursor() === index ? palette.selected : palette.panel, _v$3 = danger ? palette.warning : cursor() === index ? palette.accent : palette.foreground, _v$4 = TextAttributes2.BOLD;
4083
- _v$ !== _p$.e && (_p$.e = setProp(_el$, "height", _v$, _p$.e));
4084
- _v$2 !== _p$.t && (_p$.t = setProp(_el$, "backgroundColor", _v$2, _p$.t));
4085
- _v$3 !== _p$.a && (_p$.a = setProp(_el$2, "fg", _v$3, _p$.a));
4086
- _v$4 !== _p$.o && (_p$.o = setProp(_el$2, "attributes", _v$4, _p$.o));
4094
+ _v$ !== _p$.e && (_p$.e = setProp(_el$4, "height", _v$, _p$.e));
4095
+ _v$2 !== _p$.t && (_p$.t = setProp(_el$4, "backgroundColor", _v$2, _p$.t));
4096
+ _v$3 !== _p$.a && (_p$.a = setProp(_el$5, "fg", _v$3, _p$.a));
4097
+ _v$4 !== _p$.o && (_p$.o = setProp(_el$5, "attributes", _v$4, _p$.o));
4087
4098
  return _p$;
4088
4099
  }, {
4089
4100
  e: void 0,
@@ -4091,92 +4102,112 @@ function App(props) {
4091
4102
  a: void 0,
4092
4103
  o: void 0
4093
4104
  });
4094
- return _el$;
4105
+ return _el$4;
4095
4106
  })();
4096
4107
  return (() => {
4097
- var _el$4 = createElement("box"), _el$5 = createElement("box"), _el$6 = createElement("box"), _el$7 = createElement("text"), _el$9 = createElement("text"), _el$0 = createElement("box"), _el$1 = createElement("box"), _el$87 = createElement("text");
4098
- insertNode(_el$4, _el$5);
4099
- setProp(_el$4, "width", "100%");
4100
- setProp(_el$4, "height", "100%");
4101
- setProp(_el$4, "justifyContent", "center");
4102
- setProp(_el$4, "alignItems", "center");
4103
- insertNode(_el$5, _el$6);
4104
- insertNode(_el$5, _el$0);
4105
- insertNode(_el$5, _el$1);
4106
- insertNode(_el$5, _el$87);
4107
- setProp(_el$5, "border", true);
4108
- setProp(_el$5, "borderStyle", "single");
4109
- setProp(_el$5, "flexDirection", "column");
4110
- setProp(_el$5, "paddingX", 1);
4111
- insertNode(_el$6, _el$7);
4112
- insertNode(_el$6, _el$9);
4113
- setProp(_el$6, "height", 1);
4114
- setProp(_el$6, "flexDirection", "row");
4115
- setProp(_el$6, "justifyContent", "space-between");
4116
- setProp(_el$6, "flexShrink", 0);
4117
- insertNode(_el$7, createTextNode(`BOO FLASH`));
4118
- insert(_el$9, () => props.backend.platformLabel);
4119
- setProp(_el$0, "height", 1);
4120
- setProp(_el$0, "flexShrink", 0);
4121
- setProp(_el$1, "flexGrow", 1);
4122
- setProp(_el$1, "minHeight", 0);
4123
- setProp(_el$1, "overflow", "hidden");
4124
- insert(_el$1, createComponent2(Show, {
4108
+ var _el$7 = createElement("box"), _el$8 = createElement("box"), _el$9 = createElement("box"), _el$0 = createElement("text"), _el$10 = createElement("text"), _el$11 = createElement("box"), _el$12 = createElement("box"), _el$83 = createElement("box"), _el$84 = createElement("text"), _el$85 = createElement("text"), _el$86 = createTextNode(`v`);
4109
+ insertNode(_el$7, _el$8);
4110
+ setProp(_el$7, "width", "100%");
4111
+ setProp(_el$7, "height", "100%");
4112
+ setProp(_el$7, "justifyContent", "center");
4113
+ setProp(_el$7, "alignItems", "center");
4114
+ insert(_el$7, createComponent2(Show, {
4115
+ get when() {
4116
+ return memo2(() => dimensions().width >= 23)() && dimensions().height >= 31;
4117
+ },
4118
+ get children() {
4119
+ return createComponent2(FlashLogo, {});
4120
+ }
4121
+ }), _el$8);
4122
+ insertNode(_el$8, _el$9);
4123
+ insertNode(_el$8, _el$11);
4124
+ insertNode(_el$8, _el$12);
4125
+ insertNode(_el$8, _el$83);
4126
+ setProp(_el$8, "id", "flash-card");
4127
+ setProp(_el$8, "border", true);
4128
+ setProp(_el$8, "borderStyle", "single");
4129
+ setProp(_el$8, "flexDirection", "column");
4130
+ setProp(_el$8, "paddingX", 1);
4131
+ insertNode(_el$9, _el$0);
4132
+ insertNode(_el$9, _el$10);
4133
+ setProp(_el$9, "height", 1);
4134
+ setProp(_el$9, "flexDirection", "row");
4135
+ setProp(_el$9, "justifyContent", "space-between");
4136
+ setProp(_el$9, "flexShrink", 0);
4137
+ insertNode(_el$0, createTextNode(`BOO FLASH`));
4138
+ insert(_el$10, () => props.backend.platformLabel);
4139
+ setProp(_el$11, "height", 1);
4140
+ setProp(_el$11, "flexShrink", 0);
4141
+ setProp(_el$12, "flexGrow", 1);
4142
+ setProp(_el$12, "minHeight", 0);
4143
+ setProp(_el$12, "overflow", "hidden");
4144
+ insert(_el$12, createComponent2(Show, {
4125
4145
  get when() {
4126
4146
  return visible();
4127
4147
  },
4128
4148
  get fallback() {
4129
4149
  return (() => {
4130
- var _el$88 = createElement("text");
4131
- insertNode(_el$88, createTextNode(`Enlarge the terminal to show the full choices and erase warning. Q quits.`));
4132
- effect((_$p) => setProp(_el$88, "fg", palette.warning, _$p));
4133
- return _el$88;
4150
+ var _el$87 = createElement("text");
4151
+ insertNode(_el$87, createTextNode(`Enlarge the terminal to show the full choices and erase warning. Q quits.`));
4152
+ effect((_$p) => setProp(_el$87, "fg", palette.warning, _$p));
4153
+ return _el$87;
4134
4154
  })();
4135
4155
  },
4136
4156
  get children() {
4137
4157
  return [createComponent2(Show, {
4158
+ get when() {
4159
+ return selection();
4160
+ },
4161
+ get children() {
4162
+ var _el$13 = createElement("text");
4163
+ setProp(_el$13, "flexShrink", 0);
4164
+ insert(_el$13, selection);
4165
+ effect((_$p) => setProp(_el$13, "fg", palette.foreground, _$p));
4166
+ return _el$13;
4167
+ }
4168
+ }), createComponent2(Show, {
4138
4169
  get when() {
4139
4170
  return screen() === "profile";
4140
4171
  },
4141
4172
  get children() {
4142
4173
  return [(() => {
4143
- var _el$10 = createElement("text");
4144
- insertNode(_el$10, createTextNode(`Choose the target computer's GPU`));
4174
+ var _el$14 = createElement("text");
4175
+ insertNode(_el$14, createTextNode(`Choose the target computer's GPU`));
4145
4176
  effect((_p$) => {
4146
4177
  var _v$5 = palette.foreground, _v$6 = TextAttributes2.BOLD;
4147
- _v$5 !== _p$.e && (_p$.e = setProp(_el$10, "fg", _v$5, _p$.e));
4148
- _v$6 !== _p$.t && (_p$.t = setProp(_el$10, "attributes", _v$6, _p$.t));
4178
+ _v$5 !== _p$.e && (_p$.e = setProp(_el$14, "fg", _v$5, _p$.e));
4179
+ _v$6 !== _p$.t && (_p$.t = setProp(_el$14, "attributes", _v$6, _p$.t));
4149
4180
  return _p$;
4150
4181
  }, {
4151
4182
  e: void 0,
4152
4183
  t: void 0
4153
4184
  });
4154
- return _el$10;
4185
+ return _el$14;
4155
4186
  })(), (() => {
4156
- var _el$12 = createElement("text");
4157
- insert(_el$12, (() => {
4187
+ var _el$16 = createElement("text");
4188
+ insert(_el$16, (() => {
4158
4189
  var _c$ = memo2(() => !!loading());
4159
4190
  return () => _c$() ? `${spinner()} Finding latest Boo release...` : memo2(() => !!catalog())() ? `Boo ${catalog().version} / ${catalog().revision.slice(0, 7)} / ${imageTime(catalog().timestamp, now())}` : "Dependencies needed. Enter to set up.";
4160
4191
  })());
4161
- effect((_$p) => setProp(_el$12, "fg", palette.muted, _$p));
4162
- return _el$12;
4192
+ effect((_$p) => setProp(_el$16, "fg", palette.muted, _$p));
4193
+ return _el$16;
4163
4194
  })(), (() => {
4164
- var _el$13 = createElement("box");
4165
- setProp(_el$13, "gap", 0);
4166
- setProp(_el$13, "marginBottom", 1);
4167
- setProp(_el$13, "flexShrink", 0);
4168
- insert(_el$13, createComponent2(For, {
4195
+ var _el$17 = createElement("box");
4196
+ setProp(_el$17, "gap", 0);
4197
+ setProp(_el$17, "marginBottom", 1);
4198
+ setProp(_el$17, "flexShrink", 0);
4199
+ insert(_el$17, createComponent2(For, {
4169
4200
  each: profiles,
4170
4201
  children: (profile, index) => row(profile.toUpperCase(), profile === "nvidia" ? "NVIDIA graphics" : `${profile === "intel" ? "Intel" : "AMD Radeon"} graphics`, index())
4171
4202
  }), null);
4172
- insert(_el$13, () => row("Candidates", "", 3), null);
4173
- insert(_el$13, () => row("Clear cached images", "", 4), null);
4174
- return _el$13;
4203
+ insert(_el$17, () => row("Candidates", "", 3), null);
4204
+ insert(_el$17, () => row("Clear cached images", "", 4), null);
4205
+ return _el$17;
4175
4206
  })(), (() => {
4176
- var _el$14 = createElement("text");
4177
- insertNode(_el$14, createTextNode(`All images support Intel and AMD x86_64 CPUs.`));
4178
- effect((_$p) => setProp(_el$14, "fg", palette.muted, _$p));
4179
- return _el$14;
4207
+ var _el$18 = createElement("text");
4208
+ insertNode(_el$18, createTextNode(`All images support Intel and AMD x86_64 CPUs.`));
4209
+ effect((_$p) => setProp(_el$18, "fg", palette.muted, _$p));
4210
+ return _el$18;
4180
4211
  })()];
4181
4212
  }
4182
4213
  }), createComponent2(Show, {
@@ -4185,34 +4216,34 @@ function App(props) {
4185
4216
  },
4186
4217
  get children() {
4187
4218
  return [(() => {
4188
- var _el$16 = createElement("text");
4189
- insertNode(_el$16, createTextNode(`Clear cached images?`));
4219
+ var _el$20 = createElement("text");
4220
+ insertNode(_el$20, createTextNode(`Clear cached images?`));
4190
4221
  effect((_p$) => {
4191
4222
  var _v$7 = palette.warning, _v$8 = TextAttributes2.BOLD;
4192
- _v$7 !== _p$.e && (_p$.e = setProp(_el$16, "fg", _v$7, _p$.e));
4193
- _v$8 !== _p$.t && (_p$.t = setProp(_el$16, "attributes", _v$8, _p$.t));
4223
+ _v$7 !== _p$.e && (_p$.e = setProp(_el$20, "fg", _v$7, _p$.e));
4224
+ _v$8 !== _p$.t && (_p$.t = setProp(_el$20, "attributes", _v$8, _p$.t));
4194
4225
  return _p$;
4195
4226
  }, {
4196
4227
  e: void 0,
4197
4228
  t: void 0
4198
4229
  });
4199
- return _el$16;
4200
- })(), (() => {
4201
- var _el$18 = createElement("text");
4202
- insertNode(_el$18, createTextNode(`Removes downloaded archives only, NOT USB contents. Active flashes are unaffected.`));
4203
- effect((_$p) => setProp(_el$18, "fg", palette.foreground, _$p));
4204
- return _el$18;
4205
- })(), (() => {
4206
- var _el$20 = createElement("text");
4207
- insertNode(_el$20, createTextNode(`Images will download again when needed. Pending downloads may still finish and be cached.`));
4208
- effect((_$p) => setProp(_el$20, "fg", palette.muted, _$p));
4209
4230
  return _el$20;
4210
4231
  })(), (() => {
4211
- var _el$22 = createElement("box");
4212
- insert(_el$22, () => row("Go back", "", 0), null);
4213
- insert(_el$22, () => row(loading() ? "Clearing..." : "Clear cached images", "", 1, true), null);
4214
- effect((_$p) => setProp(_el$22, "gap", tight() ? 0 : 1, _$p));
4232
+ var _el$22 = createElement("text");
4233
+ insertNode(_el$22, createTextNode(`Removes downloaded archives only, NOT USB contents. Active flashes are unaffected.`));
4234
+ effect((_$p) => setProp(_el$22, "fg", palette.foreground, _$p));
4215
4235
  return _el$22;
4236
+ })(), (() => {
4237
+ var _el$24 = createElement("text");
4238
+ insertNode(_el$24, createTextNode(`Images will download again when needed. Pending downloads may still finish and be cached.`));
4239
+ effect((_$p) => setProp(_el$24, "fg", palette.muted, _$p));
4240
+ return _el$24;
4241
+ })(), (() => {
4242
+ var _el$26 = createElement("box");
4243
+ insert(_el$26, () => row("Go back", "", 0), null);
4244
+ insert(_el$26, () => row(loading() ? "Clearing..." : "Clear cached images", "", 1, true), null);
4245
+ effect((_$p) => setProp(_el$26, "gap", tight() ? 0 : 1, _$p));
4246
+ return _el$26;
4216
4247
  })()];
4217
4248
  }
4218
4249
  }), createComponent2(Show, {
@@ -4221,23 +4252,23 @@ function App(props) {
4221
4252
  },
4222
4253
  get children() {
4223
4254
  return [(() => {
4224
- var _el$23 = createElement("text");
4225
- insertNode(_el$23, createTextNode(`Cache cleared`));
4255
+ var _el$27 = createElement("text");
4256
+ insertNode(_el$27, createTextNode(`Cache cleared`));
4226
4257
  effect((_p$) => {
4227
4258
  var _v$9 = palette.success, _v$0 = TextAttributes2.BOLD;
4228
- _v$9 !== _p$.e && (_p$.e = setProp(_el$23, "fg", _v$9, _p$.e));
4229
- _v$0 !== _p$.t && (_p$.t = setProp(_el$23, "attributes", _v$0, _p$.t));
4259
+ _v$9 !== _p$.e && (_p$.e = setProp(_el$27, "fg", _v$9, _p$.e));
4260
+ _v$0 !== _p$.t && (_p$.t = setProp(_el$27, "attributes", _v$0, _p$.t));
4230
4261
  return _p$;
4231
4262
  }, {
4232
4263
  e: void 0,
4233
4264
  t: void 0
4234
4265
  });
4235
- return _el$23;
4266
+ return _el$27;
4236
4267
  })(), (() => {
4237
- var _el$25 = createElement("text");
4238
- insert(_el$25, notice);
4239
- effect((_$p) => setProp(_el$25, "fg", palette.foreground, _$p));
4240
- return _el$25;
4268
+ var _el$29 = createElement("text");
4269
+ insert(_el$29, notice);
4270
+ effect((_$p) => setProp(_el$29, "fg", palette.foreground, _$p));
4271
+ return _el$29;
4241
4272
  })(), memo2(() => row("Go back", "", 0))];
4242
4273
  }
4243
4274
  }), createComponent2(Show, {
@@ -4246,34 +4277,29 @@ function App(props) {
4246
4277
  },
4247
4278
  get children() {
4248
4279
  return [(() => {
4249
- var _el$26 = createElement("text");
4250
- insertNode(_el$26, createTextNode(`Candidates`));
4280
+ var _el$30 = createElement("text");
4281
+ insertNode(_el$30, createTextNode(`Candidates`));
4251
4282
  effect((_p$) => {
4252
4283
  var _v$1 = palette.foreground, _v$10 = TextAttributes2.BOLD;
4253
- _v$1 !== _p$.e && (_p$.e = setProp(_el$26, "fg", _v$1, _p$.e));
4254
- _v$10 !== _p$.t && (_p$.t = setProp(_el$26, "attributes", _v$10, _p$.t));
4284
+ _v$1 !== _p$.e && (_p$.e = setProp(_el$30, "fg", _v$1, _p$.e));
4285
+ _v$10 !== _p$.t && (_p$.t = setProp(_el$30, "attributes", _v$10, _p$.t));
4255
4286
  return _p$;
4256
4287
  }, {
4257
4288
  e: void 0,
4258
4289
  t: void 0
4259
4290
  });
4260
- return _el$26;
4261
- })(), (() => {
4262
- var _el$28 = createElement("text");
4263
- insertNode(_el$28, createTextNode(`Build-only; not boot/install/hardware qualified.`));
4264
- effect((_$p) => setProp(_el$28, "fg", palette.warning, _$p));
4265
- return _el$28;
4291
+ return _el$30;
4266
4292
  })(), createComponent2(Show, {
4267
4293
  get when() {
4268
4294
  return !loading();
4269
4295
  },
4270
4296
  get fallback() {
4271
4297
  return (() => {
4272
- var _el$90 = createElement("text"), _el$91 = createTextNode(` Finding completed candidates...`);
4273
- insertNode(_el$90, _el$91);
4274
- insert(_el$90, spinner, _el$91);
4275
- effect((_$p) => setProp(_el$90, "fg", palette.muted, _$p));
4276
- return _el$90;
4298
+ var _el$89 = createElement("text"), _el$90 = createTextNode(` Finding completed candidates...`);
4299
+ insertNode(_el$89, _el$90);
4300
+ insert(_el$89, spinner, _el$90);
4301
+ effect((_$p) => setProp(_el$89, "fg", palette.muted, _$p));
4302
+ return _el$89;
4277
4303
  })();
4278
4304
  },
4279
4305
  get children() {
@@ -4283,31 +4309,31 @@ function App(props) {
4283
4309
  },
4284
4310
  get fallback() {
4285
4311
  return [(() => {
4286
- var _el$92 = createElement("text");
4287
- insertNode(_el$92, createTextNode(`No completed candidates available`));
4288
- effect((_$p) => setProp(_el$92, "fg", palette.muted, _$p));
4289
- return _el$92;
4312
+ var _el$91 = createElement("text");
4313
+ insertNode(_el$91, createTextNode(`No completed candidates available`));
4314
+ effect((_$p) => setProp(_el$91, "fg", palette.muted, _$p));
4315
+ return _el$91;
4290
4316
  })(), memo2(() => row("Go back", "", 0))];
4291
4317
  },
4292
4318
  get children() {
4293
4319
  return [(() => {
4294
- var _el$30 = createElement("box");
4295
- setProp(_el$30, "gap", 0);
4296
- insert(_el$30, createComponent2(For, {
4320
+ var _el$32 = createElement("box");
4321
+ setProp(_el$32, "gap", 0);
4322
+ insert(_el$32, createComponent2(For, {
4297
4323
  get each() {
4298
4324
  return candidates().slice(Math.max(0, cursor() - 2), Math.max(3, cursor() + 1));
4299
4325
  },
4300
4326
  children: (c, index) => row(`${c.images[0].profile.toUpperCase()} ${c.revision.slice(0, 7)} #${c.candidate.number}`, imageTime(c.timestamp, now()), index() + Math.max(0, cursor() - 2), false, true)
4301
4327
  }));
4302
- return _el$30;
4328
+ return _el$32;
4303
4329
  })(), (() => {
4304
- var _el$31 = createElement("text"), _el$32 = createTextNode(` of `), _el$33 = createTextNode(` candidates / Enter to choose`);
4305
- insertNode(_el$31, _el$32);
4306
- insertNode(_el$31, _el$33);
4307
- insert(_el$31, () => cursor() + 1, _el$32);
4308
- insert(_el$31, () => candidates().length, _el$33);
4309
- effect((_$p) => setProp(_el$31, "fg", palette.muted, _$p));
4310
- return _el$31;
4330
+ var _el$33 = createElement("text"), _el$34 = createTextNode(` of `), _el$35 = createTextNode(` candidates / Enter to choose`);
4331
+ insertNode(_el$33, _el$34);
4332
+ insertNode(_el$33, _el$35);
4333
+ insert(_el$33, () => cursor() + 1, _el$34);
4334
+ insert(_el$33, () => candidates().length, _el$35);
4335
+ effect((_$p) => setProp(_el$33, "fg", palette.muted, _$p));
4336
+ return _el$33;
4311
4337
  })()];
4312
4338
  }
4313
4339
  });
@@ -4320,64 +4346,54 @@ function App(props) {
4320
4346
  },
4321
4347
  get children() {
4322
4348
  return [(() => {
4323
- var _el$34 = createElement("text");
4324
- insertNode(_el$34, createTextNode(`Set up required tools`));
4349
+ var _el$36 = createElement("text");
4350
+ insertNode(_el$36, createTextNode(`Set up required tools`));
4325
4351
  effect((_p$) => {
4326
4352
  var _v$11 = palette.accent, _v$12 = TextAttributes2.BOLD;
4327
- _v$11 !== _p$.e && (_p$.e = setProp(_el$34, "fg", _v$11, _p$.e));
4328
- _v$12 !== _p$.t && (_p$.t = setProp(_el$34, "attributes", _v$12, _p$.t));
4353
+ _v$11 !== _p$.e && (_p$.e = setProp(_el$36, "fg", _v$11, _p$.e));
4354
+ _v$12 !== _p$.t && (_p$.t = setProp(_el$36, "attributes", _v$12, _p$.t));
4329
4355
  return _p$;
4330
4356
  }, {
4331
4357
  e: void 0,
4332
4358
  t: void 0
4333
4359
  });
4334
- return _el$34;
4335
- })(), (() => {
4336
- var _el$36 = createElement("text"), _el$37 = createTextNode(`Missing: `);
4337
- insertNode(_el$36, _el$37);
4338
- insert(_el$36, () => dependencies3().missing.join(", "), null);
4339
- effect((_$p) => setProp(_el$36, "fg", palette.foreground, _$p));
4340
4360
  return _el$36;
4361
+ })(), (() => {
4362
+ var _el$38 = createElement("text"), _el$39 = createTextNode(`Missing: `);
4363
+ insertNode(_el$38, _el$39);
4364
+ insert(_el$38, () => dependencies3().missing.join(", "), null);
4365
+ effect((_$p) => setProp(_el$38, "fg", palette.foreground, _$p));
4366
+ return _el$38;
4341
4367
  })(), createComponent2(Show, {
4342
4368
  get when() {
4343
4369
  return !error();
4344
4370
  },
4345
4371
  get fallback() {
4346
4372
  return (() => {
4347
- var _el$94 = createElement("text");
4348
- insert(_el$94, error);
4349
- effect((_$p) => setProp(_el$94, "fg", palette.warning, _$p));
4350
- return _el$94;
4373
+ var _el$93 = createElement("text");
4374
+ insert(_el$93, error);
4375
+ effect((_$p) => setProp(_el$93, "fg", palette.warning, _$p));
4376
+ return _el$93;
4351
4377
  })();
4352
4378
  },
4353
4379
  get children() {
4354
- var _el$38 = createElement("text");
4355
- insert(_el$38, (() => {
4380
+ var _el$40 = createElement("text");
4381
+ insert(_el$40, (() => {
4356
4382
  var _c$2 = memo2(() => !!dependencies3().installer);
4357
4383
  return () => _c$2() ? `${dependencies3().installer} will install ${dependencies3().missing.join(" and ")} and required dependencies, then continue.` : dependencies3().guidance;
4358
4384
  })());
4359
- effect((_$p) => setProp(_el$38, "fg", palette.muted, _$p));
4360
- return _el$38;
4385
+ effect((_$p) => setProp(_el$40, "fg", palette.muted, _$p));
4386
+ return _el$40;
4361
4387
  }
4362
4388
  }), createComponent2(Show, {
4363
4389
  get when() {
4364
4390
  return !tight();
4365
4391
  },
4366
4392
  get children() {
4367
- var _el$39 = createElement("text");
4368
- insert(_el$39, () => dependencies3().installer ? "Uses the ordinary terminal. Ctrl-C cancels and quits." : "Boo Flash will not change system packages on this platform.");
4369
- effect((_$p) => setProp(_el$39, "fg", palette.muted, _$p));
4370
- return _el$39;
4371
- }
4372
- }), createComponent2(Show, {
4373
- get when() {
4374
- return props.backend.demo;
4375
- },
4376
- get children() {
4377
- var _el$40 = createElement("text");
4378
- insertNode(_el$40, createTextNode(`Setup simulation; no software installed.`));
4379
- effect((_$p) => setProp(_el$40, "fg", palette.warning, _$p));
4380
- return _el$40;
4393
+ var _el$41 = createElement("text");
4394
+ insert(_el$41, () => dependencies3().installer ? "Uses the ordinary terminal. Ctrl-C cancels and quits." : "Boo Flash will not change system packages on this platform.");
4395
+ effect((_$p) => setProp(_el$41, "fg", palette.muted, _$p));
4396
+ return _el$41;
4381
4397
  }
4382
4398
  }), (() => {
4383
4399
  var _el$42 = createElement("box");
@@ -4420,17 +4436,7 @@ function App(props) {
4420
4436
  insert(_el$47, () => dependencies3().installer, _el$48);
4421
4437
  effect((_$p) => setProp(_el$47, "fg", palette.muted, _$p));
4422
4438
  return _el$47;
4423
- })(), createComponent2(Show, {
4424
- get when() {
4425
- return props.backend.demo;
4426
- },
4427
- get children() {
4428
- var _el$49 = createElement("text");
4429
- insertNode(_el$49, createTextNode(`Setup simulation; no software installed.`));
4430
- effect((_$p) => setProp(_el$49, "fg", palette.warning, _$p));
4431
- return _el$49;
4432
- }
4433
- })];
4439
+ })()];
4434
4440
  }
4435
4441
  }), createComponent2(Show, {
4436
4442
  get when() {
@@ -4438,26 +4444,26 @@ function App(props) {
4438
4444
  },
4439
4445
  get children() {
4440
4446
  return [(() => {
4441
- var _el$51 = createElement("text");
4442
- insertNode(_el$51, createTextNode(`Choose a USB drive`));
4447
+ var _el$49 = createElement("text");
4448
+ insertNode(_el$49, createTextNode(`Choose a USB drive`));
4443
4449
  effect((_p$) => {
4444
4450
  var _v$15 = palette.foreground, _v$16 = TextAttributes2.BOLD;
4445
- _v$15 !== _p$.e && (_p$.e = setProp(_el$51, "fg", _v$15, _p$.e));
4446
- _v$16 !== _p$.t && (_p$.t = setProp(_el$51, "attributes", _v$16, _p$.t));
4451
+ _v$15 !== _p$.e && (_p$.e = setProp(_el$49, "fg", _v$15, _p$.e));
4452
+ _v$16 !== _p$.t && (_p$.t = setProp(_el$49, "attributes", _v$16, _p$.t));
4447
4453
  return _p$;
4448
4454
  }, {
4449
4455
  e: void 0,
4450
4456
  t: void 0
4451
4457
  });
4452
- return _el$51;
4458
+ return _el$49;
4453
4459
  })(), (() => {
4454
- var _el$53 = createElement("text");
4455
- insert(_el$53, (() => {
4460
+ var _el$51 = createElement("text");
4461
+ insert(_el$51, (() => {
4456
4462
  var _c$3 = memo2(() => !!loading());
4457
4463
  return () => _c$3() ? `${spinner()} Checking disks and protected storage...` : "System, home and app storage are excluded.";
4458
4464
  })());
4459
- effect((_$p) => setProp(_el$53, "fg", palette.muted, _$p));
4460
- return _el$53;
4465
+ effect((_$p) => setProp(_el$51, "fg", palette.muted, _$p));
4466
+ return _el$51;
4461
4467
  })(), createComponent2(Show, {
4462
4468
  get when() {
4463
4469
  return !loading();
@@ -4469,31 +4475,31 @@ function App(props) {
4469
4475
  },
4470
4476
  get fallback() {
4471
4477
  return (() => {
4472
- var _el$95 = createElement("text");
4473
- insertNode(_el$95, createTextNode(`No eligible USB drives. Connect a writable external USB drive, then press R to refresh.`));
4474
- effect((_$p) => setProp(_el$95, "fg", palette.warning, _$p));
4475
- return _el$95;
4478
+ var _el$94 = createElement("text");
4479
+ insertNode(_el$94, createTextNode(`No eligible USB drives. Connect a writable external USB drive, then press R to refresh.`));
4480
+ effect((_$p) => setProp(_el$94, "fg", palette.warning, _$p));
4481
+ return _el$94;
4476
4482
  })();
4477
4483
  },
4478
4484
  get children() {
4479
4485
  return [(() => {
4480
- var _el$54 = createElement("box");
4481
- setProp(_el$54, "gap", 0);
4482
- insert(_el$54, createComponent2(For, {
4486
+ var _el$52 = createElement("box");
4487
+ setProp(_el$52, "gap", 0);
4488
+ insert(_el$52, createComponent2(For, {
4483
4489
  get each() {
4484
4490
  return disks3().slice(Math.max(0, cursor() - 2), Math.max(3, cursor() + 1));
4485
4491
  },
4486
4492
  children: (d, index) => row(d.name, `${path(d)} / ${bytes(d.bytes)} / USB`, index() + Math.max(0, cursor() - 2))
4487
4493
  }));
4488
- return _el$54;
4494
+ return _el$52;
4489
4495
  })(), (() => {
4490
- var _el$55 = createElement("text");
4491
- insert(_el$55, (() => {
4496
+ var _el$53 = createElement("text");
4497
+ insert(_el$53, (() => {
4492
4498
  var _c$4 = memo2(() => cursor() < 0);
4493
4499
  return () => _c$4() ? "Use arrows to select a drive. Nothing is selected yet." : `${cursor() + 1} of ${disks3().length} drives / Enter to review`;
4494
4500
  })());
4495
- effect((_$p) => setProp(_el$55, "fg", palette.muted, _$p));
4496
- return _el$55;
4501
+ effect((_$p) => setProp(_el$53, "fg", palette.muted, _$p));
4502
+ return _el$53;
4497
4503
  })()];
4498
4504
  }
4499
4505
  });
@@ -4506,64 +4512,55 @@ function App(props) {
4506
4512
  },
4507
4513
  get children() {
4508
4514
  return [(() => {
4509
- var _el$56 = createElement("text");
4510
- insertNode(_el$56, createTextNode(`Erase this entire USB drive?`));
4515
+ var _el$54 = createElement("text");
4516
+ insertNode(_el$54, createTextNode(`Erase this entire USB drive?`));
4511
4517
  effect((_p$) => {
4512
4518
  var _v$17 = palette.warning, _v$18 = TextAttributes2.BOLD;
4513
- _v$17 !== _p$.e && (_p$.e = setProp(_el$56, "fg", _v$17, _p$.e));
4514
- _v$18 !== _p$.t && (_p$.t = setProp(_el$56, "attributes", _v$18, _p$.t));
4519
+ _v$17 !== _p$.e && (_p$.e = setProp(_el$54, "fg", _v$17, _p$.e));
4520
+ _v$18 !== _p$.t && (_p$.t = setProp(_el$54, "attributes", _v$18, _p$.t));
4515
4521
  return _p$;
4516
4522
  }, {
4517
4523
  e: void 0,
4518
4524
  t: void 0
4519
4525
  });
4520
- return _el$56;
4526
+ return _el$54;
4521
4527
  })(), (() => {
4522
- var _el$58 = createElement("box"), _el$59 = createElement("text"), _el$60 = createElement("text"), _el$61 = createElement("text"), _el$62 = createTextNode(` / `);
4523
- insertNode(_el$58, _el$59);
4524
- insertNode(_el$58, _el$60);
4525
- insertNode(_el$58, _el$61);
4526
- setProp(_el$58, "paddingX", 1);
4527
- setProp(_el$59, "height", 1);
4528
- setProp(_el$59, "wrapMode", "none");
4529
- insert(_el$59, () => disk()?.name);
4530
- insert(_el$60, (() => {
4528
+ var _el$56 = createElement("box"), _el$57 = createElement("text"), _el$58 = createElement("text");
4529
+ insertNode(_el$56, _el$57);
4530
+ insertNode(_el$56, _el$58);
4531
+ setProp(_el$56, "paddingX", 1);
4532
+ setProp(_el$57, "height", 1);
4533
+ setProp(_el$57, "wrapMode", "none");
4534
+ insert(_el$57, () => disk()?.name);
4535
+ insert(_el$58, (() => {
4531
4536
  var _c$5 = memo2(() => !!disk());
4532
4537
  return () => _c$5() ? `${path(disk())} / ${bytes(disk().bytes)}` : "";
4533
4538
  })());
4534
- insertNode(_el$61, _el$62);
4535
- insert(_el$61, () => image()?.profile.toUpperCase(), _el$62);
4536
- insert(_el$61, (() => {
4537
- var _c$6 = memo2(() => !!catalog()?.candidate);
4538
- return () => _c$6() ? `candidate (build-only) ${catalog()?.revision.slice(0, 7)}` : `Boo ${catalog()?.version}`;
4539
- })(), null);
4540
4539
  effect((_p$) => {
4541
- var _v$19 = palette.panelAlt, _v$20 = palette.foreground, _v$21 = TextAttributes2.BOLD, _v$22 = palette.accent, _v$23 = catalog()?.candidate ? palette.warning : palette.muted;
4542
- _v$19 !== _p$.e && (_p$.e = setProp(_el$58, "backgroundColor", _v$19, _p$.e));
4543
- _v$20 !== _p$.t && (_p$.t = setProp(_el$59, "fg", _v$20, _p$.t));
4544
- _v$21 !== _p$.a && (_p$.a = setProp(_el$59, "attributes", _v$21, _p$.a));
4545
- _v$22 !== _p$.o && (_p$.o = setProp(_el$60, "fg", _v$22, _p$.o));
4546
- _v$23 !== _p$.i && (_p$.i = setProp(_el$61, "fg", _v$23, _p$.i));
4540
+ var _v$19 = palette.panelAlt, _v$20 = palette.foreground, _v$21 = TextAttributes2.BOLD, _v$22 = palette.accent;
4541
+ _v$19 !== _p$.e && (_p$.e = setProp(_el$56, "backgroundColor", _v$19, _p$.e));
4542
+ _v$20 !== _p$.t && (_p$.t = setProp(_el$57, "fg", _v$20, _p$.t));
4543
+ _v$21 !== _p$.a && (_p$.a = setProp(_el$57, "attributes", _v$21, _p$.a));
4544
+ _v$22 !== _p$.o && (_p$.o = setProp(_el$58, "fg", _v$22, _p$.o));
4547
4545
  return _p$;
4548
4546
  }, {
4549
4547
  e: void 0,
4550
4548
  t: void 0,
4551
4549
  a: void 0,
4552
- o: void 0,
4553
- i: void 0
4550
+ o: void 0
4554
4551
  });
4555
- return _el$58;
4552
+ return _el$56;
4556
4553
  })(), (() => {
4557
- var _el$63 = createElement("text");
4558
- insertNode(_el$63, createTextNode(`ALL data and partitions on this drive will be lost. Back up anything you need before continuing.`));
4559
- effect((_$p) => setProp(_el$63, "fg", palette.warning, _$p));
4560
- return _el$63;
4554
+ var _el$59 = createElement("text");
4555
+ insertNode(_el$59, createTextNode(`ALL data and partitions on this drive will be lost. Back up anything you need before continuing.`));
4556
+ effect((_$p) => setProp(_el$59, "fg", palette.warning, _$p));
4557
+ return _el$59;
4561
4558
  })(), (() => {
4562
- var _el$65 = createElement("box");
4563
- insert(_el$65, () => row("Go back", "", 0), null);
4564
- insert(_el$65, () => row("Erase & flash", "", 1, true), null);
4565
- effect((_$p) => setProp(_el$65, "gap", tight() ? 0 : 1, _$p));
4566
- return _el$65;
4559
+ var _el$61 = createElement("box");
4560
+ insert(_el$61, () => row("Go back", "", 0), null);
4561
+ insert(_el$61, () => row("Erase & flash", "", 1, true), null);
4562
+ effect((_$p) => setProp(_el$61, "gap", tight() ? 0 : 1, _$p));
4563
+ return _el$61;
4567
4564
  })()];
4568
4565
  }
4569
4566
  }), createComponent2(Show, {
@@ -4572,108 +4569,114 @@ function App(props) {
4572
4569
  },
4573
4570
  get children() {
4574
4571
  return [(() => {
4575
- var _el$66 = createElement("text"), _el$67 = createTextNode(` `);
4576
- insertNode(_el$66, _el$67);
4577
- insert(_el$66, spinner, _el$67);
4578
- insert(_el$66, (() => {
4579
- var _c$7 = memo2(() => !!stopping());
4580
- return () => _c$7() ? "Stopping safely..." : progress().stage;
4572
+ var _el$62 = createElement("text"), _el$63 = createTextNode(` `);
4573
+ insertNode(_el$62, _el$63);
4574
+ insert(_el$62, spinner, _el$63);
4575
+ insert(_el$62, (() => {
4576
+ var _c$6 = memo2(() => !!stopping());
4577
+ return () => _c$6() ? "Stopping safely..." : progress().stage;
4581
4578
  })(), null);
4582
4579
  effect((_p$) => {
4583
- var _v$24 = palette.accent, _v$25 = TextAttributes2.BOLD;
4584
- _v$24 !== _p$.e && (_p$.e = setProp(_el$66, "fg", _v$24, _p$.e));
4585
- _v$25 !== _p$.t && (_p$.t = setProp(_el$66, "attributes", _v$25, _p$.t));
4580
+ var _v$23 = palette.accent, _v$24 = TextAttributes2.BOLD;
4581
+ _v$23 !== _p$.e && (_p$.e = setProp(_el$62, "fg", _v$23, _p$.e));
4582
+ _v$24 !== _p$.t && (_p$.t = setProp(_el$62, "attributes", _v$24, _p$.t));
4586
4583
  return _p$;
4587
4584
  }, {
4588
4585
  e: void 0,
4589
4586
  t: void 0
4590
4587
  });
4591
- return _el$66;
4588
+ return _el$62;
4592
4589
  })(), (() => {
4593
- var _el$68 = createElement("text"), _el$69 = createTextNode(` / `);
4594
- insertNode(_el$68, _el$69);
4595
- insert(_el$68, () => disk()?.name, _el$69);
4596
- insert(_el$68, () => image()?.profile.toUpperCase(), null);
4597
- effect((_$p) => setProp(_el$68, "fg", palette.foreground, _$p));
4598
- return _el$68;
4590
+ var _el$64 = createElement("text");
4591
+ insert(_el$64, () => disk()?.name);
4592
+ effect((_$p) => setProp(_el$64, "fg", palette.foreground, _$p));
4593
+ return _el$64;
4599
4594
  })(), (() => {
4600
- var _el$70 = createElement("text");
4601
- insert(_el$70, (() => {
4602
- var _c$8 = memo2(() => !!stopping());
4603
- return () => _c$8() ? "Waiting for all child processes to stop. Keep the USB connected." : progress().detail;
4595
+ var _el$65 = createElement("text");
4596
+ insert(_el$65, (() => {
4597
+ var _c$7 = memo2(() => !!stopping());
4598
+ return () => _c$7() ? "Waiting for all child processes to stop. Keep the USB connected." : progress().detail;
4604
4599
  })());
4605
- effect((_$p) => setProp(_el$70, "fg", palette.muted, _$p));
4606
- return _el$70;
4600
+ effect((_$p) => setProp(_el$65, "fg", palette.muted, _$p));
4601
+ return _el$65;
4607
4602
  })(), createComponent2(Show, {
4608
4603
  get when() {
4609
4604
  return percent() !== void 0;
4610
4605
  },
4611
4606
  get children() {
4612
4607
  return [(() => {
4613
- var _el$71 = createElement("box");
4614
- setProp(_el$71, "border", true);
4615
- setProp(_el$71, "height", 3);
4616
- insert(_el$71, createComponent2(Show, {
4608
+ var _el$66 = createElement("box");
4609
+ setProp(_el$66, "flexShrink", 0);
4610
+ insert(_el$66, createComponent2(Show, {
4617
4611
  get when() {
4618
4612
  return percent() > 0;
4619
4613
  },
4620
4614
  get children() {
4621
- var _el$72 = createElement("box");
4622
- setProp(_el$72, "height", 1);
4615
+ var _el$67 = createElement("box");
4616
+ setProp(_el$67, "height", 1);
4623
4617
  effect((_p$) => {
4624
- var _v$26 = `${percent() ?? 0}%`, _v$27 = palette.accent;
4625
- _v$26 !== _p$.e && (_p$.e = setProp(_el$72, "width", _v$26, _p$.e));
4626
- _v$27 !== _p$.t && (_p$.t = setProp(_el$72, "backgroundColor", _v$27, _p$.t));
4618
+ var _v$25 = `${percent() ?? 0}%`, _v$26 = palette.accent;
4619
+ _v$25 !== _p$.e && (_p$.e = setProp(_el$67, "width", _v$25, _p$.e));
4620
+ _v$26 !== _p$.t && (_p$.t = setProp(_el$67, "backgroundColor", _v$26, _p$.t));
4627
4621
  return _p$;
4628
4622
  }, {
4629
4623
  e: void 0,
4630
4624
  t: void 0
4631
4625
  });
4632
- return _el$72;
4626
+ return _el$67;
4633
4627
  }
4634
4628
  }));
4635
4629
  effect((_p$) => {
4636
- var _v$28 = palette.accent, _v$29 = palette.panelAlt;
4637
- _v$28 !== _p$.e && (_p$.e = setProp(_el$71, "borderColor", _v$28, _p$.e));
4638
- _v$29 !== _p$.t && (_p$.t = setProp(_el$71, "backgroundColor", _v$29, _p$.t));
4630
+ var _v$27 = !tight(), _v$28 = palette.accent, _v$29 = tight() ? 1 : 3, _v$30 = palette.panelAlt;
4631
+ _v$27 !== _p$.e && (_p$.e = setProp(_el$66, "border", _v$27, _p$.e));
4632
+ _v$28 !== _p$.t && (_p$.t = setProp(_el$66, "borderColor", _v$28, _p$.t));
4633
+ _v$29 !== _p$.a && (_p$.a = setProp(_el$66, "height", _v$29, _p$.a));
4634
+ _v$30 !== _p$.o && (_p$.o = setProp(_el$66, "backgroundColor", _v$30, _p$.o));
4639
4635
  return _p$;
4640
4636
  }, {
4641
4637
  e: void 0,
4642
- t: void 0
4638
+ t: void 0,
4639
+ a: void 0,
4640
+ o: void 0
4643
4641
  });
4644
- return _el$71;
4642
+ return _el$66;
4645
4643
  })(), (() => {
4646
- var _el$73 = createElement("text"), _el$74 = createTextNode(`% `), _el$75 = createTextNode(` / `);
4647
- insertNode(_el$73, _el$74);
4648
- insertNode(_el$73, _el$75);
4649
- insert(_el$73, percent, _el$74);
4650
- insert(_el$73, () => bytes(progress().bytes ?? 0), _el$75);
4651
- insert(_el$73, () => bytes(progress().total ?? 0), null);
4644
+ var _el$68 = createElement("text"), _el$69 = createTextNode(`% `), _el$70 = createTextNode(` / `);
4645
+ insertNode(_el$68, _el$69);
4646
+ insertNode(_el$68, _el$70);
4647
+ insert(_el$68, percent, _el$69);
4648
+ insert(_el$68, () => bytes(progress().bytes ?? 0), _el$70);
4649
+ insert(_el$68, () => bytes(progress().total ?? 0), null);
4652
4650
  effect((_p$) => {
4653
- var _v$30 = palette.foreground, _v$31 = TextAttributes2.BOLD;
4654
- _v$30 !== _p$.e && (_p$.e = setProp(_el$73, "fg", _v$30, _p$.e));
4655
- _v$31 !== _p$.t && (_p$.t = setProp(_el$73, "attributes", _v$31, _p$.t));
4651
+ var _v$31 = palette.foreground, _v$32 = TextAttributes2.BOLD;
4652
+ _v$31 !== _p$.e && (_p$.e = setProp(_el$68, "fg", _v$31, _p$.e));
4653
+ _v$32 !== _p$.t && (_p$.t = setProp(_el$68, "attributes", _v$32, _p$.t));
4656
4654
  return _p$;
4657
4655
  }, {
4658
4656
  e: void 0,
4659
4657
  t: void 0
4660
4658
  });
4661
- return _el$73;
4662
- })(), (() => {
4663
- var _el$76 = createElement("text");
4664
- insert(_el$76, (() => {
4665
- var _c$9 = memo2(() => !!progress().speed);
4666
- return () => _c$9() ? `${bytes(progress().speed)} / s` : "";
4667
- })());
4668
- effect((_$p) => setProp(_el$76, "fg", palette.muted, _$p));
4669
- return _el$76;
4670
- })()];
4659
+ return _el$68;
4660
+ })(), createComponent2(Show, {
4661
+ get when() {
4662
+ return !tight();
4663
+ },
4664
+ get children() {
4665
+ var _el$71 = createElement("text");
4666
+ insert(_el$71, (() => {
4667
+ var _c$8 = memo2(() => !!progress().speed);
4668
+ return () => _c$8() ? `${bytes(progress().speed)} / s` : "";
4669
+ })());
4670
+ effect((_$p) => setProp(_el$71, "fg", palette.muted, _$p));
4671
+ return _el$71;
4672
+ }
4673
+ })];
4671
4674
  }
4672
4675
  }), (() => {
4673
- var _el$77 = createElement("text");
4674
- insertNode(_el$77, createTextNode(`Keep the USB connected until safe removal succeeds.`));
4675
- effect((_$p) => setProp(_el$77, "fg", palette.warning, _$p));
4676
- return _el$77;
4676
+ var _el$72 = createElement("text");
4677
+ insertNode(_el$72, createTextNode(`Keep the USB connected until safe removal succeeds.`));
4678
+ effect((_$p) => setProp(_el$72, "fg", palette.warning, _$p));
4679
+ return _el$72;
4677
4680
  })()];
4678
4681
  }
4679
4682
  }), createComponent2(Show, {
@@ -4682,34 +4685,34 @@ function App(props) {
4682
4685
  },
4683
4686
  get children() {
4684
4687
  return [(() => {
4685
- var _el$79 = createElement("text");
4686
- insert(_el$79, () => props.backend.successTitle);
4688
+ var _el$74 = createElement("text");
4689
+ insert(_el$74, () => props.backend.successTitle);
4687
4690
  effect((_p$) => {
4688
- var _v$32 = palette.success, _v$33 = TextAttributes2.BOLD;
4689
- _v$32 !== _p$.e && (_p$.e = setProp(_el$79, "fg", _v$32, _p$.e));
4690
- _v$33 !== _p$.t && (_p$.t = setProp(_el$79, "attributes", _v$33, _p$.t));
4691
+ var _v$33 = palette.success, _v$34 = TextAttributes2.BOLD;
4692
+ _v$33 !== _p$.e && (_p$.e = setProp(_el$74, "fg", _v$33, _p$.e));
4693
+ _v$34 !== _p$.t && (_p$.t = setProp(_el$74, "attributes", _v$34, _p$.t));
4691
4694
  return _p$;
4692
4695
  }, {
4693
4696
  e: void 0,
4694
4697
  t: void 0
4695
4698
  });
4696
- return _el$79;
4699
+ return _el$74;
4697
4700
  })(), (() => {
4698
- var _el$80 = createElement("text");
4699
- insert(_el$80, () => props.backend.successDetail);
4700
- effect((_$p) => setProp(_el$80, "fg", palette.foreground, _$p));
4701
- return _el$80;
4701
+ var _el$75 = createElement("text");
4702
+ insert(_el$75, () => props.backend.successDetail);
4703
+ effect((_$p) => setProp(_el$75, "fg", palette.foreground, _$p));
4704
+ return _el$75;
4702
4705
  })(), (() => {
4703
- var _el$81 = createElement("text");
4704
- insert(_el$81, () => props.backend.demo ? "The real flow checks the write, flush and safe removal." : "Compressed image and raw stream verified. Not a device read-back.");
4705
- effect((_$p) => setProp(_el$81, "fg", palette.muted, _$p));
4706
- return _el$81;
4706
+ var _el$76 = createElement("text");
4707
+ insertNode(_el$76, createTextNode(`Compressed image and raw stream verified. Not a device read-back.`));
4708
+ effect((_$p) => setProp(_el$76, "fg", palette.muted, _$p));
4709
+ return _el$76;
4707
4710
  })(), (() => {
4708
- var _el$82 = createElement("box");
4709
- setProp(_el$82, "gap", 1);
4710
- insert(_el$82, () => row("Choose another image", "", 0), null);
4711
- insert(_el$82, () => row("Quit", "", 1), null);
4712
- return _el$82;
4711
+ var _el$78 = createElement("box");
4712
+ setProp(_el$78, "gap", 1);
4713
+ insert(_el$78, () => row("Choose another image", "", 0), null);
4714
+ insert(_el$78, () => row("Quit", "", 1), null);
4715
+ return _el$78;
4713
4716
  })()];
4714
4717
  }
4715
4718
  }), createComponent2(Show, {
@@ -4718,56 +4721,67 @@ function App(props) {
4718
4721
  },
4719
4722
  get children() {
4720
4723
  return [(() => {
4721
- var _el$83 = createElement("text");
4722
- insertNode(_el$83, createTextNode(`Flash not completed`));
4724
+ var _el$79 = createElement("text");
4725
+ insertNode(_el$79, createTextNode(`Flash not completed`));
4723
4726
  effect((_p$) => {
4724
- var _v$34 = palette.danger, _v$35 = TextAttributes2.BOLD;
4725
- _v$34 !== _p$.e && (_p$.e = setProp(_el$83, "fg", _v$34, _p$.e));
4726
- _v$35 !== _p$.t && (_p$.t = setProp(_el$83, "attributes", _v$35, _p$.t));
4727
+ var _v$35 = palette.danger, _v$36 = TextAttributes2.BOLD;
4728
+ _v$35 !== _p$.e && (_p$.e = setProp(_el$79, "fg", _v$35, _p$.e));
4729
+ _v$36 !== _p$.t && (_p$.t = setProp(_el$79, "attributes", _v$36, _p$.t));
4727
4730
  return _p$;
4728
4731
  }, {
4729
4732
  e: void 0,
4730
4733
  t: void 0
4731
4734
  });
4732
- return _el$83;
4735
+ return _el$79;
4733
4736
  })(), (() => {
4734
- var _el$85 = createElement("text");
4735
- insert(_el$85, error);
4736
- effect((_$p) => setProp(_el$85, "fg", palette.foreground, _$p));
4737
- return _el$85;
4737
+ var _el$81 = createElement("text");
4738
+ insert(_el$81, error);
4739
+ effect((_$p) => setProp(_el$81, "fg", palette.foreground, _$p));
4740
+ return _el$81;
4738
4741
  })(), (() => {
4739
- var _el$86 = createElement("box");
4740
- setProp(_el$86, "gap", 1);
4741
- insert(_el$86, () => row("Refresh & try again", "", 0), null);
4742
- insert(_el$86, () => row("Quit", "", 1), null);
4743
- return _el$86;
4742
+ var _el$82 = createElement("box");
4743
+ setProp(_el$82, "gap", 1);
4744
+ insert(_el$82, () => row("Refresh & try again", "", 0), null);
4745
+ insert(_el$82, () => row("Quit", "", 1), null);
4746
+ return _el$82;
4744
4747
  })()];
4745
4748
  }
4746
4749
  })];
4747
4750
  }
4748
4751
  }));
4749
- setProp(_el$87, "height", 1);
4750
- setProp(_el$87, "flexShrink", 0);
4751
- setProp(_el$87, "wrapMode", "none");
4752
- insert(_el$87, (() => {
4753
- var _c$0 = memo2(() => !!busy());
4754
- return () => _c$0() ? "Esc cancel / Q stop & quit" : dimensions().width < 56 ? "Arrows / Enter / Esc / R / Q quit" : "Arrows / Enter / Esc back / R refresh / Q quit";
4752
+ insertNode(_el$83, _el$84);
4753
+ insertNode(_el$83, _el$85);
4754
+ setProp(_el$83, "height", 1);
4755
+ setProp(_el$83, "flexShrink", 0);
4756
+ setProp(_el$83, "flexDirection", "row");
4757
+ setProp(_el$83, "gap", 1);
4758
+ setProp(_el$84, "flexGrow", 1);
4759
+ setProp(_el$84, "minWidth", 0);
4760
+ setProp(_el$84, "wrapMode", "none");
4761
+ insert(_el$84, (() => {
4762
+ var _c$9 = memo2(() => !!busy());
4763
+ return () => _c$9() ? "Esc cancel / Q stop & quit" : dimensions().width < 56 ? "\u2191\u2193 Enter / Esc / R / Q quit" : "Arrows / Enter / Esc back / R refresh / Q quit";
4755
4764
  })());
4765
+ insertNode(_el$85, _el$86);
4766
+ setProp(_el$85, "flexShrink", 0);
4767
+ setProp(_el$85, "wrapMode", "none");
4768
+ insert(_el$85, version, null);
4756
4769
  effect((_p$) => {
4757
- var _v$36 = palette.background, _v$37 = dimensions().width <= 80 ? "100%" : 80, _v$38 = dimensions().height <= 24 ? "100%" : 24, _v$39 = palette.border, _v$40 = palette.card, _v$41 = palette.accent, _v$42 = TextAttributes2.BOLD, _v$43 = props.backend.demo ? palette.warning : palette.muted, _v$44 = palette.danger, _v$45 = tight() ? 0 : 1, _v$46 = tight() ? 0 : 1, _v$47 = tight() || (compact() || dimensions().width < 56) && screen() === "setup" ? 0 : 1, _v$48 = palette.muted;
4758
- _v$36 !== _p$.e && (_p$.e = setProp(_el$4, "backgroundColor", _v$36, _p$.e));
4759
- _v$37 !== _p$.t && (_p$.t = setProp(_el$5, "width", _v$37, _p$.t));
4760
- _v$38 !== _p$.a && (_p$.a = setProp(_el$5, "height", _v$38, _p$.a));
4761
- _v$39 !== _p$.o && (_p$.o = setProp(_el$5, "borderColor", _v$39, _p$.o));
4762
- _v$40 !== _p$.i && (_p$.i = setProp(_el$5, "backgroundColor", _v$40, _p$.i));
4763
- _v$41 !== _p$.n && (_p$.n = setProp(_el$7, "fg", _v$41, _p$.n));
4764
- _v$42 !== _p$.s && (_p$.s = setProp(_el$7, "attributes", _v$42, _p$.s));
4765
- _v$43 !== _p$.h && (_p$.h = setProp(_el$9, "fg", _v$43, _p$.h));
4766
- _v$44 !== _p$.r && (_p$.r = setProp(_el$0, "backgroundColor", _v$44, _p$.r));
4767
- _v$45 !== _p$.d && (_p$.d = setProp(_el$0, "marginTop", _v$45, _p$.d));
4768
- _v$46 !== _p$.l && (_p$.l = setProp(_el$1, "paddingTop", _v$46, _p$.l));
4769
- _v$47 !== _p$.u && (_p$.u = setProp(_el$1, "gap", _v$47, _p$.u));
4770
- _v$48 !== _p$.c && (_p$.c = setProp(_el$87, "fg", _v$48, _p$.c));
4770
+ var _v$37 = palette.background, _v$38 = dimensions().width <= 80 ? "100%" : 80, _v$39 = dimensions().height <= 24 ? "100%" : 24, _v$40 = palette.border, _v$41 = palette.card, _v$42 = palette.accent, _v$43 = TextAttributes2.BOLD, _v$44 = palette.muted, _v$45 = palette.danger, _v$46 = tight() ? 0 : 1, _v$47 = tight() ? 0 : 1, _v$48 = tight() || (compact() || dimensions().width < 56) && (screen() === "setup" || !!image()) ? 0 : 1, _v$49 = palette.muted, _v$50 = palette.muted;
4771
+ _v$37 !== _p$.e && (_p$.e = setProp(_el$7, "backgroundColor", _v$37, _p$.e));
4772
+ _v$38 !== _p$.t && (_p$.t = setProp(_el$8, "width", _v$38, _p$.t));
4773
+ _v$39 !== _p$.a && (_p$.a = setProp(_el$8, "height", _v$39, _p$.a));
4774
+ _v$40 !== _p$.o && (_p$.o = setProp(_el$8, "borderColor", _v$40, _p$.o));
4775
+ _v$41 !== _p$.i && (_p$.i = setProp(_el$8, "backgroundColor", _v$41, _p$.i));
4776
+ _v$42 !== _p$.n && (_p$.n = setProp(_el$0, "fg", _v$42, _p$.n));
4777
+ _v$43 !== _p$.s && (_p$.s = setProp(_el$0, "attributes", _v$43, _p$.s));
4778
+ _v$44 !== _p$.h && (_p$.h = setProp(_el$10, "fg", _v$44, _p$.h));
4779
+ _v$45 !== _p$.r && (_p$.r = setProp(_el$11, "backgroundColor", _v$45, _p$.r));
4780
+ _v$46 !== _p$.d && (_p$.d = setProp(_el$11, "marginTop", _v$46, _p$.d));
4781
+ _v$47 !== _p$.l && (_p$.l = setProp(_el$12, "paddingTop", _v$47, _p$.l));
4782
+ _v$48 !== _p$.u && (_p$.u = setProp(_el$12, "gap", _v$48, _p$.u));
4783
+ _v$49 !== _p$.c && (_p$.c = setProp(_el$84, "fg", _v$49, _p$.c));
4784
+ _v$50 !== _p$.w && (_p$.w = setProp(_el$85, "fg", _v$50, _p$.w));
4771
4785
  return _p$;
4772
4786
  }, {
4773
4787
  e: void 0,
@@ -4782,18 +4796,17 @@ function App(props) {
4782
4796
  d: void 0,
4783
4797
  l: void 0,
4784
4798
  u: void 0,
4785
- c: void 0
4799
+ c: void 0,
4800
+ w: void 0
4786
4801
  });
4787
- return _el$4;
4802
+ return _el$7;
4788
4803
  })();
4789
4804
  }
4790
4805
 
4791
4806
  // src/index.tsx
4792
4807
  var args = process.argv.slice(2);
4793
- var demo = args.includes("--demo");
4794
- var fixture = args.find((arg) => arg.startsWith("--demo="))?.slice(7);
4795
- if (args.length > 1 || args.some((arg) => !["--demo", "--demo=empty", "--demo=error", "--demo=setup", "--demo=setup-zstd", "--demo=setup-error", "--demo=setup-interrupted", "--demo=no-homebrew", "--list-images", "--clear-cache"].includes(arg))) {
4796
- console.error("Usage: bun start [--demo[=empty|error|setup|setup-zstd|setup-error|setup-interrupted|no-homebrew] | --list-images | --clear-cache]");
4808
+ if (args.length > 1 || args.some((arg) => !["--list-images", "--clear-cache"].includes(arg))) {
4809
+ console.error("Usage: boo-flash [--list-images | --clear-cache]");
4797
4810
  process.exitCode = 1;
4798
4811
  } else if (args.includes("--clear-cache")) {
4799
4812
  try {
@@ -4809,11 +4822,11 @@ if (args.length > 1 || args.some((arg) => !["--demo", "--demo=empty", "--demo=er
4809
4822
  console.error(e instanceof Error ? e.message : "Image discovery failed.");
4810
4823
  process.exitCode = 1;
4811
4824
  }
4812
- } else if (!demo && !fixture && (!["darwin", "linux"].includes(process.platform) || process.getuid?.() === 0)) {
4813
- console.error("Boo Flash requires macOS or Linux and a normal user account. Use --demo for a non-writing UI preview.");
4825
+ } else if (!["darwin", "linux"].includes(process.platform) || process.getuid?.() === 0) {
4826
+ console.error("Boo Flash requires macOS or Linux and a normal user account.");
4814
4827
  process.exitCode = 1;
4815
4828
  } else {
4816
- const backend = new FlashBackend(demo ? "normal" : fixture);
4829
+ const backend = new FlashBackend();
4817
4830
  const renderer = await createCliRenderer2({
4818
4831
  backgroundColor: palette.background,
4819
4832
  targetFps: 30,
@@ -4854,3 +4867,31 @@ if (args.length > 1 || args.some((arg) => !["--demo", "--demo=empty", "--demo=er
4854
4867
  for (const signal of signals) process.off(signal, quit);
4855
4868
  }
4856
4869
  }
4870
+ /*!
4871
+ * Artwork derived from @simonklee/bigfeelings@0.2.1, original octant painter,
4872
+ * scale 4, time 0, right-facing ghost at (0,0), wordmark at (48,0).
4873
+ * Frozen 92x48 samples / 46x12 cells, unchanged from BooLogoRenderable.ts.
4874
+ * Source tarball SHA-256:
4875
+ * 5a82909d19c9eb94e28c7407f5d220f7ff8051a1e3cdcdb11a6eb8870c4e30b0
4876
+ *
4877
+ * MIT License
4878
+ * Copyright (c) 2026 Simon Klee
4879
+ *
4880
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
4881
+ * of this software and associated documentation files (the "Software"), to deal
4882
+ * in the Software without restriction, including without limitation the rights
4883
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
4884
+ * copies of the Software, and to permit persons to whom the Software is
4885
+ * furnished to do so, subject to the following conditions:
4886
+ *
4887
+ * The above copyright notice and this permission notice shall be included in all
4888
+ * copies or substantial portions of the Software.
4889
+ *
4890
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
4891
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
4892
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
4893
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
4894
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
4895
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
4896
+ * SOFTWARE.
4897
+ */