picocrank 1.25.1 → 1.26.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.
Files changed (44) hide show
  1. package/eslint.config.js +68 -0
  2. package/package.json +13 -3
  3. package/router.js +74 -0
  4. package/styles/dark-theme.css +21 -9
  5. package/styles/picocrank-extensions.css +131 -2
  6. package/supplemental-themes/catppuccin-latte-frappe/theme.css +12 -22
  7. package/supplemental-themes/dracula-alucard/theme.css +12 -22
  8. package/supplemental-themes/gruvbox-dark-light/theme.css +12 -22
  9. package/supplemental-themes/waffles/theme.css +2 -12
  10. package/vue/components/Breadcrumbs.vue +192 -45
  11. package/vue/components/Calendar.vue +93 -180
  12. package/vue/components/DangerZone.vue +186 -0
  13. package/vue/components/Header.vue +22 -6
  14. package/vue/components/Login.vue +6 -7
  15. package/vue/components/NavigationGrid.vue +26 -204
  16. package/vue/components/NotificationBlock.vue +120 -0
  17. package/vue/components/NotificationPopup.vue +44 -41
  18. package/vue/components/QuickSearch.vue +21 -47
  19. package/vue/components/RadioGroup.vue +4 -4
  20. package/vue/components/ReadOnlyTextArea.vue +1 -1
  21. package/vue/components/SidebarNavLink.vue +3 -3
  22. package/vue/components/Table.vue +109 -81
  23. package/vue/components/TableColumnFilterPopover.vue +7 -17
  24. package/vue/components/TableColumnOptionsPopover.vue +22 -27
  25. package/vue/components/Tabs.vue +366 -82
  26. package/vue/components/TopBar.vue +2 -2
  27. package/vue/composables/tableColumnPriorities.js +33 -0
  28. package/vue/composables/tableFilters.js +1 -1
  29. package/vue/data/navSectionHubs.js +196 -0
  30. package/vue/data/routeBreadcrumbs.js +90 -0
  31. package/vue/examples/Admin.vue +12 -12
  32. package/vue/examples/App.vue +27 -36
  33. package/vue/examples/CalendarExample.vue +32 -22
  34. package/vue/examples/ExampleHeaderThemeSwitcher.vue +1 -1
  35. package/vue/examples/Login.vue +0 -3
  36. package/vue/examples/LoginExample.vue +2 -14
  37. package/vue/examples/NavSectionHub.vue +36 -0
  38. package/vue/examples/PageStructure.vue +6 -3
  39. package/vue/examples/StatusExample.vue +248 -129
  40. package/vue/examples/TableExample.vue +68 -67
  41. package/vue/examples/TabsExample.vue +200 -255
  42. package/vue/examples/ThemePreview.vue +21 -23
  43. package/vue/examples/ViewItem.vue +32 -5
  44. package/vue/examples/Welcome.vue +3 -112
@@ -0,0 +1,68 @@
1
+ import js from '@eslint/js'
2
+ import pluginVue from 'eslint-plugin-vue'
3
+ import globals from 'globals'
4
+ import tseslint from 'typescript-eslint'
5
+ import vueParser from 'vue-eslint-parser'
6
+
7
+ export default [
8
+ {
9
+ ignores: ['dist/**', 'node_modules/**'],
10
+ },
11
+ js.configs.recommended,
12
+ ...pluginVue.configs['flat/recommended'],
13
+ {
14
+ files: ['**/*.{js,vue}'],
15
+ languageOptions: {
16
+ ecmaVersion: 'latest',
17
+ sourceType: 'module',
18
+ globals: {
19
+ ...globals.browser,
20
+ ...globals.node,
21
+ },
22
+ },
23
+ rules: {
24
+ 'no-unused-vars': ['error', {
25
+ argsIgnorePattern: '^_',
26
+ caughtErrorsIgnorePattern: '^_',
27
+ varsIgnorePattern: '^_',
28
+ }],
29
+ 'vue/multi-word-component-names': 'off',
30
+ 'vue/no-v-html': 'off',
31
+ 'vue/html-indent': 'off',
32
+ 'vue/max-attributes-per-line': 'off',
33
+ 'vue/singleline-html-element-content-newline': 'off',
34
+ 'vue/html-self-closing': 'off',
35
+ 'vue/multiline-html-element-content-newline': 'off',
36
+ 'vue/first-attribute-linebreak': 'off',
37
+ 'vue/html-closing-bracket-newline': 'off',
38
+ 'vue/attributes-order': 'off',
39
+ 'vue/attribute-hyphenation': 'off',
40
+ 'vue/v-on-event-hyphenation': 'off',
41
+ 'vue/no-spaces-around-equal-signs-in-attribute': 'off',
42
+ 'vue/require-default-prop': 'off',
43
+ 'vue/block-order': 'off',
44
+ 'vue/v-slot-style': 'off',
45
+ 'vue/html-closing-bracket-spacing': 'off',
46
+ },
47
+ },
48
+ {
49
+ files: ['**/*.vue'],
50
+ languageOptions: {
51
+ parser: vueParser,
52
+ parserOptions: {
53
+ parser: {
54
+ js: 'espree',
55
+ ts: tseslint.parser,
56
+ },
57
+ sourceType: 'module',
58
+ extraFileExtensions: ['.vue'],
59
+ },
60
+ },
61
+ },
62
+ {
63
+ files: ['**/*.vue'],
64
+ rules: {
65
+ 'no-undef': 'off',
66
+ },
67
+ },
68
+ ]
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "picocrank",
3
- "version": "1.25.1",
3
+ "version": "1.26.0",
4
+ "type": "module",
4
5
  "description": "A set of zero dependency Vue components built on the Femtocrank global CSS theme.",
