boo-flash 0.1.3 → 0.1.5

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 (2) hide show
  1. package/dist/app.js +372 -320
  2. package/package.json +1 -1
package/dist/app.js CHANGED
@@ -3434,6 +3434,36 @@ var moduleDirectory = dirname3(fileURLToPath2(import.meta.url));
3434
3434
  function bytes(n) {
3435
3435
  return n >= 1024 ** 3 ? `${(n / 1024 ** 3).toFixed(1)} GiB` : `${(n / 1024 ** 2).toFixed(1)} MiB`;
3436
3436
  }
3437
+ function imageTime(value, now = Date.now(), locales) {
3438
+ const date = new Date(value);
3439
+ if (!Number.isFinite(date.getTime())) throw new Error("Invalid image timestamp.");
3440
+ const age = now - date.getTime();
3441
+ if (age >= -60 * 1e3 && age <= 60 * 60 * 1e3) {
3442
+ const minutes = Math.max(0, Math.round(age / (60 * 1e3)));
3443
+ return new Intl.RelativeTimeFormat(locales, { numeric: "always" }).format(-minutes, "minute");
3444
+ }
3445
+ return new Intl.DateTimeFormat(locales, { dateStyle: "medium", timeStyle: "short" }).format(date);
3446
+ }
3447
+ function releaseTimestamp(headers) {
3448
+ const values = headers.split(/\r?\n/).flatMap((line) => {
3449
+ const match = /^last-modified:\s*(.*?)\s*$/i.exec(line);
3450
+ return match ? [match[1]] : [];
3451
+ });
3452
+ if (values.length !== 1 || !Number.isFinite(Date.parse(values[0]))) {
3453
+ throw new Error("The Boo release publication time is invalid.");
3454
+ }
3455
+ return new Date(values[0]).toISOString();
3456
+ }
3457
+ function releaseChannel(response) {
3458
+ let separator = response.indexOf("\r\n\r\n");
3459
+ let length = 4;
3460
+ if (separator < 0) {
3461
+ separator = response.indexOf("\n\n");
3462
+ length = 2;
3463
+ }
3464
+ if (separator < 0) throw new Error("The Boo release channel response is invalid.");
3465
+ return { channel: JSON.parse(response.slice(separator + length)), timestamp: releaseTimestamp(response.slice(0, separator)) };
3466
+ }
3437
3467
  async function prepareSafeRemoval(platform3, disk, signal, authorize2, revalidate, update) {
3438
3468
  if (platform3.finalAuthorization) {
3439
3469
  update({ stage: "Authorizing", detail: "Refreshing Linux authorization before safe power-off." });
@@ -3456,7 +3486,21 @@ async function discoverImages(signal) {
3456
3486
  ...fresh ? ["--header", "Cache-Control: no-cache"] : [],
3457
3487
  url
3458
3488
  ], signal, { limit: 1024 ** 2 }));
3459
- const channel = await get(`${releaseOrigin}/channels/main.json`, true);
3489
+ const channelUrl = `${releaseOrigin}/channels/main.json`;
3490
+ const { channel, timestamp } = releaseChannel(await command([
3491
+ "curl",
3492
+ "--fail",
3493
+ "--silent",
3494
+ "--show-error",
3495
+ "--proto",
3496
+ "=https",
3497
+ "--header",
3498
+ "Cache-Control: no-cache",
3499
+ "--suppress-connect-headers",
3500
+ "--dump-header",
3501
+ "-",
3502
+ channelUrl
3503
+ ], signal, { limit: 1024 ** 2 }));
3460
3504
  if (channel?.schema !== 1 || !releaseVersion.test(channel.version) || !/^[a-f0-9]{40}$/.test(channel.revision) || channel.prefix !== `releases/${channel.version}`) {
3461
3505
  throw new Error("The Boo main release channel is invalid.");
3462
3506
  }
@@ -3483,7 +3527,7 @@ async function discoverImages(signal) {
3483
3527
  rawDigest: artifact.raw_sha256
3484
3528
  };
3485
3529
  });
3486
- return { run: build, version: channel.version, revision: channel.revision, images };
3530
+ return { run: build, version: channel.version, revision: channel.revision, timestamp, images };
3487
3531
  }
