picocrank 1.21.5 → 1.22.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/package.json +8 -8
- package/public/themes/README.md +29 -0
- package/public/themes/catppuccin/theme.css +195 -0
- package/public/themes/dracula/theme.css +181 -0
- package/public/themes/index.json +7 -0
- package/public/themes/waffles/theme.css +143 -0
- package/router.js +20 -0
- package/styles/dark-theme.css +15 -1
- package/styles.css +18 -2
- package/vite.config.js +57 -0
- package/vue/components/CheckGroup.vue +156 -0
- package/vue/components/FormField.vue +14 -2
- package/vue/components/Header.vue +139 -33
- package/vue/components/QuickSearch.vue +325 -348
- package/vue/components/RadioGroup.vue +191 -0
- package/vue/components/Sidebar.vue +226 -262
- package/vue/components/SidebarNavLink.vue +161 -0
- package/vue/composables/useCustomTheme.js +162 -0
- package/vue/data/examplePeople.js +45 -0
- package/vue/views/App.vue +85 -15
- package/vue/views/FormExample.vue +64 -29
- package/vue/views/PageStructure.vue +168 -95
- package/vue/views/TableExample.vue +2 -76
- package/vue/views/ThemePreview.vue +172 -0
- package/vue/views/UserDetails.vue +39 -0
- package/vue/views/Welcome.vue +9 -6
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "picocrank",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.22.0",
|
|
4
4
|
"description": "A set of zero dependency Vue components built on the Femtocrank global CSS theme.",
|
|
5
5
|
"main": "vite.config.js",
|
|
6
6
|
"scripts": {
|
|
@@ -18,17 +18,17 @@
|
|
|
18
18
|
"url": "https://github.com/jamesread/picocrank/issues"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@hugeicons/core-free-icons": "^4.2.
|
|
21
|
+
"@hugeicons/core-free-icons": "^4.2.3",
|
|
22
22
|
"@hugeicons/vue": "^1.0.7",
|
|
23
|
-
"@vitejs/plugin-vue": "^6.0.
|
|
24
|
-
"femtocrank": "^2.5.
|
|
23
|
+
"@vitejs/plugin-vue": "^6.0.8",
|
|
24
|
+
"femtocrank": "^2.5.1",
|
|
25
25
|
"unplugin-vue-components": "^32.1.0",
|
|
26
|
-
"vite": "^8.
|
|
27
|
-
"vue": "^3.5.
|
|
28
|
-
"vue-router": "^5.
|
|
26
|
+
"vite": "^8.2.0",
|
|
27
|
+
"vue": "^3.5.40",
|
|
28
|
+
"vue-router": "^5.2.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"semantic-release": "^25.0.
|
|
31
|
+
"semantic-release": "^25.0.8"
|
|
32
32
|
},
|
|
33
33
|
"homepage": "https://github.com/jamesread/picocrank#readme"
|
|
34
34
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Drop-in themes
|
|
2
|
+
|
|
3
|
+
Themes are **not** part of the PicoCrank Vite/JS CSS bundle. Drop a folder here and restart the dev server (or rebuild) to make it discoverable.
|
|
4
|
+
|
|
5
|
+
## Layout
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
public/themes/
|
|
9
|
+
├── index.json # generated by Vite — do not edit by hand
|
|
10
|
+
├── <theme-folder-name>/
|
|
11
|
+
│ ├── theme.css # required
|
|
12
|
+
│ └── …optional assets…
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
A directory is a valid theme only if it contains `theme.css`.
|
|
16
|
+
|
|
17
|
+
## Asset URLs
|
|
18
|
+
|
|
19
|
+
Theme CSS is loaded via `@import` into a document-level stylesheet, so relative URLs resolve incorrectly. Use absolute paths:
|
|
20
|
+
|
|
21
|
+
```css
|
|
22
|
+
body {
|
|
23
|
+
background-image: url('/themes/mytheme/background.png');
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Switching
|
|
28
|
+
|
|
29
|
+
The examples app uses `useCustomTheme()` to list themes from `index.json` and apply the selected `theme.css` with `@import … layer(theme)`.
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Catppuccin Mocha sample theme for PicoCrank / Femtocrank.
|
|
3
|
+
* Palette: https://catppuccin.com/palette/ (Mocha)
|
|
4
|
+
*
|
|
5
|
+
* Asset URLs must be absolute, e.g.:
|
|
6
|
+
* background-image: url('/themes/catppuccin/background.png');
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
:root,
|
|
10
|
+
html {
|
|
11
|
+
color-scheme: dark;
|
|
12
|
+
|
|
13
|
+
--ctp-rosewater: #f5e0dc;
|
|
14
|
+
--ctp-flamingo: #f2cdcd;
|
|
15
|
+
--ctp-pink: #f5c2e7;
|
|
16
|
+
--ctp-mauve: #cba6f7;
|
|
17
|
+
--ctp-red: #f38ba8;
|
|
18
|
+
--ctp-maroon: #eba0ac;
|
|
19
|
+
--ctp-peach: #fab387;
|
|
20
|
+
--ctp-yellow: #f9e2af;
|
|
21
|
+
--ctp-green: #a6e3a1;
|
|
22
|
+
--ctp-teal: #94e2d5;
|
|
23
|
+
--ctp-sky: #89dceb;
|
|
24
|
+
--ctp-sapphire: #74c7ec;
|
|
25
|
+
--ctp-blue: #89b4fa;
|
|
26
|
+
--ctp-lavender: #b4befe;
|
|
27
|
+
--ctp-text: #cdd6f4;
|
|
28
|
+
--ctp-subtext1: #bac2de;
|
|
29
|
+
--ctp-subtext0: #a6adc8;
|
|
30
|
+
--ctp-overlay2: #9399b2;
|
|
31
|
+
--ctp-overlay1: #7f849c;
|
|
32
|
+
--ctp-overlay0: #6c7086;
|
|
33
|
+
--ctp-surface2: #585b70;
|
|
34
|
+
--ctp-surface1: #45475a;
|
|
35
|
+
--ctp-surface0: #313244;
|
|
36
|
+
--ctp-base: #1e1e2e;
|
|
37
|
+
--ctp-mantle: #181825;
|
|
38
|
+
--ctp-crust: #11111b;
|
|
39
|
+
|
|
40
|
+
--text-color: var(--ctp-text);
|
|
41
|
+
--border-color: var(--ctp-surface1);
|
|
42
|
+
--standout-bg-color: var(--ctp-mantle);
|
|
43
|
+
--hover-background-color: var(--ctp-surface0);
|
|
44
|
+
--hover-text-color: var(--ctp-text);
|
|
45
|
+
--header-hover-background-color: var(--ctp-surface1);
|
|
46
|
+
--header-hover-text-color: var(--ctp-text);
|
|
47
|
+
--disabled-background-color: var(--ctp-surface0);
|
|
48
|
+
--disabled-text-color: var(--ctp-overlay0);
|
|
49
|
+
|
|
50
|
+
--karma-good: var(--ctp-green);
|
|
51
|
+
--karma-bad: var(--ctp-red);
|
|
52
|
+
--karma-warning: var(--ctp-yellow);
|
|
53
|
+
--karma-severe: var(--ctp-maroon);
|
|
54
|
+
--karma-important: var(--ctp-peach);
|
|
55
|
+
--karma-note: var(--ctp-sapphire);
|
|
56
|
+
--karma-info: var(--ctp-surface1);
|
|
57
|
+
--karma-old: var(--ctp-overlay0);
|
|
58
|
+
|
|
59
|
+
--karma-good-fg: var(--ctp-green);
|
|
60
|
+
--karma-bad-fg: var(--ctp-red);
|
|
61
|
+
--karma-warning-fg: var(--ctp-yellow);
|
|
62
|
+
--karma-severe-fg: var(--ctp-maroon);
|
|
63
|
+
--karma-important-fg: var(--ctp-peach);
|
|
64
|
+
--karma-note-fg: var(--ctp-sapphire);
|
|
65
|
+
--karma-info-fg: var(--ctp-subtext0);
|
|
66
|
+
--karma-old-fg: var(--ctp-overlay1);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
body {
|
|
70
|
+
background-color: var(--ctp-base);
|
|
71
|
+
color: var(--ctp-text);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
header {
|
|
75
|
+
background-color: var(--ctp-crust);
|
|
76
|
+
border-bottom: 1px solid var(--ctp-surface0);
|
|
77
|
+
box-shadow: none;
|
|
78
|
+
color: var(--ctp-text);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
#sidebar-toggler-button,
|
|
82
|
+
#sidebar-toggler-button.neutral,
|
|
83
|
+
header .theme-toggle,
|
|
84
|
+
header .theme-toggle.neutral,
|
|
85
|
+
header .search-trigger,
|
|
86
|
+
header .search-trigger.neutral {
|
|
87
|
+
background-color: transparent;
|
|
88
|
+
border: 0;
|
|
89
|
+
color: var(--ctp-text);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
#sidebar-toggler-button:hover,
|
|
93
|
+
header .theme-toggle:hover,
|
|
94
|
+
header .search-trigger:hover,
|
|
95
|
+
header .user-info:hover {
|
|
96
|
+
background-color: var(--header-hover-background-color);
|
|
97
|
+
color: var(--header-hover-text-color);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
aside,
|
|
101
|
+
#sidebar {
|
|
102
|
+
background-color: var(--ctp-mantle);
|
|
103
|
+
color: var(--ctp-text);
|
|
104
|
+
border-color: var(--ctp-surface0);
|
|
105
|
+
/* Replace Femtocrank's light gray glow — it reads as a haze on Mocha */
|
|
106
|
+
box-shadow: 0.15em 0 0.6em rgba(17, 17, 27, 0.65);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
aside a,
|
|
110
|
+
aside a:visited {
|
|
111
|
+
color: var(--ctp-text);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
aside a:hover,
|
|
115
|
+
aside :is(ul, menu) li a:hover,
|
|
116
|
+
aside .nav-section-header:hover {
|
|
117
|
+
background-color: var(--ctp-surface0);
|
|
118
|
+
color: var(--ctp-text);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
section {
|
|
122
|
+
background-color: var(--ctp-mantle);
|
|
123
|
+
color: var(--ctp-text);
|
|
124
|
+
box-shadow: 0 0 0.5em var(--ctp-crust);
|
|
125
|
+
border-color: var(--ctp-surface0);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
section .section-header,
|
|
129
|
+
section .section-subheader {
|
|
130
|
+
background-color: var(--ctp-mantle);
|
|
131
|
+
border-bottom-color: var(--ctp-surface0);
|
|
132
|
+
color: var(--ctp-text);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
button,
|
|
136
|
+
.button {
|
|
137
|
+
background-color: var(--ctp-surface0);
|
|
138
|
+
border: 1px solid var(--ctp-surface1);
|
|
139
|
+
color: var(--ctp-text);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
button:hover,
|
|
143
|
+
.button:hover {
|
|
144
|
+
background-color: var(--ctp-surface1);
|
|
145
|
+
color: var(--ctp-text);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
button.good,
|
|
149
|
+
.button.good {
|
|
150
|
+
background-color: var(--ctp-green);
|
|
151
|
+
border-color: var(--ctp-green);
|
|
152
|
+
color: var(--ctp-crust);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
button.bad,
|
|
156
|
+
.button.bad {
|
|
157
|
+
background-color: var(--ctp-red);
|
|
158
|
+
border-color: var(--ctp-red);
|
|
159
|
+
color: var(--ctp-crust);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
button.warning,
|
|
163
|
+
.button.warning {
|
|
164
|
+
background-color: var(--ctp-yellow);
|
|
165
|
+
border-color: var(--ctp-yellow);
|
|
166
|
+
color: var(--ctp-crust);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
button.neutral,
|
|
170
|
+
.button.neutral {
|
|
171
|
+
background-color: var(--ctp-surface1);
|
|
172
|
+
border-color: var(--ctp-surface2);
|
|
173
|
+
color: var(--ctp-text);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
input,
|
|
177
|
+
select,
|
|
178
|
+
textarea {
|
|
179
|
+
background-color: var(--ctp-surface0);
|
|
180
|
+
border: 1px solid var(--ctp-surface1);
|
|
181
|
+
color: var(--ctp-text);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
a {
|
|
185
|
+
color: var(--ctp-blue);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
footer {
|
|
189
|
+
color: var(--ctp-subtext0);
|
|
190
|
+
border-top-color: var(--ctp-surface0);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
.subtle {
|
|
194
|
+
color: var(--ctp-subtext0);
|
|
195
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Dracula sample theme for PicoCrank / Femtocrank.
|
|
3
|
+
* Palette: https://draculatheme.com/ / https://spec.draculatheme.com/
|
|
4
|
+
*
|
|
5
|
+
* Asset URLs must be absolute, e.g.:
|
|
6
|
+
* background-image: url('/themes/dracula/background.png');
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
:root,
|
|
10
|
+
html {
|
|
11
|
+
color-scheme: dark;
|
|
12
|
+
|
|
13
|
+
--dracula-background: #282a36;
|
|
14
|
+
--dracula-current-line: #44475a;
|
|
15
|
+
--dracula-foreground: #f8f8f2;
|
|
16
|
+
--dracula-comment: #6272a4;
|
|
17
|
+
--dracula-cyan: #8be9fd;
|
|
18
|
+
--dracula-green: #50fa7b;
|
|
19
|
+
--dracula-orange: #ffb86c;
|
|
20
|
+
--dracula-pink: #ff79c6;
|
|
21
|
+
--dracula-purple: #bd93f9;
|
|
22
|
+
--dracula-red: #ff5555;
|
|
23
|
+
--dracula-yellow: #f1fa8c;
|
|
24
|
+
--dracula-selection: #44475a;
|
|
25
|
+
--dracula-ansi-black: #21222c;
|
|
26
|
+
|
|
27
|
+
--text-color: var(--dracula-foreground);
|
|
28
|
+
--border-color: var(--dracula-current-line);
|
|
29
|
+
--standout-bg-color: var(--dracula-ansi-black);
|
|
30
|
+
--hover-background-color: var(--dracula-selection);
|
|
31
|
+
--hover-text-color: var(--dracula-foreground);
|
|
32
|
+
--header-hover-background-color: var(--dracula-selection);
|
|
33
|
+
--header-hover-text-color: var(--dracula-foreground);
|
|
34
|
+
--disabled-background-color: var(--dracula-current-line);
|
|
35
|
+
--disabled-text-color: var(--dracula-comment);
|
|
36
|
+
|
|
37
|
+
--karma-good: var(--dracula-green);
|
|
38
|
+
--karma-bad: var(--dracula-red);
|
|
39
|
+
--karma-warning: var(--dracula-yellow);
|
|
40
|
+
--karma-severe: var(--dracula-orange);
|
|
41
|
+
--karma-important: var(--dracula-purple);
|
|
42
|
+
--karma-note: var(--dracula-cyan);
|
|
43
|
+
--karma-info: var(--dracula-current-line);
|
|
44
|
+
--karma-old: var(--dracula-comment);
|
|
45
|
+
|
|
46
|
+
--karma-good-fg: var(--dracula-green);
|
|
47
|
+
--karma-bad-fg: var(--dracula-red);
|
|
48
|
+
--karma-warning-fg: var(--dracula-yellow);
|
|
49
|
+
--karma-severe-fg: var(--dracula-orange);
|
|
50
|
+
--karma-important-fg: var(--dracula-purple);
|
|
51
|
+
--karma-note-fg: var(--dracula-cyan);
|
|
52
|
+
--karma-info-fg: var(--dracula-comment);
|
|
53
|
+
--karma-old-fg: var(--dracula-comment);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
body {
|
|
57
|
+
background-color: var(--dracula-background);
|
|
58
|
+
color: var(--dracula-foreground);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
header {
|
|
62
|
+
background-color: var(--dracula-ansi-black);
|
|
63
|
+
border-bottom: 1px solid var(--dracula-current-line);
|
|
64
|
+
box-shadow: none;
|
|
65
|
+
color: var(--dracula-foreground);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
#sidebar-toggler-button,
|
|
69
|
+
#sidebar-toggler-button.neutral,
|
|
70
|
+
header .theme-toggle,
|
|
71
|
+
header .theme-toggle.neutral,
|
|
72
|
+
header .search-trigger,
|
|
73
|
+
header .search-trigger.neutral {
|
|
74
|
+
background-color: transparent;
|
|
75
|
+
border: 0;
|
|
76
|
+
color: var(--dracula-foreground);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
#sidebar-toggler-button:hover,
|
|
80
|
+
header .theme-toggle:hover,
|
|
81
|
+
header .search-trigger:hover,
|
|
82
|
+
header .user-info:hover {
|
|
83
|
+
background-color: var(--header-hover-background-color);
|
|
84
|
+
color: var(--header-hover-text-color);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
aside,
|
|
88
|
+
#sidebar {
|
|
89
|
+
background-color: var(--dracula-ansi-black);
|
|
90
|
+
color: var(--dracula-foreground);
|
|
91
|
+
border-color: var(--dracula-current-line);
|
|
92
|
+
box-shadow: 0.15em 0 0.6em rgba(33, 34, 44, 0.85);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
aside a,
|
|
96
|
+
aside a:visited {
|
|
97
|
+
color: var(--dracula-foreground);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
aside a:hover,
|
|
101
|
+
aside :is(ul, menu) li a:hover,
|
|
102
|
+
aside .nav-section-header:hover {
|
|
103
|
+
background-color: var(--dracula-selection);
|
|
104
|
+
color: var(--dracula-foreground);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
section {
|
|
108
|
+
background-color: var(--dracula-ansi-black);
|
|
109
|
+
color: var(--dracula-foreground);
|
|
110
|
+
box-shadow: 0 0 0.5em rgba(33, 34, 44, 0.9);
|
|
111
|
+
border-color: var(--dracula-current-line);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
section .section-header,
|
|
115
|
+
section .section-subheader {
|
|
116
|
+
background-color: var(--dracula-ansi-black);
|
|
117
|
+
border-bottom-color: var(--dracula-current-line);
|
|
118
|
+
color: var(--dracula-foreground);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
button,
|
|
122
|
+
.button {
|
|
123
|
+
background-color: var(--dracula-current-line);
|
|
124
|
+
border: 1px solid var(--dracula-comment);
|
|
125
|
+
color: var(--dracula-foreground);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
button:hover,
|
|
129
|
+
.button:hover {
|
|
130
|
+
background-color: var(--dracula-selection);
|
|
131
|
+
color: var(--dracula-foreground);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
button.good,
|
|
135
|
+
.button.good {
|
|
136
|
+
background-color: var(--dracula-green);
|
|
137
|
+
border-color: var(--dracula-green);
|
|
138
|
+
color: var(--dracula-ansi-black);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
button.bad,
|
|
142
|
+
.button.bad {
|
|
143
|
+
background-color: var(--dracula-red);
|
|
144
|
+
border-color: var(--dracula-red);
|
|
145
|
+
color: var(--dracula-foreground);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
button.warning,
|
|
149
|
+
.button.warning {
|
|
150
|
+
background-color: var(--dracula-yellow);
|
|
151
|
+
border-color: var(--dracula-yellow);
|
|
152
|
+
color: var(--dracula-ansi-black);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
button.neutral,
|
|
156
|
+
.button.neutral {
|
|
157
|
+
background-color: var(--dracula-selection);
|
|
158
|
+
border-color: var(--dracula-comment);
|
|
159
|
+
color: var(--dracula-foreground);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
input,
|
|
163
|
+
select,
|
|
164
|
+
textarea {
|
|
165
|
+
background-color: var(--dracula-background);
|
|
166
|
+
border: 1px solid var(--dracula-current-line);
|
|
167
|
+
color: var(--dracula-foreground);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
a {
|
|
171
|
+
color: var(--dracula-pink);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
footer {
|
|
175
|
+
color: var(--dracula-comment);
|
|
176
|
+
border-top-color: var(--dracula-current-line);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.subtle {
|
|
180
|
+
color: var(--dracula-comment);
|
|
181
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Waffles — a playful accent sample theme for PicoCrank.
|
|
3
|
+
*
|
|
4
|
+
* Asset URLs must be absolute, e.g.:
|
|
5
|
+
* background-image: url('/themes/waffles/background.png');
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
:root,
|
|
9
|
+
html {
|
|
10
|
+
--waffle-cream: #fff8e7;
|
|
11
|
+
--waffle-batter: #f5e6c8;
|
|
12
|
+
--waffle-crust: #c4863b;
|
|
13
|
+
--waffle-syrup: #8b4513;
|
|
14
|
+
--waffle-butter: #ffd966;
|
|
15
|
+
--waffle-berry: #c23b5a;
|
|
16
|
+
|
|
17
|
+
--text-color: var(--waffle-syrup);
|
|
18
|
+
--border-color: #e0c896;
|
|
19
|
+
--standout-bg-color: var(--waffle-batter);
|
|
20
|
+
--hover-background-color: #f0d9a8;
|
|
21
|
+
--hover-text-color: var(--waffle-syrup);
|
|
22
|
+
--header-hover-background-color: var(--waffle-crust);
|
|
23
|
+
--header-hover-text-color: var(--waffle-cream);
|
|
24
|
+
--disabled-background-color: #efe4cb;
|
|
25
|
+
--disabled-text-color: #a88860;
|
|
26
|
+
|
|
27
|
+
--karma-good: #b8d98a;
|
|
28
|
+
--karma-bad: #f0a0a8;
|
|
29
|
+
--karma-warning: var(--waffle-butter);
|
|
30
|
+
--karma-severe: #e08a6a;
|
|
31
|
+
--karma-important: #ffe8a3;
|
|
32
|
+
--karma-note: #a8d4e8;
|
|
33
|
+
--karma-info: var(--waffle-batter);
|
|
34
|
+
--karma-old: #d4c4a0;
|
|
35
|
+
|
|
36
|
+
--karma-good-fg: #4a7a28;
|
|
37
|
+
--karma-bad-fg: var(--waffle-berry);
|
|
38
|
+
--karma-warning-fg: #9a6b00;
|
|
39
|
+
--karma-severe-fg: #a04020;
|
|
40
|
+
--karma-important-fg: #8a6800;
|
|
41
|
+
--karma-note-fg: #2a6a88;
|
|
42
|
+
--karma-info-fg: #7a6540;
|
|
43
|
+
--karma-old-fg: #6a5840;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
body {
|
|
47
|
+
background-color: var(--waffle-cream);
|
|
48
|
+
color: var(--waffle-syrup);
|
|
49
|
+
background-image:
|
|
50
|
+
repeating-linear-gradient(
|
|
51
|
+
0deg,
|
|
52
|
+
transparent,
|
|
53
|
+
transparent 11px,
|
|
54
|
+
rgba(196, 134, 59, 0.08) 11px,
|
|
55
|
+
rgba(196, 134, 59, 0.08) 12px
|
|
56
|
+
),
|
|
57
|
+
repeating-linear-gradient(
|
|
58
|
+
90deg,
|
|
59
|
+
transparent,
|
|
60
|
+
transparent 11px,
|
|
61
|
+
rgba(196, 134, 59, 0.08) 11px,
|
|
62
|
+
rgba(196, 134, 59, 0.08) 12px
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
header {
|
|
67
|
+
background: linear-gradient(180deg, var(--waffle-crust), #a86e2e);
|
|
68
|
+
border-bottom: 3px solid var(--waffle-syrup);
|
|
69
|
+
color: var(--waffle-cream);
|
|
70
|
+
box-shadow: 0 2px 8px rgba(139, 69, 19, 0.25);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
header a,
|
|
74
|
+
header button,
|
|
75
|
+
header .button {
|
|
76
|
+
color: var(--waffle-cream);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
#sidebar-toggler-button,
|
|
80
|
+
#sidebar-toggler-button.neutral,
|
|
81
|
+
header .theme-toggle,
|
|
82
|
+
header .theme-toggle.neutral,
|
|
83
|
+
header .search-trigger,
|
|
84
|
+
header .search-trigger.neutral {
|
|
85
|
+
background-color: transparent;
|
|
86
|
+
border: 0;
|
|
87
|
+
color: var(--waffle-cream);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
#sidebar-toggler-button:hover,
|
|
91
|
+
header .theme-toggle:hover,
|
|
92
|
+
header .search-trigger:hover,
|
|
93
|
+
header .user-info:hover {
|
|
94
|
+
background-color: var(--header-hover-background-color);
|
|
95
|
+
color: var(--header-hover-text-color);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
section {
|
|
99
|
+
background-color: #fffdf6;
|
|
100
|
+
border: 1px solid var(--border-color);
|
|
101
|
+
box-shadow: 0 2px 6px rgba(139, 69, 19, 0.12);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
section .section-header {
|
|
105
|
+
background-color: var(--waffle-batter);
|
|
106
|
+
border-bottom: 2px solid var(--waffle-crust);
|
|
107
|
+
color: var(--waffle-syrup);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
button,
|
|
111
|
+
.button {
|
|
112
|
+
border: 1px solid var(--waffle-crust);
|
|
113
|
+
background-color: var(--waffle-butter);
|
|
114
|
+
color: var(--waffle-syrup);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
button:hover,
|
|
118
|
+
.button:hover {
|
|
119
|
+
background-color: #ffe14d;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
button.good,
|
|
123
|
+
.button.good {
|
|
124
|
+
background-color: #9ccc65;
|
|
125
|
+
border-color: #6a9a38;
|
|
126
|
+
color: #2a4010;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
button.bad,
|
|
130
|
+
.button.bad {
|
|
131
|
+
background-color: var(--waffle-berry);
|
|
132
|
+
border-color: #8a2040;
|
|
133
|
+
color: #fff8e7;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
a {
|
|
137
|
+
color: #a05020;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
footer {
|
|
141
|
+
color: var(--waffle-syrup);
|
|
142
|
+
border-top: 1px dashed var(--border-color);
|
|
143
|
+
}
|
package/router.js
CHANGED
|
@@ -12,6 +12,8 @@ import { ClipboardCopyIcon } from '@hugeicons/core-free-icons';
|
|
|
12
12
|
import { CursorPointer01Icon } from '@hugeicons/core-free-icons';
|
|
13
13
|
import { LayoutGridIcon } from '@hugeicons/core-free-icons';
|
|
14
14
|
import { StatusIcon } from '@hugeicons/core-free-icons';
|
|
15
|
+
import { PaintBoardIcon } from '@hugeicons/core-free-icons';
|
|
16
|
+
import { UserIcon } from '@hugeicons/core-free-icons';
|
|
15
17
|
|
|
16
18
|
const routes = [
|
|
17
19
|
{
|
|
@@ -32,6 +34,24 @@ const routes = [
|
|
|
32
34
|
icon: LayoutGridIcon,
|
|
33
35
|
}
|
|
34
36
|
},
|
|
37
|
+
{
|
|
38
|
+
name: 'ThemePreview',
|
|
39
|
+
path: '/theme-preview',
|
|
40
|
+
component: () => import('./vue/views/ThemePreview.vue'),
|
|
41
|
+
meta: {
|
|
42
|
+
title: 'Theme Switcher',
|
|
43
|
+
icon: PaintBoardIcon,
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'UserDetails',
|
|
48
|
+
path: '/user',
|
|
49
|
+
component: () => import('./vue/views/UserDetails.vue'),
|
|
50
|
+
meta: {
|
|
51
|
+
title: 'User details',
|
|
52
|
+
icon: UserIcon,
|
|
53
|
+
}
|
|
54
|
+
},
|
|
35
55
|
{
|
|
36
56
|
name: 'TableExample',
|
|
37
57
|
path: '/table-example',
|
package/styles/dark-theme.css
CHANGED
|
@@ -158,12 +158,26 @@ html[data-theme="dark"] {
|
|
|
158
158
|
background-color: #555;
|
|
159
159
|
}
|
|
160
160
|
|
|
161
|
+
& .radio-group label:hover,
|
|
162
|
+
& .radio-group label:has(input:focus-visible) {
|
|
163
|
+
background-color: var(--hover-background-color);
|
|
164
|
+
color: white;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
& .multiple-checklist {
|
|
168
|
+
border-color: var(--border-color);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
& .multiple-checklist label {
|
|
172
|
+
background-color: #555;
|
|
173
|
+
}
|
|
174
|
+
|
|
161
175
|
& aside {
|
|
162
176
|
background-color: #000;
|
|
163
177
|
box-shadow: 0 0 .5em #121212;
|
|
164
178
|
}
|
|
165
179
|
|
|
166
|
-
& aside ul li a:hover {
|
|
180
|
+
& aside :is(ul, menu) li a:hover {
|
|
167
181
|
background-color: var(--hover-background-color);
|
|
168
182
|
}
|
|
169
183
|
|
package/styles.css
CHANGED
|
@@ -1,3 +1,19 @@
|
|
|
1
|
-
/*
|
|
2
|
-
@
|
|
1
|
+
/* Layer order: drop-in themes win over component and karma styles */
|
|
2
|
+
@layer components, karma, theme;
|
|
3
|
+
|
|
4
|
+
@import 'femtocrank/style.css' layer(components);
|
|
3
5
|
@import './styles/dark-theme.css';
|
|
6
|
+
|
|
7
|
+
/* Sidebar uses <menu> for nav items; mirror Femtocrank's aside ul rules. */
|
|
8
|
+
@layer components {
|
|
9
|
+
aside menu {
|
|
10
|
+
list-style: none;
|
|
11
|
+
padding: 0;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
aside menu li a {
|
|
15
|
+
text-decoration: none;
|
|
16
|
+
display: block;
|
|
17
|
+
padding: .4em .6em;
|
|
18
|
+
}
|
|
19
|
+
}
|