5
6
  "main": "vite.config.js",
6
7
  "scripts": {
@@ -8,6 +9,8 @@
8
9
  "build": "vite build --base './'",
9
10
  "build:minimal": "VITE_INCLUDE_SUPPLEMENTAL_THEMES=false vite build --base './'",
10
11
  "preview": "vite preview",
12
+ "lint": "eslint .",
13
+ "lint:fix": "eslint . --fix",
11
14
  "test": "echo \"Error: no test specified\" && exit 1"
12
15
  },
13
16
  "repository": {
@@ -23,14 +26,21 @@
23
26
  "@hugeicons/core-free-icons": "^4.3.0",
24
27
  "@hugeicons/vue": "^1.0.8",
25
28
  "@vitejs/plugin-vue": "^6.0.8",
26
- "femtocrank": "^2.6.1",
29
+ "femtocrank": "^2.7.0",
27
30
  "unplugin-vue-components": "^32.1.0",
28
31
  "vite": "^8.2.2",
29
32
  "vue": "^3.5.41",
30
33
  "vue-router": "^5.2.0"
31
34
  },
32
35
  "devDependencies": {
33
- "semantic-release": "^25.0.9"
36
+ "@eslint/js": "^10.0.1",
37
+ "eslint": "^10.9.1",
38
+ "eslint-plugin-vue": "^10.10.0",
39
+ "globals": "^17.11.0",
40
+ "semantic-release": "^25.0.9",
41
+ "typescript": "^6.0.3",
42
+ "typescript-eslint": "^8.68.0",
43
+ "vue-eslint-parser": "^10.4.1"
34
44
  },
35
45
  "homepage": "https://github.com/jamesread/picocrank#readme"
36
46
  }
package/router.js CHANGED
@@ -16,6 +16,13 @@ import { PaintBoardIcon } from '@hugeicons/core-free-icons';
16
16
  import { UserIcon } from '@hugeicons/core-free-icons';
17
17
  import { InformationCircleIcon } from '@hugeicons/core-free-icons';
18
18
 