3488
3532
  async function discoverCandidates(signal) {
3489
3533
  const api = async (path) => JSON.parse(await command(["gh", "api", "--hostname", "github.com", `repos/${repository}/${path}`], signal));
@@ -3500,6 +3544,7 @@ async function discoverCandidates(signal) {
3500
3544
  candidates.push({
3501
3545
  run: run.id,
3502
3546
  revision: match[2],
3547
+ timestamp: new Date(run.created_at).toISOString(),
3503
3548
  images: [{
3504
3549
  profile: match[1],
3505
3550
  id: a.id,
@@ -3507,7 +3552,7 @@ async function discoverCandidates(signal) {
3507
3552
  bytes: a.size_in_bytes,
3508
3553
  digest: a.digest.slice(7)
3509
3554
  }],
3510
- candidate: { number: run.run_number, date: new Date(run.created_at).toISOString().slice(0, 10), title: cleanText(run.display_title ?? "") }
3555
+ candidate: { number: run.run_number }
3511
3556
  });
3512
3557
  if (candidates.length === 10) return candidates;
3513
3558
  }
@@ -3565,7 +3610,7 @@ var FlashBackend = class {
3565
3610
  async catalog(signal) {
3566
3611
  if (!this.demo) return discoverImages(signal);
3567
3612
  await delay(350, void 0, { signal });
3568
- return { run: 149, version: "0.1.0+149", revision: "9b7574859120add5a1a478bc7923aeb1629be4ba", images: profiles.map((profile, index) => ({
3613
+ return { run: 149, version: "0.1.0+149", revision: "9b7574859120add5a1a478bc7923aeb1629be4ba", timestamp: new Date(Date.now() - 10 * 60 * 1e3).toISOString(), images: profiles.map((profile, index) => ({
3569
3614
  profile,
3570
3615
  id: index,
3571
3616
  name: `demo-${profile}`,
@@ -3578,8 +3623,9 @@ var FlashBackend = class {
3578
3623
  const catalog = await this.catalog(signal);
3579
3624
  return this.demo === "empty" ? [] : [{
3580
3625
  ...catalog,
3626
+ timestamp: new Date(Date.now() - 5 * 60 * 1e3).toISOString(),
3581
3627
  images: [catalog.images[0]],
3582
- candidate: { number: 1, date: "2026-08-28", title: "Simulated candidate" }
3628
+ candidate: { number: 1 }
3583
3629
  }];
3584
3630
  }
3585
3631
  async disks(signal, staging = tmpdir4(), unmounted) {
@@ -3816,6 +3862,7 @@ function App(props) {
3816
3862
  detail: ""
3817
3863
  });
3818
3864
  const [frame, setFrame] = createSignal(0);
3865
+ const [now, setNow] = createSignal(Date.now());
3819
3866
  let controller = new AbortController();
3820
3867
  let pending = Promise.resolve();
3821
3868
  let closing = false;
@@ -3917,7 +3964,11 @@ function App(props) {
3917
3964
  await pending;
3918
3965
  };
3919
3966
  props.registerStop(stop);
3920
- onMount(refresh);
3967
+ onMount(() => {
3968
+ refresh();
3969
+ const timer = setInterval(() => setNow(Date.now()), 60 * 1e3);
3970
+ onCleanup(() => clearInterval(timer));
3971
+ });
3921
3972
  const activate = () => {
3922
3973
  if (busy() || !visible()) return;
3923
3974
  if (screen() === "setup") {
@@ -4047,7 +4098,7 @@ function App(props) {
4047
4098
  if (["up", "left"].includes(key.name)) setCursor((n) => Math.max(0, n - 1));
4048
4099
  if (key.name === "return" && !key.repeated) activate();
4049
4100
  });
4050
- const row = (label, detail, index, danger = false) => (() => {
4101
+ const row = (label, detail, index, danger = false, detailWhenTight = false) => (() => {
4051
4102
  var _el$ = createElement("box"), _el$2 = createElement("text");
4052
4103
  insertNode(_el$, _el$2);
4053
4104
  setProp(_el$, "paddingX", 1);
@@ -4057,19 +4108,18 @@ function App(props) {
4057
4108
  insert(_el$2, label, null);
4058
4109
  insert(_el$, createComponent2(Show, {
4059
4110
  get when() {
4060
- return detail && !tight();
4111
+ return detail && (!tight() || detailWhenTight);
4061
4112
  },
4062
4113
  get children() {
4063
- var _el$3 = createElement("text"), _el$4 = createTextNode(` `);
4064
- insertNode(_el$3, _el$4);
4114
+ var _el$3 = createElement("text");
4065
4115
  setProp(_el$3, "wrapMode", "none");
4066
- insert(_el$3, detail, null);
4116
+ insert(_el$3, ` ${detail}`);
4067
4117
  effect((_$p) => setProp(_el$3, "fg", palette.muted, _$p));
4068
4118
  return _el$3;
4069
4119
  }
4070
4120
  }), null);
4071
4121
  effect((_p$) => {
4072
- var _v$ = detail && !tight() ? 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;
4122
+ 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;
4073
4123
  _v$ !== _p$.e && (_p$.e = setProp(_el$, "height", _v$, _p$.e));
4074
4124
  _v$2 !== _p$.t && (_p$.t = setProp(_el$, "backgroundColor", _v$2, _p$.t));
4075
4125
  _v$3 !== _p$.a && (_p$.a = setProp(_el$2, "fg", _v$3, _p$.a));
@@ -4084,43 +4134,43 @@ function App(props) {
4084
4134
  return _el$;
4085
4135
  })();
4086
4136
  return (() => {
4087
- var _el$5 = createElement("box"), _el$6 = createElement("box"), _el$7 = createElement("box"), _el$8 = createElement("text"), _el$0 = createElement("text"), _el$1 = createElement("box"), _el$10 = createElement("box"), _el$88 = createElement("text");
4137
+ 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");
4138
+ insertNode(_el$4, _el$5);
4139
+ setProp(_el$4, "width", "100%");
4140
+ setProp(_el$4, "height", "100%");
4141
+ setProp(_el$4, "justifyContent", "center");
4142
+ setProp(_el$4, "alignItems", "center");
4088
4143
  insertNode(_el$5, _el$6);
4089
- setProp(_el$5, "width", "100%");
4090
- setProp(_el$5, "height", "100%");
4091
- setProp(_el$5, "justifyContent", "center");
4092
- setProp(_el$5, "alignItems", "center");
4144
+ insertNode(_el$5, _el$0);
4145
+ insertNode(_el$5, _el$1);
4146
+ insertNode(_el$5, _el$87);
4147
+ setProp(_el$5, "border", true);
4148
+ setProp(_el$5, "borderStyle", "single");
4149
+ setProp(_el$5, "flexDirection", "column");
4150
+ setProp(_el$5, "paddingX", 1);
4093
4151
  insertNode(_el$6, _el$7);
4094
- insertNode(_el$6, _el$1);
4095
- insertNode(_el$6, _el$10);
4096
- insertNode(_el$6, _el$88);
4097
- setProp(_el$6, "border", true);
4098
- setProp(_el$6, "borderStyle", "single");
4099
- setProp(_el$6, "flexDirection", "column");
4100
- setProp(_el$6, "paddingX", 1);
4101
- insertNode(_el$7, _el$8);
4102
- insertNode(_el$7, _el$0);
4103
- setProp(_el$7, "height", 1);
4104
- setProp(_el$7, "flexDirection", "row");
4105
- setProp(_el$7, "justifyContent", "space-between");
4106
- setProp(_el$7, "flexShrink", 0);
4107
- insertNode(_el$8, createTextNode(`BOO FLASH`));
4108
- insert(_el$0, () => props.backend.platformLabel);
4109
- setProp(_el$1, "height", 1);
4110
- setProp(_el$1, "flexShrink", 0);
4111
- setProp(_el$10, "flexGrow", 1);
4112
- setProp(_el$10, "minHeight", 0);
4113
- setProp(_el$10, "overflow", "hidden");
4114
- insert(_el$10, createComponent2(Show, {
4152
+ insertNode(_el$6, _el$9);
4153
+ setProp(_el$6, "height", 1);
4154
+ setProp(_el$6, "flexDirection", "row");
4155
+ setProp(_el$6, "justifyContent", "space-between");
4156
+ setProp(_el$6, "flexShrink", 0);
4157
+ insertNode(_el$7, createTextNode(`BOO FLASH`));
4158
+ insert(_el$9, () => props.backend.platformLabel);
4159
+ setProp(_el$0, "height", 1);
4160
+ setProp(_el$0, "flexShrink", 0);
4161
+ setProp(_el$1, "flexGrow", 1);
4162
+ setProp(_el$1, "minHeight", 0);
4163
+ setProp(_el$1, "overflow", "hidden");
4164
+ insert(_el$1, createComponent2(Show, {
4115
4165
  get when() {
4116
4166
  return visible();
4117
4167
  },
4118
4168
  get fallback() {
4119
4169
  return (() => {
4120
- var _el$89 = createElement("text");
4121
- insertNode(_el$89, createTextNode(`Enlarge the terminal to show the full choices and erase warning. Q quits.`));
4122
- effect((_$p) => setProp(_el$89, "fg", palette.warning, _$p));
4123
- return _el$89;
4170
+ var _el$88 = createElement("text");
4171
+ insertNode(_el$88, createTextNode(`Enlarge the terminal to show the full choices and erase warning. Q quits.`));
4172
+ effect((_$p) => setProp(_el$88, "fg", palette.warning, _$p));
4173
+ return _el$88;
4124
4174
  })();
4125
4175
  },
4126
4176
  get children() {
@@ -4130,41 +4180,43 @@ function App(props) {
4130
4180
  },
4131
4181
  get children() {
4132
4182
  return [(() => {
4133
- var _el$11 = createElement("text");
4134
- insertNode(_el$11, createTextNode(`Choose the target computer's GPU`));
4183
+ var _el$10 = createElement("text");
4184
+ insertNode(_el$10, createTextNode(`Choose the target computer's GPU`));
4135
4185
  effect((_p$) => {
4136
4186
  var _v$5 = palette.foreground, _v$6 = TextAttributes2.BOLD;
4137
- _v$5 !== _p$.e && (_p$.e = setProp(_el$11, "fg", _v$5, _p$.e));
4138
- _v$6 !== _p$.t && (_p$.t = setProp(_el$11, "attributes", _v$6, _p$.t));
4187
+ _v$5 !== _p$.e && (_p$.e = setProp(_el$10, "fg", _v$5, _p$.e));
4188
+ _v$6 !== _p$.t && (_p$.t = setProp(_el$10, "attributes", _v$6, _p$.t));
4139
4189
  return _p$;
4140
4190
  }, {
4141
4191
  e: void 0,
4142
4192
  t: void 0
4143
4193
  });
4144
- return _el$11;
4194
+ return _el$10;
4145
4195
  })(), (() => {
4146
- var _el$13 = createElement("text");
4147
- insert(_el$13, (() => {
4196
+ var _el$12 = createElement("text");
4197
+ insert(_el$12, (() => {
4148
4198
  var _c$ = memo2(() => !!loading());
4149
- return () => _c$() ? `${spinner()} Finding latest Boo release...` : memo2(() => !!catalog())() ? `Boo ${catalog().version} / ${catalog().revision.slice(0, 7)}` : "Dependencies needed. Enter to set up.";
4199
+ 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.";
4150
4200
  })());
4151
- effect((_$p) => setProp(_el$13, "fg", palette.muted, _$p));
4152
- return _el$13;
4201
+ effect((_$p) => setProp(_el$12, "fg", palette.muted, _$p));
4202
+ return _el$12;
4153
4203
  })(), (() => {
4154
- var _el$14 = createElement("box");
4155
- setProp(_el$14, "gap", 0);
4156
- insert(_el$14, createComponent2(For, {
4204
+ var _el$13 = createElement("box");
4205
+ setProp(_el$13, "gap", 0);
4206
+ setProp(_el$13, "marginBottom", 1);
4207
+ setProp(_el$13, "flexShrink", 0);
4208
+ insert(_el$13, createComponent2(For, {
4157
4209
  each: profiles,
4158
4210
  children: (profile, index) => row(profile.toUpperCase(), profile === "nvidia" ? "NVIDIA graphics" : `${profile === "intel" ? "Intel" : "AMD Radeon"} graphics`, index())
4159
4211
  }), null);
4160
- insert(_el$14, () => row("Candidates", "", 3), null);
4161
- insert(_el$14, () => row("Clear cached images", "", 4), null);
4162
- return _el$14;
4212
+ insert(_el$13, () => row("Candidates", "", 3), null);
4213
+ insert(_el$13, () => row("Clear cached images", "", 4), null);
4214
+ return _el$13;
4163
4215
  })(), (() => {
4164
- var _el$15 = createElement("text");
4165
- insertNode(_el$15, createTextNode(`All images support Intel and AMD x86_64 CPUs.`));
4166
- effect((_$p) => setProp(_el$15, "fg", palette.muted, _$p));
4167
- return _el$15;
4216
+ var _el$14 = createElement("text");
4217
+ insertNode(_el$14, createTextNode(`All images support Intel and AMD x86_64 CPUs.`));
4218
+ effect((_$p) => setProp(_el$14, "fg", palette.muted, _$p));
4219
+ return _el$14;
4168
4220
  })()];
4169
4221
  }
4170
4222
  }), createComponent2(Show, {
@@ -4173,34 +4225,34 @@ function App(props) {
4173
4225
  },
4174
4226
  get children() {
4175
4227
  return [(() => {
4176
- var _el$17 = createElement("text");
4177
- insertNode(_el$17, createTextNode(`Clear cached images?`));
4228
+ var _el$16 = createElement("text");
4229
+ insertNode(_el$16, createTextNode(`Clear cached images?`));
4178
4230
  effect((_p$) => {
4179
4231
  var _v$7 = palette.warning, _v$8 = TextAttributes2.BOLD;
4180
- _v$7 !== _p$.e && (_p$.e = setProp(_el$17, "fg", _v$7, _p$.e));
4181
- _v$8 !== _p$.t && (_p$.t = setProp(_el$17, "attributes", _v$8, _p$.t));
4232
+ _v$7 !== _p$.e && (_p$.e = setProp(_el$16, "fg", _v$7, _p$.e));
4233
+ _v$8 !== _p$.t && (_p$.t = setProp(_el$16, "attributes", _v$8, _p$.t));
4182
4234
  return _p$;
4183
4235
  }, {
4184
4236
  e: void 0,
4185
4237
  t: void 0
4186
4238
  });
4187
- return _el$17;
4239
+ return _el$16;
4188
4240
  })(), (() => {
4189
- var _el$19 = createElement("text");
4190
- insertNode(_el$19, createTextNode(`Removes downloaded archives only, NOT USB contents. Active flashes are unaffected.`));
4191
- effect((_$p) => setProp(_el$19, "fg", palette.foreground, _$p));
4192
- return _el$19;
4241
+ var _el$18 = createElement("text");
4242
+ insertNode(_el$18, createTextNode(`Removes downloaded archives only, NOT USB contents. Active flashes are unaffected.`));
4243
+ effect((_$p) => setProp(_el$18, "fg", palette.foreground, _$p));
4244
+ return _el$18;
4193
4245
  })(), (() => {
4194
- var _el$21 = createElement("text");
4195
- insertNode(_el$21, createTextNode(`Images will download again when needed. Pending downloads may still finish and be cached.`));
4196
- effect((_$p) => setProp(_el$21, "fg", palette.muted, _$p));
4197
- return _el$21;
4246
+ var _el$20 = createElement("text");
4247
+ insertNode(_el$20, createTextNode(`Images will download again when needed. Pending downloads may still finish and be cached.`));
4248
+ effect((_$p) => setProp(_el$20, "fg", palette.muted, _$p));
4249
+ return _el$20;
4198
4250
  })(), (() => {
4199
- var _el$23 = createElement("box");
4200
- insert(_el$23, () => row("Go back", "", 0), null);
4201
- insert(_el$23, () => row(loading() ? "Clearing..." : "Clear cached images", "", 1, true), null);
4202
- effect((_$p) => setProp(_el$23, "gap", tight() ? 0 : 1, _$p));
4203
- return _el$23;
4251
+ var _el$22 = createElement("box");
4252
+ insert(_el$22, () => row("Go back", "", 0), null);
4253
+ insert(_el$22, () => row(loading() ? "Clearing..." : "Clear cached images", "", 1, true), null);
4254
+ effect((_$p) => setProp(_el$22, "gap", tight() ? 0 : 1, _$p));
4255
+ return _el$22;
4204
4256
  })()];
4205
4257
  }
4206
4258
  }), createComponent2(Show, {
@@ -4209,23 +4261,23 @@ function App(props) {
4209
4261
  },
4210
4262
  get children() {
4211
4263
  return [(() => {
4212
- var _el$24 = createElement("text");
4213
- insertNode(_el$24, createTextNode(`Cache cleared`));
4264
+ var _el$23 = createElement("text");
4265
+ insertNode(_el$23, createTextNode(`Cache cleared`));
4214
4266
  effect((_p$) => {
4215
4267
  var _v$9 = palette.success, _v$0 = TextAttributes2.BOLD;
4216
- _v$9 !== _p$.e && (_p$.e = setProp(_el$24, "fg", _v$9, _p$.e));
4217
- _v$0 !== _p$.t && (_p$.t = setProp(_el$24, "attributes", _v$0, _p$.t));
4268
+ _v$9 !== _p$.e && (_p$.e = setProp(_el$23, "fg", _v$9, _p$.e));
4269
+ _v$0 !== _p$.t && (_p$.t = setProp(_el$23, "attributes", _v$0, _p$.t));
4218
4270
  return _p$;
4219
4271
  }, {
4220
4272
  e: void 0,
4221
4273
  t: void 0
4222
4274
  });
4223
- return _el$24;
4275
+ return _el$23;
4224
4276
  })(), (() => {
4225
- var _el$26 = createElement("text");
4226
- insert(_el$26, notice);
4227
- effect((_$p) => setProp(_el$26, "fg", palette.foreground, _$p));
4228
- return _el$26;
4277
+ var _el$25 = createElement("text");
4278
+ insert(_el$25, notice);
4279
+ effect((_$p) => setProp(_el$25, "fg", palette.foreground, _$p));
4280
+ return _el$25;
4229
4281
  })(), memo2(() => row("Go back", "", 0))];
4230
4282
  }
4231
4283
  }), createComponent2(Show, {
@@ -4234,34 +4286,34 @@ function App(props) {
4234
4286
  },
4235
4287
  get children() {
4236
4288
  return [(() => {
4237
- var _el$27 = createElement("text");
4238
- insertNode(_el$27, createTextNode(`Candidates`));
4289
+ var _el$26 = createElement("text");
4290
+ insertNode(_el$26, createTextNode(`Candidates`));
4239
4291
  effect((_p$) => {
4240
4292
  var _v$1 = palette.foreground, _v$10 = TextAttributes2.BOLD;
4241
- _v$1 !== _p$.e && (_p$.e = setProp(_el$27, "fg", _v$1, _p$.e));
4242
- _v$10 !== _p$.t && (_p$.t = setProp(_el$27, "attributes", _v$10, _p$.t));
4293
+ _v$1 !== _p$.e && (_p$.e = setProp(_el$26, "fg", _v$1, _p$.e));
4294
+ _v$10 !== _p$.t && (_p$.t = setProp(_el$26, "attributes", _v$10, _p$.t));
4243
4295
  return _p$;
4244
4296
  }, {
4245
4297
  e: void 0,
4246
4298
  t: void 0
4247
4299
  });
4248
- return _el$27;
4300
+ return _el$26;
4249
4301
  })(), (() => {
4250
- var _el$29 = createElement("text");
4251
- insertNode(_el$29, createTextNode(`Build-only; not boot/install/hardware qualified.`));
4252
- effect((_$p) => setProp(_el$29, "fg", palette.warning, _$p));
4253
- return _el$29;
4302
+ var _el$28 = createElement("text");
4303
+ insertNode(_el$28, createTextNode(`Build-only; not boot/install/hardware qualified.`));
4304
+ effect((_$p) => setProp(_el$28, "fg", palette.warning, _$p));
4305
+ return _el$28;
4254
4306
  })(), createComponent2(Show, {
4255
4307
  get when() {
4256
4308
  return !loading();
4257
4309
  },
4258
4310
  get fallback() {
4259
4311
  return (() => {
4260
- var _el$91 = createElement("text"), _el$92 = createTextNode(` Finding completed candidates...`);
4261
- insertNode(_el$91, _el$92);
4262
- insert(_el$91, spinner, _el$92);
4263
- effect((_$p) => setProp(_el$91, "fg", palette.muted, _$p));
4264
- return _el$91;
4312
+ var _el$90 = createElement("text"), _el$91 = createTextNode(` Finding completed candidates...`);
4313
+ insertNode(_el$90, _el$91);
4314
+ insert(_el$90, spinner, _el$91);
4315
+ effect((_$p) => setProp(_el$90, "fg", palette.muted, _$p));
4316
+ return _el$90;
4265
4317
  })();
4266
4318
  },
4267
4319
  get children() {
@@ -4271,31 +4323,31 @@ function App(props) {
4271
4323
  },
4272
4324
  get fallback() {
4273
4325
  return [(() => {
4274
- var _el$93 = createElement("text");
4275
- insertNode(_el$93, createTextNode(`No completed candidates available`));
4276
- effect((_$p) => setProp(_el$93, "fg", palette.muted, _$p));
4277
- return _el$93;
4326
+ var _el$92 = createElement("text");
4327
+ insertNode(_el$92, createTextNode(`No completed candidates available`));
4328
+ effect((_$p) => setProp(_el$92, "fg", palette.muted, _$p));
4329
+ return _el$92;
4278
4330
  })(), memo2(() => row("Go back", "", 0))];
4279
4331
  },
4280
4332
  get children() {
4281
4333
  return [(() => {
4282
- var _el$31 = createElement("box");
4283
- setProp(_el$31, "gap", 0);
4284
- insert(_el$31, createComponent2(For, {
4334
+ var _el$30 = createElement("box");
4335
+ setProp(_el$30, "gap", 0);
4336
+ insert(_el$30, createComponent2(For, {
4285
4337
  get each() {
4286
4338
  return candidates().slice(Math.max(0, cursor() - 2), Math.max(3, cursor() + 1));
4287
4339
  },
4288
- children: (c, index) => row(`${c.images[0].profile.toUpperCase()} ${c.revision.slice(0, 7)} #${c.candidate.number} ${c.candidate.date}`, c.candidate.title, index() + Math.max(0, cursor() - 2))
4340
+ 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)
4289
4341
  }));
4290
- return _el$31;
4342
+ return _el$30;
4291
4343
  })(), (() => {
4292
- var _el$32 = createElement("text"), _el$33 = createTextNode(` of `), _el$34 = createTextNode(` candidates / Enter to choose`);
4293
- insertNode(_el$32, _el$33);
4294
- insertNode(_el$32, _el$34);
4295
- insert(_el$32, () => cursor() + 1, _el$33);
4296
- insert(_el$32, () => candidates().length, _el$34);
4297
- effect((_$p) => setProp(_el$32, "fg", palette.muted, _$p));
4298
- return _el$32;
4344
+ var _el$31 = createElement("text"), _el$32 = createTextNode(` of `), _el$33 = createTextNode(` candidates / Enter to choose`);
4345
+ insertNode(_el$31, _el$32);
4346
+ insertNode(_el$31, _el$33);
4347
+ insert(_el$31, () => cursor() + 1, _el$32);
4348
+ insert(_el$31, () => candidates().length, _el$33);
4349
+ effect((_$p) => setProp(_el$31, "fg", palette.muted, _$p));
4350
+ return _el$31;
4299
4351
  })()];
4300
4352
  }
4301
4353
  });
@@ -4308,71 +4360,71 @@ function App(props) {
4308
4360
  },
4309
4361
  get children() {
4310
4362
  return [(() => {
4311
- var _el$35 = createElement("text");
4312
- insertNode(_el$35, createTextNode(`Set up required tools`));
4363
+ var _el$34 = createElement("text");
4364
+ insertNode(_el$34, createTextNode(`Set up required tools`));
4313
4365
  effect((_p$) => {
4314
4366
  var _v$11 = palette.accent, _v$12 = TextAttributes2.BOLD;
4315
- _v$11 !== _p$.e && (_p$.e = setProp(_el$35, "fg", _v$11, _p$.e));
4316
- _v$12 !== _p$.t && (_p$.t = setProp(_el$35, "attributes", _v$12, _p$.t));
4367
+ _v$11 !== _p$.e && (_p$.e = setProp(_el$34, "fg", _v$11, _p$.e));
4368
+ _v$12 !== _p$.t && (_p$.t = setProp(_el$34, "attributes", _v$12, _p$.t));
4317
4369
  return _p$;
4318
4370
  }, {
4319
4371
  e: void 0,
4320
4372
  t: void 0
4321
4373
  });
4322
- return _el$35;
4374
+ return _el$34;
4323
4375
  })(), (() => {
4324
- var _el$37 = createElement("text"), _el$38 = createTextNode(`Missing: `);
4325
- insertNode(_el$37, _el$38);
4326
- insert(_el$37, () => dependencies3().missing.join(", "), null);
4327
- effect((_$p) => setProp(_el$37, "fg", palette.foreground, _$p));
4328
- return _el$37;
4376
+ var _el$36 = createElement("text"), _el$37 = createTextNode(`Missing: `);
4377
+ insertNode(_el$36, _el$37);
4378
+ insert(_el$36, () => dependencies3().missing.join(", "), null);
4379
+ effect((_$p) => setProp(_el$36, "fg", palette.foreground, _$p));
4380
+ return _el$36;
4329
4381
  })(), createComponent2(Show, {
4330
4382
  get when() {
4331
4383
  return !error();
4332
4384
  },
4333
4385
  get fallback() {
4334
4386
  return (() => {
4335
- var _el$95 = createElement("text");
4336
- insert(_el$95, error);
4337
- effect((_$p) => setProp(_el$95, "fg", palette.warning, _$p));
4338
- return _el$95;
4387
+ var _el$94 = createElement("text");
4388
+ insert(_el$94, error);
4389
+ effect((_$p) => setProp(_el$94, "fg", palette.warning, _$p));
4390
+ return _el$94;
4339
4391
  })();
4340
4392
  },
4341
4393
  get children() {
4342
- var _el$39 = createElement("text");
4343
- insert(_el$39, (() => {
4394
+ var _el$38 = createElement("text");
4395
+ insert(_el$38, (() => {
4344
4396
  var _c$2 = memo2(() => !!dependencies3().installer);
4345
4397
  return () => _c$2() ? `${dependencies3().installer} will install ${dependencies3().missing.join(" and ")} and required dependencies, then continue.` : dependencies3().guidance;
4346
4398
  })());
4347
- effect((_$p) => setProp(_el$39, "fg", palette.muted, _$p));
4348
- return _el$39;
4399
+ effect((_$p) => setProp(_el$38, "fg", palette.muted, _$p));
4400
+ return _el$38;
4349
4401
  }
4350
4402
  }), createComponent2(Show, {
4351
4403
  get when() {
4352
4404
  return !tight();
4353
4405
  },
4354
4406
  get children() {
4355
- var _el$40 = createElement("text");
4356
- insert(_el$40, () => dependencies3().installer ? "Uses the ordinary terminal. Ctrl-C cancels and quits." : "Boo Flash will not change system packages on this platform.");
4357
- effect((_$p) => setProp(_el$40, "fg", palette.muted, _$p));
4358
- return _el$40;
4407
+ var _el$39 = createElement("text");
4408
+ insert(_el$39, () => dependencies3().installer ? "Uses the ordinary terminal. Ctrl-C cancels and quits." : "Boo Flash will not change system packages on this platform.");
4409
+ effect((_$p) => setProp(_el$39, "fg", palette.muted, _$p));
4410
+ return _el$39;
4359
4411
  }
4360
4412
  }), createComponent2(Show, {
4361
4413
  get when() {
4362
4414
  return props.backend.demo;
4363
4415
  },
4364
4416
  get children() {
4365
- var _el$41 = createElement("text");
4366
- insertNode(_el$41, createTextNode(`Setup simulation; no software installed.`));
4367
- effect((_$p) => setProp(_el$41, "fg", palette.warning, _$p));
4368
- return _el$41;
4417
+ var _el$40 = createElement("text");
4418
+ insertNode(_el$40, createTextNode(`Setup simulation; no software installed.`));
4419
+ effect((_$p) => setProp(_el$40, "fg", palette.warning, _$p));
4420
+ return _el$40;
4369
4421
  }
4370
4422
  }), (() => {
4371
- var _el$43 = createElement("box");
4372
- insert(_el$43, () => row("Go back", "", 0), null);
4373
- insert(_el$43, () => row(dependencies3().installer ? `Install ${dependencies3().missing.join(" + ")}` : "Refresh", "", 1), null);
4374
- effect((_$p) => setProp(_el$43, "gap", tight() ? 0 : 1, _$p));
4375
- return _el$43;
4423
+ var _el$42 = createElement("box");
4424
+ insert(_el$42, () => row("Go back", "", 0), null);
4425
+ insert(_el$42, () => row(dependencies3().installer ? `Install ${dependencies3().missing.join(" + ")}` : "Refresh", "", 1), null);
4426
+ effect((_$p) => setProp(_el$42, "gap", tight() ? 0 : 1, _$p));
4427
+ return _el$42;
4376
4428
  })()];
4377
4429
  }
4378
4430
  }), createComponent2(Show, {
@@ -4381,42 +4433,42 @@ function App(props) {
4381
4433
  },
4382
4434
  get children() {
4383
4435
  return [(() => {
4384
- var _el$44 = createElement("text"), _el$45 = createTextNode(` `);
4385
- insertNode(_el$44, _el$45);
4386
- insert(_el$44, spinner, _el$45);
4387
- insert(_el$44, () => stopping() ? "Waiting for setup to stop..." : "Installing required tools", null);
4436
+ var _el$43 = createElement("text"), _el$44 = createTextNode(` `);
4437
+ insertNode(_el$43, _el$44);
4438
+ insert(_el$43, spinner, _el$44);
4439
+ insert(_el$43, () => stopping() ? "Waiting for setup to stop..." : "Installing required tools", null);
4388
4440
  effect((_p$) => {
4389
4441
  var _v$13 = palette.accent, _v$14 = TextAttributes2.BOLD;
4390
- _v$13 !== _p$.e && (_p$.e = setProp(_el$44, "fg", _v$13, _p$.e));
4391
- _v$14 !== _p$.t && (_p$.t = setProp(_el$44, "attributes", _v$14, _p$.t));
4442
+ _v$13 !== _p$.e && (_p$.e = setProp(_el$43, "fg", _v$13, _p$.e));
4443
+ _v$14 !== _p$.t && (_p$.t = setProp(_el$43, "attributes", _v$14, _p$.t));
4392
4444
  return _p$;
4393
4445
  }, {
4394
4446
  e: void 0,
4395
4447
  t: void 0
4396
4448
  });
4397
- return _el$44;
4449
+ return _el$43;
4398
4450
  })(), (() => {
4399
- var _el$46 = createElement("text"), _el$47 = createTextNode(` via `);
4400
- insertNode(_el$46, _el$47);
4401
- insert(_el$46, () => dependencies3().missing.join(" + "), _el$47);
4402
- insert(_el$46, () => dependencies3().installer, null);
4403
- effect((_$p) => setProp(_el$46, "fg", palette.foreground, _$p));
4404
- return _el$46;
4451
+ var _el$45 = createElement("text"), _el$46 = createTextNode(` via `);
4452
+ insertNode(_el$45, _el$46);
4453
+ insert(_el$45, () => dependencies3().missing.join(" + "), _el$46);
4454
+ insert(_el$45, () => dependencies3().installer, null);
4455
+ effect((_$p) => setProp(_el$45, "fg", palette.foreground, _$p));
4456
+ return _el$45;
4405
4457
  })(), (() => {
4406
- var _el$48 = createElement("text"), _el$49 = createTextNode(` uses the ordinary terminal. Ctrl-C cancels and quits; wait for cleanup.`);
4407
- insertNode(_el$48, _el$49);
4408
- insert(_el$48, () => dependencies3().installer, _el$49);
4409
- effect((_$p) => setProp(_el$48, "fg", palette.muted, _$p));
4410
- return _el$48;
4458
+ var _el$47 = createElement("text"), _el$48 = createTextNode(` uses the ordinary terminal. Ctrl-C cancels and quits; wait for cleanup.`);
4459
+ insertNode(_el$47, _el$48);
4460
+ insert(_el$47, () => dependencies3().installer, _el$48);
4461
+ effect((_$p) => setProp(_el$47, "fg", palette.muted, _$p));
4462
+ return _el$47;
4411
4463
  })(), createComponent2(Show, {
4412
4464
  get when() {
4413
4465
  return props.backend.demo;
4414
4466
  },
4415
4467
  get children() {
4416
- var _el$50 = createElement("text");
4417
- insertNode(_el$50, createTextNode(`Setup simulation; no software installed.`));
4418
- effect((_$p) => setProp(_el$50, "fg", palette.warning, _$p));
4419
- return _el$50;
4468
+ var _el$49 = createElement("text");
4469
+ insertNode(_el$49, createTextNode(`Setup simulation; no software installed.`));
4470
+ effect((_$p) => setProp(_el$49, "fg", palette.warning, _$p));
4471
+ return _el$49;
4420
4472
  }
4421
4473
  })];
4422
4474
  }
@@ -4426,26 +4478,26 @@ function App(props) {
4426
4478
  },
4427
4479
  get children() {
4428
4480
  return [(() => {
4429
- var _el$52 = createElement("text");
4430
- insertNode(_el$52, createTextNode(`Choose a USB drive`));
4481
+ var _el$51 = createElement("text");
4482
+ insertNode(_el$51, createTextNode(`Choose a USB drive`));
4431
4483
  effect((_p$) => {
4432
4484
  var _v$15 = palette.foreground, _v$16 = TextAttributes2.BOLD;
4433
- _v$15 !== _p$.e && (_p$.e = setProp(_el$52, "fg", _v$15, _p$.e));
4434
- _v$16 !== _p$.t && (_p$.t = setProp(_el$52, "attributes", _v$16, _p$.t));
4485
+ _v$15 !== _p$.e && (_p$.e = setProp(_el$51, "fg", _v$15, _p$.e));
4486
+ _v$16 !== _p$.t && (_p$.t = setProp(_el$51, "attributes", _v$16, _p$.t));
4435
4487
  return _p$;
4436
4488
  }, {
4437
4489
  e: void 0,
4438
4490
  t: void 0
4439
4491
  });
4440
- return _el$52;
4492
+ return _el$51;
4441
4493
  })(), (() => {
4442
- var _el$54 = createElement("text");
4443
- insert(_el$54, (() => {
4494
+ var _el$53 = createElement("text");
4495
+ insert(_el$53, (() => {
4444
4496
  var _c$3 = memo2(() => !!loading());
4445
4497
  return () => _c$3() ? `${spinner()} Checking disks and protected storage...` : "System, home and app storage are excluded.";
4446
4498
  })());
4447
- effect((_$p) => setProp(_el$54, "fg", palette.muted, _$p));
4448
- return _el$54;
4499
+ effect((_$p) => setProp(_el$53, "fg", palette.muted, _$p));
4500
+ return _el$53;
4449
4501
  })(), createComponent2(Show, {
4450
4502
  get when() {
4451
4503
  return !loading();
@@ -4457,31 +4509,31 @@ function App(props) {
4457
4509
  },
4458
4510
  get fallback() {
4459
4511
  return (() => {
4460
- var _el$96 = createElement("text");
4461
- insertNode(_el$96, createTextNode(`No eligible USB drives. Connect a writable external USB drive, then press R to refresh.`));
4462
- effect((_$p) => setProp(_el$96, "fg", palette.warning, _$p));
4463
- return _el$96;
4512
+ var _el$95 = createElement("text");
4513
+ insertNode(_el$95, createTextNode(`No eligible USB drives. Connect a writable external USB drive, then press R to refresh.`));
4514
+ effect((_$p) => setProp(_el$95, "fg", palette.warning, _$p));
4515
+ return _el$95;
4464
4516
  })();
4465
4517
  },
4466
4518
  get children() {
4467
4519
  return [(() => {
4468
- var _el$55 = createElement("box");
4469
- setProp(_el$55, "gap", 0);
4470
- insert(_el$55, createComponent2(For, {
4520
+ var _el$54 = createElement("box");
4521
+ setProp(_el$54, "gap", 0);
4522
+ insert(_el$54, createComponent2(For, {
4471
4523
  get each() {
4472
4524
  return disks3().slice(Math.max(0, cursor() - 2), Math.max(3, cursor() + 1));
4473
4525
  },
4474
4526
  children: (d, index) => row(d.name, `${path(d)} / ${bytes(d.bytes)} / USB`, index() + Math.max(0, cursor() - 2))
4475
4527
  }));
4476
- return _el$55;
4528
+ return _el$54;
4477
4529
  })(), (() => {
4478
- var _el$56 = createElement("text");
4479
- insert(_el$56, (() => {
4530
+ var _el$55 = createElement("text");
4531
+ insert(_el$55, (() => {
4480
4532
  var _c$4 = memo2(() => cursor() < 0);
4481
4533
  return () => _c$4() ? "Use arrows to select a drive. Nothing is selected yet." : `${cursor() + 1} of ${disks3().length} drives / Enter to review`;
4482
4534
  })());
4483
- effect((_$p) => setProp(_el$56, "fg", palette.muted, _$p));
4484
- return _el$56;
4535
+ effect((_$p) => setProp(_el$55, "fg", palette.muted, _$p));
4536
+ return _el$55;
4485
4537
  })()];
4486
4538
  }
4487
4539
  });
@@ -4494,44 +4546,44 @@ function App(props) {
4494
4546
  },
4495
4547
  get children() {
4496
4548
  return [(() => {
4497
- var _el$57 = createElement("text");
4498
- insertNode(_el$57, createTextNode(`Erase this entire USB drive?`));
4549
+ var _el$56 = createElement("text");
4550
+ insertNode(_el$56, createTextNode(`Erase this entire USB drive?`));
4499
4551
  effect((_p$) => {
4500
4552
  var _v$17 = palette.warning, _v$18 = TextAttributes2.BOLD;
4501
- _v$17 !== _p$.e && (_p$.e = setProp(_el$57, "fg", _v$17, _p$.e));
4502
- _v$18 !== _p$.t && (_p$.t = setProp(_el$57, "attributes", _v$18, _p$.t));
4553
+ _v$17 !== _p$.e && (_p$.e = setProp(_el$56, "fg", _v$17, _p$.e));
4554
+ _v$18 !== _p$.t && (_p$.t = setProp(_el$56, "attributes", _v$18, _p$.t));
4503
4555
  return _p$;
4504
4556
  }, {
4505
4557
  e: void 0,
4506
4558
  t: void 0
4507
4559
  });
4508
- return _el$57;
4560
+ return _el$56;
4509
4561
  })(), (() => {
4510
- var _el$59 = createElement("box"), _el$60 = createElement("text"), _el$61 = createElement("text"), _el$62 = createElement("text"), _el$63 = createTextNode(` / `);
4511
- insertNode(_el$59, _el$60);
4512
- insertNode(_el$59, _el$61);
4513
- insertNode(_el$59, _el$62);
4514
- setProp(_el$59, "paddingX", 1);
4515
- setProp(_el$60, "height", 1);
4516
- setProp(_el$60, "wrapMode", "none");
4517
- insert(_el$60, () => disk()?.name);
4518
- insert(_el$61, (() => {
4562
+ var _el$58 = createElement("box"), _el$59 = createElement("text"), _el$60 = createElement("text"), _el$61 = createElement("text"), _el$62 = createTextNode(` / `);
4563
+ insertNode(_el$58, _el$59);
4564
+ insertNode(_el$58, _el$60);
4565
+ insertNode(_el$58, _el$61);
4566
+ setProp(_el$58, "paddingX", 1);
4567
+ setProp(_el$59, "height", 1);
4568
+ setProp(_el$59, "wrapMode", "none");
4569
+ insert(_el$59, () => disk()?.name);
4570
+ insert(_el$60, (() => {
4519
4571
  var _c$5 = memo2(() => !!disk());
4520
4572
  return () => _c$5() ? `${path(disk())} / ${bytes(disk().bytes)}` : "";
4521
4573
  })());
4522
- insertNode(_el$62, _el$63);
4523
- insert(_el$62, () => image()?.profile.toUpperCase(), _el$63);
4524
- insert(_el$62, (() => {
4574
+ insertNode(_el$61, _el$62);
4575
+ insert(_el$61, () => image()?.profile.toUpperCase(), _el$62);
4576
+ insert(_el$61, (() => {
4525
4577
  var _c$6 = memo2(() => !!catalog()?.candidate);
4526
4578
  return () => _c$6() ? `candidate (build-only) ${catalog()?.revision.slice(0, 7)}` : `Boo ${catalog()?.version}`;
4527
4579
  })(), null);
4528
4580
  effect((_p$) => {
4529
4581
  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;
4530
- _v$19 !== _p$.e && (_p$.e = setProp(_el$59, "backgroundColor", _v$19, _p$.e));
4531
- _v$20 !== _p$.t && (_p$.t = setProp(_el$60, "fg", _v$20, _p$.t));
4532
- _v$21 !== _p$.a && (_p$.a = setProp(_el$60, "attributes", _v$21, _p$.a));
4533
- _v$22 !== _p$.o && (_p$.o = setProp(_el$61, "fg", _v$22, _p$.o));
4534
- _v$23 !== _p$.i && (_p$.i = setProp(_el$62, "fg", _v$23, _p$.i));
4582
+ _v$19 !== _p$.e && (_p$.e = setProp(_el$58, "backgroundColor", _v$19, _p$.e));
4583
+ _v$20 !== _p$.t && (_p$.t = setProp(_el$59, "fg", _v$20, _p$.t));
4584
+ _v$21 !== _p$.a && (_p$.a = setProp(_el$59, "attributes", _v$21, _p$.a));
4585
+ _v$22 !== _p$.o && (_p$.o = setProp(_el$60, "fg", _v$22, _p$.o));
4586
+ _v$23 !== _p$.i && (_p$.i = setProp(_el$61, "fg", _v$23, _p$.i));
4535
4587
  return _p$;
4536
4588
  }, {
4537
4589
  e: void 0,
@@ -4540,18 +4592,18 @@ function App(props) {
4540
4592
  o: void 0,
4541
4593
  i: void 0
4542
4594
  });
4543
- return _el$59;
4595
+ return _el$58;
4544
4596
  })(), (() => {
4545
- var _el$64 = createElement("text");
4546
- insertNode(_el$64, createTextNode(`ALL data and partitions on this drive will be lost. Back up anything you need before continuing.`));
4547
- effect((_$p) => setProp(_el$64, "fg", palette.warning, _$p));
4548
- return _el$64;
4597
+ var _el$63 = createElement("text");
4598
+ insertNode(_el$63, createTextNode(`ALL data and partitions on this drive will be lost. Back up anything you need before continuing.`));
4599
+ effect((_$p) => setProp(_el$63, "fg", palette.warning, _$p));
4600
+ return _el$63;
4549
4601
  })(), (() => {
4550
- var _el$66 = createElement("box");
4551
- insert(_el$66, () => row("Go back", "", 0), null);
4552
- insert(_el$66, () => row("Erase & flash", "", 1, true), null);
4553
- effect((_$p) => setProp(_el$66, "gap", tight() ? 0 : 1, _$p));
4554
- return _el$66;
4602
+ var _el$65 = createElement("box");
4603
+ insert(_el$65, () => row("Go back", "", 0), null);
4604
+ insert(_el$65, () => row("Erase & flash", "", 1, true), null);
4605
+ effect((_$p) => setProp(_el$65, "gap", tight() ? 0 : 1, _$p));
4606
+ return _el$65;
4555
4607
  })()];
4556
4608
  }
4557
4609
  }), createComponent2(Show, {
@@ -4560,108 +4612,108 @@ function App(props) {
4560
4612
  },
4561
4613
  get children() {
4562
4614
  return [(() => {
4563
- var _el$67 = createElement("text"), _el$68 = createTextNode(` `);
4564
- insertNode(_el$67, _el$68);
4565
- insert(_el$67, spinner, _el$68);
4566
- insert(_el$67, (() => {
4615
+ var _el$66 = createElement("text"), _el$67 = createTextNode(` `);
4616
+ insertNode(_el$66, _el$67);
4617
+ insert(_el$66, spinner, _el$67);
4618
+ insert(_el$66, (() => {
4567
4619
  var _c$7 = memo2(() => !!stopping());
4568
4620
  return () => _c$7() ? "Stopping safely..." : progress().stage;
4569
4621
  })(), null);
4570
4622
  effect((_p$) => {
4571
4623
  var _v$24 = palette.accent, _v$25 = TextAttributes2.BOLD;
4572
- _v$24 !== _p$.e && (_p$.e = setProp(_el$67, "fg", _v$24, _p$.e));
4573
- _v$25 !== _p$.t && (_p$.t = setProp(_el$67, "attributes", _v$25, _p$.t));
4624
+ _v$24 !== _p$.e && (_p$.e = setProp(_el$66, "fg", _v$24, _p$.e));
4625
+ _v$25 !== _p$.t && (_p$.t = setProp(_el$66, "attributes", _v$25, _p$.t));
4574
4626
  return _p$;
4575
4627
  }, {
4576
4628
  e: void 0,
4577
4629
  t: void 0
4578
4630
  });
4579
- return _el$67;
4631
+ return _el$66;
4580
4632
  })(), (() => {
4581
- var _el$69 = createElement("text"), _el$70 = createTextNode(` / `);
4582
- insertNode(_el$69, _el$70);
4583
- insert(_el$69, () => disk()?.name, _el$70);
4584
- insert(_el$69, () => image()?.profile.toUpperCase(), null);
4585
- effect((_$p) => setProp(_el$69, "fg", palette.foreground, _$p));
4586
- return _el$69;
4633
+ var _el$68 = createElement("text"), _el$69 = createTextNode(` / `);
4634
+ insertNode(_el$68, _el$69);
4635
+ insert(_el$68, () => disk()?.name, _el$69);
4636
+ insert(_el$68, () => image()?.profile.toUpperCase(), null);
4637
+ effect((_$p) => setProp(_el$68, "fg", palette.foreground, _$p));
4638
+ return _el$68;
4587
4639
  })(), (() => {
4588
- var _el$71 = createElement("text");
4589
- insert(_el$71, (() => {
4640
+ var _el$70 = createElement("text");
4641
+ insert(_el$70, (() => {
4590
4642
  var _c$8 = memo2(() => !!stopping());
4591
4643
  return () => _c$8() ? "Waiting for all child processes to stop. Keep the USB connected." : progress().detail;
4592
4644
  })());
4593
- effect((_$p) => setProp(_el$71, "fg", palette.muted, _$p));
4594
- return _el$71;
4645
+ effect((_$p) => setProp(_el$70, "fg", palette.muted, _$p));
4646
+ return _el$70;
4595
4647
  })(), createComponent2(Show, {
4596
4648
  get when() {
4597
4649
  return percent() !== void 0;
4598
4650
  },
4599
4651
  get children() {
4600
4652
  return [(() => {
4601
- var _el$72 = createElement("box");
4602
- setProp(_el$72, "border", true);
4603
- setProp(_el$72, "height", 3);
4604
- insert(_el$72, createComponent2(Show, {
4653
+ var _el$71 = createElement("box");
4654
+ setProp(_el$71, "border", true);
4655
+ setProp(_el$71, "height", 3);
4656
+ insert(_el$71, createComponent2(Show, {
4605
4657
  get when() {
4606
4658
  return percent() > 0;
4607
4659
  },
4608
4660
  get children() {
4609
- var _el$73 = createElement("box");
4610
- setProp(_el$73, "height", 1);
4661
+ var _el$72 = createElement("box");
4662
+ setProp(_el$72, "height", 1);
4611
4663
  effect((_p$) => {
4612
4664
  var _v$26 = `${percent() ?? 0}%`, _v$27 = palette.accent;
4613
- _v$26 !== _p$.e && (_p$.e = setProp(_el$73, "width", _v$26, _p$.e));
4614
- _v$27 !== _p$.t && (_p$.t = setProp(_el$73, "backgroundColor", _v$27, _p$.t));
4665
+ _v$26 !== _p$.e && (_p$.e = setProp(_el$72, "width", _v$26, _p$.e));
4666
+ _v$27 !== _p$.t && (_p$.t = setProp(_el$72, "backgroundColor", _v$27, _p$.t));
4615
4667
  return _p$;
4616
4668
  }, {
4617
4669
  e: void 0,
4618
4670
  t: void 0
4619
4671
  });
4620
- return _el$73;
4672
+ return _el$72;
4621
4673
  }
4622
4674
  }));
4623
4675
  effect((_p$) => {
4624
4676
  var _v$28 = palette.accent, _v$29 = palette.panelAlt;
4625
- _v$28 !== _p$.e && (_p$.e = setProp(_el$72, "borderColor", _v$28, _p$.e));
4626
- _v$29 !== _p$.t && (_p$.t = setProp(_el$72, "backgroundColor", _v$29, _p$.t));
4677
+ _v$28 !== _p$.e && (_p$.e = setProp(_el$71, "borderColor", _v$28, _p$.e));
4678
+ _v$29 !== _p$.t && (_p$.t = setProp(_el$71, "backgroundColor", _v$29, _p$.t));
4627
4679
  return _p$;
4628
4680
  }, {
4629
4681
  e: void 0,
4630
4682
  t: void 0
4631
4683
  });
4632
- return _el$72;
4684
+ return _el$71;
4633
4685
  })(), (() => {
4634
- var _el$74 = createElement("text"), _el$75 = createTextNode(`% `), _el$76 = createTextNode(` / `);
4635
- insertNode(_el$74, _el$75);
4636
- insertNode(_el$74, _el$76);
4637
- insert(_el$74, percent, _el$75);
4638
- insert(_el$74, () => bytes(progress().bytes ?? 0), _el$76);
4639
- insert(_el$74, () => bytes(progress().total ?? 0), null);
4686
+ var _el$73 = createElement("text"), _el$74 = createTextNode(`% `), _el$75 = createTextNode(` / `);
4687
+ insertNode(_el$73, _el$74);
4688
+ insertNode(_el$73, _el$75);
4689
+ insert(_el$73, percent, _el$74);
4690
+ insert(_el$73, () => bytes(progress().bytes ?? 0), _el$75);
4691
+ insert(_el$73, () => bytes(progress().total ?? 0), null);
4640
4692
  effect((_p$) => {
4641
4693
  var _v$30 = palette.foreground, _v$31 = TextAttributes2.BOLD;
4642
- _v$30 !== _p$.e && (_p$.e = setProp(_el$74, "fg", _v$30, _p$.e));
4643
- _v$31 !== _p$.t && (_p$.t = setProp(_el$74, "attributes", _v$31, _p$.t));
4694
+ _v$30 !== _p$.e && (_p$.e = setProp(_el$73, "fg", _v$30, _p$.e));
4695
+ _v$31 !== _p$.t && (_p$.t = setProp(_el$73, "attributes", _v$31, _p$.t));
4644
4696
  return _p$;
4645
4697
  }, {
4646
4698
  e: void 0,
4647
4699
  t: void 0
4648
4700
  });
4649
- return _el$74;
4701
+ return _el$73;
4650
4702
  })(), (() => {
4651
- var _el$77 = createElement("text");
4652
- insert(_el$77, (() => {
4703
+ var _el$76 = createElement("text");
4704
+ insert(_el$76, (() => {
4653
4705
  var _c$9 = memo2(() => !!progress().speed);
4654
4706
  return () => _c$9() ? `${bytes(progress().speed)} / s` : "";
4655
4707
  })());
4656
- effect((_$p) => setProp(_el$77, "fg", palette.muted, _$p));
4657
- return _el$77;
4708
+ effect((_$p) => setProp(_el$76, "fg", palette.muted, _$p));
4709
+ return _el$76;
4658
4710
  })()];
4659
4711
  }
4660
4712
  }), (() => {
4661
- var _el$78 = createElement("text");
4662
- insertNode(_el$78, createTextNode(`Keep the USB connected until safe removal succeeds.`));
4663
- effect((_$p) => setProp(_el$78, "fg", palette.warning, _$p));
4664
- return _el$78;
4713
+ var _el$77 = createElement("text");
4714
+ insertNode(_el$77, createTextNode(`Keep the USB connected until safe removal succeeds.`));
4715
+ effect((_$p) => setProp(_el$77, "fg", palette.warning, _$p));
4716
+ return _el$77;
4665
4717
  })()];
4666
4718
  }
4667
4719
  }), createComponent2(Show, {
@@ -4670,37 +4722,37 @@ function App(props) {
4670
4722
  },
4671
4723
  get children() {
4672
4724
  return [(() => {
4673
- var _el$80 = createElement("text");
4674
- insert(_el$80, () => props.backend.successTitle);
4725
+ var _el$79 = createElement("text");
4726
+ insert(_el$79, () => props.backend.successTitle);
4675
4727
  effect((_p$) => {
4676
4728
  var _v$32 = palette.success, _v$33 = TextAttributes2.BOLD;
4677
- _v$32 !== _p$.e && (_p$.e = setProp(_el$80, "fg", _v$32, _p$.e));
4678
- _v$33 !== _p$.t && (_p$.t = setProp(_el$80, "attributes", _v$33, _p$.t));
4729
+ _v$32 !== _p$.e && (_p$.e = setProp(_el$79, "fg", _v$32, _p$.e));
4730
+ _v$33 !== _p$.t && (_p$.t = setProp(_el$79, "attributes", _v$33, _p$.t));
4679
4731
  return _p$;
4680
4732
  }, {
4681
4733
  e: void 0,
4682
4734
  t: void 0
4683
4735
  });
4736
+ return _el$79;
4737
+ })(), (() => {
4738
+ var _el$80 = createElement("text");
4739
+ insert(_el$80, () => props.backend.successDetail);
4740
+ effect((_$p) => setProp(_el$80, "fg", palette.foreground, _$p));
4684
4741
  return _el$80;
4685
4742
  })(), (() => {
4686
4743
  var _el$81 = createElement("text");
4687
- insert(_el$81, () => props.backend.successDetail);
4688
- effect((_$p) => setProp(_el$81, "fg", palette.foreground, _$p));
4689
- return _el$81;
4690
- })(), (() => {
4691
- var _el$82 = createElement("text");
4692
- insert(_el$82, (() => {
4744
+ insert(_el$81, (() => {
4693
4745
  var _c$0 = memo2(() => !!props.backend.demo);
4694
4746
  return () => _c$0() ? "The real flow checks the write, flush and safe removal." : catalog()?.candidate ? "GitHub ZIP, compressed image and raw stream verified. Not a device read-back." : "Compressed image and raw stream verified. Not a device read-back.";
4695
4747
  })());
4696
- effect((_$p) => setProp(_el$82, "fg", palette.muted, _$p));
4697
- return _el$82;
4748
+ effect((_$p) => setProp(_el$81, "fg", palette.muted, _$p));
4749
+ return _el$81;
4698
4750
  })(), (() => {
4699
- var _el$83 = createElement("box");
4700
- setProp(_el$83, "gap", 1);
4701
- insert(_el$83, () => row("Choose another image", "", 0), null);
4702
- insert(_el$83, () => row("Quit", "", 1), null);
4703
- return _el$83;
4751
+ var _el$82 = createElement("box");
4752
+ setProp(_el$82, "gap", 1);
4753
+ insert(_el$82, () => row("Choose another image", "", 0), null);
4754
+ insert(_el$82, () => row("Quit", "", 1), null);
4755
+ return _el$82;
4704
4756
  })()];
4705
4757
  }
4706
4758
  }), createComponent2(Show, {
@@ -4709,56 +4761,56 @@ function App(props) {
4709
4761
  },
4710
4762
  get children() {
4711
4763
  return [(() => {
4712
- var _el$84 = createElement("text");
4713
- insertNode(_el$84, createTextNode(`Flash not completed`));
4764
+ var _el$83 = createElement("text");
4765
+ insertNode(_el$83, createTextNode(`Flash not completed`));
4714
4766
  effect((_p$) => {
4715
4767
  var _v$34 = palette.danger, _v$35 = TextAttributes2.BOLD;
4716
- _v$34 !== _p$.e && (_p$.e = setProp(_el$84, "fg", _v$34, _p$.e));
4717
- _v$35 !== _p$.t && (_p$.t = setProp(_el$84, "attributes", _v$35, _p$.t));
4768
+ _v$34 !== _p$.e && (_p$.e = setProp(_el$83, "fg", _v$34, _p$.e));
4769
+ _v$35 !== _p$.t && (_p$.t = setProp(_el$83, "attributes", _v$35, _p$.t));
4718
4770
  return _p$;
4719
4771
  }, {
4720
4772
  e: void 0,
4721
4773
  t: void 0
4722
4774
  });
4723
- return _el$84;
4775
+ return _el$83;
4724
4776
  })(), (() => {
4725
- var _el$86 = createElement("text");
4726
- insert(_el$86, error);
4727
- effect((_$p) => setProp(_el$86, "fg", palette.foreground, _$p));
4728
- return _el$86;
4777
+ var _el$85 = createElement("text");
4778
+ insert(_el$85, error);
4779
+ effect((_$p) => setProp(_el$85, "fg", palette.foreground, _$p));
4780
+ return _el$85;
4729
4781
  })(), (() => {
4730
- var _el$87 = createElement("box");
4731
- setProp(_el$87, "gap", 1);
4732
- insert(_el$87, () => row("Refresh & try again", "", 0), null);
4733
- insert(_el$87, () => row("Quit", "", 1), null);
4734
- return _el$87;
4782
+ var _el$86 = createElement("box");
4783
+ setProp(_el$86, "gap", 1);
4784
+ insert(_el$86, () => row("Refresh & try again", "", 0), null);
4785
+ insert(_el$86, () => row("Quit", "", 1), null);
4786
+ return _el$86;
4735
4787
  })()];
4736
4788
  }
4737
4789
  })];
4738
4790
  }
4739
4791
  }));
4740
- setProp(_el$88, "height", 1);
4741
- setProp(_el$88, "flexShrink", 0);
4742
- setProp(_el$88, "wrapMode", "none");
4743
- insert(_el$88, (() => {
4792
+ setProp(_el$87, "height", 1);
4793
+ setProp(_el$87, "flexShrink", 0);
4794
+ setProp(_el$87, "wrapMode", "none");
4795
+ insert(_el$87, (() => {
4744
4796
  var _c$1 = memo2(() => !!busy());
4745
4797
  return () => _c$1() ? "Esc cancel / Q stop & quit" : dimensions().width < 56 ? "Arrows / Enter / Esc / R / Q quit" : "Arrows / Enter / Esc back / R refresh / Q quit";
4746
4798
  })());
4747
4799
  effect((_p$) => {
4748
4800
  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;
4749
- _v$36 !== _p$.e && (_p$.e = setProp(_el$5, "backgroundColor", _v$36, _p$.e));
4750
- _v$37 !== _p$.t && (_p$.t = setProp(_el$6, "width", _v$37, _p$.t));
4751
- _v$38 !== _p$.a && (_p$.a = setProp(_el$6, "height", _v$38, _p$.a));
4752
- _v$39 !== _p$.o && (_p$.o = setProp(_el$6, "borderColor", _v$39, _p$.o));
4753
- _v$40 !== _p$.i && (_p$.i = setProp(_el$6, "backgroundColor", _v$40, _p$.i));
4754
- _v$41 !== _p$.n && (_p$.n = setProp(_el$8, "fg", _v$41, _p$.n));
4755
- _v$42 !== _p$.s && (_p$.s = setProp(_el$8, "attributes", _v$42, _p$.s));
4756
- _v$43 !== _p$.h && (_p$.h = setProp(_el$0, "fg", _v$43, _p$.h));
4757
- _v$44 !== _p$.r && (_p$.r = setProp(_el$1, "backgroundColor", _v$44, _p$.r));
4758
- _v$45 !== _p$.d && (_p$.d = setProp(_el$1, "marginTop", _v$45, _p$.d));
4759
- _v$46 !== _p$.l && (_p$.l = setProp(_el$10, "paddingTop", _v$46, _p$.l));
4760
- _v$47 !== _p$.u && (_p$.u = setProp(_el$10, "gap", _v$47, _p$.u));
4761
- _v$48 !== _p$.c && (_p$.c = setProp(_el$88, "fg", _v$48, _p$.c));
4801
+ _v$36 !== _p$.e && (_p$.e = setProp(_el$4, "backgroundColor", _v$36, _p$.e));
4802
+ _v$37 !== _p$.t && (_p$.t = setProp(_el$5, "width", _v$37, _p$.t));
4803
+ _v$38 !== _p$.a && (_p$.a = setProp(_el$5, "height", _v$38, _p$.a));
4804
+ _v$39 !== _p$.o && (_p$.o = setProp(_el$5, "borderColor", _v$39, _p$.o));
4805
+ _v$40 !== _p$.i && (_p$.i = setProp(_el$5, "backgroundColor", _v$40, _p$.i));
4806
+ _v$41 !== _p$.n && (_p$.n = setProp(_el$7, "fg", _v$41, _p$.n));
4807
+ _v$42 !== _p$.s && (_p$.s = setProp(_el$7, "attributes", _v$42, _p$.s));
4808
+ _v$43 !== _p$.h && (_p$.h = setProp(_el$9, "fg", _v$43, _p$.h));
4809
+ _v$44 !== _p$.r && (_p$.r = setProp(_el$0, "backgroundColor", _v$44, _p$.r));
4810
+ _v$45 !== _p$.d && (_p$.d = setProp(_el$0, "marginTop", _v$45, _p$.d));
4811
+ _v$46 !== _p$.l && (_p$.l = setProp(_el$1, "paddingTop", _v$46, _p$.l));
4812
+ _v$47 !== _p$.u && (_p$.u = setProp(_el$1, "gap", _v$47, _p$.u));
4813
+ _v$48 !== _p$.c && (_p$.c = setProp(_el$87, "fg", _v$48, _p$.c));
4762
4814
  return _p$;
4763
4815
  }, {
4764
4816
  e: void 0,
@@ -4775,7 +4827,7 @@ function App(props) {
4775
4827
  u: void 0,
4776
4828
  c: void 0
4777
4829
  });
4778
- return _el$5;
4830
+ return _el$4;
4779
4831
  })();
4780
4832
  }
4781
4833
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "boo-flash",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Flash qualified Boo images to USB drives on macOS and Linux",
5
5
  "license": "MIT",
6
6
  "type": "module",