@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/THIRD_PARTY_NOTICES +98 -0
- package/assets/icon.icns +0 -0
- package/assets/icon.ico +0 -0
- package/assets/icon.png +0 -0
- package/package.json +3 -3
- package/web/app.css +611 -634
- package/web/app.js +34 -12
- package/web/i18n.js +12 -4
- package/web/icon.svg +4 -10
- package/web/index.html +27 -26
- package/web/glauca.css +0 -87
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 =
|
|
107
|
+
if (textEl) textEl.textContent = t("layoutWide");
|
|
108
108
|
const btn = $("width-btn");
|
|
109
|
-
if (btn)
|
|
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
|
|
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.
|
|
130
|
-
btn.
|
|
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 =
|
|
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-
|
|
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
|
|
183
|
-
|
|
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 += `
|
|
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="
|
|
3
|
-
<rect
|
|
4
|
-
|
|
5
|
-
<
|
|
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="
|
|
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="
|
|
20
|
-
<div class="brand"><
|
|
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="
|
|
36
|
-
<button type="button" class="
|
|
37
|
-
<button type="button" class="
|
|
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="
|
|
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
|
|
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="
|
|
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
|
-
<
|
|
78
|
-
<
|
|
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
|
-
<
|
|
88
|
-
|
|
89
|
-
<
|
|
90
|
-
|
|
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="
|
|
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
|
-
}
|