picocrank 1.21.5 → 1.22.1

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "picocrank",
3
- "version": "1.21.5",
3
+ "version": "1.22.1",
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.2",
21
+ "@hugeicons/core-free-icons": "^4.2.3",
22
22
  "@hugeicons/vue": "^1.0.7",
23
- "@vitejs/plugin-vue": "^6.0.7",
24
- "femtocrank": "^2.5.0",
23
+ "@vitejs/plugin-vue": "^6.0.8",
24
+ "femtocrank": "^2.5.1",
25
25
  "unplugin-vue-components": "^32.1.0",
26
- "vite": "^8.1.2",
27
- "vue": "^3.5.39",
28
- "vue-router": "^5.1.0"
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.5"
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,7 @@
1
+ {
2
+ "themes": [
3
+ "catppuccin",
4
+ "dracula",
5
+ "waffles"
6
+ ]
7
+ }
@@ -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',
@@ -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
- /* Import femtocrank styles */
2
- @import 'femtocrank/style.css';
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
+ }