@mdbase-dev/ui 0.1.0-beta.117
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 +28 -0
- package/css/brand.css +93 -0
- package/css/controls.css +611 -0
- package/css/fonts.css +6 -0
- package/css/motion.css +198 -0
- package/css/palette.css +196 -0
- package/css/screens.css +155 -0
- package/css/tokens.css +141 -0
- package/dist/AppSwitcher.d.ts +13 -0
- package/dist/AppSwitcher.js +38 -0
- package/dist/CommandPalette.d.ts +37 -0
- package/dist/CommandPalette.js +130 -0
- package/dist/Dialog.d.ts +12 -0
- package/dist/Dialog.js +23 -0
- package/dist/SaveNotice.d.ts +17 -0
- package/dist/SaveNotice.js +15 -0
- package/dist/Select.d.ts +20 -0
- package/dist/Select.js +158 -0
- package/dist/SelectList.d.ts +19 -0
- package/dist/SelectList.js +21 -0
- package/dist/ThemeSelect.d.ts +12 -0
- package/dist/ThemeSelect.js +12 -0
- package/dist/apps.d.ts +20 -0
- package/dist/apps.js +47 -0
- package/dist/brand.d.ts +99 -0
- package/dist/brand.js +61 -0
- package/dist/codemirror.d.ts +9 -0
- package/dist/codemirror.js +98 -0
- package/dist/popover.d.ts +50 -0
- package/dist/popover.js +162 -0
- package/dist/screens.d.ts +29 -0
- package/dist/screens.js +18 -0
- package/dist/select-model.d.ts +34 -0
- package/dist/select-model.js +53 -0
- package/dist/theme.d.ts +18 -0
- package/dist/theme.js +59 -0
- package/package.json +105 -0
package/dist/theme.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/** Every mdbase surface stores an explicit System, Light or Dark choice under this key. */
|
|
2
|
+
export const THEME_STORAGE_KEY = "mdbase:theme";
|
|
3
|
+
export const themePreferences = ["system", "light", "dark"];
|
|
4
|
+
/** Browser chrome colours matching the light and dark canvas tokens. */
|
|
5
|
+
export const themeColors = { light: "#fcfcfd", dark: "#1b1d23" };
|
|
6
|
+
export function normalizeThemePreference(value) {
|
|
7
|
+
return themePreferences.includes(value)
|
|
8
|
+
? value
|
|
9
|
+
: "system";
|
|
10
|
+
}
|
|
11
|
+
/** Storage may be absent (server rendering, extension pages) or blocked; both mean System. */
|
|
12
|
+
export function loadThemePreference(storage) {
|
|
13
|
+
try {
|
|
14
|
+
return normalizeThemePreference((storage ?? localStorage).getItem(THEME_STORAGE_KEY));
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return "system";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function prefersDark() {
|
|
21
|
+
return typeof matchMedia === "function"
|
|
22
|
+
&& matchMedia("(prefers-color-scheme: dark)").matches;
|
|
23
|
+
}
|
|
24
|
+
export function resolveDarkTheme(root = document.documentElement) {
|
|
25
|
+
const applied = root.dataset.theme;
|
|
26
|
+
return applied === "dark" || (applied !== "light" && prefersDark());
|
|
27
|
+
}
|
|
28
|
+
export function observeTheme(listener, root = document.documentElement) {
|
|
29
|
+
const observer = new MutationObserver(listener);
|
|
30
|
+
observer.observe(root, { attributeFilter: ["data-theme"] });
|
|
31
|
+
const media = typeof matchMedia === "function"
|
|
32
|
+
? matchMedia("(prefers-color-scheme: dark)")
|
|
33
|
+
: null;
|
|
34
|
+
media?.addEventListener("change", listener);
|
|
35
|
+
return () => {
|
|
36
|
+
observer.disconnect();
|
|
37
|
+
media?.removeEventListener("change", listener);
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function applyThemePreference(preference, root = document.documentElement) {
|
|
41
|
+
if (preference === "system")
|
|
42
|
+
root.removeAttribute("data-theme");
|
|
43
|
+
else
|
|
44
|
+
root.dataset.theme = preference;
|
|
45
|
+
const dark = preference === "dark" || (preference === "system" && prefersDark());
|
|
46
|
+
if (typeof document !== "undefined") {
|
|
47
|
+
document.querySelector('meta[name="theme-color"]')
|
|
48
|
+
?.setAttribute("content", dark ? themeColors.dark : themeColors.light);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function saveThemePreference(preference, storage, root = document.documentElement) {
|
|
52
|
+
try {
|
|
53
|
+
(storage ?? localStorage).setItem(THEME_STORAGE_KEY, preference);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Theme selection still applies for this session when storage is unavailable.
|
|
57
|
+
}
|
|
58
|
+
applyThemePreference(preference, root);
|
|
59
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mdbase-dev/ui",
|
|
3
|
+
"version": "0.1.0-beta.117",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/mdbase-dev/mdbase-connect.git",
|
|
10
|
+
"directory": "packages/app-ui"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://mdbase.dev",
|
|
13
|
+
"sideEffects": [
|
|
14
|
+
"*.css"
|
|
15
|
+
],
|
|
16
|
+
"exports": {
|
|
17
|
+
"./app-switcher": {
|
|
18
|
+
"types": "./dist/AppSwitcher.d.ts",
|
|
19
|
+
"import": "./dist/AppSwitcher.js"
|
|
20
|
+
},
|
|
21
|
+
"./apps": {
|
|
22
|
+
"types": "./dist/apps.d.ts",
|
|
23
|
+
"import": "./dist/apps.js"
|
|
24
|
+
},
|
|
25
|
+
"./brand": {
|
|
26
|
+
"types": "./dist/brand.d.ts",
|
|
27
|
+
"import": "./dist/brand.js"
|
|
28
|
+
},
|
|
29
|
+
"./codemirror": {
|
|
30
|
+
"types": "./dist/codemirror.d.ts",
|
|
31
|
+
"import": "./dist/codemirror.js"
|
|
32
|
+
},
|
|
33
|
+
"./command-palette": {
|
|
34
|
+
"types": "./dist/CommandPalette.d.ts",
|
|
35
|
+
"import": "./dist/CommandPalette.js"
|
|
36
|
+
},
|
|
37
|
+
"./dialog": {
|
|
38
|
+
"types": "./dist/Dialog.d.ts",
|
|
39
|
+
"import": "./dist/Dialog.js"
|
|
40
|
+
},
|
|
41
|
+
"./popover": {
|
|
42
|
+
"types": "./dist/popover.d.ts",
|
|
43
|
+
"import": "./dist/popover.js"
|
|
44
|
+
},
|
|
45
|
+
"./save-notice": {
|
|
46
|
+
"types": "./dist/SaveNotice.d.ts",
|
|
47
|
+
"import": "./dist/SaveNotice.js"
|
|
48
|
+
},
|
|
49
|
+
"./screens": {
|
|
50
|
+
"types": "./dist/screens.d.ts",
|
|
51
|
+
"import": "./dist/screens.js"
|
|
52
|
+
},
|
|
53
|
+
"./select": {
|
|
54
|
+
"types": "./dist/Select.d.ts",
|
|
55
|
+
"import": "./dist/Select.js"
|
|
56
|
+
},
|
|
57
|
+
"./theme": {
|
|
58
|
+
"types": "./dist/theme.d.ts",
|
|
59
|
+
"import": "./dist/theme.js"
|
|
60
|
+
},
|
|
61
|
+
"./theme-select": {
|
|
62
|
+
"types": "./dist/ThemeSelect.d.ts",
|
|
63
|
+
"import": "./dist/ThemeSelect.js"
|
|
64
|
+
},
|
|
65
|
+
"./brand.css": "./css/brand.css",
|
|
66
|
+
"./controls.css": "./css/controls.css",
|
|
67
|
+
"./fonts.css": "./css/fonts.css",
|
|
68
|
+
"./motion.css": "./css/motion.css",
|
|
69
|
+
"./palette.css": "./css/palette.css",
|
|
70
|
+
"./screens.css": "./css/screens.css",
|
|
71
|
+
"./tokens.css": "./css/tokens.css"
|
|
72
|
+
},
|
|
73
|
+
"files": [
|
|
74
|
+
"css",
|
|
75
|
+
"dist",
|
|
76
|
+
"README.md"
|
|
77
|
+
],
|
|
78
|
+
"dependencies": {
|
|
79
|
+
"@fontsource/atkinson-hyperlegible": "^5.3.0",
|
|
80
|
+
"@fontsource/azeret-mono": "^5.3.0"
|
|
81
|
+
},
|
|
82
|
+
"peerDependencies": {
|
|
83
|
+
"@codemirror/view": "^6.0.0",
|
|
84
|
+
"react": "^19.2.0"
|
|
85
|
+
},
|
|
86
|
+
"devDependencies": {
|
|
87
|
+
"@codemirror/view": "^6.43.12",
|
|
88
|
+
"@types/react": "^19.3.0",
|
|
89
|
+
"@types/react-dom": "^19.3.0",
|
|
90
|
+
"react": "^19.3.0",
|
|
91
|
+
"react-dom": "^19.3.0",
|
|
92
|
+
"typescript": "^7.0.2",
|
|
93
|
+
"vitest": "^4.1.10"
|
|
94
|
+
},
|
|
95
|
+
"peerDependenciesMeta": {
|
|
96
|
+
"@codemirror/view": {
|
|
97
|
+
"optional": true
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"scripts": {
|
|
101
|
+
"build": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\" && tsc -p tsconfig.json",
|
|
102
|
+
"test": "vitest run",
|
|
103
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
104
|
+
}
|
|
105
|
+
}
|