@birdycom/omniaui 0.11.0 → 0.11.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/LICENSE +21 -21
- package/README.md +21 -21
- package/bin/lib/add.mjs +126 -126
- package/bin/lib/catalog.mjs +169 -169
- package/bin/lib/project.mjs +90 -90
- package/bin/omniaui.mjs +69 -69
- package/dist/code-block.css +25 -25
- package/dist/components-extra.css +916 -914
- package/dist/components.css +6559 -6469
- package/dist/components.min.css +1 -1
- package/dist/data-table.d.ts +9 -9
- package/dist/data-table.js +505 -505
- package/dist/docs-ui.css +267 -265
- package/dist/oc-theme.css +69 -69
- package/dist/parts/app-accordion-accent.css +60 -60
- package/dist/parts/app-alpha-tabs.css +68 -68
- package/dist/parts/app-busy-overlay.css +25 -25
- package/dist/parts/app-column-menu.css +85 -85
- package/dist/parts/app-confirm-dialog.css +70 -70
- package/dist/parts/app-cookie-consent.css +63 -63
- package/dist/parts/app-data-table.css +174 -174
- package/dist/parts/app-greeting.css +47 -47
- package/dist/parts/app-list-toolbar.css +81 -81
- package/dist/parts/app-page-header.css +54 -54
- package/dist/parts/app-severity-card.css +91 -91
- package/dist/parts/app-sidebar-dark.css +15 -15
- package/dist/parts/app-sortable-row.css +52 -52
- package/dist/parts/app-stat-card.css +68 -68
- package/dist/parts/app-table-actions.css +71 -71
- package/dist/parts/app-table-compact.css +54 -54
- package/dist/parts/app-top-progress.css +68 -68
- package/dist/parts/app-tree.css +104 -104
- package/dist/parts/app-upgrade-banner.css +90 -90
- package/dist/parts/app-version-banner.css +80 -80
- package/dist/parts/data-chart-line.css +167 -167
- package/dist/parts/forms-affix-input.css +75 -75
- package/dist/parts/forms-barcode-input.css +75 -75
- package/dist/parts/forms-chip-filter.css +91 -91
- package/dist/parts/forms-color-select.css +97 -89
- package/dist/parts/forms-decimal-input.css +51 -51
- package/dist/parts/forms-filter-counts.css +94 -94
- package/dist/parts/forms-language-select.css +89 -76
- package/dist/parts/forms-number-input.css +98 -95
- package/dist/parts/forms-password-requirements.css +55 -55
- package/dist/parts/forms-phone-input.css +85 -85
- package/dist/parts/forms-time-input.css +74 -74
- package/dist/parts/forms-toggle-field.css +69 -69
- package/dist/parts/media-art.css +21 -21
- package/dist/parts/media-attachment.css +160 -160
- package/dist/parts/media-browser-frame.css +73 -73
- package/dist/parts/media-card.css +83 -83
- package/dist/parts/media-chat-composer.css +90 -90
- package/dist/parts/media-doc-viewer.css +151 -151
- package/dist/parts/media-emoji-picker.css +88 -88
- package/dist/parts/media-entity-card.css +52 -52
- package/dist/parts/media-flip-card.css +78 -78
- package/dist/parts/media-image-zoom.css +68 -68
- package/dist/parts/media-lightbox.css +131 -131
- package/dist/parts/media-message-thread.css +136 -136
- package/dist/parts/media-message.css +160 -160
- package/dist/parts/media-row.css +78 -78
- package/dist/parts/media-stack-card.css +82 -82
- package/dist/parts/media-terminal-log.css +76 -76
- package/dist/parts/media-thumb.css +71 -71
- package/dist/parts/site-fact-list.css +25 -25
- package/dist/parts/site-link-arrow.css +34 -34
- package/dist/parts/site-marquee.css +34 -34
- package/dist/parts/site-next-teaser.css +75 -75
- package/dist/parts/site-price-card.css +91 -75
- package/dist/parts/site-product-mark.css +66 -66
- package/dist/parts/site-project-card.css +111 -111
- package/dist/parts/site-prose.css +124 -124
- package/dist/parts/site-stack-list.css +48 -48
- package/dist/parts/site-timeline.css +54 -54
- package/dist/showcase.css +404 -404
- package/package.json +69 -69
- package/snippets/accordion-accent.html +24 -24
- package/snippets/accordion.html +11 -11
- package/snippets/affix-input.html +30 -30
- package/snippets/alert-dialog.html +22 -22
- package/snippets/alert.html +5 -5
- package/snippets/alpha-tabs.html +37 -37
- package/snippets/aspect-ratio.html +15 -15
- package/snippets/attachment.html +43 -43
- package/snippets/avatar.html +6 -6
- package/snippets/back-link.html +5 -5
- package/snippets/badge.html +5 -5
- package/snippets/barcode-input.html +18 -18
- package/snippets/breadcrumb.html +6 -6
- package/snippets/browser-frame.html +18 -18
- package/snippets/busy-overlay.html +31 -31
- package/snippets/button-group.html +21 -21
- package/snippets/button.html +8 -8
- package/snippets/calendar.html +43 -43
- package/snippets/card.html +17 -17
- package/snippets/carousel.html +21 -21
- package/snippets/chart-line.html +46 -46
- package/snippets/chart.html +27 -27
- package/snippets/chat-composer.html +21 -21
- package/snippets/checkbox.html +5 -5
- package/snippets/checklist.html +23 -23
- package/snippets/chip-filter.html +14 -14
- package/snippets/code-window.html +20 -20
- package/snippets/collapsible.html +19 -19
- package/snippets/color-field.html +13 -13
- package/snippets/color-select.html +18 -18
- package/snippets/column-menu.html +38 -38
- package/snippets/combobox.html +19 -19
- package/snippets/command.html +24 -24
- package/snippets/confirm-dialog.html +32 -32
- package/snippets/context-menu.html +25 -25
- package/snippets/cookie-consent.html +70 -70
- package/snippets/copy-field.html +19 -19
- package/snippets/counter.html +2 -2
- package/snippets/data-table.html +151 -151
- package/snippets/date-picker.html +32 -32
- package/snippets/decimal-input.html +20 -20
- package/snippets/definition-list.html +20 -20
- package/snippets/demo-panel.html +18 -18
- package/snippets/doc-viewer.html +58 -58
- package/snippets/drawer.html +30 -30
- package/snippets/dropdown-menu.html +27 -27
- package/snippets/dropdown.html +9 -9
- package/snippets/dropzone.html +13 -13
- package/snippets/emoji-picker.html +51 -51
- package/snippets/empty-state.html +17 -17
- package/snippets/entity-card.html +26 -26
- package/snippets/expandable-table.html +26 -26
- package/snippets/fact-list.html +14 -14
- package/snippets/filter-counts.html +30 -30
- package/snippets/flip-card.html +22 -22
- package/snippets/form-field.html +6 -6
- package/snippets/greeting.html +22 -22
- package/snippets/heading.html +14 -14
- package/snippets/hover-card.html +18 -18
- package/snippets/image-zoom.html +30 -30
- package/snippets/input-group.html +10 -10
- package/snippets/input.html +5 -5
- package/snippets/item.html +26 -26
- package/snippets/kbd.html +13 -13
- package/snippets/label.html +9 -9
- package/snippets/language-select.html +26 -26
- package/snippets/launcher-card.html +14 -14
- package/snippets/lightbox.html +50 -50
- package/snippets/link-arrow.html +10 -10
- package/snippets/list-toolbar.html +33 -33
- package/snippets/marquee.html +15 -15
- package/snippets/media-card.html +28 -28
- package/snippets/media-row.html +21 -21
- package/snippets/media-thumb.html +12 -12
- package/snippets/menubar.html +30 -30
- package/snippets/message-thread.html +123 -123
- package/snippets/message.html +51 -51
- package/snippets/modal.html +15 -15
- package/snippets/native-select.html +15 -15
- package/snippets/navmenu.html +23 -23
- package/snippets/next-teaser.html +15 -15
- package/snippets/number-input.html +27 -27
- package/snippets/otp-input.html +9 -9
- package/snippets/page-header.html +24 -24
- package/snippets/pagination.html +6 -6
- package/snippets/password-input.html +24 -24
- package/snippets/password-requirements.html +30 -30
- package/snippets/phone-input.html +22 -22
- package/snippets/popover.html +15 -15
- package/snippets/price-card.html +34 -34
- package/snippets/product-mark.html +13 -13
- package/snippets/progress.html +4 -4
- package/snippets/project-card.html +23 -23
- package/snippets/prose.html +54 -54
- package/snippets/radio.html +17 -17
- package/snippets/recovery-codes.html +20 -20
- package/snippets/resizable.html +16 -16
- package/snippets/scroll-area.html +20 -20
- package/snippets/search.html +8 -8
- package/snippets/segmented.html +11 -11
- package/snippets/select.html +7 -7
- package/snippets/separator.html +15 -15
- package/snippets/severity-card.html +35 -35
- package/snippets/sheet.html +32 -32
- package/snippets/sidebar-docs.html +24 -24
- package/snippets/sidebar.html +55 -55
- package/snippets/site-footer.html +6 -6
- package/snippets/site-header.html +26 -26
- package/snippets/skeleton.html +4 -4
- package/snippets/slider.html +17 -17
- package/snippets/sortable-row.html +31 -31
- package/snippets/spinner.html +14 -14
- package/snippets/stack-card.html +17 -17
- package/snippets/stack-list.html +16 -16
- package/snippets/stat-card.html +24 -24
- package/snippets/stepper.html +13 -13
- package/snippets/switch.html +6 -6
- package/snippets/table-actions.html +39 -39
- package/snippets/table-compact.html +24 -24
- package/snippets/table.html +29 -29
- package/snippets/tabs.html +9 -9
- package/snippets/tag-input.html +60 -17
- package/snippets/terminal-log.html +23 -23
- package/snippets/textarea.html +3 -3
- package/snippets/theme-switch.html +6 -6
- package/snippets/time-input.html +26 -26
- package/snippets/timeline.html +28 -28
- package/snippets/toast-stack.html +10 -10
- package/snippets/toast.html +36 -36
- package/snippets/toc.html +13 -13
- package/snippets/toggle-field.html +20 -20
- package/snippets/toggle.html +22 -22
- package/snippets/tooltip.html +4 -4
- package/snippets/top-progress.html +12 -12
- package/snippets/tree.html +38 -38
- package/snippets/upgrade-banner.html +28 -28
- package/snippets/user.html +15 -15
- package/snippets/version-banner.html +15 -15
package/dist/oc-theme.css
CHANGED
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
/* File: oc-theme.css — generated from tokens/semantic.json by @birdycom/omniacss 0.11.
|
|
2
|
-
/* Semantic theme tokens: every color is light-dark() of an Omnia palette token (oc-colors.css). */
|
|
3
|
-
/* Same source as the desktop export: npx omniacss tokens --format json|dtcg|python */
|
|
4
|
-
:root {
|
|
5
|
-
color-scheme: light dark;
|
|
6
|
-
|
|
7
|
-
/* Brand */
|
|
8
|
-
--oc-brand-1: light-dark(var(--color-teal-80), var(--color-skycyan-60));
|
|
9
|
-
--oc-brand-2: light-dark(var(--color-blue-40), var(--color-blue-10));
|
|
10
|
-
--oc-brand-3: light-dark(var(--color-purple-40), var(--color-purple-10));
|
|
11
|
-
|
|
12
|
-
/* Core surfaces */
|
|
13
|
-
--oc-background: light-dark(var(--color-frostblue-2), var(--color-shallowblue-95));
|
|
14
|
-
--oc-foreground: light-dark(var(--color-duskblue-60), var(--color-frostblue-10));
|
|
15
|
-
--oc-muted: light-dark(var(--color-frostblue-60), var(--color-shallowblue-50));
|
|
16
|
-
--oc-muted-foreground: light-dark(var(--color-stormblue-40), var(--color-mistblue-70));
|
|
17
|
-
--oc-card: light-dark(var(--color-white-50), var(--color-shallowblue-70));
|
|
18
|
-
--oc-popover: light-dark(var(--color-white-50), var(--color-shallowblue-60));
|
|
19
|
-
--oc-popover-foreground: var(--oc-foreground);
|
|
20
|
-
--oc-surface: light-dark(oklch(from var(--color-stormblue-50) l c h / 0.04), oklch(from var(--color-white-50) l c h / 0.04));
|
|
21
|
-
--oc-surface-strong: light-dark(oklch(from var(--color-stormblue-50) l c h / 0.08), oklch(from var(--color-white-50) l c h / 0.07));
|
|
22
|
-
|
|
23
|
-
/* Semantic accents */
|
|
24
|
-
--oc-primary: light-dark(var(--color-vividblue-95), var(--color-vividblue-100));
|
|
25
|
-
--oc-primary-foreground: light-dark(var(--color-white-50), var(--color-shallowblue-95));
|
|
26
|
-
--oc-secondary: var(--oc-muted);
|
|
27
|
-
--oc-secondary-foreground: var(--oc-foreground);
|
|
28
|
-
--oc-accent: var(--oc-muted);
|
|
29
|
-
--oc-accent-foreground: var(--oc-foreground);
|
|
30
|
-
--oc-destructive: light-dark(var(--color-red-70), var(--color-red-50));
|
|
31
|
-
--oc-destructive-foreground: var(--color-white-50);
|
|
32
|
-
--oc-success: light-dark(var(--color-green-60), var(--color-green-2));
|
|
33
|
-
--oc-success-foreground: light-dark(var(--color-white-50), var(--color-shallowblue-95));
|
|
34
|
-
--oc-warning: light-dark(var(--color-orange-95), var(--color-orange-50));
|
|
35
|
-
--oc-warning-foreground: light-dark(var(--color-white-50), var(--color-shallowblue-95));
|
|
36
|
-
|
|
37
|
-
/* Borders and inputs */
|
|
38
|
-
--oc-border: light-dark(var(--color-frostblue-80), var(--color-duskblue-30));
|
|
39
|
-
--oc-border-strong: light-dark(var(--color-mistblue-80), var(--color-stormblue-30));
|
|
40
|
-
--oc-input: var(--oc-border);
|
|
41
|
-
--oc-ring: var(--oc-primary);
|
|
42
|
-
|
|
43
|
-
/* Interaction states */
|
|
44
|
-
--oc-row-alt: light-dark(var(--color-frostblue-2), var(--color-shallowblue-100));
|
|
45
|
-
--oc-hover: light-dark(var(--color-frostblue-100), var(--color-duskblue-50));
|
|
46
|
-
--oc-pressed: light-dark(var(--color-frostblue-60), var(--color-duskblue-40));
|
|
47
|
-
--oc-selected: light-dark(var(--color-mistblue-2), var(--color-stormblue-60));
|
|
48
|
-
--oc-selected-foreground: var(--oc-foreground);
|
|
49
|
-
--oc-disabled-foreground: light-dark(var(--color-duskblue-2), var(--color-duskblue-10));
|
|
50
|
-
|
|
51
|
-
/* Gradients */
|
|
52
|
-
--oc-gradient-brand: linear-gradient(100deg, var(--oc-brand-1), var(--oc-brand-2) 50%, var(--oc-brand-3));
|
|
53
|
-
|
|
54
|
-
/* Shape, focus, motion, fonts */
|
|
55
|
-
--oc-radius: 0.5rem;
|
|
56
|
-
--oc-focus-width: 2px;
|
|
57
|
-
--oc-transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
58
|
-
--oc-transition-normal: 200ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
59
|
-
--oc-font-sans: system-ui, -apple-system, "Segoe UI", Roboto, Cantarell, "Helvetica Neue", sans-serif;
|
|
60
|
-
--oc-font-mono: "Cascadia Code", "JetBrains Mono", Consolas, ui-monospace, monospace;
|
|
61
|
-
|
|
62
|
-
/* Shadows (x y blur spread; color + alpha per mode in --oc-shadow-<name>-color) */
|
|
63
|
-
--oc-shadow-sm-color: light-dark(oklch(from var(--color-stormblue-50) l c h / 0.08), oklch(from var(--color-black-50) l c h / 0.4));
|
|
64
|
-
--oc-shadow-sm: 0px 1px 2px 0px var(--oc-shadow-sm-color);
|
|
65
|
-
--oc-shadow-md-color: light-dark(oklch(from var(--color-stormblue-50) l c h / 0.12), oklch(from var(--color-black-50) l c h / 0.5));
|
|
66
|
-
--oc-shadow-md: 0px 4px 12px -2px var(--oc-shadow-md-color);
|
|
67
|
-
--oc-shadow-lg-color: light-dark(oklch(from var(--color-stormblue-50) l c h / 0.16), oklch(from var(--color-black-50) l c h / 0.6));
|
|
68
|
-
--oc-shadow-lg: 0px 12px 32px -6px var(--oc-shadow-lg-color);
|
|
69
|
-
}
|
|
1
|
+
/* File: oc-theme.css — generated from tokens/semantic.json by @birdycom/omniacss 0.11.1. Do not edit. */
|
|
2
|
+
/* Semantic theme tokens: every color is light-dark() of an Omnia palette token (oc-colors.css). */
|
|
3
|
+
/* Same source as the desktop export: npx omniacss tokens --format json|dtcg|python */
|
|
4
|
+
:root {
|
|
5
|
+
color-scheme: light dark;
|
|
6
|
+
|
|
7
|
+
/* Brand */
|
|
8
|
+
--oc-brand-1: light-dark(var(--color-teal-80), var(--color-skycyan-60));
|
|
9
|
+
--oc-brand-2: light-dark(var(--color-blue-40), var(--color-blue-10));
|
|
10
|
+
--oc-brand-3: light-dark(var(--color-purple-40), var(--color-purple-10));
|
|
11
|
+
|
|
12
|
+
/* Core surfaces */
|
|
13
|
+
--oc-background: light-dark(var(--color-frostblue-2), var(--color-shallowblue-95));
|
|
14
|
+
--oc-foreground: light-dark(var(--color-duskblue-60), var(--color-frostblue-10));
|
|
15
|
+
--oc-muted: light-dark(var(--color-frostblue-60), var(--color-shallowblue-50));
|
|
16
|
+
--oc-muted-foreground: light-dark(var(--color-stormblue-40), var(--color-mistblue-70));
|
|
17
|
+
--oc-card: light-dark(var(--color-white-50), var(--color-shallowblue-70));
|
|
18
|
+
--oc-popover: light-dark(var(--color-white-50), var(--color-shallowblue-60));
|
|
19
|
+
--oc-popover-foreground: var(--oc-foreground);
|
|
20
|
+
--oc-surface: light-dark(oklch(from var(--color-stormblue-50) l c h / 0.04), oklch(from var(--color-white-50) l c h / 0.04));
|
|
21
|
+
--oc-surface-strong: light-dark(oklch(from var(--color-stormblue-50) l c h / 0.08), oklch(from var(--color-white-50) l c h / 0.07));
|
|
22
|
+
|
|
23
|
+
/* Semantic accents */
|
|
24
|
+
--oc-primary: light-dark(var(--color-vividblue-95), var(--color-vividblue-100));
|
|
25
|
+
--oc-primary-foreground: light-dark(var(--color-white-50), var(--color-shallowblue-95));
|
|
26
|
+
--oc-secondary: var(--oc-muted);
|
|
27
|
+
--oc-secondary-foreground: var(--oc-foreground);
|
|
28
|
+
--oc-accent: var(--oc-muted);
|
|
29
|
+
--oc-accent-foreground: var(--oc-foreground);
|
|
30
|
+
--oc-destructive: light-dark(var(--color-red-70), var(--color-red-50));
|
|
31
|
+
--oc-destructive-foreground: var(--color-white-50);
|
|
32
|
+
--oc-success: light-dark(var(--color-green-60), var(--color-green-2));
|
|
33
|
+
--oc-success-foreground: light-dark(var(--color-white-50), var(--color-shallowblue-95));
|
|
34
|
+
--oc-warning: light-dark(var(--color-orange-95), var(--color-orange-50));
|
|
35
|
+
--oc-warning-foreground: light-dark(var(--color-white-50), var(--color-shallowblue-95));
|
|
36
|
+
|
|
37
|
+
/* Borders and inputs */
|
|
38
|
+
--oc-border: light-dark(var(--color-frostblue-80), var(--color-duskblue-30));
|
|
39
|
+
--oc-border-strong: light-dark(var(--color-mistblue-80), var(--color-stormblue-30));
|
|
40
|
+
--oc-input: var(--oc-border);
|
|
41
|
+
--oc-ring: var(--oc-primary);
|
|
42
|
+
|
|
43
|
+
/* Interaction states */
|
|
44
|
+
--oc-row-alt: light-dark(var(--color-frostblue-2), var(--color-shallowblue-100));
|
|
45
|
+
--oc-hover: light-dark(var(--color-frostblue-100), var(--color-duskblue-50));
|
|
46
|
+
--oc-pressed: light-dark(var(--color-frostblue-60), var(--color-duskblue-40));
|
|
47
|
+
--oc-selected: light-dark(var(--color-mistblue-2), var(--color-stormblue-60));
|
|
48
|
+
--oc-selected-foreground: var(--oc-foreground);
|
|
49
|
+
--oc-disabled-foreground: light-dark(var(--color-duskblue-2), var(--color-duskblue-10));
|
|
50
|
+
|
|
51
|
+
/* Gradients */
|
|
52
|
+
--oc-gradient-brand: linear-gradient(100deg, var(--oc-brand-1), var(--oc-brand-2) 50%, var(--oc-brand-3));
|
|
53
|
+
|
|
54
|
+
/* Shape, focus, motion, fonts */
|
|
55
|
+
--oc-radius: 0.5rem;
|
|
56
|
+
--oc-focus-width: 2px;
|
|
57
|
+
--oc-transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
58
|
+
--oc-transition-normal: 200ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
59
|
+
--oc-font-sans: system-ui, -apple-system, "Segoe UI", Roboto, Cantarell, "Helvetica Neue", sans-serif;
|
|
60
|
+
--oc-font-mono: "Cascadia Code", "JetBrains Mono", Consolas, ui-monospace, monospace;
|
|
61
|
+
|
|
62
|
+
/* Shadows (x y blur spread; color + alpha per mode in --oc-shadow-<name>-color) */
|
|
63
|
+
--oc-shadow-sm-color: light-dark(oklch(from var(--color-stormblue-50) l c h / 0.08), oklch(from var(--color-black-50) l c h / 0.4));
|
|
64
|
+
--oc-shadow-sm: 0px 1px 2px 0px var(--oc-shadow-sm-color);
|
|
65
|
+
--oc-shadow-md-color: light-dark(oklch(from var(--color-stormblue-50) l c h / 0.12), oklch(from var(--color-black-50) l c h / 0.5));
|
|
66
|
+
--oc-shadow-md: 0px 4px 12px -2px var(--oc-shadow-md-color);
|
|
67
|
+
--oc-shadow-lg-color: light-dark(oklch(from var(--color-stormblue-50) l c h / 0.16), oklch(from var(--color-black-50) l c h / 0.6));
|
|
68
|
+
--oc-shadow-lg: 0px 12px 32px -6px var(--oc-shadow-lg-color);
|
|
69
|
+
}
|
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
/* File: packages/ui/src/parts/app-accordion-accent.css | Map: accent accordion (separate cards) -> item card + left accent -> trigger -> open state -> color modifiers (presets) -> flush combination */
|
|
2
|
-
/* Accordion accent: every item becomes its own card with a colored accent on the start edge.
|
|
3
|
-
Add .oc-accordion--accent to an .oc-accordion. The color comes from --oc-accordion-accent:
|
|
4
|
-
primary by default, or an existing .oc-accent--* preset (blue, cyan, green, orange, red, violet, yellow)
|
|
5
|
-
on the accordion (all items) or on a single .oc-accordion-item. Works with <details> and the JS hooks. */
|
|
6
|
-
|
|
7
|
-
.oc-accordion--accent {
|
|
8
|
-
--oc-accordion-accent: var(--oc-accent-from, var(--oc-primary));
|
|
9
|
-
display: grid;
|
|
10
|
-
gap: 0.5rem;
|
|
11
|
-
overflow: visible;
|
|
12
|
-
border: 0;
|
|
13
|
-
border-radius: 0;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/* Each item is a card; the accent is a 3px start border in the item color. */
|
|
17
|
-
.oc-accordion--accent .oc-accordion-item {
|
|
18
|
-
--oc-accordion-accent: var(--oc-accent-from, var(--oc-primary));
|
|
19
|
-
overflow: hidden;
|
|
20
|
-
background: var(--oc-card);
|
|
21
|
-
border: 1px solid var(--oc-border);
|
|
22
|
-
border-inline-start: 3px solid var(--oc-accordion-accent);
|
|
23
|
-
border-radius: var(--oc-radius);
|
|
24
|
-
transition: border-color var(--oc-transition-fast), box-shadow var(--oc-transition-fast);
|
|
25
|
-
}
|
|
26
|
-
/* The base accordion draws a line between items; cards do not need it. */
|
|
27
|
-
.oc-accordion--accent .oc-accordion-item + .oc-accordion-item { border-top: 1px solid var(--oc-border); }
|
|
28
|
-
|
|
29
|
-
/* Trigger: a bit tighter, title in the foreground color. */
|
|
30
|
-
.oc-accordion--accent .oc-accordion-trigger { padding: 0.75rem 1rem; font-weight: 600; }
|
|
31
|
-
.oc-accordion--accent .oc-accordion-trigger:hover { background: oklch(from var(--oc-accordion-accent) l c h / 0.06); }
|
|
32
|
-
|
|
33
|
-
/* Open item: tinted head, soft shadow and an accent-colored frame. */
|
|
34
|
-
.oc-accordion--accent :is(details.oc-accordion-item[open], .oc-accordion-item.is-open, .oc-accordion-item[aria-expanded="true"]) {
|
|
35
|
-
border-color: oklch(from var(--oc-accordion-accent) l c h / 0.35);
|
|
36
|
-
border-inline-start-color: var(--oc-accordion-accent);
|
|
37
|
-
box-shadow: 0 4px 14px oklch(from var(--color-black-60) l c h / 0.06);
|
|
38
|
-
}
|
|
39
|
-
.oc-accordion--accent :is(details.oc-accordion-item[open], .oc-accordion-item.is-open, .oc-accordion-item[aria-expanded="true"]) > .oc-accordion-trigger {
|
|
40
|
-
background: oklch(from var(--oc-accordion-accent) l c h / 0.08);
|
|
41
|
-
}
|
|
42
|
-
.oc-accordion--accent .oc-accordion-content { padding: 0.75rem 1rem 1rem; color: var(--oc-foreground); }
|
|
43
|
-
|
|
44
|
-
/* Optional short label at the end of the trigger ("3 items"), in the accent color. */
|
|
45
|
-
.oc-accordion-accent-meta { margin-inline: auto 0.75rem; font-size: 0.75rem; font-weight: 500; color: var(--oc-accordion-accent); }
|
|
46
|
-
|
|
47
|
-
/* Semantic colors (theme tokens), as an alternative to the .oc-accent--* presets. */
|
|
48
|
-
.oc-accordion--accent .oc-accordion-item--success,
|
|
49
|
-
.oc-accordion--accent.oc-accordion--success .oc-accordion-item { --oc-accordion-accent: var(--oc-success); }
|
|
50
|
-
.oc-accordion--accent .oc-accordion-item--warning,
|
|
51
|
-
.oc-accordion--accent.oc-accordion--warning .oc-accordion-item { --oc-accordion-accent: var(--oc-warning); }
|
|
52
|
-
.oc-accordion--accent .oc-accordion-item--danger,
|
|
53
|
-
.oc-accordion--accent.oc-accordion--danger .oc-accordion-item { --oc-accordion-accent: var(--oc-destructive); }
|
|
54
|
-
|
|
55
|
-
/* Accent + flush: no frame around each card except the accent edge. */
|
|
56
|
-
.oc-accordion--accent.oc-accordion--flush .oc-accordion-item { border-block: 0; border-inline-end: 0; border-radius: 0; }
|
|
57
|
-
|
|
58
|
-
@media (prefers-reduced-motion: reduce) {
|
|
59
|
-
.oc-accordion--accent .oc-accordion-item { transition: none; }
|
|
60
|
-
}
|
|
1
|
+
/* File: packages/ui/src/parts/app-accordion-accent.css | Map: accent accordion (separate cards) -> item card + left accent -> trigger -> open state -> color modifiers (presets) -> flush combination */
|
|
2
|
+
/* Accordion accent: every item becomes its own card with a colored accent on the start edge.
|
|
3
|
+
Add .oc-accordion--accent to an .oc-accordion. The color comes from --oc-accordion-accent:
|
|
4
|
+
primary by default, or an existing .oc-accent--* preset (blue, cyan, green, orange, red, violet, yellow)
|
|
5
|
+
on the accordion (all items) or on a single .oc-accordion-item. Works with <details> and the JS hooks. */
|
|
6
|
+
|
|
7
|
+
.oc-accordion--accent {
|
|
8
|
+
--oc-accordion-accent: var(--oc-accent-from, var(--oc-primary));
|
|
9
|
+
display: grid;
|
|
10
|
+
gap: 0.5rem;
|
|
11
|
+
overflow: visible;
|
|
12
|
+
border: 0;
|
|
13
|
+
border-radius: 0;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/* Each item is a card; the accent is a 3px start border in the item color. */
|
|
17
|
+
.oc-accordion--accent .oc-accordion-item {
|
|
18
|
+
--oc-accordion-accent: var(--oc-accent-from, var(--oc-primary));
|
|
19
|
+
overflow: hidden;
|
|
20
|
+
background: var(--oc-card);
|
|
21
|
+
border: 1px solid var(--oc-border);
|
|
22
|
+
border-inline-start: 3px solid var(--oc-accordion-accent);
|
|
23
|
+
border-radius: var(--oc-radius);
|
|
24
|
+
transition: border-color var(--oc-transition-fast), box-shadow var(--oc-transition-fast);
|
|
25
|
+
}
|
|
26
|
+
/* The base accordion draws a line between items; cards do not need it. */
|
|
27
|
+
.oc-accordion--accent .oc-accordion-item + .oc-accordion-item { border-top: 1px solid var(--oc-border); }
|
|
28
|
+
|
|
29
|
+
/* Trigger: a bit tighter, title in the foreground color. */
|
|
30
|
+
.oc-accordion--accent .oc-accordion-trigger { padding: 0.75rem 1rem; font-weight: 600; }
|
|
31
|
+
.oc-accordion--accent .oc-accordion-trigger:hover { background: oklch(from var(--oc-accordion-accent) l c h / 0.06); }
|
|
32
|
+
|
|
33
|
+
/* Open item: tinted head, soft shadow and an accent-colored frame. */
|
|
34
|
+
.oc-accordion--accent :is(details.oc-accordion-item[open], .oc-accordion-item.is-open, .oc-accordion-item[aria-expanded="true"]) {
|
|
35
|
+
border-color: oklch(from var(--oc-accordion-accent) l c h / 0.35);
|
|
36
|
+
border-inline-start-color: var(--oc-accordion-accent);
|
|
37
|
+
box-shadow: 0 4px 14px oklch(from var(--color-black-60) l c h / 0.06);
|
|
38
|
+
}
|
|
39
|
+
.oc-accordion--accent :is(details.oc-accordion-item[open], .oc-accordion-item.is-open, .oc-accordion-item[aria-expanded="true"]) > .oc-accordion-trigger {
|
|
40
|
+
background: oklch(from var(--oc-accordion-accent) l c h / 0.08);
|
|
41
|
+
}
|
|
42
|
+
.oc-accordion--accent .oc-accordion-content { padding: 0.75rem 1rem 1rem; color: var(--oc-foreground); }
|
|
43
|
+
|
|
44
|
+
/* Optional short label at the end of the trigger ("3 items"), in the accent color. */
|
|
45
|
+
.oc-accordion-accent-meta { margin-inline: auto 0.75rem; font-size: 0.75rem; font-weight: 500; color: var(--oc-accordion-accent); }
|
|
46
|
+
|
|
47
|
+
/* Semantic colors (theme tokens), as an alternative to the .oc-accent--* presets. */
|
|
48
|
+
.oc-accordion--accent .oc-accordion-item--success,
|
|
49
|
+
.oc-accordion--accent.oc-accordion--success .oc-accordion-item { --oc-accordion-accent: var(--oc-success); }
|
|
50
|
+
.oc-accordion--accent .oc-accordion-item--warning,
|
|
51
|
+
.oc-accordion--accent.oc-accordion--warning .oc-accordion-item { --oc-accordion-accent: var(--oc-warning); }
|
|
52
|
+
.oc-accordion--accent .oc-accordion-item--danger,
|
|
53
|
+
.oc-accordion--accent.oc-accordion--danger .oc-accordion-item { --oc-accordion-accent: var(--oc-destructive); }
|
|
54
|
+
|
|
55
|
+
/* Accent + flush: no frame around each card except the accent edge. */
|
|
56
|
+
.oc-accordion--accent.oc-accordion--flush .oc-accordion-item { border-block: 0; border-inline-end: 0; border-radius: 0; }
|
|
57
|
+
|
|
58
|
+
@media (prefers-reduced-motion: reduce) {
|
|
59
|
+
.oc-accordion--accent .oc-accordion-item { transition: none; }
|
|
60
|
+
}
|
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
/* File: packages/ui/src/parts/app-alpha-tabs.css | Map: bar (scrolling row) -> item -> "All" item -> states (current, empty) -> wrap + size modifiers -> reduced motion */
|
|
2
|
-
/* Alpha tabs: "All" + A-Z filter bar for long lists (dictionary, contacts).
|
|
3
|
-
Each letter is a link (?letter=A) or a button. Current letter: aria-current="true" (or .is-active).
|
|
4
|
-
Letters without entries: aria-disabled="true". The row scrolls sideways on small screens. */
|
|
5
|
-
|
|
6
|
-
.oc-alpha-tabs {
|
|
7
|
-
display: flex;
|
|
8
|
-
flex-wrap: nowrap;
|
|
9
|
-
gap: 2px;
|
|
10
|
-
inline-size: 100%;
|
|
11
|
-
padding: 0.25rem;
|
|
12
|
-
overflow-x: auto;
|
|
13
|
-
overscroll-behavior-x: contain;
|
|
14
|
-
scroll-snap-type: x proximity;
|
|
15
|
-
scrollbar-width: thin;
|
|
16
|
-
background: var(--oc-muted);
|
|
17
|
-
border: 1px solid var(--oc-border);
|
|
18
|
-
border-radius: var(--oc-radius);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/* One letter. Square-ish, fixed width, centered text. */
|
|
22
|
-
.oc-alpha-tabs-item {
|
|
23
|
-
flex: 0 0 auto;
|
|
24
|
-
display: inline-grid;
|
|
25
|
-
place-items: center;
|
|
26
|
-
min-inline-size: 1.875rem;
|
|
27
|
-
block-size: 1.875rem;
|
|
28
|
-
padding-inline: 0.375rem;
|
|
29
|
-
font: inherit;
|
|
30
|
-
font-size: 0.8125rem;
|
|
31
|
-
font-weight: 500;
|
|
32
|
-
line-height: 1;
|
|
33
|
-
color: var(--oc-muted-foreground);
|
|
34
|
-
text-decoration: none;
|
|
35
|
-
background: none;
|
|
36
|
-
border: 0;
|
|
37
|
-
border-radius: calc(var(--oc-radius) - 2px);
|
|
38
|
-
cursor: pointer;
|
|
39
|
-
scroll-snap-align: start;
|
|
40
|
-
transition: color var(--oc-transition-fast), background var(--oc-transition-fast);
|
|
41
|
-
}
|
|
42
|
-
.oc-alpha-tabs-item:hover { color: var(--oc-foreground); background: var(--oc-surface-strong); }
|
|
43
|
-
.oc-alpha-tabs-item:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
|
|
44
|
-
|
|
45
|
-
/* "All" is wider and separated from the letters by a thin line. */
|
|
46
|
-
.oc-alpha-tabs-item--all { padding-inline: 0.75rem; margin-inline-end: 0.25rem; box-shadow: 0.25rem 0 0 -0.2rem var(--oc-border); }
|
|
47
|
-
|
|
48
|
-
/* Current letter: filled with the primary token. */
|
|
49
|
-
.oc-alpha-tabs-item[aria-current="true"],
|
|
50
|
-
.oc-alpha-tabs-item[aria-selected="true"],
|
|
51
|
-
.oc-alpha-tabs-item.is-active { color: var(--oc-primary-foreground); background: var(--oc-primary); }
|
|
52
|
-
|
|
53
|
-
/* Letter without entries: visible but not clickable. */
|
|
54
|
-
.oc-alpha-tabs-item[aria-disabled="true"],
|
|
55
|
-
.oc-alpha-tabs-item:disabled { opacity: 0.4; pointer-events: none; }
|
|
56
|
-
|
|
57
|
-
/* Wrap: letters wrap onto more rows instead of scrolling. */
|
|
58
|
-
.oc-alpha-tabs--wrap { flex-wrap: wrap; overflow: visible; }
|
|
59
|
-
|
|
60
|
-
/* Small: tighter letters. */
|
|
61
|
-
.oc-alpha-tabs--sm .oc-alpha-tabs-item { min-inline-size: 1.5rem; block-size: 1.5rem; font-size: 0.75rem; }
|
|
62
|
-
|
|
63
|
-
/* Plain: no frame (for inside a toolbar or card). */
|
|
64
|
-
.oc-alpha-tabs--plain { padding: 0; background: none; border: 0; }
|
|
65
|
-
|
|
66
|
-
@media (prefers-reduced-motion: reduce) {
|
|
67
|
-
.oc-alpha-tabs-item { transition: none; }
|
|
68
|
-
}
|
|
1
|
+
/* File: packages/ui/src/parts/app-alpha-tabs.css | Map: bar (scrolling row) -> item -> "All" item -> states (current, empty) -> wrap + size modifiers -> reduced motion */
|
|
2
|
+
/* Alpha tabs: "All" + A-Z filter bar for long lists (dictionary, contacts).
|
|
3
|
+
Each letter is a link (?letter=A) or a button. Current letter: aria-current="true" (or .is-active).
|
|
4
|
+
Letters without entries: aria-disabled="true". The row scrolls sideways on small screens. */
|
|
5
|
+
|
|
6
|
+
.oc-alpha-tabs {
|
|
7
|
+
display: flex;
|
|
8
|
+
flex-wrap: nowrap;
|
|
9
|
+
gap: 2px;
|
|
10
|
+
inline-size: 100%;
|
|
11
|
+
padding: 0.25rem;
|
|
12
|
+
overflow-x: auto;
|
|
13
|
+
overscroll-behavior-x: contain;
|
|
14
|
+
scroll-snap-type: x proximity;
|
|
15
|
+
scrollbar-width: thin;
|
|
16
|
+
background: var(--oc-muted);
|
|
17
|
+
border: 1px solid var(--oc-border);
|
|
18
|
+
border-radius: var(--oc-radius);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* One letter. Square-ish, fixed width, centered text. */
|
|
22
|
+
.oc-alpha-tabs-item {
|
|
23
|
+
flex: 0 0 auto;
|
|
24
|
+
display: inline-grid;
|
|
25
|
+
place-items: center;
|
|
26
|
+
min-inline-size: 1.875rem;
|
|
27
|
+
block-size: 1.875rem;
|
|
28
|
+
padding-inline: 0.375rem;
|
|
29
|
+
font: inherit;
|
|
30
|
+
font-size: 0.8125rem;
|
|
31
|
+
font-weight: 500;
|
|
32
|
+
line-height: 1;
|
|
33
|
+
color: var(--oc-muted-foreground);
|
|
34
|
+
text-decoration: none;
|
|
35
|
+
background: none;
|
|
36
|
+
border: 0;
|
|
37
|
+
border-radius: calc(var(--oc-radius) - 2px);
|
|
38
|
+
cursor: pointer;
|
|
39
|
+
scroll-snap-align: start;
|
|
40
|
+
transition: color var(--oc-transition-fast), background var(--oc-transition-fast);
|
|
41
|
+
}
|
|
42
|
+
.oc-alpha-tabs-item:hover { color: var(--oc-foreground); background: var(--oc-surface-strong); }
|
|
43
|
+
.oc-alpha-tabs-item:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
|
|
44
|
+
|
|
45
|
+
/* "All" is wider and separated from the letters by a thin line. */
|
|
46
|
+
.oc-alpha-tabs-item--all { padding-inline: 0.75rem; margin-inline-end: 0.25rem; box-shadow: 0.25rem 0 0 -0.2rem var(--oc-border); }
|
|
47
|
+
|
|
48
|
+
/* Current letter: filled with the primary token. */
|
|
49
|
+
.oc-alpha-tabs-item[aria-current="true"],
|
|
50
|
+
.oc-alpha-tabs-item[aria-selected="true"],
|
|
51
|
+
.oc-alpha-tabs-item.is-active { color: var(--oc-primary-foreground); background: var(--oc-primary); }
|
|
52
|
+
|
|
53
|
+
/* Letter without entries: visible but not clickable. */
|
|
54
|
+
.oc-alpha-tabs-item[aria-disabled="true"],
|
|
55
|
+
.oc-alpha-tabs-item:disabled { opacity: 0.4; pointer-events: none; }
|
|
56
|
+
|
|
57
|
+
/* Wrap: letters wrap onto more rows instead of scrolling. */
|
|
58
|
+
.oc-alpha-tabs--wrap { flex-wrap: wrap; overflow: visible; }
|
|
59
|
+
|
|
60
|
+
/* Small: tighter letters. */
|
|
61
|
+
.oc-alpha-tabs--sm .oc-alpha-tabs-item { min-inline-size: 1.5rem; block-size: 1.5rem; font-size: 0.75rem; }
|
|
62
|
+
|
|
63
|
+
/* Plain: no frame (for inside a toolbar or card). */
|
|
64
|
+
.oc-alpha-tabs--plain { padding: 0; background: none; border: 0; }
|
|
65
|
+
|
|
66
|
+
@media (prefers-reduced-motion: reduce) {
|
|
67
|
+
.oc-alpha-tabs-item { transition: none; }
|
|
68
|
+
}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
/* File: packages/ui/src/parts/app-busy-overlay.css | Map: dialog + backdrop -> box -> spinner / progress -> title + text -> motion
|
|
2
|
-
Busy overlay: a modal <dialog closedby="none"> shown while a long request runs (saving, uploading, processing photos).
|
|
3
|
-
The modal dialog makes the page inert, so nothing can be clicked twice. Based on the Verdavita admin save overlay. */
|
|
4
|
-
|
|
5
|
-
.oc-busy-overlay {
|
|
6
|
-
inline-size: min(100vw - 2rem, 24rem);
|
|
7
|
-
padding: 1.75rem 2rem;
|
|
8
|
-
border: 1px solid var(--oc-border);
|
|
9
|
-
border-radius: 14px;
|
|
10
|
-
background: var(--oc-card);
|
|
11
|
-
color: var(--oc-foreground);
|
|
12
|
-
text-align: center;
|
|
13
|
-
box-shadow: 0 1.25rem 3rem oklch(from var(--color-black-50) l c h / 0.25);
|
|
14
|
-
}
|
|
15
|
-
.oc-busy-overlay[open] { display: grid; justify-items: center; gap: 0.75rem; }
|
|
16
|
-
.oc-busy-overlay::backdrop { background: oklch(from var(--color-black-60) l c h / 0.5); backdrop-filter: blur(2px); }
|
|
17
|
-
.oc-busy-overlay > .oc-spinner { --oc-spinner-size: 2.5rem; color: var(--oc-primary); }
|
|
18
|
-
.oc-busy-overlay__title { margin: 0; font-size: 1rem; font-weight: 700; }
|
|
19
|
-
.oc-busy-overlay__text { margin: 0; color: var(--oc-muted-foreground); font-size: 0.875rem; }
|
|
20
|
-
.oc-busy-overlay > .oc-progress { inline-size: 100%; }
|
|
21
|
-
|
|
22
|
-
/* Fade in, so short requests do not flash: the box appears after 300ms */
|
|
23
|
-
.oc-busy-overlay[open], .oc-busy-overlay[open]::backdrop { animation: oc-busy-in 0.2s 0.3s both; }
|
|
24
|
-
@keyframes oc-busy-in { from { opacity: 0; } }
|
|
25
|
-
@media (prefers-reduced-motion: reduce) { .oc-busy-overlay[open], .oc-busy-overlay[open]::backdrop { animation-duration: 0s; } }
|
|
1
|
+
/* File: packages/ui/src/parts/app-busy-overlay.css | Map: dialog + backdrop -> box -> spinner / progress -> title + text -> motion
|
|
2
|
+
Busy overlay: a modal <dialog closedby="none"> shown while a long request runs (saving, uploading, processing photos).
|
|
3
|
+
The modal dialog makes the page inert, so nothing can be clicked twice. Based on the Verdavita admin save overlay. */
|
|
4
|
+
|
|
5
|
+
.oc-busy-overlay {
|
|
6
|
+
inline-size: min(100vw - 2rem, 24rem);
|
|
7
|
+
padding: 1.75rem 2rem;
|
|
8
|
+
border: 1px solid var(--oc-border);
|
|
9
|
+
border-radius: 14px;
|
|
10
|
+
background: var(--oc-card);
|
|
11
|
+
color: var(--oc-foreground);
|
|
12
|
+
text-align: center;
|
|
13
|
+
box-shadow: 0 1.25rem 3rem oklch(from var(--color-black-50) l c h / 0.25);
|
|
14
|
+
}
|
|
15
|
+
.oc-busy-overlay[open] { display: grid; justify-items: center; gap: 0.75rem; }
|
|
16
|
+
.oc-busy-overlay::backdrop { background: oklch(from var(--color-black-60) l c h / 0.5); backdrop-filter: blur(2px); }
|
|
17
|
+
.oc-busy-overlay > .oc-spinner { --oc-spinner-size: 2.5rem; color: var(--oc-primary); }
|
|
18
|
+
.oc-busy-overlay__title { margin: 0; font-size: 1rem; font-weight: 700; }
|
|
19
|
+
.oc-busy-overlay__text { margin: 0; color: var(--oc-muted-foreground); font-size: 0.875rem; }
|
|
20
|
+
.oc-busy-overlay > .oc-progress { inline-size: 100%; }
|
|
21
|
+
|
|
22
|
+
/* Fade in, so short requests do not flash: the box appears after 300ms */
|
|
23
|
+
.oc-busy-overlay[open], .oc-busy-overlay[open]::backdrop { animation: oc-busy-in 0.2s 0.3s both; }
|
|
24
|
+
@keyframes oc-busy-in { from { opacity: 0; } }
|
|
25
|
+
@media (prefers-reduced-motion: reduce) { .oc-busy-overlay[open], .oc-busy-overlay[open]::backdrop { animation-duration: 0s; } }
|
|
@@ -1,85 +1,85 @@
|
|
|
1
|
-
/* File: packages/ui/src/parts/app-column-menu.css | Map: menu panel -> title + list -> item states -> footer -> CSS-only column hiding (scope) */
|
|
2
|
-
/* Column menu: a popover with one checkbox per table column (column visibility).
|
|
3
|
-
CSS-only hiding: wrap the menu and the table in .oc-column-menu-scope and give each checkbox
|
|
4
|
-
data-col="<column number>". An unchecked box hides that column (th and td) through :has(). */
|
|
5
|
-
|
|
6
|
-
/* Panel look. Without the popover attribute it is a normal block (e.g. inside a sheet or sidebar). */
|
|
7
|
-
.oc-column-menu {
|
|
8
|
-
inline-size: 14rem;
|
|
9
|
-
max-inline-size: calc(100vw - 1rem);
|
|
10
|
-
padding: 0.375rem;
|
|
11
|
-
font-size: 0.875rem;
|
|
12
|
-
color: var(--oc-popover-foreground);
|
|
13
|
-
background: var(--oc-popover);
|
|
14
|
-
border: 1px solid var(--oc-border);
|
|
15
|
-
border-radius: var(--oc-radius);
|
|
16
|
-
box-shadow: 0 8px 24px oklch(from var(--color-black-60) l c h / 0.15);
|
|
17
|
-
}
|
|
18
|
-
/* As a popover: in the top layer, tethered to its trigger like the dropdown. */
|
|
19
|
-
.oc-column-menu[popover] {
|
|
20
|
-
position: fixed;
|
|
21
|
-
inset: auto;
|
|
22
|
-
margin: 4px 0 0;
|
|
23
|
-
position-area: block-end span-inline-start;
|
|
24
|
-
position-try-fallbacks: flip-block, flip-inline;
|
|
25
|
-
transition: opacity var(--oc-transition-fast), display var(--oc-transition-fast) allow-discrete, overlay var(--oc-transition-fast) allow-discrete;
|
|
26
|
-
}
|
|
27
|
-
.oc-column-menu[popover]:popover-open {
|
|
28
|
-
display: block;
|
|
29
|
-
@starting-style { opacity: 0; }
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/* Small heading above the list ("Columns"). */
|
|
33
|
-
.oc-column-menu-title {
|
|
34
|
-
margin: 0;
|
|
35
|
-
padding: 0.375rem 0.5rem 0.25rem;
|
|
36
|
-
font-size: 0.75rem;
|
|
37
|
-
font-weight: 600;
|
|
38
|
-
color: var(--oc-muted-foreground);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/* The list is a <form>, so a native <button type="reset"> restores the default columns. */
|
|
42
|
-
.oc-column-menu-list { display: grid; gap: 1px; margin: 0; max-block-size: 18rem; overflow-y: auto; }
|
|
43
|
-
|
|
44
|
-
/* One row: label around a checkbox and the column name. */
|
|
45
|
-
.oc-column-menu-item {
|
|
46
|
-
display: flex;
|
|
47
|
-
align-items: center;
|
|
48
|
-
gap: 0.5rem;
|
|
49
|
-
padding: 0.375rem 0.5rem;
|
|
50
|
-
border-radius: calc(var(--oc-radius) - 2px);
|
|
51
|
-
cursor: pointer;
|
|
52
|
-
user-select: none;
|
|
53
|
-
}
|
|
54
|
-
.oc-column-menu-item:hover { background: var(--oc-accent); }
|
|
55
|
-
.oc-column-menu-item:has(:focus-visible) { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
|
|
56
|
-
.oc-column-menu-item input { margin: 0; accent-color: var(--oc-primary); }
|
|
57
|
-
/* Locked column (always visible): <input disabled checked>. */
|
|
58
|
-
.oc-column-menu-item:has(input:disabled) { color: var(--oc-muted-foreground); cursor: default; }
|
|
59
|
-
.oc-column-menu-item:has(input:disabled):hover { background: none; }
|
|
60
|
-
|
|
61
|
-
/* Footer row with "Reset" (type="reset") or other small buttons. */
|
|
62
|
-
.oc-column-menu-footer {
|
|
63
|
-
display: flex;
|
|
64
|
-
justify-content: flex-end;
|
|
65
|
-
gap: 0.25rem;
|
|
66
|
-
margin-block-start: 0.375rem;
|
|
67
|
-
padding-block-start: 0.375rem;
|
|
68
|
-
border-block-start: 1px solid var(--oc-border);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/* ---- CSS-only column hiding (columns 1 to 10) ---- */
|
|
72
|
-
.oc-column-menu-scope:has([data-col="1"]:not(:checked)) .oc-table :is(th, td):nth-child(1),
|
|
73
|
-
.oc-column-menu-scope:has([data-col="2"]:not(:checked)) .oc-table :is(th, td):nth-child(2),
|
|
74
|
-
.oc-column-menu-scope:has([data-col="3"]:not(:checked)) .oc-table :is(th, td):nth-child(3),
|
|
75
|
-
.oc-column-menu-scope:has([data-col="4"]:not(:checked)) .oc-table :is(th, td):nth-child(4),
|
|
76
|
-
.oc-column-menu-scope:has([data-col="5"]:not(:checked)) .oc-table :is(th, td):nth-child(5),
|
|
77
|
-
.oc-column-menu-scope:has([data-col="6"]:not(:checked)) .oc-table :is(th, td):nth-child(6),
|
|
78
|
-
.oc-column-menu-scope:has([data-col="7"]:not(:checked)) .oc-table :is(th, td):nth-child(7),
|
|
79
|
-
.oc-column-menu-scope:has([data-col="8"]:not(:checked)) .oc-table :is(th, td):nth-child(8),
|
|
80
|
-
.oc-column-menu-scope:has([data-col="9"]:not(:checked)) .oc-table :is(th, td):nth-child(9),
|
|
81
|
-
.oc-column-menu-scope:has([data-col="10"]:not(:checked)) .oc-table :is(th, td):nth-child(10) { display: none; }
|
|
82
|
-
|
|
83
|
-
@media (prefers-reduced-motion: reduce) {
|
|
84
|
-
.oc-column-menu[popover] { transition: none; }
|
|
85
|
-
}
|
|
1
|
+
/* File: packages/ui/src/parts/app-column-menu.css | Map: menu panel -> title + list -> item states -> footer -> CSS-only column hiding (scope) */
|
|
2
|
+
/* Column menu: a popover with one checkbox per table column (column visibility).
|
|
3
|
+
CSS-only hiding: wrap the menu and the table in .oc-column-menu-scope and give each checkbox
|
|
4
|
+
data-col="<column number>". An unchecked box hides that column (th and td) through :has(). */
|
|
5
|
+
|
|
6
|
+
/* Panel look. Without the popover attribute it is a normal block (e.g. inside a sheet or sidebar). */
|
|
7
|
+
.oc-column-menu {
|
|
8
|
+
inline-size: 14rem;
|
|
9
|
+
max-inline-size: calc(100vw - 1rem);
|
|
10
|
+
padding: 0.375rem;
|
|
11
|
+
font-size: 0.875rem;
|
|
12
|
+
color: var(--oc-popover-foreground);
|
|
13
|
+
background: var(--oc-popover);
|
|
14
|
+
border: 1px solid var(--oc-border);
|
|
15
|
+
border-radius: var(--oc-radius);
|
|
16
|
+
box-shadow: 0 8px 24px oklch(from var(--color-black-60) l c h / 0.15);
|
|
17
|
+
}
|
|
18
|
+
/* As a popover: in the top layer, tethered to its trigger like the dropdown. */
|
|
19
|
+
.oc-column-menu[popover] {
|
|
20
|
+
position: fixed;
|
|
21
|
+
inset: auto;
|
|
22
|
+
margin: 4px 0 0;
|
|
23
|
+
position-area: block-end span-inline-start;
|
|
24
|
+
position-try-fallbacks: flip-block, flip-inline;
|
|
25
|
+
transition: opacity var(--oc-transition-fast), display var(--oc-transition-fast) allow-discrete, overlay var(--oc-transition-fast) allow-discrete;
|
|
26
|
+
}
|
|
27
|
+
.oc-column-menu[popover]:popover-open {
|
|
28
|
+
display: block;
|
|
29
|
+
@starting-style { opacity: 0; }
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* Small heading above the list ("Columns"). */
|
|
33
|
+
.oc-column-menu-title {
|
|
34
|
+
margin: 0;
|
|
35
|
+
padding: 0.375rem 0.5rem 0.25rem;
|
|
36
|
+
font-size: 0.75rem;
|
|
37
|
+
font-weight: 600;
|
|
38
|
+
color: var(--oc-muted-foreground);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/* The list is a <form>, so a native <button type="reset"> restores the default columns. */
|
|
42
|
+
.oc-column-menu-list { display: grid; gap: 1px; margin: 0; max-block-size: 18rem; overflow-y: auto; }
|
|
43
|
+
|
|
44
|
+
/* One row: label around a checkbox and the column name. */
|
|
45
|
+
.oc-column-menu-item {
|
|
46
|
+
display: flex;
|
|
47
|
+
align-items: center;
|
|
48
|
+
gap: 0.5rem;
|
|
49
|
+
padding: 0.375rem 0.5rem;
|
|
50
|
+
border-radius: calc(var(--oc-radius) - 2px);
|
|
51
|
+
cursor: pointer;
|
|
52
|
+
user-select: none;
|
|
53
|
+
}
|
|
54
|
+
.oc-column-menu-item:hover { background: var(--oc-accent); }
|
|
55
|
+
.oc-column-menu-item:has(:focus-visible) { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
|
|
56
|
+
.oc-column-menu-item input { margin: 0; accent-color: var(--oc-primary); }
|
|
57
|
+
/* Locked column (always visible): <input disabled checked>. */
|
|
58
|
+
.oc-column-menu-item:has(input:disabled) { color: var(--oc-muted-foreground); cursor: default; }
|
|
59
|
+
.oc-column-menu-item:has(input:disabled):hover { background: none; }
|
|
60
|
+
|
|
61
|
+
/* Footer row with "Reset" (type="reset") or other small buttons. */
|
|
62
|
+
.oc-column-menu-footer {
|
|
63
|
+
display: flex;
|
|
64
|
+
justify-content: flex-end;
|
|
65
|
+
gap: 0.25rem;
|
|
66
|
+
margin-block-start: 0.375rem;
|
|
67
|
+
padding-block-start: 0.375rem;
|
|
68
|
+
border-block-start: 1px solid var(--oc-border);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* ---- CSS-only column hiding (columns 1 to 10) ---- */
|
|
72
|
+
.oc-column-menu-scope:has([data-col="1"]:not(:checked)) .oc-table :is(th, td):nth-child(1),
|
|
73
|
+
.oc-column-menu-scope:has([data-col="2"]:not(:checked)) .oc-table :is(th, td):nth-child(2),
|
|
74
|
+
.oc-column-menu-scope:has([data-col="3"]:not(:checked)) .oc-table :is(th, td):nth-child(3),
|
|
75
|
+
.oc-column-menu-scope:has([data-col="4"]:not(:checked)) .oc-table :is(th, td):nth-child(4),
|
|
76
|
+
.oc-column-menu-scope:has([data-col="5"]:not(:checked)) .oc-table :is(th, td):nth-child(5),
|
|
77
|
+
.oc-column-menu-scope:has([data-col="6"]:not(:checked)) .oc-table :is(th, td):nth-child(6),
|
|
78
|
+
.oc-column-menu-scope:has([data-col="7"]:not(:checked)) .oc-table :is(th, td):nth-child(7),
|
|
79
|
+
.oc-column-menu-scope:has([data-col="8"]:not(:checked)) .oc-table :is(th, td):nth-child(8),
|
|
80
|
+
.oc-column-menu-scope:has([data-col="9"]:not(:checked)) .oc-table :is(th, td):nth-child(9),
|
|
81
|
+
.oc-column-menu-scope:has([data-col="10"]:not(:checked)) .oc-table :is(th, td):nth-child(10) { display: none; }
|
|
82
|
+
|
|
83
|
+
@media (prefers-reduced-motion: reduce) {
|
|
84
|
+
.oc-column-menu[popover] { transition: none; }
|
|
85
|
+
}
|