19
+ import {
20
+ hubChildBreadcrumbs,
21
+ hubSectionBreadcrumbs,
22
+ standaloneBreadcrumbs,
23
+ viewItemBreadcrumbs,
24
+ } from './vue/data/routeBreadcrumbs.js';
25
+
19
26
  const routes = [
20
27
  {
21
28
  name: 'Welcome',
@@ -33,6 +40,7 @@ const routes = [
33
40
  meta: {
34
41
  title: 'Page structure',
35
42
  icon: LayoutGridIcon,
43
+ breadcrumbs: hubChildBreadcrumbs('NavLayoutsHub', 'PageStructure', 'Page structure'),
36
44
  }
37
45
  },
38
46
  {
@@ -42,6 +50,7 @@ const routes = [
42
50
  meta: {
43
51
  title: 'Theme Switcher',
44
52
  icon: PaintBoardIcon,
53
+ breadcrumbs: hubChildBreadcrumbs('NavLayoutsHub', 'ThemePreview', 'Theme Switcher'),
45
54
  }
46
55
  },
47
56
  {
@@ -51,6 +60,7 @@ const routes = [
51
60
  meta: {
52
61
  title: 'User details',
53
62
  icon: UserIcon,
63
+ breadcrumbs: standaloneBreadcrumbs('UserDetails', 'User details'),
54
64
  }
55
65
  },
56
66
  {
@@ -61,6 +71,7 @@ const routes = [
61
71
  meta: {
62
72
  title: 'Table',
63
73
  icon: TableIcon,
74
+ breadcrumbs: hubChildBreadcrumbs('NavDataDisplayHub', 'TableExample', 'Table'),
64
75
  }
65
76
  },
66
77
  {
@@ -70,6 +81,7 @@ const routes = [
70
81
  meta: {
71
82
  title: 'Remote table',
72
83
  icon: TableIcon,
84
+ breadcrumbs: hubChildBreadcrumbs('NavDataDisplayHub', 'TableRemoteExample', 'Remote table'),
73
85
  }
74
86
  },
75
87
  {
@@ -80,6 +92,7 @@ const routes = [
80
92
  meta: {
81
93
  title: 'View item',
82
94
  icon: ViewIcon,
95
+ breadcrumbs: viewItemBreadcrumbs,
83
96
  }
84
97
  },
85
98
  {
@@ -89,6 +102,7 @@ const routes = [
89
102
  meta: {
90
103
  title: 'Admin',
91
104
  icon: SecurityValidationIcon,
105
+ breadcrumbs: hubChildBreadcrumbs('NavLayoutsHub', 'Admin', 'Admin'),
92
106
  }
93
107
  },
94
108
  {
@@ -99,6 +113,7 @@ const routes = [
99
113
  meta: {
100
114
  title: 'Calendar',
101
115
  icon: CalendarIcon,
116
+ breadcrumbs: hubChildBreadcrumbs('NavDataDisplayHub', 'CalendarExample', 'Calendar'),
102
117
  }
103
118
  },
104
119
  {
@@ -108,6 +123,7 @@ const routes = [
108
123
  meta: {
109
124
  title: 'Login',
110
125
  icon: SecurityValidationIcon,
126
+ breadcrumbs: standaloneBreadcrumbs('Login', 'Login'),
111
127
  }
112
128
  },
113
129
  {
@@ -117,6 +133,7 @@ const routes = [
117
133
  meta: {
118
134
  title: 'Buttons',
119
135
  icon: CursorPointer01Icon,
136
+ breadcrumbs: hubChildBreadcrumbs('NavFormsInputHub', 'ButtonsExample', 'Buttons'),
120
137
  }
121
138
  },
122
139
  {
@@ -126,6 +143,7 @@ const routes = [
126
143
  meta: {
127
144
  title: 'Forms',
128
145
  icon: EditIcon,
146
+ breadcrumbs: hubChildBreadcrumbs('NavFormsInputHub', 'FormExample', 'Forms'),
129
147
  }
130
148
  },
131
149
  {
@@ -135,6 +153,7 @@ const routes = [
135
153
  meta: {
136
154
  title: 'Read-only output',
137
155
  icon: ClipboardCopyIcon,
156
+ breadcrumbs: hubChildBreadcrumbs('NavDataDisplayHub', 'ReadOnlyTextAreaExample', 'Read-only output'),
138
157
  }
139
158
  },
140
159
  {
@@ -144,6 +163,7 @@ const routes = [
144
163
  meta: {
145
164
  title: 'Status & notifications',
146
165
  icon: StatusIcon,
166
+ breadcrumbs: hubChildBreadcrumbs('NavFeedbackStatusHub', 'StatusExample', 'Status & notifications'),
147
167
  }
148
168
  },
149
169
  {
@@ -153,6 +173,7 @@ const routes = [
153
173
  meta: {
154
174
  title: 'Dialog',
155
175
  icon: InformationCircleIcon,
176
+ breadcrumbs: hubChildBreadcrumbs('NavFeedbackStatusHub', 'DialogExample', 'Dialog'),
156
177
  }
157
178
  },
158
179
  {
@@ -162,6 +183,7 @@ const routes = [
162
183
  meta: {
163
184
  title: 'Tabs',
164
185
  icon: Menu01Icon,
186
+ breadcrumbs: hubChildBreadcrumbs('NavLayoutsHub', 'TabsExample', 'Tabs'),
165
187
  }
166
188
  },
167
189
  {
@@ -171,6 +193,57 @@ const routes = [
171
193
  meta: {
172
194
  title: 'Navigation Grid',
173
195
  icon: Navigation01Icon,
196
+ breadcrumbs: hubChildBreadcrumbs('NavLayoutsHub', 'NavigationGridExample', 'Navigation Grid'),
197
+ }
198
+ },
199
+ {
200
+ name: 'NavLayoutsHub',
201
+ path: '/nav/layouts',
202
+ component: () => import('./vue/examples/NavSectionHub.vue'),
203
+ meta: {
204
+ title: 'Layouts',
205
+ icon: LayoutGridIcon,
206
+ breadcrumbs: hubSectionBreadcrumbs('NavLayoutsHub'),
207
+ }
208
+ },
209
+ {
210
+ name: 'NavDataDisplayHub',
211
+ path: '/nav/data-display',
212
+ component: () => import('./vue/examples/NavSectionHub.vue'),
213
+ meta: {
214
+ title: 'Data display',
215
+ icon: TableIcon,
216
+ breadcrumbs: hubSectionBreadcrumbs('NavDataDisplayHub'),
217
+ }
218
+ },
219
+ {
220
+ name: 'NavFormsInputHub',
221
+ path: '/nav/forms-input',
222
+ component: () => import('./vue/examples/NavSectionHub.vue'),
223
+ meta: {
224
+ title: 'Forms & input',
225
+ icon: EditIcon,
226
+ breadcrumbs: hubSectionBreadcrumbs('NavFormsInputHub'),
227
+ }
228
+ },
229
+ {
230
+ name: 'NavFeedbackStatusHub',
231
+ path: '/nav/feedback-status',
232
+ component: () => import('./vue/examples/NavSectionHub.vue'),
233
+ meta: {
234
+ title: 'Feedback & status',
235
+ icon: StatusIcon,
236
+ breadcrumbs: hubSectionBreadcrumbs('NavFeedbackStatusHub'),
237
+ }
238
+ },
239
+ {
240
+ name: 'NavPatternsHub',
241
+ path: '/nav/patterns',
242
+ component: () => import('./vue/examples/NavSectionHub.vue'),
243
+ meta: {
244
+ title: 'Patterns',
245
+ icon: CursorPointer01Icon,
246
+ breadcrumbs: hubSectionBreadcrumbs('NavPatternsHub'),
174
247
  }
175
248
  },
176
249
  {
@@ -180,6 +253,7 @@ const routes = [
180
253
  meta: {
181
254
  title: 'Login',
182
255
  icon: SecurityValidationIcon,
256
+ breadcrumbs: hubChildBreadcrumbs('NavFormsInputHub', 'LoginExample', 'Login'),
183
257
  }
184
258
  }
185
259
  ];
@@ -4,9 +4,9 @@ html[data-theme="dark"] {
4
4
  color-scheme: dark;
5
5
 
6
6
  --body-bg-color: #262626;
7
- --surface-bg-color: #343434;
7
+ --section-bg-color: #343434;
8
8
  --standout-bg-color: #1f1f1f;
9
- --section-header-bg-color: var(--surface-bg-color);
9
+ --section-header-bg-color: var(--section-bg-color);
10
10
 
11
11
  --header-bg-color: #000;
12
12
  --header-border-color: #222;
@@ -18,16 +18,18 @@ html[data-theme="dark"] {
18
18
  --sidebar-hover-bg-color: var(--hover-background-color);
19
19
 
20
20
  --footer-chip-bg-color: #444;
21
+ --footer-link-color: lightblue;
21
22
 
22
23
  --text-color: #ddd;
24
+ --muted-text-color: color-mix(in srgb, var(--text-color) 87%, #121619);
23
25
  --link-color: lightblue;
24
26
  --annotation-key-color: #aaa;
25
27
  --focus-outline-color: #fff;
26
28
 
27
29
  --border-color: #595959;
28
- --shadow-color: #121212;
30
+ --shadow-color: color-mix(in srgb, var(--body-bg-color) 48%, #121619);
29
31
 
30
- --hover-background-color: #1d345c;
32
+ --hover-background-color: color-mix(in srgb, var(--header-hover-background-color) 45%, var(--section-bg-color));
31
33
  --hover-text-color: var(--on-accent-fg);
32
34
 
33
35
  --disabled-background-color: #333;
@@ -35,23 +37,33 @@ html[data-theme="dark"] {
35
37
 
36
38
  --input-bg-color: #4e4e4e;
37
39
  --input-fg-color: var(--text-color);
38
- --control-option-bg-color: #555;
40
+ --control-option-bg-color: var(--section-bg-color);
39
41
  --control-hover-bg-color: var(--hover-background-color);
42
+ --control-checked-bg: color-mix(in srgb, #8fb59a 45%, var(--section-bg-color));
43
+ --control-checked-hover-bg: color-mix(in srgb, #8fb59a 55%, var(--section-bg-color));
44
+ --control-checked-fg: var(--text-color);
40
45
 
41
46
  --menu-item-hover-background-color: var(--hover-background-color);
42
- --menu-dropdown-background-color: var(--surface-bg-color);
43
- --menu-dropdown-shadow: 0 0 .5em var(--shadow-color);
47
+ --menu-dropdown-background-color: var(--section-bg-color);
48
+ --menu-dropdown-shadow: 0 .4em 1.1em color-mix(in srgb, black 55%, transparent), 0 0 0 1px var(--menu-dropdown-border-color);
44
49
  --menu-dropdown-link-hover-background-color: var(--hover-background-color);
45
50
  --header-menu-dropdown-link-hover-background-color: var(--header-hover-background-color);
46
51
 
47
- --table-sticky-bg: var(--surface-bg-color);
52
+ --table-sticky-bg: var(--section-bg-color);
48
53
  --table-row-hover-bg: var(--hover-background-color);
49
54
  --table-row-hover-fg: var(--on-accent-fg);
50
55
  --table-sticky-hover-bg: var(--table-row-hover-bg);
51
- --table-uneditable-bg: #555;
56
+ --table-uneditable-bg: color-mix(in srgb, var(--header-hover-background-color) 18%, var(--section-bg-color));
52
57
  --table-sticky-uneditable-bg: var(--table-uneditable-bg);
53
58
 
54
59
  --progress-track-bg-color: var(--table-uneditable-bg);
60
+ --progress-fill-bg-color: #8fb59a;
61
+
62
+ --karma-info-tint: color-mix(in srgb, var(--karma-info) 30%, var(--standout-bg-color));
63
+ --karma-info-wash: color-mix(in srgb, var(--karma-info) 22%, var(--standout-bg-color));
64
+
65
+ --karma-warning: #ffeb3b;
66
+ --karma-warning-tint: color-mix(in srgb, var(--karma-warning) 30%, var(--standout-bg-color));
55
67
  }
56
68
 
57
69
  html[data-theme="light"] {
@@ -5,11 +5,140 @@
5
5
  --table-header-active-fg: var(--link-color);
6
6
  --table-header-active-bg: var(--hover-background-color);
7
7
  --tab-fg: var(--muted-text-color);
8
- --tab-active-fg: var(--link-color);
9
- --tab-focus-outline-color: var(--tab-active-fg);
8
+ --tab-active-fg: var(--control-checked-fg);
9
+ --tab-active-bg: var(--control-checked-bg);
10
+ --tab-active-hover-bg: var(--control-checked-hover-bg);
11
+
12
+ --hover-background-color: color-mix(in srgb, var(--body-bg-color) 45%, var(--section-bg-color));
13
+ --control-hover-bg-color: var(--hover-background-color);
14
+ --sidebar-hover-bg-color: var(--hover-background-color);
15
+
16
+ --quick-search-dialog-bg: var(--standout-bg-color);
17
+ --quick-search-dialog-fg: var(--text-color);
18
+ --quick-search-backdrop: var(--backdrop-color);
19
+ --quick-search-input-bg: var(--input-bg-color);
20
+ --quick-search-input-fg: var(--input-fg-color);
21
+ --quick-search-border: var(--border-color);
22
+ --quick-search-muted-fg: var(--muted-text-color);
23
+ --quick-search-subtle-fg: var(--annotation-key-color);
24
+ --quick-search-focus-outline: var(--focus-outline-color);
25
+ --quick-search-highlight-bg: var(--karma-warning-tint);
26
+ --quick-search-hover-bg: var(--hover-background-color);
27
+ --quick-search-hover-fg: var(--hover-text-color);
28
+
29
+ --radio-group-focus-outline: var(--focus-outline-color);
30
+ --radio-group-checked-hover-bg: var(--control-checked-hover-bg);
31
+ --radio-group-checked-hover-fg: var(--control-checked-fg);
32
+
33
+ --login-input-focus-outline: var(--focus-outline-color);
34
+ --login-error-bg: var(--karma-bad);
35
+ --login-error-fg: var(--karma-on-bg-fg);
36
+ --login-muted-fg: var(--muted-text-color);
37
+
38
+ --table-muted-fg: var(--muted-text-color);
39
+
40
+ --table-popover-bg: var(--section-bg-color);
41
+ --table-popover-border: var(--border-color);
42
+ --table-popover-shadow: 0 8px 24px color-mix(in srgb, var(--shadow-color) 60%, transparent);
43
+ --table-popover-muted-fg: var(--muted-text-color);
44
+ --table-popover-fg: var(--text-color);
45
+ --table-popover-item-bg: var(--standout-bg-color);
46
+ --table-popover-item-drag-border: var(--text-color);
47
+ --table-popover-divider: var(--border-color);
48
+ --table-popover-error-fg: var(--karma-bad);
49
+ --table-popover-success-fg: var(--karma-good);
50
+
51
+ --tab-border: var(--border-color);
52
+ --tab-hover-fg: var(--text-color);
53
+ --tab-hover-bg: var(--hover-background-color);
54
+
55
+ --calendar-chrome-bg: var(--standout-bg-color);
56
+ --calendar-surface-bg: var(--section-bg-color);
57
+ --calendar-border: var(--border-color);
58
+ --calendar-error-fg: var(--karma-bad);
59
+ --calendar-loading-overlay-bg: color-mix(in srgb, var(--calendar-surface-bg) 60%, transparent);
60
+ --calendar-day-fg: var(--text-color);
61
+ --calendar-muted-fg: var(--muted-text-color);
62
+ --calendar-accent-fg: var(--link-color);
63
+ --calendar-day-hover-bg: color-mix(in srgb, var(--link-color) 8%, var(--calendar-surface-bg));
64
+ --calendar-day-muted-bg: var(--standout-bg-color);
65
+ --calendar-day-muted-hover-bg: var(--table-uneditable-bg);
66
+ --calendar-today-bg: var(--karma-warning-tint);
67
+ --calendar-today-hover-bg: var(--karma-note-tint);
68
+ --calendar-range-accent: var(--link-color);
69
+ --calendar-range-bg-strong: color-mix(in srgb, var(--link-color) 22%, transparent);
70
+ --calendar-range-bg: color-mix(in srgb, var(--link-color) 14%, transparent);
71
+ --calendar-range-bg-subtle: color-mix(in srgb, var(--link-color) 10%, transparent);
72
+ --calendar-event-bg: var(--karma-good);
73
+ --calendar-event-border: color-mix(in srgb, var(--karma-on-bg-fg) 35%, var(--karma-good));
74
+ --calendar-event-hover-bg: color-mix(in srgb, var(--karma-good) 80%, var(--karma-on-bg-fg));
75
+ --calendar-event-title-fg: var(--text-color);
76
+ --calendar-event-shadow: 0 1px 2px color-mix(in srgb, var(--shadow-color) 50%, transparent);
77
+ --calendar-event-hover-shadow: 0 2px 4px color-mix(in srgb, var(--shadow-color) 60%, transparent);
78
+ --calendar-more-bg: var(--standout-bg-color);
79
+ --calendar-event-custom-border-mix: var(--karma-on-bg-fg);
80
+
81
+ --danger-zone-border: color-mix(in srgb, var(--karma-bad) 35%, var(--border-color));
82
+ --danger-zone-bg: var(--standout-bg-color);
83
+ --danger-zone-summary-hover-bg: var(--karma-bad-tint);
84
+ --danger-zone-warning-fg: var(--muted-text-color);
85
+ --danger-zone-focus-outline: var(--karma-bad-border);
10
86
  }
11
87
 
12
88
  table thead th {
13
89
  color: var(--table-header-fg);
14
90
  }
91
+
92
+ /* Flex children default to min-width: auto, which lets wide tables expand the page. */
93
+ #content,
94
+ #content main,
95
+ section .section-content {
96
+ min-width: 0;
97
+ }
98
+
99
+ /* Femtocrank 2.7 compacts section toolbars; keep pre-upgrade default button padding. */
100
+ section .section-header [role="toolbar"] button,
101
+ section .section-header [role="toolbar"] .button {
102
+ padding-top: .4em;
103
+ padding-bottom: .4em;
104
+ padding-left: 1em;
105
+ padding-right: 1em;
106
+ min-width: 0;
107
+ line-height: normal;
108
+ }
109
+ }
110
+
111
+ /*
112
+ * Responsive column priorities: classes col-priority-1 … col-priority-5 on th/td only
113
+ * take effect inside a .responsive-cols wrapper via container queries (not standalone
114
+ * class rules). Mirrored here (outside @layer) so they win the cascade and are easy to find.
115
+ * See also node_modules/femtocrank/style.css (.responsive-cols / @container responsive-cols).
116
+ */
117
+ .responsive-cols {
118
+ container-type: inline-size;
119
+ container-name: responsive-cols;
120
+ display: block;
121
+ width: 100%;
122
+ min-width: 0;
123
+ max-width: 100%;
124
+ }
125
+
126
+ @container responsive-cols (max-width: 38rem) {
127
+ :is(th, td).col-priority-1 { display: none; }
128
+ }
129
+
130
+ @container responsive-cols (max-width: 34rem) {
131
+ :is(th, td).col-priority-2 { display: none; }
132
+ }
133
+
134
+ @container responsive-cols (max-width: 30rem) {
135
+ :is(th, td).col-priority-3 { display: none; }
136
+ }
137
+
138
+ @container responsive-cols (max-width: 26rem) {
139
+ :is(th, td).col-priority-4 { display: none; }
140
+ }
141
+
142
+ @container responsive-cols (max-width: 22rem) {
143
+ :is(th, td).col-priority-5 { display: none; }
15
144
  }
@@ -41,7 +41,7 @@ html[data-theme="dark"] {
41
41
  --ctp-good-fg: var(--ctp-crust);
42
42
 
43
43
  --body-bg-color: var(--ctp-base);
44
- --surface-bg-color: var(--ctp-mantle);
44
+ --section-bg-color: var(--ctp-mantle);
45
45
  --standout-bg-color: var(--ctp-mantle);
46
46
  --section-header-bg-color: var(--ctp-mantle);
47
47
  --shadow-color: var(--ctp-shadow-strong);
@@ -71,7 +71,10 @@ html[data-theme="dark"] {
71
71
  --input-bg-color: var(--ctp-surface0);
72
72
  --input-fg-color: var(--ctp-text);
73
73
  --control-option-bg-color: var(--ctp-surface0);
74
- --control-hover-bg-color: var(--ctp-surface0);
74
+ --control-hover-bg-color: var(--ctp-surface1);
75
+ --control-checked-bg: color-mix(in srgb, var(--ctp-green) 28%, var(--standout-bg-color));
76
+ --control-checked-hover-bg: color-mix(in srgb, var(--ctp-green) 36%, var(--standout-bg-color));
77
+ --control-checked-fg: var(--ctp-text);
75
78
  --menu-hover-bg-color: var(--ctp-surface0);
76
79
 
77
80
  --table-row-hover-bg: var(--ctp-surface0);
@@ -94,19 +97,11 @@ html[data-theme="dark"] {
94
97
  --karma-bad: var(--ctp-red);
95
98
  --karma-warning: var(--ctp-yellow);
96
99
  --karma-severe: var(--ctp-maroon);
97
- --karma-important: var(--ctp-peach);
98
100
  --karma-note: var(--ctp-sapphire);
99
101
  --karma-info: var(--ctp-surface1);
100
102
  --karma-old: var(--ctp-overlay0);
101
103
 
102
- --karma-good-fg: var(--ctp-green);
103
- --karma-bad-fg: var(--ctp-red);
104
- --karma-warning-fg: var(--ctp-yellow);
105
- --karma-severe-fg: var(--ctp-maroon);
106
- --karma-important-fg: var(--ctp-peach);
107
- --karma-note-fg: var(--ctp-sapphire);
108
- --karma-info-fg: var(--ctp-subtext0);
109
- --karma-old-fg: var(--ctp-overlay1);
104
+ --karma-on-bg-fg: var(--ctp-good-fg);
110
105
  }
111
106
 
112
107
  html[data-theme="light"] {
@@ -142,7 +137,7 @@ html[data-theme="light"] {
142
137
  --ctp-good-fg: var(--ctp-base);
143
138
 
144
139
  --body-bg-color: var(--ctp-base);
145
- --surface-bg-color: var(--ctp-mantle);
140
+ --section-bg-color: var(--ctp-mantle);
146
141
  --standout-bg-color: var(--ctp-mantle);
147
142
  --section-header-bg-color: var(--ctp-mantle);
148
143
  --shadow-color: var(--ctp-shadow-strong);
@@ -172,7 +167,10 @@ html[data-theme="light"] {
172
167
  --input-bg-color: var(--ctp-surface0);
173
168
  --input-fg-color: var(--ctp-text);
174
169
  --control-option-bg-color: var(--ctp-surface0);
175
- --control-hover-bg-color: var(--ctp-surface0);
170
+ --control-hover-bg-color: var(--ctp-surface1);
171
+ --control-checked-bg: color-mix(in srgb, var(--ctp-green) 20%, var(--standout-bg-color));
172
+ --control-checked-hover-bg: color-mix(in srgb, var(--ctp-green) 28%, var(--standout-bg-color));
173
+ --control-checked-fg: var(--ctp-text);
176
174
  --menu-hover-bg-color: var(--ctp-surface0);
177
175
 
178
176
  --table-row-hover-bg: var(--ctp-surface0);
@@ -195,17 +193,9 @@ html[data-theme="light"] {
195
193
  --karma-bad: var(--ctp-red);
196
194
  --karma-warning: var(--ctp-yellow);
197
195
  --karma-severe: var(--ctp-maroon);
198
- --karma-important: var(--ctp-peach);
199
196
  --karma-note: var(--ctp-sapphire);
200
197
  --karma-info: var(--ctp-surface1);
201
198
  --karma-old: var(--ctp-overlay0);
202
199
 
203
- --karma-good-fg: var(--ctp-green);
204
- --karma-bad-fg: var(--ctp-red);
205
- --karma-warning-fg: var(--ctp-yellow);
206
- --karma-severe-fg: var(--ctp-maroon);
207
- --karma-important-fg: var(--ctp-peach);
208
- --karma-note-fg: var(--ctp-sapphire);
209
- --karma-info-fg: var(--ctp-subtext0);
210
- --karma-old-fg: var(--ctp-overlay1);
200
+ --karma-on-bg-fg: var(--ctp-good-fg);
211
201
  }
@@ -32,7 +32,7 @@ html[data-theme="dark"] {
32
32
  --dt-warning-fg: var(--dt-surface);
33
33
 
34
34
  --body-bg-color: var(--dt-background);
35
- --surface-bg-color: var(--dt-surface);
35
+ --section-bg-color: var(--dt-surface);
36
36
  --standout-bg-color: var(--dt-surface);
37
37
  --section-header-bg-color: var(--dt-surface);
38
38
  --shadow-color: var(--dt-shadow-strong);
@@ -61,8 +61,11 @@ html[data-theme="dark"] {
61
61
 
62
62
  --input-bg-color: var(--dt-background);
63
63
  --input-fg-color: var(--dt-foreground);
64
- --control-option-bg-color: var(--dt-overlay);
65
- --control-hover-bg-color: var(--dt-selection);
64
+ --control-option-bg-color: var(--dt-background);
65
+ --control-hover-bg-color: var(--dt-overlay);
66
+ --control-checked-bg: color-mix(in srgb, var(--dt-green) 35%, var(--standout-bg-color));
67
+ --control-checked-hover-bg: color-mix(in srgb, var(--dt-green) 45%, var(--standout-bg-color));
68
+ --control-checked-fg: var(--dt-foreground);
66
69
  --menu-hover-bg-color: var(--dt-selection);
67
70
 
68
71
  --table-row-hover-bg: var(--dt-selection);
@@ -85,19 +88,11 @@ html[data-theme="dark"] {
85
88
  --karma-bad: var(--dt-red);
86
89
  --karma-warning: var(--dt-yellow);
87
90
  --karma-severe: var(--dt-orange);
88
- --karma-important: var(--dt-purple);
89
91
  --karma-note: var(--dt-cyan);
90
92
  --karma-info: var(--dt-overlay);
91
93
  --karma-old: var(--dt-muted);
92
94
 
93
- --karma-good-fg: var(--dt-green);
94
- --karma-bad-fg: var(--dt-red);
95
- --karma-warning-fg: var(--dt-yellow);
96
- --karma-severe-fg: var(--dt-orange);
97
- --karma-important-fg: var(--dt-purple);
98
- --karma-note-fg: var(--dt-cyan);
99
- --karma-info-fg: var(--dt-muted);
100
- --karma-old-fg: var(--dt-muted);
95
+ --karma-on-bg-fg: var(--dt-good-fg);
101
96
  }
102
97
 
103
98
  html[data-theme="light"] {
@@ -124,7 +119,7 @@ html[data-theme="light"] {
124
119
  --dt-warning-fg: var(--dt-background);
125
120
 
126
121
  --body-bg-color: var(--dt-background);
127
- --surface-bg-color: var(--dt-surface);
122
+ --section-bg-color: var(--dt-surface);
128
123
  --standout-bg-color: var(--dt-surface);
129
124
  --section-header-bg-color: var(--dt-surface);
130
125
  --shadow-color: var(--dt-shadow-strong);
@@ -155,6 +150,9 @@ html[data-theme="light"] {
155
150
  --input-fg-color: var(--dt-foreground);
156
151
  --control-option-bg-color: var(--dt-overlay);
157
152
  --control-hover-bg-color: var(--dt-selection);
153
+ --control-checked-bg: color-mix(in srgb, var(--dt-green) 20%, var(--standout-bg-color));
154
+ --control-checked-hover-bg: color-mix(in srgb, var(--dt-green) 28%, var(--standout-bg-color));
155
+ --control-checked-fg: var(--dt-foreground);
158
156
  --menu-hover-bg-color: var(--dt-selection);
159
157
 
160
158
  --table-row-hover-bg: var(--dt-selection);
@@ -177,17 +175,9 @@ html[data-theme="light"] {
177
175
  --karma-bad: var(--dt-red);
178
176
  --karma-warning: var(--dt-yellow);
179
177
  --karma-severe: var(--dt-orange);
180
- --karma-important: var(--dt-purple);
181
178
  --karma-note: var(--dt-cyan);
182
179
  --karma-info: var(--dt-overlay);
183
180
  --karma-old: var(--dt-muted);
184
181
 
185
- --karma-good-fg: var(--dt-green);
186
- --karma-bad-fg: var(--dt-red);
187
- --karma-warning-fg: var(--dt-yellow);
188
- --karma-severe-fg: var(--dt-orange);
189
- --karma-important-fg: var(--dt-purple);
190
- --karma-note-fg: var(--dt-cyan);
191
- --karma-info-fg: var(--dt-muted);
192
- --karma-old-fg: var(--dt-muted);
182
+ --karma-on-bg-fg: var(--dt-good-fg);
193
183
  }