@glossarist/concept-browser 0.7.68 → 0.7.71
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/cli/index.mjs +28 -9
- package/package.json +14 -8
- package/public/favicon.svg +1 -4
- package/scripts/bridge-to-astro.mjs +155 -0
- package/scripts/generate-data.mjs +13 -0
- package/scripts/load-site-config.mjs +73 -1
- package/src/__tests__/tc204-deployment.test.ts +21 -0
- package/src/adapters/DatasetAdapter.ts +1 -0
- package/src/adapters/model-bridge.ts +50 -12
- package/src/adapters/non-verbal/glossarist-augment.d.ts +5 -1
- package/src/adapters/types.ts +1 -0
- package/src/assets/glossarist-logo-full.svg +1 -0
- package/src/astro-islands/app.ts +3 -0
- package/src/components/AppFooter.vue +3 -2
- package/src/components/AppHeader.vue +4 -7
- package/src/components/AppSidebar.vue +8 -5
- package/src/components/ConceptDetail.vue +12 -0
- package/src/components/DesignationList.vue +15 -4
- package/src/components/LanguageDetail.vue +6 -0
- package/src/components/RelationSphere.vue +36 -32
- package/src/components/site/SeoMeta.astro +23 -0
- package/src/components/site/SiteFooter.astro +14 -0
- package/src/components/site/SiteHeader.astro +25 -0
- package/src/components/site/SiteSidebar.astro +56 -0
- package/src/content.config.ts +85 -0
- package/src/i18n/locales/eng.yml +1 -0
- package/src/i18n/locales/fra.yml +1 -0
- package/src/islands/AppIsland.vue +7 -0
- package/src/islands/BibliographyIsland.vue +26 -0
- package/src/islands/ConceptDetailIsland.vue +27 -0
- package/src/islands/ConceptDiffIsland.vue +214 -0
- package/src/islands/ConceptIsland.vue +102 -0
- package/src/islands/GraphIsland.vue +15 -0
- package/src/islands/GroupRendererIsland.vue +15 -0
- package/src/islands/HeaderIsland.vue +10 -0
- package/src/islands/NonVerbalIsland.vue +75 -0
- package/src/islands/RelationSphereIsland.vue +20 -0
- package/src/islands/SearchIsland.vue +23 -0
- package/src/islands/SeriesCardIsland.vue +12 -0
- package/src/islands/ShortcutsIsland.vue +13 -0
- package/src/islands/SidebarIsland.vue +15 -0
- package/src/islands/SupersessionDiffIsland.vue +267 -0
- package/src/islands/app-entry.ts +8 -0
- package/src/islands/app.ts +4 -0
- package/src/layouts/Default.astro +70 -0
- package/src/lib/site-config.ts +26 -0
- package/src/pages/404.astro +9 -0
- package/src/pages/[...path].astro +29 -0
- package/src/pages/dataset/[id]/concept/[cid].astro +23 -0
- package/src/pages/dataset/[id]/index.astro +16 -0
- package/src/pages/graph.astro +5 -0
- package/src/pages/group/[id]/index.astro +16 -0
- package/src/pages/index.astro +10 -0
- package/src/pages/search.astro +5 -0
- package/src/styles/tailwind.css +503 -0
- package/src/views/ConceptView.vue +18 -23
- package/src/views/StatsView.vue +1 -1
- package/tsconfig.json +2 -1
- package/vite.config.ts +3 -1
- package/postcss.config.js +0 -13
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
|
|
3
|
+
@source "../index.html";
|
|
4
|
+
@source "../src/**/*.{vue,astro,ts,js,css}";
|
|
5
|
+
|
|
6
|
+
@custom-variant dark (&:where(.dark, .dark *));
|
|
7
|
+
|
|
8
|
+
@theme {
|
|
9
|
+
--color-ink: #1a1b2e;
|
|
10
|
+
--color-ink-50: #f0f0f4;
|
|
11
|
+
--color-ink-100: #dddde6;
|
|
12
|
+
--color-ink-200: #b8b9cc;
|
|
13
|
+
--color-ink-300: #8d8faa;
|
|
14
|
+
--color-ink-400: #636588;
|
|
15
|
+
--color-ink-500: #484a6e;
|
|
16
|
+
--color-ink-600: #36385a;
|
|
17
|
+
--color-ink-700: #2c2e4a;
|
|
18
|
+
--color-ink-800: #1a1b2e;
|
|
19
|
+
--color-ink-900: #0f1020;
|
|
20
|
+
|
|
21
|
+
--color-surface: #faf9f6;
|
|
22
|
+
--color-surface-alt: #f3f2ee;
|
|
23
|
+
--color-surface-raised: #ffffff;
|
|
24
|
+
|
|
25
|
+
--color-rel-definitional: #3b82f6;
|
|
26
|
+
--color-rel-designation: #10b981;
|
|
27
|
+
--color-rel-contextual: #f59e0b;
|
|
28
|
+
--color-rel-organizational: #8b5cf6;
|
|
29
|
+
--color-rel-temporal: #ec4899;
|
|
30
|
+
|
|
31
|
+
--color-status-valid: #10b981;
|
|
32
|
+
--color-status-superseded: #f59e0b;
|
|
33
|
+
--color-status-withdrawn: #ef4444;
|
|
34
|
+
--color-status-draft: #6366f1;
|
|
35
|
+
|
|
36
|
+
--color-group-lineage: #d97706;
|
|
37
|
+
--color-group-topic: #059669;
|
|
38
|
+
--color-group-family: #6366f1;
|
|
39
|
+
--color-group-collection: #0891b2;
|
|
40
|
+
|
|
41
|
+
--font-serif: "DM Serif Display", Georgia, serif;
|
|
42
|
+
--font-sans: "DM Sans", system-ui, sans-serif;
|
|
43
|
+
--font-mono: "JetBrains Mono", monospace;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
:root {
|
|
47
|
+
--rel-definitional: var(--color-rel-definitional);
|
|
48
|
+
--rel-designation: var(--color-rel-designation);
|
|
49
|
+
--rel-contextual: var(--color-rel-contextual);
|
|
50
|
+
--rel-organizational: var(--color-rel-organizational);
|
|
51
|
+
--rel-temporal: var(--color-rel-temporal);
|
|
52
|
+
--status-valid: var(--color-status-valid);
|
|
53
|
+
--status-superseded: var(--color-status-superseded);
|
|
54
|
+
--status-withdrawn: var(--color-status-withdrawn);
|
|
55
|
+
--status-draft: var(--color-status-draft);
|
|
56
|
+
--group-lineage: var(--color-group-lineage);
|
|
57
|
+
--group-topic: var(--color-group-topic);
|
|
58
|
+
--group-family: var(--color-group-family);
|
|
59
|
+
--group-collection: var(--color-group-collection);
|
|
60
|
+
--brand-primary: #2563eb;
|
|
61
|
+
--brand-primary-rgb: 37, 99, 235;
|
|
62
|
+
--brand-dark: #1e293b;
|
|
63
|
+
--font-header: "DM Serif Display", Georgia, serif;
|
|
64
|
+
--font-body: "DM Sans", system-ui, sans-serif;
|
|
65
|
+
--gold-accent: #B8935A;
|
|
66
|
+
--gold-accent-deep: #8C6A3A;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
@layer base {
|
|
70
|
+
body {
|
|
71
|
+
font-family: var(--font-body);
|
|
72
|
+
@apply antialiased bg-surface text-ink-800;
|
|
73
|
+
-webkit-font-smoothing: antialiased;
|
|
74
|
+
-moz-osx-font-smoothing: grayscale;
|
|
75
|
+
}
|
|
76
|
+
h1, h2, h3, .font-serif {
|
|
77
|
+
font-family: var(--font-header);
|
|
78
|
+
}
|
|
79
|
+
code, pre, .font-mono {
|
|
80
|
+
font-family: var(--font-mono);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
@utility card {
|
|
85
|
+
background-color: var(--color-surface-raised);
|
|
86
|
+
border-radius: 0.75rem;
|
|
87
|
+
border: 1px solid color-mix(in srgb, var(--color-ink-100) 60%, transparent);
|
|
88
|
+
box-shadow: 0 1px 3px rgba(26, 27, 46, 0.04), 0 1px 2px rgba(26, 27, 46, 0.02);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@utility badge {
|
|
92
|
+
display: inline-flex;
|
|
93
|
+
align-items: center;
|
|
94
|
+
padding: 0.125rem 0.5rem;
|
|
95
|
+
border-radius: 0.375rem;
|
|
96
|
+
font-size: 0.75rem;
|
|
97
|
+
font-weight: 500;
|
|
98
|
+
letter-spacing: 0.025em;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
@utility concept-link {
|
|
102
|
+
color: var(--brand-primary);
|
|
103
|
+
text-underline-offset: 2px;
|
|
104
|
+
cursor: pointer;
|
|
105
|
+
transition: color 150ms;
|
|
106
|
+
&:hover {
|
|
107
|
+
text-decoration: underline;
|
|
108
|
+
filter: brightness(0.8);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
@utility xref-link {
|
|
113
|
+
color: var(--brand-primary);
|
|
114
|
+
text-underline-offset: 2px;
|
|
115
|
+
cursor: pointer;
|
|
116
|
+
font-weight: 500;
|
|
117
|
+
transition: color 150ms;
|
|
118
|
+
&:hover {
|
|
119
|
+
text-decoration: underline;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
@utility text-balance {
|
|
124
|
+
text-wrap: balance;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
@utility scrollbar-none {
|
|
128
|
+
scrollbar-width: none;
|
|
129
|
+
-ms-overflow-style: none;
|
|
130
|
+
&::-webkit-scrollbar {
|
|
131
|
+
display: none;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
@layer components {
|
|
136
|
+
.card-hover {
|
|
137
|
+
@apply card transition-all duration-200;
|
|
138
|
+
}
|
|
139
|
+
.card-hover:hover {
|
|
140
|
+
box-shadow: 0 4px 16px rgba(26, 27, 46, 0.08), 0 2px 4px rgba(26, 27, 46, 0.04);
|
|
141
|
+
border-color: var(--color-ink-200);
|
|
142
|
+
transform: translateY(-1px);
|
|
143
|
+
}
|
|
144
|
+
.card-hover:active {
|
|
145
|
+
transform: translateY(0);
|
|
146
|
+
box-shadow: 0 1px 3px rgba(26, 27, 46, 0.04);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.btn-primary {
|
|
150
|
+
@apply text-white px-5 py-2 rounded-lg font-medium text-sm transition-all duration-150;
|
|
151
|
+
background-color: var(--brand-dark);
|
|
152
|
+
box-shadow: 0 1px 2px rgba(26, 27, 46, 0.12);
|
|
153
|
+
}
|
|
154
|
+
.btn-primary:hover {
|
|
155
|
+
background-color: var(--brand-primary);
|
|
156
|
+
box-shadow: 0 2px 4px rgba(26, 27, 46, 0.16);
|
|
157
|
+
}
|
|
158
|
+
.btn-primary:disabled {
|
|
159
|
+
@apply bg-ink-300 cursor-not-allowed;
|
|
160
|
+
box-shadow: none;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.btn-secondary {
|
|
164
|
+
@apply bg-surface-raised text-ink-700 px-5 py-2 rounded-lg font-medium text-sm border border-ink-100 transition-all duration-150;
|
|
165
|
+
}
|
|
166
|
+
.btn-secondary:hover {
|
|
167
|
+
@apply bg-surface-alt border-ink-200;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.btn-ghost {
|
|
171
|
+
@apply text-ink-600 px-3 py-1.5 rounded-lg text-sm font-medium transition-colors duration-150;
|
|
172
|
+
}
|
|
173
|
+
.btn-ghost:hover {
|
|
174
|
+
@apply bg-ink-50 text-ink-800;
|
|
175
|
+
}
|
|
176
|
+
.btn-ghost.active {
|
|
177
|
+
@apply bg-ink-50 text-ink-800 font-semibold;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.badge-blue {
|
|
181
|
+
@apply badge bg-blue-50 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300;
|
|
182
|
+
}
|
|
183
|
+
.badge-green {
|
|
184
|
+
@apply badge bg-emerald-50 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-300;
|
|
185
|
+
}
|
|
186
|
+
.badge-yellow {
|
|
187
|
+
@apply badge bg-amber-50 text-amber-700 dark:bg-amber-900/30 dark:text-amber-300;
|
|
188
|
+
}
|
|
189
|
+
.badge-gray {
|
|
190
|
+
@apply badge bg-ink-50 text-ink-600;
|
|
191
|
+
}
|
|
192
|
+
.badge-purple {
|
|
193
|
+
@apply badge bg-purple-50 text-purple-700 dark:bg-purple-900/30 dark:text-purple-300;
|
|
194
|
+
}
|
|
195
|
+
.badge-brand {
|
|
196
|
+
@apply badge;
|
|
197
|
+
background-color: rgba(var(--brand-primary-rgb), 0.1);
|
|
198
|
+
color: var(--brand-primary);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.bib-link {
|
|
202
|
+
@apply text-ink-600 hover:text-ink-800 underline-offset-2 hover:underline transition-colors;
|
|
203
|
+
}
|
|
204
|
+
.bib-ref {
|
|
205
|
+
@apply text-ink-500 italic;
|
|
206
|
+
}
|
|
207
|
+
.fig-ref a {
|
|
208
|
+
@apply text-ink-600 hover:text-ink-800 underline-offset-2 hover:underline transition-colors;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
.nv-entity--highlighted {
|
|
212
|
+
outline: 2px solid var(--brand-primary);
|
|
213
|
+
outline-offset: 4px;
|
|
214
|
+
animation: nv-entity-pulse 1.6s ease-out;
|
|
215
|
+
}
|
|
216
|
+
@keyframes nv-entity-pulse {
|
|
217
|
+
0%, 100% { box-shadow: 0 0 0 0 rgba(37, 99, 235, 0); }
|
|
218
|
+
20% { box-shadow: 0 0 0 6px rgba(37, 99, 235, 0.25); }
|
|
219
|
+
}
|
|
220
|
+
@media (prefers-reduced-motion: reduce) {
|
|
221
|
+
.nv-entity--highlighted { animation: none; }
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.concept-list {
|
|
225
|
+
list-style: disc;
|
|
226
|
+
padding-left: 1.25rem;
|
|
227
|
+
margin: 0.5rem 0;
|
|
228
|
+
}
|
|
229
|
+
.concept-list-ordered {
|
|
230
|
+
list-style: decimal;
|
|
231
|
+
}
|
|
232
|
+
.concept-list li {
|
|
233
|
+
margin: 0.25rem 0;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.concept-table {
|
|
237
|
+
border-collapse: collapse;
|
|
238
|
+
margin: 0.75rem 0;
|
|
239
|
+
font-size: 0.875rem;
|
|
240
|
+
width: 100%;
|
|
241
|
+
}
|
|
242
|
+
.concept-table td {
|
|
243
|
+
border: 1px solid var(--color-ink-200);
|
|
244
|
+
padding: 0.375rem 0.625rem;
|
|
245
|
+
vertical-align: top;
|
|
246
|
+
text-align: left;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
.lang-content {
|
|
250
|
+
overflow: hidden;
|
|
251
|
+
transition: max-height 250ms ease-out, opacity 200ms ease-out;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.section-label {
|
|
255
|
+
@apply text-[11px] font-semibold uppercase tracking-widest text-ink-400 mb-2;
|
|
256
|
+
font-family: var(--font-body);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
.math-inline {
|
|
260
|
+
display: inline;
|
|
261
|
+
}
|
|
262
|
+
.math-inline math {
|
|
263
|
+
font-size: 1.05em;
|
|
264
|
+
}
|
|
265
|
+
.math-bold .math-inline math {
|
|
266
|
+
font-weight: bold;
|
|
267
|
+
}
|
|
268
|
+
.math-fallback {
|
|
269
|
+
@apply bg-ink-50 text-ink-600 px-1 rounded text-xs;
|
|
270
|
+
font-family: var(--font-mono);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
.prose-page,
|
|
274
|
+
.prose-news {
|
|
275
|
+
@apply text-sm text-ink-700 leading-relaxed;
|
|
276
|
+
}
|
|
277
|
+
.prose-page h2, .prose-news h2 {
|
|
278
|
+
@apply font-serif text-xl text-ink-800 mt-6 mb-3;
|
|
279
|
+
}
|
|
280
|
+
.prose-page h3, .prose-news h3 {
|
|
281
|
+
@apply font-serif text-lg text-ink-800 mt-5 mb-2;
|
|
282
|
+
}
|
|
283
|
+
.prose-page h4, .prose-news h4 {
|
|
284
|
+
@apply font-semibold text-ink-800 mt-4 mb-2;
|
|
285
|
+
}
|
|
286
|
+
.prose-page p, .prose-news p {
|
|
287
|
+
@apply mb-4;
|
|
288
|
+
}
|
|
289
|
+
.prose-page ul, .prose-page ol,
|
|
290
|
+
.prose-news ul, .prose-news ol {
|
|
291
|
+
@apply mb-4 pl-5;
|
|
292
|
+
}
|
|
293
|
+
.prose-page ul, .prose-news ul {
|
|
294
|
+
@apply list-disc;
|
|
295
|
+
}
|
|
296
|
+
.prose-page ol, .prose-news ol {
|
|
297
|
+
@apply list-decimal;
|
|
298
|
+
}
|
|
299
|
+
.prose-page li, .prose-news li {
|
|
300
|
+
@apply mb-1;
|
|
301
|
+
}
|
|
302
|
+
.prose-news li.list-level-2 {
|
|
303
|
+
@apply pl-3;
|
|
304
|
+
list-style-type: circle;
|
|
305
|
+
}
|
|
306
|
+
.prose-page a, .prose-news a {
|
|
307
|
+
@apply concept-link;
|
|
308
|
+
}
|
|
309
|
+
.prose-page strong, .prose-news strong {
|
|
310
|
+
@apply font-semibold text-ink-800;
|
|
311
|
+
}
|
|
312
|
+
.prose-page em, .prose-news em {
|
|
313
|
+
@apply italic;
|
|
314
|
+
}
|
|
315
|
+
.prose-page code, .prose-news code {
|
|
316
|
+
@apply bg-ink-50 text-ink-600 px-1 rounded text-xs;
|
|
317
|
+
font-family: var(--font-mono);
|
|
318
|
+
}
|
|
319
|
+
.prose-page pre, .prose-news pre {
|
|
320
|
+
@apply bg-ink-50 rounded-lg p-4 mb-4 overflow-x-auto text-xs;
|
|
321
|
+
font-family: var(--font-mono);
|
|
322
|
+
}
|
|
323
|
+
.prose-page pre code, .prose-news pre code {
|
|
324
|
+
@apply bg-transparent px-0 text-ink-700;
|
|
325
|
+
}
|
|
326
|
+
.prose-page blockquote, .prose-news blockquote {
|
|
327
|
+
@apply border-l-4 border-ink-200 pl-4 italic text-ink-500 mb-4;
|
|
328
|
+
}
|
|
329
|
+
.prose-page hr {
|
|
330
|
+
@apply border-ink-100 my-6;
|
|
331
|
+
}
|
|
332
|
+
.prose-page table, .prose-news table {
|
|
333
|
+
@apply w-full mb-4 text-sm;
|
|
334
|
+
}
|
|
335
|
+
.prose-page th, .prose-news th {
|
|
336
|
+
@apply text-left font-semibold text-ink-800 px-3 py-2 border-b-2 border-ink-200;
|
|
337
|
+
}
|
|
338
|
+
.prose-page td, .prose-news td {
|
|
339
|
+
@apply px-3 py-2 border-b border-ink-100;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
.page-enter-active, .page-leave-active {
|
|
344
|
+
transition: opacity 150ms ease;
|
|
345
|
+
}
|
|
346
|
+
.page-enter-from, .page-leave-to {
|
|
347
|
+
opacity: 0;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
@keyframes fadeSlideIn {
|
|
351
|
+
from { opacity: 0; transform: translateY(8px); }
|
|
352
|
+
to { opacity: 1; transform: translateY(0); }
|
|
353
|
+
}
|
|
354
|
+
.animate-entrance {
|
|
355
|
+
animation: fadeSlideIn 300ms ease both;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
@keyframes shimmer {
|
|
359
|
+
0% { background-position: -200% 0; }
|
|
360
|
+
100% { background-position: 200% 0; }
|
|
361
|
+
}
|
|
362
|
+
.skeleton {
|
|
363
|
+
background: linear-gradient(90deg, #f0f0f4 25%, #f7f7f9 50%, #f0f0f4 75%);
|
|
364
|
+
background-size: 200% 100%;
|
|
365
|
+
animation: shimmer 1.5s ease-in-out infinite;
|
|
366
|
+
border-radius: 6px;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
.dark body {
|
|
370
|
+
background-color: #0f1020;
|
|
371
|
+
color: #dddde6;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
.dark {
|
|
375
|
+
--color-ink-50: #161728;
|
|
376
|
+
--color-ink-100: #484a6e;
|
|
377
|
+
--color-ink-200: #484a6e;
|
|
378
|
+
--color-ink-300: #636588;
|
|
379
|
+
--color-ink-400: #7a7c9a;
|
|
380
|
+
--color-ink-500: #9d9fbb;
|
|
381
|
+
--color-ink-600: #b8b9cc;
|
|
382
|
+
--color-ink-700: #c8c9d8;
|
|
383
|
+
--color-ink-800: #dddde6;
|
|
384
|
+
--color-ink-900: #eeeef4;
|
|
385
|
+
--color-surface: #0f1020;
|
|
386
|
+
--color-surface-alt: #161728;
|
|
387
|
+
--color-surface-raised: #1e1f34;
|
|
388
|
+
--brand-primary: #ff5d5d;
|
|
389
|
+
--brand-primary-rgb: 255, 93, 93;
|
|
390
|
+
--brand-dark: #1a1b2e;
|
|
391
|
+
--gold-accent: #D4AF6E;
|
|
392
|
+
--gold-accent-deep: #B8935A;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
.dark .concept-link,
|
|
396
|
+
.dark .xref-link,
|
|
397
|
+
.dark .prose-page a,
|
|
398
|
+
.dark .prose-news a,
|
|
399
|
+
.dark .prose-page a:hover,
|
|
400
|
+
.dark .prose-news a:hover {
|
|
401
|
+
color: #ff6b6b;
|
|
402
|
+
}
|
|
403
|
+
.dark .concept-link:hover,
|
|
404
|
+
.dark .xref-link:hover {
|
|
405
|
+
filter: brightness(1.15);
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
.dark .badge-brand {
|
|
409
|
+
background-color: rgba(255, 93, 93, 0.15);
|
|
410
|
+
color: #ff8a8a;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
.dark .btn-primary:hover {
|
|
414
|
+
background-color: #c41818;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
.dark .bg-surface { background-color: #0f1020 !important; }
|
|
418
|
+
.dark .bg-surface-alt { background-color: #161728 !important; }
|
|
419
|
+
.dark .bg-surface-raised { background-color: #1e1f34 !important; }
|
|
420
|
+
|
|
421
|
+
.dark .text-ink { color: #dddde6 !important; }
|
|
422
|
+
.dark .text-ink-900 { color: #eeeef4 !important; }
|
|
423
|
+
.dark .text-ink-800 { color: #dddde6 !important; }
|
|
424
|
+
.dark .text-ink-700 { color: #c8c9d8 !important; }
|
|
425
|
+
.dark .text-ink-600 { color: #b8b9cc !important; }
|
|
426
|
+
.dark .text-ink-500 { color: #9d9fbb !important; }
|
|
427
|
+
.dark .text-ink-400 { color: #7a7c9a !important; }
|
|
428
|
+
.dark .text-ink-300 { color: #636588 !important; }
|
|
429
|
+
.dark .text-ink-200 { color: #484a6e !important; }
|
|
430
|
+
.dark .text-ink-100 { color: #484a6e !important; }
|
|
431
|
+
|
|
432
|
+
.dark .bg-ink-50 { background-color: #161728 !important; }
|
|
433
|
+
.dark .bg-ink-50\/30 { background-color: rgba(22, 23, 40, 0.3) !important; }
|
|
434
|
+
.dark .bg-ink-50\/60 { background-color: rgba(22, 23, 40, 0.6) !important; }
|
|
435
|
+
.dark .bg-ink-100 { background-color: #1e1f34 !important; }
|
|
436
|
+
.dark .bg-ink-200 { background-color: #22243c !important; }
|
|
437
|
+
.dark .bg-ink-800 { background-color: #0a0b18 !important; }
|
|
438
|
+
.dark .bg-ink-800\/8 { background-color: rgba(10, 11, 24, 0.08) !important; }
|
|
439
|
+
|
|
440
|
+
.dark .border-ink-100 { border-color: #2c2e4a !important; }
|
|
441
|
+
.dark .border-ink-100\/30 { border-color: rgba(44, 46, 74, 0.3) !important; }
|
|
442
|
+
.dark .border-ink-100\/60 { border-color: rgba(44, 46, 74, 0.6) !important; }
|
|
443
|
+
.dark .border-ink-100\/80 { border-color: rgba(44, 46, 74, 0.8) !important; }
|
|
444
|
+
.dark .border-ink-200 { border-color: #36385a !important; }
|
|
445
|
+
.dark .border-ink-800 { border-color: #2c2e4a !important; }
|
|
446
|
+
|
|
447
|
+
.dark .focus\:ring-ink-200:focus { --tw-ring-color: #36385a !important; }
|
|
448
|
+
.dark .focus\:ring-ink-200\/30:focus { --tw-ring-color: rgba(54, 56, 90, 0.3) !important; }
|
|
449
|
+
.dark .focus\:border-ink-400:focus { border-color: #7a7c9a !important; }
|
|
450
|
+
|
|
451
|
+
.dark .card {
|
|
452
|
+
background-color: #1e1f34 !important;
|
|
453
|
+
border-color: rgba(44, 46, 74, 0.6) !important;
|
|
454
|
+
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2) !important;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
.dark input {
|
|
458
|
+
background-color: #161728 !important;
|
|
459
|
+
border-color: #2c2e4a !important;
|
|
460
|
+
color: #dddde6 !important;
|
|
461
|
+
}
|
|
462
|
+
.dark input::placeholder { color: #484a6e !important; }
|
|
463
|
+
|
|
464
|
+
.dark .skeleton {
|
|
465
|
+
background: linear-gradient(90deg, #1e1f34 25%, #2c2e4a 50%, #1e1f34 75%) !important;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
.dark .hover\:bg-ink-50:hover { background-color: #1e1f34 !important; }
|
|
469
|
+
.dark .hover\:bg-ink-50\/30:hover { background-color: rgba(30, 31, 52, 0.3) !important; }
|
|
470
|
+
.dark .hover\:bg-ink-50\/50:hover { background-color: rgba(30, 31, 52, 0.5) !important; }
|
|
471
|
+
.dark .hover\:bg-surface-alt:hover { background-color: #161728 !important; }
|
|
472
|
+
.dark .hover\:text-ink-700:hover { color: #dddde6 !important; }
|
|
473
|
+
.dark .hover\:text-ink-800:hover { color: #eeeef4 !important; }
|
|
474
|
+
|
|
475
|
+
.dark .placeholder\:text-ink-300::placeholder { color: #484a6e !important; }
|
|
476
|
+
|
|
477
|
+
.dark .concept-link {
|
|
478
|
+
filter: brightness(1.5);
|
|
479
|
+
}
|
|
480
|
+
.dark .concept-link:hover {
|
|
481
|
+
filter: brightness(1.3) underline;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
.dark .bg-blue-50 { background-color: rgba(59, 130, 246, 0.15) !important; }
|
|
485
|
+
.dark .text-blue-600 { color: #93bbfd !important; }
|
|
486
|
+
.dark .text-blue-700 { color: #7aa8fb !important; }
|
|
487
|
+
.dark .border-blue-100 { border-color: rgba(59, 130, 246, 0.25) !important; }
|
|
488
|
+
.dark .border-blue-500 { border-color: #3b82f6 !important; }
|
|
489
|
+
.dark .bg-emerald-50 { background-color: rgba(16, 185, 129, 0.15) !important; }
|
|
490
|
+
.dark .text-emerald-500 { color: #6ee7b7 !important; }
|
|
491
|
+
.dark .text-emerald-700 { color: #6ee7b7 !important; }
|
|
492
|
+
.dark .border-emerald-100 { border-color: rgba(16, 185, 129, 0.25) !important; }
|
|
493
|
+
.dark .bg-amber-50 { background-color: rgba(245, 158, 11, 0.15) !important; }
|
|
494
|
+
.dark .text-amber-600 { color: #fbbf24 !important; }
|
|
495
|
+
.dark .text-amber-700 { color: #fbbf24 !important; }
|
|
496
|
+
.dark .bg-purple-50 { background-color: rgba(139, 92, 246, 0.15) !important; }
|
|
497
|
+
.dark .text-purple-700 { color: #c4b5fd !important; }
|
|
498
|
+
.dark .bg-red-50 { background-color: rgba(239, 68, 68, 0.15) !important; }
|
|
499
|
+
.dark .text-red-600 { color: #fca5a5 !important; }
|
|
500
|
+
|
|
501
|
+
.dark .section-label {
|
|
502
|
+
color: var(--color-ink-300) !important;
|
|
503
|
+
}
|
|
@@ -48,18 +48,20 @@ watch(
|
|
|
48
48
|
{ immediate: true }
|
|
49
49
|
);
|
|
50
50
|
|
|
51
|
+
/* When the user clicks a card in the sphere, we store the navigation
|
|
52
|
+
payload here. The concept loads via store.viewConcept (without
|
|
53
|
+
router.push). When the user switches to Detail, we commit the URL. */
|
|
54
|
+
const sphereFocusPayload = ref<{ registerId: string; conceptId: string } | null>(null);
|
|
55
|
+
|
|
51
56
|
const concept = computed(() => store.currentConcept);
|
|
52
57
|
const manifest = computed(() => store.currentManifest);
|
|
53
58
|
const edges = computed(() => store.conceptEdges);
|
|
59
|
+
const activeRegisterId = computed(() => sphereFocusPayload.value?.registerId ?? props.registerId);
|
|
54
60
|
const adjacent = ref({ prev: null as string | null, next: null as string | null });
|
|
55
61
|
const viewMode = ref<'detail' | 'sphere'>(
|
|
56
62
|
router.currentRoute.value.query.view === 'sphere' ? 'sphere' : 'detail'
|
|
57
63
|
);
|
|
58
64
|
|
|
59
|
-
/* When the user clicks a card in the sphere, we store the navigation
|
|
60
|
-
payload here. The concept loads via store.viewConcept (without
|
|
61
|
-
router.push). When the user switches to Detail, we commit the URL. */
|
|
62
|
-
const sphereFocusPayload = ref<{ registerId: string; conceptId: string } | null>(null);
|
|
63
65
|
const permalinkCopied = ref(false);
|
|
64
66
|
|
|
65
67
|
async function copyPermalink() {
|
|
@@ -88,26 +90,19 @@ function goAdjacent(id: string) {
|
|
|
88
90
|
window.scrollTo({ top: 0, behavior: 'smooth' });
|
|
89
91
|
}
|
|
90
92
|
|
|
91
|
-
function onSphereNavigate(payload: { registerId: string; conceptId: string }) {
|
|
93
|
+
async function onSphereNavigate(payload: { registerId: string; conceptId: string }) {
|
|
92
94
|
if (!payload.registerId || !payload.conceptId) return;
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
watch on props.concept fires → rebuilds the graph → animates. */
|
|
98
|
-
sphereFocusPayload.value = { registerId: payload.registerId, conceptId: payload.conceptId };
|
|
99
|
-
(async () => {
|
|
100
|
-
try {
|
|
101
|
-
const adapter = store.datasets.get(payload.registerId);
|
|
102
|
-
if (!adapter?.index) {
|
|
103
|
-
await store.loadDataset(payload.registerId);
|
|
104
|
-
}
|
|
105
|
-
await store.viewConcept(payload.registerId, payload.conceptId);
|
|
106
|
-
loadAdjacent();
|
|
107
|
-
} catch (e) {
|
|
108
|
-
console.warn('Sphere navigation failed:', e);
|
|
95
|
+
try {
|
|
96
|
+
const adapter = store.datasets.get(payload.registerId);
|
|
97
|
+
if (!adapter?.index) {
|
|
98
|
+
await store.loadDataset(payload.registerId);
|
|
109
99
|
}
|
|
110
|
-
|
|
100
|
+
await store.viewConcept(payload.registerId, payload.conceptId);
|
|
101
|
+
sphereFocusPayload.value = { registerId: payload.registerId, conceptId: payload.conceptId };
|
|
102
|
+
loadAdjacent();
|
|
103
|
+
} catch (e) {
|
|
104
|
+
console.warn('Sphere navigation failed:', e);
|
|
105
|
+
}
|
|
111
106
|
}
|
|
112
107
|
|
|
113
108
|
function switchToSphere() {
|
|
@@ -283,7 +278,7 @@ onUnmounted(() => window.removeEventListener('keydown', onKeydown));
|
|
|
283
278
|
v-if="viewMode === 'sphere'"
|
|
284
279
|
:concept="concept"
|
|
285
280
|
:manifest="manifest"
|
|
286
|
-
:register-id="
|
|
281
|
+
:register-id="activeRegisterId"
|
|
287
282
|
:edges="edges"
|
|
288
283
|
@navigate="onSphereNavigate"
|
|
289
284
|
/>
|
package/src/views/StatsView.vue
CHANGED
|
@@ -45,7 +45,7 @@ const stats = computed(() => {
|
|
|
45
45
|
|
|
46
46
|
const langs: LangStat[] = [...allLangs].map(lang => ({
|
|
47
47
|
lang,
|
|
48
|
-
terms:
|
|
48
|
+
terms: ls[lang]?.terms ?? conceptCounts[lang] ?? 0,
|
|
49
49
|
definitions: ls[lang]?.definitions ?? conceptCounts[lang] ?? 0,
|
|
50
50
|
}));
|
|
51
51
|
|
package/tsconfig.json
CHANGED
|
@@ -20,5 +20,6 @@
|
|
|
20
20
|
},
|
|
21
21
|
"baseUrl": "."
|
|
22
22
|
},
|
|
23
|
-
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "env.d.ts"]
|
|
23
|
+
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "env.d.ts", ".astro/types.d.ts"],
|
|
24
|
+
"exclude": ["src/content.config.ts", "src/pages/**", "src/layouts/**", "src/astro-islands/**", "src/lib/site-config.ts"]
|
|
24
25
|
}
|
package/vite.config.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { defineConfig, type Plugin } from 'vite'
|
|
2
2
|
import vue from '@vitejs/plugin-vue'
|
|
3
|
+
import tailwindcss from '@tailwindcss/vite'
|
|
3
4
|
import { resolve, dirname, extname, join } from 'path'
|
|
4
5
|
import { readFileSync, existsSync, statSync, createReadStream } from 'fs'
|
|
5
6
|
import { fileURLToPath } from 'url'
|
|
@@ -162,7 +163,7 @@ export default defineConfig({
|
|
|
162
163
|
optimizeDeps: {
|
|
163
164
|
exclude: ['@plurimath/plurimath'],
|
|
164
165
|
},
|
|
165
|
-
plugins: [yamlPlugin(), faviconPlugin(), brandingPlugin(), dataServePlugin(), inlineDataPlugin(), vue()],
|
|
166
|
+
plugins: [tailwindcss(), yamlPlugin(), faviconPlugin(), brandingPlugin(), dataServePlugin(), inlineDataPlugin(), vue()],
|
|
166
167
|
resolve: {
|
|
167
168
|
alias: {
|
|
168
169
|
'@': resolve(__dirname, 'src'),
|
|
@@ -180,5 +181,6 @@ export default defineConfig({
|
|
|
180
181
|
test: {
|
|
181
182
|
environment: 'happy-dom',
|
|
182
183
|
globals: true,
|
|
184
|
+
include: ['src/__tests__/**/*.test.ts'],
|
|
183
185
|
},
|
|
184
186
|
})
|
package/postcss.config.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { dirname, resolve } from 'path';
|
|
2
|
-
import { fileURLToPath } from 'url';
|
|
3
|
-
|
|
4
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
5
|
-
|
|
6
|
-
export default {
|
|
7
|
-
plugins: {
|
|
8
|
-
tailwindcss: {
|
|
9
|
-
config: resolve(__dirname, 'tailwind.config.js'),
|
|
10
|
-
},
|
|
11
|
-
autoprefixer: {},
|
|
12
|
-
},
|
|
13
|
-
};
|