@mvarble/mesearch-ui 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +84 -2
- package/dist/ambient.d.ts +2 -0
- package/dist/components/Article.svelte +226 -0
- package/dist/components/Article.svelte.d.ts +16 -0
- package/dist/components/ArticleHeader.svelte +134 -0
- package/dist/components/ArticleHeader.svelte.d.ts +19 -0
- package/dist/components/Chips.svelte +22 -0
- package/dist/components/Chips.svelte.d.ts +8 -0
- package/dist/components/Graph.svelte +727 -0
- package/dist/components/Graph.svelte.d.ts +16 -0
- package/dist/components/GraphPanel.svelte +328 -0
- package/dist/components/GraphPanel.svelte.d.ts +17 -0
- package/dist/components/Icon.svelte +67 -0
- package/dist/components/Icon.svelte.d.ts +8 -0
- package/dist/components/Index.svelte +283 -0
- package/dist/components/Index.svelte.d.ts +9 -0
- package/dist/components/Pager.svelte +71 -0
- package/dist/components/Pager.svelte.d.ts +12 -0
- package/dist/components/Palette.svelte +333 -0
- package/dist/components/Palette.svelte.d.ts +9 -0
- package/dist/components/Parts.svelte +62 -0
- package/dist/components/Parts.svelte.d.ts +11 -0
- package/dist/components/Proof.svelte +39 -0
- package/dist/components/Proof.svelte.d.ts +8 -0
- package/dist/components/Rail.svelte +186 -0
- package/dist/components/Rail.svelte.d.ts +13 -0
- package/dist/components/References.svelte +94 -0
- package/dist/components/References.svelte.d.ts +8 -0
- package/dist/components/SequenceTrack.svelte +186 -0
- package/dist/components/SequenceTrack.svelte.d.ts +11 -0
- package/dist/components/Shell.svelte +82 -0
- package/dist/components/Shell.svelte.d.ts +14 -0
- package/dist/components/Statement.svelte +105 -0
- package/dist/components/Statement.svelte.d.ts +11 -0
- package/dist/components/ThemeToggle.svelte +19 -0
- package/dist/components/ThemeToggle.svelte.d.ts +3 -0
- package/dist/components/Toc.svelte +145 -0
- package/dist/components/Toc.svelte.d.ts +8 -0
- package/dist/fonts.d.ts +4 -0
- package/dist/fonts.js +6 -0
- package/dist/fuzzy.d.ts +12 -0
- package/dist/fuzzy.js +57 -0
- package/dist/graph-layout.d.ts +35 -0
- package/dist/graph-layout.js +98 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +30 -0
- package/dist/reading.svelte.d.ts +3 -0
- package/dist/reading.svelte.js +4 -0
- package/dist/server.d.ts +26 -0
- package/dist/server.js +115 -0
- package/dist/settings.d.ts +10 -0
- package/dist/settings.js +28 -0
- package/dist/styles/base.css +136 -0
- package/dist/styles/index.css +6 -0
- package/dist/styles/prose.css +203 -0
- package/dist/styles/tokens.css +111 -0
- package/dist/theme.svelte.d.ts +12 -0
- package/dist/theme.svelte.js +66 -0
- package/dist/types.d.ts +84 -0
- package/dist/types.js +3 -0
- package/package.json +66 -3
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// The reader's theme: 'light', 'dark', or 'system' to follow the device.
|
|
2
|
+
// `THEME_SCRIPT`, inlined in the page's `<head>`, applies the stored choice
|
|
3
|
+
// before the first paint; `theme` keeps it applied afterwards and tracks the
|
|
4
|
+
// device while following it. The theme is `data-theme` on `<html>`, and a page
|
|
5
|
+
// read without JavaScript keeps the light theme it ships with.
|
|
6
|
+
const KEY = 'mesearch:theme';
|
|
7
|
+
function stored() {
|
|
8
|
+
try {
|
|
9
|
+
const value = localStorage.getItem(KEY);
|
|
10
|
+
return value == 'light' || value == 'dark' ? value : 'system';
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return 'system';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
// For `app.html`: paste inside a `<script>` in the `<head>`, before anything
|
|
17
|
+
// that paints. It also adds the `js` class that the `needs-js` utility uses.
|
|
18
|
+
export const THEME_SCRIPT = `(function () {
|
|
19
|
+
var root = document.documentElement;
|
|
20
|
+
var theme;
|
|
21
|
+
root.classList.add('js');
|
|
22
|
+
try {
|
|
23
|
+
theme = localStorage.getItem('${KEY}');
|
|
24
|
+
} catch (e) {}
|
|
25
|
+
if (theme !== 'light' && theme !== 'dark') {
|
|
26
|
+
theme = matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
|
27
|
+
}
|
|
28
|
+
root.dataset.theme = theme;
|
|
29
|
+
})();`;
|
|
30
|
+
class Theme {
|
|
31
|
+
#started = false;
|
|
32
|
+
choice = $state('system');
|
|
33
|
+
systemDark = $state(false);
|
|
34
|
+
resolved = $derived(this.choice == 'system' ? (this.systemDark ? 'dark' : 'light') : this.choice);
|
|
35
|
+
start() {
|
|
36
|
+
if (this.#started)
|
|
37
|
+
return;
|
|
38
|
+
this.#started = true;
|
|
39
|
+
this.choice = stored();
|
|
40
|
+
const query = matchMedia('(prefers-color-scheme: dark)');
|
|
41
|
+
this.systemDark = query.matches;
|
|
42
|
+
query.addEventListener('change', (event) => (this.systemDark = event.matches));
|
|
43
|
+
$effect.root(() => {
|
|
44
|
+
$effect(() => {
|
|
45
|
+
document.documentElement.dataset.theme = this.resolved;
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
// Light and dark, in turn: every click changes what the page shows. A
|
|
50
|
+
// choice that matches the device's own setting is not remembered, so
|
|
51
|
+
// from then on the page follows the device again.
|
|
52
|
+
toggle() {
|
|
53
|
+
const next = this.resolved == 'dark' ? 'light' : 'dark';
|
|
54
|
+
this.choice = next == (this.systemDark ? 'dark' : 'light') ? 'system' : next;
|
|
55
|
+
try {
|
|
56
|
+
if (this.choice == 'system')
|
|
57
|
+
localStorage.removeItem(KEY);
|
|
58
|
+
else
|
|
59
|
+
localStorage.setItem(KEY, this.choice);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// Private browsing: the choice lasts as long as the page.
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export const theme = new Theme();
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
export type Kind = string;
|
|
2
|
+
export interface DocumentRef {
|
|
3
|
+
key: string;
|
|
4
|
+
kind: Kind;
|
|
5
|
+
url: string;
|
|
6
|
+
title: string;
|
|
7
|
+
titleHtml: string;
|
|
8
|
+
}
|
|
9
|
+
export interface IndexEntry extends DocumentRef {
|
|
10
|
+
summary: string;
|
|
11
|
+
summaryHtml: string;
|
|
12
|
+
created: Date;
|
|
13
|
+
updated: Date;
|
|
14
|
+
readingMinutes?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface SearchEntry {
|
|
17
|
+
key: string;
|
|
18
|
+
kind: Kind;
|
|
19
|
+
url: string;
|
|
20
|
+
title: string;
|
|
21
|
+
summary: string;
|
|
22
|
+
summaryHtml?: string;
|
|
23
|
+
headings: Array<{
|
|
24
|
+
title: string;
|
|
25
|
+
slug: string;
|
|
26
|
+
}>;
|
|
27
|
+
}
|
|
28
|
+
export interface GraphNode extends DocumentRef {
|
|
29
|
+
x: number;
|
|
30
|
+
y: number;
|
|
31
|
+
width: number;
|
|
32
|
+
depth: number;
|
|
33
|
+
sequenced: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface GraphLegend {
|
|
36
|
+
kinds: Array<{
|
|
37
|
+
kind: Kind;
|
|
38
|
+
label: string;
|
|
39
|
+
shape?: 'pill' | 'card';
|
|
40
|
+
}>;
|
|
41
|
+
solid: string;
|
|
42
|
+
dashed: string;
|
|
43
|
+
sequenced?: string;
|
|
44
|
+
from: string;
|
|
45
|
+
to: string;
|
|
46
|
+
related: string;
|
|
47
|
+
empty: string;
|
|
48
|
+
}
|
|
49
|
+
export interface GraphLink {
|
|
50
|
+
from: string;
|
|
51
|
+
to: string;
|
|
52
|
+
style: 'solid' | 'dashed';
|
|
53
|
+
}
|
|
54
|
+
export interface TocEntry {
|
|
55
|
+
slug: string;
|
|
56
|
+
titleHtml: string;
|
|
57
|
+
depth: number;
|
|
58
|
+
children: TocEntry[];
|
|
59
|
+
}
|
|
60
|
+
export interface TrackItem {
|
|
61
|
+
key: string;
|
|
62
|
+
url: string;
|
|
63
|
+
titleHtml: string;
|
|
64
|
+
label?: string;
|
|
65
|
+
children?: TrackItem[];
|
|
66
|
+
}
|
|
67
|
+
export interface RailLink {
|
|
68
|
+
url: string;
|
|
69
|
+
label: string;
|
|
70
|
+
icon: IconName;
|
|
71
|
+
}
|
|
72
|
+
export type IconName = 'search' | 'graph' | 'list' | 'sun' | 'moon' | 'auto' | 'plus' | 'minus' | 'reset' | 'close' | 'arrow-right' | 'arrow-left' | 'home' | 'pen' | 'book' | 'quote';
|
|
73
|
+
export interface Reference {
|
|
74
|
+
id: string;
|
|
75
|
+
label: string;
|
|
76
|
+
html: string;
|
|
77
|
+
}
|
|
78
|
+
export interface StatementInfo {
|
|
79
|
+
kind: string;
|
|
80
|
+
label: string;
|
|
81
|
+
slug: string;
|
|
82
|
+
title?: string;
|
|
83
|
+
id?: string;
|
|
84
|
+
}
|
package/dist/types.js
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,69 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mvarble/mesearch-ui",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "The Svelte components and styles mesearch sites are made of: the map, the index, search, the rail, contents, sequences, and a textbook look. Data and URLs come in as props, so any SvelteKit site can use them.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Matthew Varble <matthew@rodent.club>",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/mvarble/mesearch.git",
|
|
10
|
+
"directory": "packages/ui"
|
|
11
|
+
},
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"access": "public"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"svelte": "./dist/index.js",
|
|
17
|
+
"types": "./dist/index.d.ts",
|
|
18
|
+
"exports": {
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"svelte": "./dist/index.js",
|
|
22
|
+
"default": "./dist/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./server": {
|
|
25
|
+
"types": "./dist/server.d.ts",
|
|
26
|
+
"default": "./dist/server.js"
|
|
27
|
+
},
|
|
28
|
+
"./styles/*": "./dist/styles/*",
|
|
29
|
+
"./package.json": "./package.json",
|
|
30
|
+
"./fonts": {
|
|
31
|
+
"types": "./dist/fonts.d.ts",
|
|
32
|
+
"default": "./dist/fonts.js"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"files": [
|
|
36
|
+
"dist"
|
|
37
|
+
],
|
|
38
|
+
"sideEffects": [
|
|
39
|
+
"**/*.css",
|
|
40
|
+
"./dist/fonts.js"
|
|
41
|
+
],
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=22.18"
|
|
44
|
+
},
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@fontsource-variable/inter": "^5.3.0",
|
|
47
|
+
"@fontsource-variable/source-serif-4": "^5.3.0",
|
|
48
|
+
"@fontsource/fira-mono": "^5.3.0",
|
|
49
|
+
"@mvarble/mesearch-markdown": "^0.1.0",
|
|
50
|
+
"d3-force": "^3.0.0",
|
|
51
|
+
"katex": "^0.18.4"
|
|
52
|
+
},
|
|
53
|
+
"peerDependencies": {
|
|
54
|
+
"svelte": "^5.0.0"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"@sveltejs/package": "^2.5.8",
|
|
58
|
+
"@types/d3-force": "^3.0.10",
|
|
59
|
+
"@types/node": "^22.14.0",
|
|
60
|
+
"svelte": "^5.57.1",
|
|
61
|
+
"svelte-check": "^4.7.6",
|
|
62
|
+
"typescript": "^6.0.3"
|
|
63
|
+
},
|
|
64
|
+
"scripts": {
|
|
65
|
+
"build": "svelte-package -i src/lib -o dist",
|
|
66
|
+
"check": "svelte-check --tsconfig ./tsconfig.json",
|
|
67
|
+
"test": "svelte-package -i src/lib -o dist && node --test 'test/**/*.test.mjs'"
|
|
68
|
+
}
|
|
6
69
|
}
|