@tiagojct/subsub 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/web/app.js CHANGED
@@ -104,9 +104,12 @@ function updateLayoutUI() {
104
104
  const isWide = currentLayout === "wide";
105
105
  document.body.classList.toggle("layout-full", isWide);
106
106
  const textEl = $("width-btn-text");
107
- if (textEl) textEl.textContent = isWide ? t("layoutFocus") : t("layoutWide");
107
+ if (textEl) textEl.textContent = t("layoutWide");
108
108
  const btn = $("width-btn");
109
- if (btn) btn.title = t("toggleWidth");
109
+ if (btn) {
110
+ btn.title = t("toggleWidth");
111
+ btn.setAttribute("aria-pressed", String(isWide));
112
+ }
110
113
  }
111
114
 
112
115
  function toggleLayout() {
@@ -121,16 +124,23 @@ function themeLabel(theme) {
121
124
  return t("themeAuto");
122
125
  }
123
126
 
127
+ /** Stroke icons for the theme button: fixed markup, no user text. */
128
+ const THEME_ICONS = {
129
+ light: '<circle cx="12" cy="12" r="4"/><path d="M12 2.5v2M12 19.5v2M2.5 12h2M19.5 12h2M5.3 5.3l1.4 1.4M17.3 17.3l1.4 1.4M5.3 18.7l1.4-1.4M17.3 6.7l1.4-1.4"/>',
130
+ dark: '<path d="M20 14.5A8 8 0 0 1 9.5 4a8 8 0 1 0 10.5 10.5Z"/>',
131
+ auto: '<rect x="3" y="4.5" width="18" height="12" rx="1.5"/><path d="M8.5 20h7M12 16.5V20"/>',
132
+ };
133
+
124
134
  function updateThemeUI() {
125
- const icon = currentTheme === "light" ? "☀️" : currentTheme === "dark" ? "🌙" : "💻";
126
- const label = `${icon} ${themeLabel(currentTheme)}`;
135
+ const label = `${t("theme")}: ${themeLabel(currentTheme)}`;
127
136
  const btn = $("theme-btn");
128
137
  if (btn) {
129
- btn.textContent = label;
130
- btn.title = t("themeToggle");
138
+ btn.innerHTML = `<svg viewBox="0 0 24 24" aria-hidden="true">${THEME_ICONS[currentTheme] ?? THEME_ICONS.auto}</svg>`;
139
+ btn.append(el("span", { class: "visually-hidden", text: label }));
140
+ btn.title = `${label} (${t("themeToggle")})`;
131
141
  }
132
142
  const sideBtn = $("theme-btn-side");
133
- if (sideBtn) sideBtn.textContent = label;
143
+ if (sideBtn) sideBtn.textContent = themeLabel(currentTheme);
134
144
  }
135
145
 
136
146
  function setTheme(theme) {
@@ -153,7 +163,10 @@ function toggleTheme() {
153
163
  function applyLang() {
154
164
  document.documentElement.lang = lang === "pt" ? "pt-PT" : "en";
155
165
  for (const e of document.querySelectorAll("[data-i18n]")) e.textContent = t(e.dataset.i18n);
166
+ for (const e of document.querySelectorAll("[data-i18n-placeholder]")) e.placeholder = t(e.dataset.i18nPlaceholder);
167
+ for (const e of document.querySelectorAll("[data-i18n-title]")) e.title = t(e.dataset.i18nTitle);
156
168
  updateThemeUI();
169
+ updateLayoutUI();
157
170
  }
158
171
 
159
172
  function mode() {
@@ -165,7 +178,7 @@ function renderHeader() {
165
178
  for (const b of document.querySelectorAll(".modes button")) b.setAttribute("aria-pressed", String(b.dataset.mode === mode()));
166
179
  if (state?.profile) $("profile").value = $("profile-side").value = state.profile;
167
180
  $("starbuck-toggle").checked = Boolean(state?.starbuck);
168
- $("starbuck-toggle").parentElement.title = t("starbuckHint");
181
+ $("starbuck-label").title = t("starbuckHint");
169
182
  const m = state?.model ?? session?.model;
170
183
  $("model-btn").textContent = $("model-btn-side").textContent = m ? m.id : t("noModel");
171
184
  const lib = $("library");
@@ -179,16 +192,22 @@ function renderHeader() {
179
192
  txt.textContent = t("zoteroDown");
180
193
  lib.classList.add("down");
181
194
  } else {
182
- const parts = [t("items", { n: L.items ?? "?" })];
183
- if (L.toReview) parts.push(t("toReview", { n: L.toReview }));
195
+ const num = (n) => (typeof n === "number" ? n.toLocaleString(lang === "pt" ? "pt-PT" : "en-GB") : (n ?? "?"));
196
+ const parts = [t("items", { n: num(L.items) })];
197
+ if (L.toReview) parts.push(t("toReview", { n: num(L.toReview) }));
184
198
  txt.textContent = `Zotero: ${parts.join(", ")}`;
185
199
  lib.classList.add("reachable");
186
200
  }
187
201
  if (state?.down?.length) {
188
- txt.textContent += ` | ${t("serversDown", { x: state.down.join(", ") })}`;
202
+ txt.textContent += ` · ${t("serversDown", { x: state.down.join(", ") })}`;
189
203
  lib.classList.add("down");
190
204
  }
205
+ lib.title = txt.textContent;
191
206
  $("input").placeholder = mode() === "librarian" ? t("placeholderLibrarian") : t("placeholderResearcher");
207
+ if (log.querySelector(".empty")) {
208
+ clearEmpty();
209
+ renderEmpty();
210
+ }
192
211
  renderActions();
193
212
  renderBanner();
194
213
  updateThemeUI();
@@ -355,14 +374,16 @@ function renderEmpty() {
355
374
  el(
356
375
  "div",
357
376
  { class: "empty" },
377
+ el("p", { class: "kicker", text: t(mode()) }),
358
378
  el("h1", { text: t("emptyTitle") }),
379
+ el("p", { class: "lede", text: t(mode() === "librarian" ? "emptyLibrarian" : "emptyResearcher") }),
359
380
  el(
360
381
  "div",
361
382
  { class: "chips" },
362
383
  s.map((x) =>
363
384
  el("button", {
364
385
  type: "button",
365
- text: x.trim(),
386
+ text: x.endsWith(" ") ? `${x.trim()}…` : x,
366
387
  onclick: () => {
367
388
  const input = $("input");
368
389
  input.value = x;
@@ -771,6 +792,7 @@ function nextDialog() {
771
792
  const d = dialogs[0];
772
793
  shownDialog = d;
773
794
  const dlg = $("dialog");
795
+ $("dialog-kicker").textContent = d.method === "confirm" ? t("previewKicker") : "";
774
796
  $("dialog-title").textContent = dialogTitle(d);
775
797
  const hint = $("dialog-hint");
776
798
  hint.textContent = d.method === "confirm" ? t("approveHint") : "";
package/web/i18n.js CHANGED
@@ -72,9 +72,9 @@ export const STRINGS = {
72
72
  layoutFocus: "Focus",
73
73
  toggleWidth: "Toggle wide layout",
74
74
  copy: "Copy",
75
- copied: "Copied!",
75
+ copied: "Copied",
76
76
  copyNote: "Copy text",
77
- searchConversations: "Search conversations...",
77
+ searchConversations: "Search conversations",
78
78
  export: "Export",
79
79
  exportTitle: "Export conversation",
80
80
  confirmShortcutHint: "Y to approve, N to decline",
@@ -82,6 +82,10 @@ export const STRINGS = {
82
82
  starbuckHint: "Checks that cited works exist, match their citation and were not retracted. Sub-Sub restarts when you change this.",
83
83
  starbuckOn: "Reference checks are on. Use /verify, or ask the researcher to check a manuscript's references.",
84
84
  starbuckOff: "Reference checks are off.",
85
+ composerHint: "Enter sends. Shift+Enter starts a new line. / shows the commands.",
86
+ emptyResearcher: "The researcher reads your library and searches PubMed, Europe PMC and OpenAlex. It cannot change your library.",
87
+ emptyLibrarian: "The librarian changes your library. You see a preview of each change, and nothing changes until you approve it.",
88
+ previewKicker: "Preview",
85
89
  },
86
90
  pt: {
87
91
  researcher: "Investigador",
@@ -153,9 +157,9 @@ export const STRINGS = {
153
157
  layoutFocus: "Foco",
154
158
  toggleWidth: "Mudar largura do ecrã",
155
159
  copy: "Copiar",
156
- copied: "Copiado!",
160
+ copied: "Copiado",
157
161
  copyNote: "Copiar texto",
158
- searchConversations: "Procurar conversas...",
162
+ searchConversations: "Procurar conversas",
159
163
  export: "Exportar",
160
164
  exportTitle: "Exportar conversa",
161
165
  confirmShortcutHint: "Y para aprovar, N para recusar",
@@ -163,6 +167,10 @@ export const STRINGS = {
163
167
  starbuckHint: "Verifica se as obras citadas existem, correspondem à citação e não foram retratadas. O Sub-Sub reinicia quando muda esta opção.",
164
168
  starbuckOn: "A verificação de referências está ligada. Use /verify, ou peça ao investigador que verifique as referências de um manuscrito.",
165
169
  starbuckOff: "A verificação de referências está desligada.",
170
+ composerHint: "Enter envia. Shift+Enter muda de linha. / mostra os comandos.",
171
+ emptyResearcher: "O investigador lê a sua biblioteca e pesquisa na PubMed, Europe PMC e OpenAlex. Não pode alterar a biblioteca.",
172
+ emptyLibrarian: "O bibliotecário altera a sua biblioteca. Vê uma pré-visualização de cada alteração, e nada muda até a aprovar.",
173
+ previewKicker: "Pré-visualização",
166
174
  },
167
175
  };
168
176
 
package/web/icon.svg CHANGED
@@ -1,12 +1,6 @@
1
1
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
2
- <rect width="32" height="32" rx="5" fill="#f8f6f0"/>
3
- <rect width="28" height="28" x="2" y="2" rx="4" fill="none" stroke="#211e1b" stroke-width="1.2"/>
4
- <!-- Open Folio Book -->
5
- <path d="M7 21.5V9A2 2 0 0 1 9 7h7v15H9a2 2 0 0 0-2 2v-2.5Z" fill="none" stroke="#211e1b" stroke-width="1.6" stroke-linejoin="round"/>
6
- <path d="M25 21.5V9A2 2 0 0 0 23 7h-7v15h7a2 2 0 0 1 2 2v-2.5Z" fill="none" stroke="#211e1b" stroke-width="1.6" stroke-linejoin="round"/>
7
- <line x1="16" y1="7" x2="16" y2="22" stroke="#211e1b" stroke-width="1.5"/>
8
- <line x1="10" y1="11" x2="13" y2="11" stroke="#211e1b" stroke-width="1.2" stroke-linecap="round"/>
9
- <line x1="10" y1="14" x2="13" y2="14" stroke="#211e1b" stroke-width="1.2" stroke-linecap="round"/>
10
- <line x1="19" y1="11" x2="22" y2="11" stroke="#211e1b" stroke-width="1.2" stroke-linecap="round"/>
11
- <line x1="19" y1="14" x2="22" y2="14" stroke="#211e1b" stroke-width="1.2" stroke-linecap="round"/>
2
+ <rect width="32" height="32" rx="7" fill="#1d4f7c"/>
3
+ <rect x="5.5" y="8" width="21" height="16" rx="1.5" fill="#f7f6f2"/>
4
+ <path d="M9 12.5h8M9 16h14" stroke="#1d4f7c" stroke-width="1.6" stroke-linecap="round"/>
5
+ <circle cx="16" cy="20.3" r="1.5" fill="#1d4f7c"/>
12
6
  </svg>
package/web/index.html CHANGED
@@ -6,25 +6,22 @@
6
6
  <meta name="color-scheme" content="light dark">
7
7
  <title>Sub-Sub</title>
8
8
  <link rel="icon" href="/icon.svg" type="image/svg+xml">
9
- <link rel="preconnect" href="https://fonts.googleapis.com">
10
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
- <link href="https://fonts.googleapis.com/css2?family=Courier+Prime:ital,wght@0,400;0,700;1,400&family=EB+Garamond:ital,wght@0,400..800;1,400..800&family=JetBrains+Mono:wght@400;500;600&family=Newsreader:ital,opsz,wght@0,6..72,400..700;1,6..72,400..700&display=swap" rel="stylesheet">
12
- <link rel="stylesheet" href="/glauca.css">
9
+ <link rel="preload" href="/fonts/IBMPlexSans.woff2" as="font" type="font/woff2" crossorigin>
13
10
  <link rel="stylesheet" href="/app.css">
14
11
  <script type="module" src="/app.js"></script>
15
12
  </head>
16
13
  <body data-mode="researcher">
17
14
  <div class="app">
18
15
  <header class="top">
19
- <button type="button" class="ghost menu-btn" id="menu-btn" aria-controls="side" aria-expanded="true" title="Toggle catalog sidebar"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="18" height="18" x="3" y="3" rx="2"/><path d="M9 3v18"/></svg> <span data-i18n="menu">Menu</span></button>
20
- <div class="brand"><span class="mark" aria-hidden="true"><svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v20H6.5a2.5 2.5 0 0 1-2.5-2.5Z"/><path d="M6 6h10"/><path d="M6 10h10"/></svg></span> Sub-Sub</div>
16
+ <button type="button" class="icon-btn" id="menu-btn" aria-controls="side" aria-expanded="true" data-i18n-title="menu" title="Menu"><svg viewBox="0 0 24 24" aria-hidden="true"><rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M9.5 4.5v15"/></svg><span class="visually-hidden" data-i18n="menu">Menu</span></button>
17
+ <div class="brand"><svg class="mark" viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="5" width="18" height="14" rx="1.5"/><path d="M6.5 9h7M6.5 12h11"/><circle cx="12" cy="16" r="1.1"/></svg><span>Sub<span class="hyphen">-</span>Sub</span></div>
21
18
  <div class="modes" role="group" aria-label="Mode">
22
19
  <button type="button" data-mode="researcher" aria-pressed="true" data-i18n="researcher">Researcher</button>
23
20
  <button type="button" data-mode="librarian" aria-pressed="false" data-i18n="librarian">Librarian</button>
24
21
  </div>
25
22
  <div class="status">
26
23
  <span class="library" id="library"><span class="library-dot" aria-hidden="true"></span><span class="library-text"></span></span>
27
- <label class="profile"><span class="visually-hidden" data-i18n="profile">Profile</span>
24
+ <label class="profile wide-only"><span class="visually-hidden" data-i18n="profile">Profile</span>
28
25
  <select id="profile">
29
26
  <option value="reader">Reader</option>
30
27
  <option value="scholar">Scholar</option>
@@ -32,14 +29,14 @@
32
29
  <option value="editor">Editor</option>
33
30
  </select>
34
31
  </label>
35
- <button type="button" class="ghost model-btn" id="model-btn"></button>
36
- <button type="button" class="ghost width-btn" id="width-btn" aria-label="Toggle wide layout" title="Toggle wide layout"><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="15 3 21 3 21 9"/><polyline points="9 21 3 21 3 15"/><line x1="21" x2="14" y1="3" y2="10"/><line x1="3" x2="10" y1="21" y2="14"/></svg> <span id="width-btn-text">Wide</span></button>
37
- <button type="button" class="ghost theme-btn" id="theme-btn" aria-label="Toggle theme" title="Toggle theme"></button>
32
+ <button type="button" class="chip-btn model-btn wide-only" id="model-btn"></button>
33
+ <button type="button" class="icon-btn wide-only" id="width-btn" aria-pressed="false"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 12h16M4 12l3.5-3.5M4 12l3.5 3.5M20 12l-3.5-3.5M20 12l-3.5 3.5"/></svg><span class="visually-hidden" id="width-btn-text">Wide</span></button>
34
+ <button type="button" class="icon-btn" id="theme-btn"></button>
38
35
  </div>
39
36
  </header>
40
37
 
41
38
  <aside class="side" id="side">
42
- <button type="button" class="primary block" id="new-btn" data-i18n="newConversation">New conversation</button>
39
+ <button type="button" class="new-btn" id="new-btn"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5v14M5 12h14"/></svg><span data-i18n="newConversation">New conversation</span></button>
43
40
  <section class="phone-only settings">
44
41
  <label><span data-i18n="profile">Profile</span>
45
42
  <select id="profile-side">
@@ -53,12 +50,9 @@
53
50
  <button type="button" class="secondary model-btn" id="model-btn-side"></button>
54
51
  </label>
55
52
  <label><span data-i18n="theme">Theme</span>
56
- <button type="button" class="secondary theme-btn" id="theme-btn-side"></button>
53
+ <button type="button" class="secondary" id="theme-btn-side"></button>
57
54
  </label>
58
55
  </section>
59
- <section class="addons">
60
- <label class="check" title=""><input type="checkbox" id="starbuck-toggle"> <span data-i18n="starbuck">Reference checks (Starbuck)</span></label>
61
- </section>
62
56
  <section>
63
57
  <h2 data-i18n="actions">Actions</h2>
64
58
  <div class="actions" id="actions"></div>
@@ -66,16 +60,17 @@
66
60
  <section class="grow">
67
61
  <div class="side-subhead">
68
62
  <h2 data-i18n="conversations">Conversations</h2>
69
- <button type="button" class="ghost small" id="export-btn" title="Export conversation as Markdown" data-i18n="export">Export</button>
70
- </div>
71
- <div class="search-wrap">
72
- <input type="search" id="session-search" placeholder="Search conversations..." autocomplete="off">
63
+ <button type="button" class="link-btn" id="export-btn" data-i18n="export" data-i18n-title="exportTitle">Export</button>
73
64
  </div>
65
+ <input type="search" id="session-search" class="search" data-i18n-placeholder="searchConversations" placeholder="Search conversations" autocomplete="off">
74
66
  <ul class="sessions" id="sessions"></ul>
75
67
  </section>
76
68
  <footer class="side-foot">
77
- <button type="button" class="ghost small" id="quit-btn" data-i18n="quit">Close Sub-Sub</button>
78
- <span class="version" id="version"></span>
69
+ <label class="switch" id="starbuck-label"><input type="checkbox" role="switch" id="starbuck-toggle"><span class="track" aria-hidden="true"></span><span data-i18n="starbuck">Reference checks (Starbuck)</span></label>
70
+ <div class="side-foot-row">
71
+ <button type="button" class="link-btn" id="quit-btn" data-i18n="quit">Close Sub-Sub</button>
72
+ <span class="version" id="version"></span>
73
+ </div>
79
74
  </footer>
80
75
  </aside>
81
76
 
@@ -84,10 +79,15 @@
84
79
  <div class="log" id="log" aria-live="polite"></div>
85
80
  <form class="composer" id="composer">
86
81
  <div class="suggest" id="suggest" role="listbox" hidden></div>
87
- <textarea id="input" rows="2" autocomplete="off" spellcheck="true"></textarea>
88
- <div class="composer-buttons">
89
- <button type="button" class="secondary" id="stop" hidden data-i18n="stop">Stop</button>
90
- <button type="submit" class="primary" id="send" data-i18n="send">Send</button>
82
+ <div class="composer-box">
83
+ <textarea id="input" rows="1" autocomplete="off" spellcheck="true"></textarea>
84
+ <div class="composer-row">
85
+ <span class="composer-hint" data-i18n="composerHint">Enter to send, Shift+Enter for a new line, / for commands</span>
86
+ <div class="composer-buttons">
87
+ <button type="button" class="secondary" id="stop" hidden data-i18n="stop">Stop</button>
88
+ <button type="submit" class="primary" id="send" data-i18n="send">Send</button>
89
+ </div>
90
+ </div>
91
91
  </div>
92
92
  </form>
93
93
  </main>
@@ -95,6 +95,7 @@
95
95
 
96
96
  <dialog id="dialog" class="modal">
97
97
  <form method="dialog" id="dialog-form">
98
+ <p class="modal-kicker" id="dialog-kicker"></p>
98
99
  <h2 id="dialog-title"></h2>
99
100
  <p class="hint" id="dialog-hint"></p>
100
101
  <pre class="preview" id="dialog-message"></pre>
@@ -106,7 +107,7 @@
106
107
  <dialog id="model-dialog" class="modal wide">
107
108
  <div class="modal-head">
108
109
  <h2 data-i18n="modelTitle">Model</h2>
109
- <button type="button" class="ghost small" id="model-close" data-i18n="close">Close</button>
110
+ <button type="button" class="link-btn" id="model-close" data-i18n="close">Close</button>
110
111
  </div>
111
112
  <h3 data-i18n="chooseModel">Choose a model</h3>
112
113
  <label class="check"><input type="checkbox" id="model-both" checked> <span data-i18n="forBoth">Use it in both modes</span></label>
package/web/glauca.css DELETED
@@ -1,87 +0,0 @@
1
- /* Sub-Sub Glauca tokens: Vintage & Minimal Bookmaking System */
2
- :root {
3
- --gl-font-serif: "EB Garamond", "Newsreader", "IBM Plex Serif", Georgia, serif;
4
- --gl-font-sans: "EB Garamond", "IBM Plex Sans", system-ui, -apple-system, sans-serif;
5
- --gl-font-mono: "JetBrains Mono", "Courier Prime", "IBM Plex Mono", ui-monospace, monospace;
6
- --gl-font-reading: "EB Garamond", Garamond, Georgia, serif;
7
- --gl-text-xs: 0.72rem;
8
- --gl-text-sm: 0.88rem;
9
- --gl-text-base: 1.05rem;
10
- --gl-text-lg: 1.25rem;
11
- --gl-text-xl: 1.55rem;
12
- --gl-text-2xl: 1.95rem;
13
- --gl-text-3xl: 2.45rem;
14
- --gl-text-4xl: 3.05rem;
15
- --gl-text-display: clamp(2.4rem, 5vw, 3.6rem);
16
- --gl-text-poster: clamp(3rem, 8vw, 5.5rem);
17
- --gl-leading-tight: 1.15;
18
- --gl-leading-snug: 1.35;
19
- --gl-leading-normal: 1.65;
20
- --gl-leading-relaxed: 1.8;
21
- --gl-weight-regular: 400;
22
- --gl-weight-medium: 500;
23
- --gl-weight-semibold: 600;
24
- --gl-weight-bold: 700;
25
- --gl-space-0: 0;
26
- --gl-space-1: 0.25rem;
27
- --gl-space-2: 0.5rem;
28
- --gl-space-3: 0.75rem;
29
- --gl-space-4: 1rem;
30
- --gl-space-5: 1.25rem;
31
- --gl-space-6: 1.5rem;
32
- --gl-space-8: 2rem;
33
- --gl-space-10: 2.5rem;
34
- --gl-space-12: 3rem;
35
- --gl-space-16: 4rem;
36
- --gl-space-20: 5rem;
37
- --gl-space-24: 6rem;
38
- --gl-radius-none: 0;
39
- --gl-radius-sm: 2px;
40
- --gl-radius-md: 4px;
41
- --gl-radius-lg: 6px;
42
- --gl-radius-pill: 999px;
43
- --gl-border-width: 1px;
44
- }
45
-
46
- /* Light Default: Warm Archival Paper & Printer's Inks */
47
- :root,
48
- [data-mode="light"],
49
- [data-theme="light"],
50
- html[data-theme="light"] {
51
- --gl-bg: #f8f6f0;
52
- --gl-surface: #f2ede2;
53
- --gl-surface-raised: #ffffff;
54
- --gl-text: #211e1b;
55
- --gl-text-muted: #5c554a;
56
- --gl-border: #dfd7c6;
57
- --gl-accent: #234b6e;
58
- --gl-accent-bright: #2f648e;
59
- --gl-accent-deep: #15344e;
60
- --gl-on-accent: #f8f6f0;
61
- --gl-tint-deep: #182a36;
62
- --gl-tint: #2c4659;
63
- --gl-tint-bright: #486980;
64
- --gl-tint-pale: #c4d3dc;
65
- --gl-on-tint: #f8f6f0;
66
- }
67
-
68
- /* Dark Mode: Antique Study by Candlelight */
69
- [data-theme="dark"],
70
- html[data-theme="dark"],
71
- [data-mode="dark"] {
72
- --gl-bg: #141210;
73
- --gl-surface: #1c1916;
74
- --gl-surface-raised: #24201c;
75
- --gl-text: #eae4d5;
76
- --gl-text-muted: #9e9585;
77
- --gl-border: #2e2924;
78
- --gl-accent: #6ea3cc;
79
- --gl-accent-bright: #8bb9dc;
80
- --gl-accent-deep: #4a7e9f;
81
- --gl-on-accent: #141210;
82
- --gl-tint-deep: #0f181f;
83
- --gl-tint: #243642;
84
- --gl-tint-bright: #3d596b;
85
- --gl-tint-pale: #7a9cb3;
86
- --gl-on-tint: #eae4d5;
87
- }