relmio 0.2.7 → 0.2.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/CHANGELOG.md CHANGED
@@ -7,6 +7,16 @@ checks the registry separately after publication.
7
7
 
8
8
  ## Unreleased
9
9
 
10
+ ## [0.2.8] - 2026-08-02
11
+
12
+ ### Changed
13
+
14
+ - Replace the local browser wizard's text appearance selector with compact,
15
+ accessible System/Light/Dark icons, while keeping the original horizontal
16
+ Signal Spine flow and touch-friendly behavior.
17
+ - Serve the bundled Lucide SVG assets from the wizard and include them in the
18
+ npm package so offline and Node-free browser launches render consistently.
19
+
10
20
  ## [0.2.7] - 2026-08-02
11
21
 
12
22
  ### Changed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "relmio",
3
- "version": "0.2.7",
3
+ "version": "0.2.8",
4
4
  "description": "Turn a supported ChatGPT/Codex OAuth sign-in into a private OpenAI-compatible endpoint, starting with self-hosted n8n.",
5
5
  "keywords": [
6
6
  "relmio",
@@ -0,0 +1,6 @@
1
+ <!-- Lucide monitor icon, ISC licensed: https://lucide.dev/license -->
2
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round">
3
+ <rect width="20" height="14" x="2" y="3" rx="2" />
4
+ <line x1="8" x2="16" y1="21" y2="21" />
5
+ <line x1="12" x2="12" y1="17" y2="21" />
6
+ </svg>
@@ -0,0 +1,4 @@
1
+ <!-- Lucide moon icon, ISC licensed: https://lucide.dev/license -->
2
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round">
3
+ <path d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401" />
4
+ </svg>
@@ -0,0 +1,12 @@
1
+ <!-- Lucide sun icon, ISC licensed: https://lucide.dev/license -->
2
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round">
3
+ <circle cx="12" cy="12" r="4" />
4
+ <path d="M12 2v2" />
5
+ <path d="M12 20v2" />
6
+ <path d="m4.93 4.93 1.41 1.41" />
7
+ <path d="m17.66 17.66 1.41 1.41" />
8
+ <path d="M2 12h2" />
9
+ <path d="M20 12h2" />
10
+ <path d="m6.34 17.66-1.41 1.41" />
11
+ <path d="m19.07 4.93-1.41 1.41" />
12
+ </svg>
package/src/ui/index.html CHANGED
@@ -35,17 +35,20 @@
35
35
  <div class="header-actions">
36
36
  <fieldset class="theme-picker">
37
37
  <legend class="visually-hidden">Color theme</legend>
38
- <label>
38
+ <label title="Use system appearance">
39
39
  <input type="radio" name="color-theme" value="system" checked />
40
- <span>System</span>
40
+ <span class="theme-icon theme-icon-system" aria-hidden="true"></span>
41
+ <span class="visually-hidden">System</span>
41
42
  </label>
42
- <label>
43
+ <label title="Use light appearance">
43
44
  <input type="radio" name="color-theme" value="light" />
44
- <span>Light</span>
45
+ <span class="theme-icon theme-icon-light" aria-hidden="true"></span>
46
+ <span class="visually-hidden">Light</span>
45
47
  </label>
46
- <label>
48
+ <label title="Use dark appearance">
47
49
  <input type="radio" name="color-theme" value="dark" />
48
- <span>Dark</span>
50
+ <span class="theme-icon theme-icon-dark" aria-hidden="true"></span>
51
+ <span class="visually-hidden">Dark</span>
49
52
  </label>
50
53
  </fieldset>
51
54
  <span class="local-badge">Runs only on this computer</span>
package/src/ui/styles.css CHANGED
@@ -201,9 +201,9 @@ a:focus-visible {
201
201
  min-width: 0;
202
202
  margin: 0;
203
203
  padding: 0.1875rem;
204
- border: 1px solid var(--border);
205
- border-radius: 0.625rem;
206
- background: var(--surface-muted);
204
+ border: 0;
205
+ border-radius: 999px;
206
+ background: color-mix(in srgb, var(--text) 88%, var(--border));
207
207
  }
208
208
 
209
209
  .theme-picker label {
@@ -217,29 +217,50 @@ a:focus-visible {
217
217
  pointer-events: none;
218
218
  }
219
219
 
220
- .theme-picker span {
221
- min-height: 2rem;
220
+ .theme-picker .theme-icon {
221
+ width: 1.75rem;
222
+ min-height: 1.75rem;
222
223
  display: inline-flex;
223
224
  align-items: center;
224
225
  justify-content: center;
225
- padding: 0 0.625rem;
226
- border-radius: 0.4375rem;
227
- color: var(--text-muted);
228
- font-size: 0.6875rem;
229
- font-weight: 700;
226
+ padding: 0;
227
+ border-radius: 999px;
228
+ color: rgb(255 255 255 / 72%);
230
229
  transition:
231
230
  color 160ms var(--ease),
232
231
  background 160ms var(--ease),
233
232
  box-shadow 160ms var(--ease);
234
233
  }
235
234
 
236
- .theme-picker input:checked + span {
235
+ .theme-picker .theme-icon::before {
236
+ width: 1rem;
237
+ height: 1rem;
238
+ content: "";
239
+ display: block;
240
+ background: currentColor;
241
+ mask: center / contain no-repeat var(--theme-icon);
242
+ -webkit-mask: center / contain no-repeat var(--theme-icon);
243
+ }
244
+
245
+ .theme-icon-system {
246
+ --theme-icon: url("/icons/monitor.svg");
247
+ }
248
+
249
+ .theme-icon-light {
250
+ --theme-icon: url("/icons/sun.svg");
251
+ }
252
+
253
+ .theme-icon-dark {
254
+ --theme-icon: url("/icons/moon.svg");
255
+ }
256
+
257
+ .theme-picker input:checked + .theme-icon {
237
258
  color: var(--text);
238
259
  background: var(--surface);
239
260
  box-shadow: var(--shadow-sm);
240
261
  }
241
262
 
242
- .theme-picker input:focus-visible + span {
263
+ .theme-picker input:focus-visible + .theme-icon {
243
264
  outline: 3px solid #f2a94a;
244
265
  outline-offset: 2px;
245
266
  }
@@ -1050,10 +1071,6 @@ footer p {
1050
1071
  gap: 0.375rem;
1051
1072
  }
1052
1073
 
1053
- .theme-picker span {
1054
- padding-inline: 0.5rem;
1055
- }
1056
-
1057
1074
  .shell {
1058
1075
  width: min(100% - 1rem, 54rem);
1059
1076
  padding-top: 2rem;
package/src/web/server.js CHANGED
@@ -182,6 +182,9 @@ async function loadDefaultUiFiles() {
182
182
  readFile(new URL("../ui/theme.js", import.meta.url), "utf8"),
183
183
  readFile(new URL("../ui/time.js", import.meta.url), "utf8"),
184
184
  readFile(new URL("../ui/styles.css", import.meta.url), "utf8"),
185
+ readFile(new URL("../ui/icons/monitor.svg", import.meta.url), "utf8"),
186
+ readFile(new URL("../ui/icons/sun.svg", import.meta.url), "utf8"),
187
+ readFile(new URL("../ui/icons/moon.svg", import.meta.url), "utf8"),
185
188
  ]);
186
189
 
187
190
  return {
@@ -190,6 +193,9 @@ async function loadDefaultUiFiles() {
190
193
  "/theme.js": files[2],
191
194
  "/time.js": files[3],
192
195
  "/styles.css": files[4],
196
+ "/icons/monitor.svg": files[5],
197
+ "/icons/sun.svg": files[6],
198
+ "/icons/moon.svg": files[7],
193
199
  };
194
200
  }
195
201
 
@@ -421,9 +427,11 @@ function createRequestHandler(state) {
421
427
  const contentType =
422
428
  path.endsWith(".js")
423
429
  ? "text/javascript; charset=utf-8"
424
- : path === "/styles.css"
425
- ? "text/css; charset=utf-8"
426
- : "text/html; charset=utf-8";
430
+ : path.endsWith(".svg")
431
+ ? "image/svg+xml; charset=utf-8"
432
+ : path === "/styles.css"
433
+ ? "text/css; charset=utf-8"
434
+ : "text/html; charset=utf-8";
427
435
  const contents = state.uiFiles[path];
428
436
  response.writeHead(200, {
429
437
  "Content-Type": contentType,