@birdycom/omniaui 0.11.0 → 0.11.2
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 +6565 -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 +410 -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
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
/* File: packages/ui/src/parts/app-greeting.css | Map: header row -> icon tile -> text (eyebrow, title, date) -> actions -> time-of-day modifiers -> size modifier */
|
|
2
|
-
/* Greeting: dashboard header with a time-of-day greeting ("Good morning, Ada") and today's date.
|
|
3
|
-
CSS cannot read the clock, so the app (or a wrapper) picks the modifier:
|
|
4
|
-
--morning (5-12h), --afternoon (12-18h), --evening (18-5h). The modifier only tints the icon tile. */
|
|
5
|
-
|
|
6
|
-
.oc-greeting {
|
|
7
|
-
--oc-greeting-color: var(--oc-primary);
|
|
8
|
-
display: flex;
|
|
9
|
-
flex-wrap: wrap;
|
|
10
|
-
align-items: center;
|
|
11
|
-
gap: 0.75rem 1rem;
|
|
12
|
-
padding-block: 0.5rem;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/* Icon tile (sun, sun-low, moon): tinted with the time-of-day color. */
|
|
16
|
-
.oc-greeting-icon {
|
|
17
|
-
display: grid;
|
|
18
|
-
place-items: center;
|
|
19
|
-
flex-shrink: 0;
|
|
20
|
-
inline-size: 2.75rem;
|
|
21
|
-
block-size: 2.75rem;
|
|
22
|
-
color: var(--oc-greeting-color);
|
|
23
|
-
background: oklch(from var(--oc-greeting-color) l c h / 0.12);
|
|
24
|
-
border-radius: calc(var(--oc-radius) + 4px);
|
|
25
|
-
}
|
|
26
|
-
.oc-greeting-icon svg { inline-size: 1.375rem; block-size: 1.375rem; }
|
|
27
|
-
|
|
28
|
-
/* Text column. */
|
|
29
|
-
.oc-greeting-body { flex: 1 1 16rem; min-inline-size: 0; }
|
|
30
|
-
.oc-greeting-eyebrow { margin: 0 0 0.125rem; font-size: 0.75rem; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; color: var(--oc-greeting-color); }
|
|
31
|
-
.oc-greeting-title { margin: 0; font-size: 1.5rem; font-weight: 600; line-height: 1.2; letter-spacing: -0.01em; color: var(--oc-foreground); text-wrap: balance; }
|
|
32
|
-
.oc-greeting-name { color: var(--oc-greeting-color); }
|
|
33
|
-
/* Date: use <time datetime="2026-10-15">. First letter capitalised for locales that write weekdays in lower case. */
|
|
34
|
-
.oc-greeting-date { display: block; margin-block-start: 0.25rem; font-size: 0.875rem; color: var(--oc-muted-foreground); }
|
|
35
|
-
.oc-greeting-date::first-letter { text-transform: uppercase; }
|
|
36
|
-
|
|
37
|
-
/* Actions at the end (buttons, search). */
|
|
38
|
-
.oc-greeting-actions { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }
|
|
39
|
-
|
|
40
|
-
/* Time-of-day tints. */
|
|
41
|
-
.oc-greeting--morning { --oc-greeting-color: var(--oc-warning); }
|
|
42
|
-
.oc-greeting--afternoon { --oc-greeting-color: var(--oc-primary); }
|
|
43
|
-
.oc-greeting--evening { --oc-greeting-color: light-dark(var(--color-purple-40), var(--color-purple-10)); }
|
|
44
|
-
|
|
45
|
-
/* Large: for a hero-like start page. */
|
|
46
|
-
.oc-greeting--lg .oc-greeting-title { font-size: clamp(1.5rem, 1.2rem + 1.5vw, 2.25rem); }
|
|
47
|
-
.oc-greeting--lg .oc-greeting-icon { inline-size: 3.5rem; block-size: 3.5rem; }
|
|
1
|
+
/* File: packages/ui/src/parts/app-greeting.css | Map: header row -> icon tile -> text (eyebrow, title, date) -> actions -> time-of-day modifiers -> size modifier */
|
|
2
|
+
/* Greeting: dashboard header with a time-of-day greeting ("Good morning, Ada") and today's date.
|
|
3
|
+
CSS cannot read the clock, so the app (or a wrapper) picks the modifier:
|
|
4
|
+
--morning (5-12h), --afternoon (12-18h), --evening (18-5h). The modifier only tints the icon tile. */
|
|
5
|
+
|
|
6
|
+
.oc-greeting {
|
|
7
|
+
--oc-greeting-color: var(--oc-primary);
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-wrap: wrap;
|
|
10
|
+
align-items: center;
|
|
11
|
+
gap: 0.75rem 1rem;
|
|
12
|
+
padding-block: 0.5rem;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* Icon tile (sun, sun-low, moon): tinted with the time-of-day color. */
|
|
16
|
+
.oc-greeting-icon {
|
|
17
|
+
display: grid;
|
|
18
|
+
place-items: center;
|
|
19
|
+
flex-shrink: 0;
|
|
20
|
+
inline-size: 2.75rem;
|
|
21
|
+
block-size: 2.75rem;
|
|
22
|
+
color: var(--oc-greeting-color);
|
|
23
|
+
background: oklch(from var(--oc-greeting-color) l c h / 0.12);
|
|
24
|
+
border-radius: calc(var(--oc-radius) + 4px);
|
|
25
|
+
}
|
|
26
|
+
.oc-greeting-icon svg { inline-size: 1.375rem; block-size: 1.375rem; }
|
|
27
|
+
|
|
28
|
+
/* Text column. */
|
|
29
|
+
.oc-greeting-body { flex: 1 1 16rem; min-inline-size: 0; }
|
|
30
|
+
.oc-greeting-eyebrow { margin: 0 0 0.125rem; font-size: 0.75rem; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; color: var(--oc-greeting-color); }
|
|
31
|
+
.oc-greeting-title { margin: 0; font-size: 1.5rem; font-weight: 600; line-height: 1.2; letter-spacing: -0.01em; color: var(--oc-foreground); text-wrap: balance; }
|
|
32
|
+
.oc-greeting-name { color: var(--oc-greeting-color); }
|
|
33
|
+
/* Date: use <time datetime="2026-10-15">. First letter capitalised for locales that write weekdays in lower case. */
|
|
34
|
+
.oc-greeting-date { display: block; margin-block-start: 0.25rem; font-size: 0.875rem; color: var(--oc-muted-foreground); }
|
|
35
|
+
.oc-greeting-date::first-letter { text-transform: uppercase; }
|
|
36
|
+
|
|
37
|
+
/* Actions at the end (buttons, search). */
|
|
38
|
+
.oc-greeting-actions { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }
|
|
39
|
+
|
|
40
|
+
/* Time-of-day tints. */
|
|
41
|
+
.oc-greeting--morning { --oc-greeting-color: var(--oc-warning); }
|
|
42
|
+
.oc-greeting--afternoon { --oc-greeting-color: var(--oc-primary); }
|
|
43
|
+
.oc-greeting--evening { --oc-greeting-color: light-dark(var(--color-purple-40), var(--color-purple-10)); }
|
|
44
|
+
|
|
45
|
+
/* Large: for a hero-like start page. */
|
|
46
|
+
.oc-greeting--lg .oc-greeting-title { font-size: clamp(1.5rem, 1.2rem + 1.5vw, 2.25rem); }
|
|
47
|
+
.oc-greeting--lg .oc-greeting-icon { inline-size: 3.5rem; block-size: 3.5rem; }
|
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
/* File: packages/ui/src/parts/app-list-toolbar.css | Map: toolbar row -> search -> count -> view toggle (radio icons) -> actions -> sticky modifier -> CSS-only view switch (scope) -> narrow screens */
|
|
2
|
-
/* List toolbar: search field + result count + cards / table view toggle + actions, above a list.
|
|
3
|
-
The view toggle is a radio group. Inside .oc-list-toolbar-scope the checked radio shows the matching
|
|
4
|
-
panel (.oc-list-toolbar-panel[data-view="cards" | "table"]) with :has(); no JavaScript. */
|
|
5
|
-
|
|
6
|
-
.oc-list-toolbar {
|
|
7
|
-
display: flex;
|
|
8
|
-
flex-wrap: wrap;
|
|
9
|
-
align-items: center;
|
|
10
|
-
gap: 0.5rem 0.75rem;
|
|
11
|
-
padding-block: 0.5rem;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/* Search: a .oc-input (or .oc-search) that takes the free space, up to 24rem. */
|
|
15
|
-
.oc-list-toolbar-search { flex: 1 1 14rem; max-inline-size: 24rem; }
|
|
16
|
-
.oc-list-toolbar-search .oc-input { inline-size: 100%; }
|
|
17
|
-
|
|
18
|
-
/* Result count ("128 items"). */
|
|
19
|
-
.oc-list-toolbar-count { font-size: 0.8125rem; color: var(--oc-muted-foreground); font-variant-numeric: tabular-nums; white-space: nowrap; }
|
|
20
|
-
|
|
21
|
-
/* Pushes everything after it to the end edge. */
|
|
22
|
-
.oc-list-toolbar-spacer { flex: 1; }
|
|
23
|
-
|
|
24
|
-
/* View toggle: radio inputs inside labels, shown as small icon buttons in one frame. */
|
|
25
|
-
.oc-list-toolbar-views {
|
|
26
|
-
display: inline-flex;
|
|
27
|
-
padding: 2px;
|
|
28
|
-
background: var(--oc-muted);
|
|
29
|
-
border: 1px solid var(--oc-border);
|
|
30
|
-
border-radius: var(--oc-radius);
|
|
31
|
-
}
|
|
32
|
-
.oc-list-toolbar-view {
|
|
33
|
-
position: relative;
|
|
34
|
-
display: inline-grid;
|
|
35
|
-
place-items: center;
|
|
36
|
-
inline-size: 2rem;
|
|
37
|
-
block-size: 1.75rem;
|
|
38
|
-
color: var(--oc-muted-foreground);
|
|
39
|
-
border-radius: calc(var(--oc-radius) - 2px);
|
|
40
|
-
cursor: pointer;
|
|
41
|
-
transition: color var(--oc-transition-fast), background var(--oc-transition-fast);
|
|
42
|
-
}
|
|
43
|
-
/* The radio stays in the accessibility tree but is invisible; the label is the click target. */
|
|
44
|
-
.oc-list-toolbar-view input { position: absolute; inset: 0; margin: 0; opacity: 0; cursor: inherit; }
|
|
45
|
-
.oc-list-toolbar-view svg { inline-size: 1rem; block-size: 1rem; }
|
|
46
|
-
.oc-list-toolbar-view:hover { color: var(--oc-foreground); }
|
|
47
|
-
.oc-list-toolbar-view:has(input:checked) {
|
|
48
|
-
color: var(--oc-foreground);
|
|
49
|
-
background: var(--oc-background);
|
|
50
|
-
box-shadow: 0 1px 3px oklch(from var(--color-black-60) l c h / 0.1);
|
|
51
|
-
}
|
|
52
|
-
.oc-list-toolbar-view:has(input:focus-visible) { outline: 2px solid var(--oc-ring); outline-offset: 1px; }
|
|
53
|
-
|
|
54
|
-
/* Buttons at the end (New, Export, filter dropdown ...). */
|
|
55
|
-
.oc-list-toolbar-actions { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }
|
|
56
|
-
|
|
57
|
-
/* Sticky: stays at the top of the scroll container while the list scrolls. */
|
|
58
|
-
.oc-list-toolbar--sticky {
|
|
59
|
-
position: sticky;
|
|
60
|
-
inset-block-start: 0;
|
|
61
|
-
z-index: 5;
|
|
62
|
-
background: var(--oc-background);
|
|
63
|
-
border-block-end: 1px solid var(--oc-border);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/* Bordered: framed bar (for use above a card grid). */
|
|
67
|
-
.oc-list-toolbar--bordered { padding: 0.5rem 0.75rem; background: var(--oc-card); border: 1px solid var(--oc-border); border-radius: var(--oc-radius); }
|
|
68
|
-
|
|
69
|
-
/* ---- CSS-only view switch ---- */
|
|
70
|
-
.oc-list-toolbar-scope:has(.oc-list-toolbar-view input[value="cards"]:checked) .oc-list-toolbar-panel:not([data-view="cards"]),
|
|
71
|
-
.oc-list-toolbar-scope:has(.oc-list-toolbar-view input[value="table"]:checked) .oc-list-toolbar-panel:not([data-view="table"]),
|
|
72
|
-
.oc-list-toolbar-scope:has(.oc-list-toolbar-view input[value="list"]:checked) .oc-list-toolbar-panel:not([data-view="list"]) { display: none; }
|
|
73
|
-
|
|
74
|
-
/* Narrow screens: search takes the full first row. */
|
|
75
|
-
@media (max-width: 36rem) {
|
|
76
|
-
.oc-list-toolbar-search { flex-basis: 100%; max-inline-size: none; }
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
@media (prefers-reduced-motion: reduce) {
|
|
80
|
-
.oc-list-toolbar-view { transition: none; }
|
|
81
|
-
}
|
|
1
|
+
/* File: packages/ui/src/parts/app-list-toolbar.css | Map: toolbar row -> search -> count -> view toggle (radio icons) -> actions -> sticky modifier -> CSS-only view switch (scope) -> narrow screens */
|
|
2
|
+
/* List toolbar: search field + result count + cards / table view toggle + actions, above a list.
|
|
3
|
+
The view toggle is a radio group. Inside .oc-list-toolbar-scope the checked radio shows the matching
|
|
4
|
+
panel (.oc-list-toolbar-panel[data-view="cards" | "table"]) with :has(); no JavaScript. */
|
|
5
|
+
|
|
6
|
+
.oc-list-toolbar {
|
|
7
|
+
display: flex;
|
|
8
|
+
flex-wrap: wrap;
|
|
9
|
+
align-items: center;
|
|
10
|
+
gap: 0.5rem 0.75rem;
|
|
11
|
+
padding-block: 0.5rem;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* Search: a .oc-input (or .oc-search) that takes the free space, up to 24rem. */
|
|
15
|
+
.oc-list-toolbar-search { flex: 1 1 14rem; max-inline-size: 24rem; }
|
|
16
|
+
.oc-list-toolbar-search .oc-input { inline-size: 100%; }
|
|
17
|
+
|
|
18
|
+
/* Result count ("128 items"). */
|
|
19
|
+
.oc-list-toolbar-count { font-size: 0.8125rem; color: var(--oc-muted-foreground); font-variant-numeric: tabular-nums; white-space: nowrap; }
|
|
20
|
+
|
|
21
|
+
/* Pushes everything after it to the end edge. */
|
|
22
|
+
.oc-list-toolbar-spacer { flex: 1; }
|
|
23
|
+
|
|
24
|
+
/* View toggle: radio inputs inside labels, shown as small icon buttons in one frame. */
|
|
25
|
+
.oc-list-toolbar-views {
|
|
26
|
+
display: inline-flex;
|
|
27
|
+
padding: 2px;
|
|
28
|
+
background: var(--oc-muted);
|
|
29
|
+
border: 1px solid var(--oc-border);
|
|
30
|
+
border-radius: var(--oc-radius);
|
|
31
|
+
}
|
|
32
|
+
.oc-list-toolbar-view {
|
|
33
|
+
position: relative;
|
|
34
|
+
display: inline-grid;
|
|
35
|
+
place-items: center;
|
|
36
|
+
inline-size: 2rem;
|
|
37
|
+
block-size: 1.75rem;
|
|
38
|
+
color: var(--oc-muted-foreground);
|
|
39
|
+
border-radius: calc(var(--oc-radius) - 2px);
|
|
40
|
+
cursor: pointer;
|
|
41
|
+
transition: color var(--oc-transition-fast), background var(--oc-transition-fast);
|
|
42
|
+
}
|
|
43
|
+
/* The radio stays in the accessibility tree but is invisible; the label is the click target. */
|
|
44
|
+
.oc-list-toolbar-view input { position: absolute; inset: 0; margin: 0; opacity: 0; cursor: inherit; }
|
|
45
|
+
.oc-list-toolbar-view svg { inline-size: 1rem; block-size: 1rem; }
|
|
46
|
+
.oc-list-toolbar-view:hover { color: var(--oc-foreground); }
|
|
47
|
+
.oc-list-toolbar-view:has(input:checked) {
|
|
48
|
+
color: var(--oc-foreground);
|
|
49
|
+
background: var(--oc-background);
|
|
50
|
+
box-shadow: 0 1px 3px oklch(from var(--color-black-60) l c h / 0.1);
|
|
51
|
+
}
|
|
52
|
+
.oc-list-toolbar-view:has(input:focus-visible) { outline: 2px solid var(--oc-ring); outline-offset: 1px; }
|
|
53
|
+
|
|
54
|
+
/* Buttons at the end (New, Export, filter dropdown ...). */
|
|
55
|
+
.oc-list-toolbar-actions { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }
|
|
56
|
+
|
|
57
|
+
/* Sticky: stays at the top of the scroll container while the list scrolls. */
|
|
58
|
+
.oc-list-toolbar--sticky {
|
|
59
|
+
position: sticky;
|
|
60
|
+
inset-block-start: 0;
|
|
61
|
+
z-index: 5;
|
|
62
|
+
background: var(--oc-background);
|
|
63
|
+
border-block-end: 1px solid var(--oc-border);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/* Bordered: framed bar (for use above a card grid). */
|
|
67
|
+
.oc-list-toolbar--bordered { padding: 0.5rem 0.75rem; background: var(--oc-card); border: 1px solid var(--oc-border); border-radius: var(--oc-radius); }
|
|
68
|
+
|
|
69
|
+
/* ---- CSS-only view switch ---- */
|
|
70
|
+
.oc-list-toolbar-scope:has(.oc-list-toolbar-view input[value="cards"]:checked) .oc-list-toolbar-panel:not([data-view="cards"]),
|
|
71
|
+
.oc-list-toolbar-scope:has(.oc-list-toolbar-view input[value="table"]:checked) .oc-list-toolbar-panel:not([data-view="table"]),
|
|
72
|
+
.oc-list-toolbar-scope:has(.oc-list-toolbar-view input[value="list"]:checked) .oc-list-toolbar-panel:not([data-view="list"]) { display: none; }
|
|
73
|
+
|
|
74
|
+
/* Narrow screens: search takes the full first row. */
|
|
75
|
+
@media (max-width: 36rem) {
|
|
76
|
+
.oc-list-toolbar-search { flex-basis: 100%; max-inline-size: none; }
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@media (prefers-reduced-motion: reduce) {
|
|
80
|
+
.oc-list-toolbar-view { transition: none; }
|
|
81
|
+
}
|
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
/* File: packages/ui/src/parts/app-page-header.css | Map: header (container) -> back link row -> main row (text + actions) -> title + subtitle + meta -> wide layout (@container) -> modifiers (bordered, sticky, sm) */
|
|
2
|
-
/* Page header: back link + title + subtitle + actions at the top of an app page.
|
|
3
|
-
A lighter variant of the module-header block, as a component. The header is a size container:
|
|
4
|
-
below 36rem the actions wrap under the title, from 36rem they sit at the end of the title row. */
|
|
5
|
-
|
|
6
|
-
.oc-page-header {
|
|
7
|
-
container-type: inline-size;
|
|
8
|
-
container-name: oc-page-header;
|
|
9
|
-
display: grid;
|
|
10
|
-
gap: 0.5rem;
|
|
11
|
-
padding-block: 0.75rem 1rem;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
/* Optional back link row (use .oc-back-link inside, or any link). */
|
|
15
|
-
.oc-page-header-back { display: flex; }
|
|
16
|
-
.oc-page-header-back .oc-back-link { margin-inline-start: -0.75rem; }
|
|
17
|
-
|
|
18
|
-
/* Main row: text block + actions. Stacks by default. */
|
|
19
|
-
.oc-page-header-main { display: flex; flex-direction: column; gap: 0.75rem; }
|
|
20
|
-
.oc-page-header-text { min-inline-size: 0; }
|
|
21
|
-
.oc-page-header-title {
|
|
22
|
-
display: flex;
|
|
23
|
-
flex-wrap: wrap;
|
|
24
|
-
align-items: center;
|
|
25
|
-
gap: 0.5rem;
|
|
26
|
-
margin: 0;
|
|
27
|
-
font-size: 1.5rem;
|
|
28
|
-
font-weight: 600;
|
|
29
|
-
line-height: 1.25;
|
|
30
|
-
letter-spacing: -0.01em;
|
|
31
|
-
color: var(--oc-foreground);
|
|
32
|
-
text-wrap: balance;
|
|
33
|
-
}
|
|
34
|
-
.oc-page-header-subtitle { margin: 0.25rem 0 0; max-inline-size: 65ch; font-size: 0.875rem; line-height: 1.55; color: var(--oc-muted-foreground); }
|
|
35
|
-
/* Meta row: badges, last-updated text. */
|
|
36
|
-
.oc-page-header-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 0.375rem 0.75rem; margin-block-start: 0.5rem; font-size: 0.8125rem; color: var(--oc-muted-foreground); }
|
|
37
|
-
|
|
38
|
-
.oc-page-header-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }
|
|
39
|
-
|
|
40
|
-
/* Wide enough: actions at the end of the title row. */
|
|
41
|
-
@container oc-page-header (min-width: 36rem) {
|
|
42
|
-
.oc-page-header-main { flex-direction: row; align-items: flex-start; justify-content: space-between; }
|
|
43
|
-
.oc-page-header-actions { flex-shrink: 0; justify-content: flex-end; padding-block-start: 0.125rem; }
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/* Bordered: line under the header. */
|
|
47
|
-
.oc-page-header--bordered { margin-block-end: 1rem; border-block-end: 1px solid var(--oc-border); }
|
|
48
|
-
|
|
49
|
-
/* Sticky: stays on top while the page scrolls (needs a background). */
|
|
50
|
-
.oc-page-header--sticky { position: sticky; inset-block-start: 0; z-index: 10; background: var(--oc-background); }
|
|
51
|
-
|
|
52
|
-
/* Small: for sub pages and dialogs. */
|
|
53
|
-
.oc-page-header--sm { padding-block: 0.5rem 0.75rem; }
|
|
54
|
-
.oc-page-header--sm .oc-page-header-title { font-size: 1.125rem; }
|
|
1
|
+
/* File: packages/ui/src/parts/app-page-header.css | Map: header (container) -> back link row -> main row (text + actions) -> title + subtitle + meta -> wide layout (@container) -> modifiers (bordered, sticky, sm) */
|
|
2
|
+
/* Page header: back link + title + subtitle + actions at the top of an app page.
|
|
3
|
+
A lighter variant of the module-header block, as a component. The header is a size container:
|
|
4
|
+
below 36rem the actions wrap under the title, from 36rem they sit at the end of the title row. */
|
|
5
|
+
|
|
6
|
+
.oc-page-header {
|
|
7
|
+
container-type: inline-size;
|
|
8
|
+
container-name: oc-page-header;
|
|
9
|
+
display: grid;
|
|
10
|
+
gap: 0.5rem;
|
|
11
|
+
padding-block: 0.75rem 1rem;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* Optional back link row (use .oc-back-link inside, or any link). */
|
|
15
|
+
.oc-page-header-back { display: flex; }
|
|
16
|
+
.oc-page-header-back .oc-back-link { margin-inline-start: -0.75rem; }
|
|
17
|
+
|
|
18
|
+
/* Main row: text block + actions. Stacks by default. */
|
|
19
|
+
.oc-page-header-main { display: flex; flex-direction: column; gap: 0.75rem; }
|
|
20
|
+
.oc-page-header-text { min-inline-size: 0; }
|
|
21
|
+
.oc-page-header-title {
|
|
22
|
+
display: flex;
|
|
23
|
+
flex-wrap: wrap;
|
|
24
|
+
align-items: center;
|
|
25
|
+
gap: 0.5rem;
|
|
26
|
+
margin: 0;
|
|
27
|
+
font-size: 1.5rem;
|
|
28
|
+
font-weight: 600;
|
|
29
|
+
line-height: 1.25;
|
|
30
|
+
letter-spacing: -0.01em;
|
|
31
|
+
color: var(--oc-foreground);
|
|
32
|
+
text-wrap: balance;
|
|
33
|
+
}
|
|
34
|
+
.oc-page-header-subtitle { margin: 0.25rem 0 0; max-inline-size: 65ch; font-size: 0.875rem; line-height: 1.55; color: var(--oc-muted-foreground); }
|
|
35
|
+
/* Meta row: badges, last-updated text. */
|
|
36
|
+
.oc-page-header-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 0.375rem 0.75rem; margin-block-start: 0.5rem; font-size: 0.8125rem; color: var(--oc-muted-foreground); }
|
|
37
|
+
|
|
38
|
+
.oc-page-header-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }
|
|
39
|
+
|
|
40
|
+
/* Wide enough: actions at the end of the title row. */
|
|
41
|
+
@container oc-page-header (min-width: 36rem) {
|
|
42
|
+
.oc-page-header-main { flex-direction: row; align-items: flex-start; justify-content: space-between; }
|
|
43
|
+
.oc-page-header-actions { flex-shrink: 0; justify-content: flex-end; padding-block-start: 0.125rem; }
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/* Bordered: line under the header. */
|
|
47
|
+
.oc-page-header--bordered { margin-block-end: 1rem; border-block-end: 1px solid var(--oc-border); }
|
|
48
|
+
|
|
49
|
+
/* Sticky: stays on top while the page scrolls (needs a background). */
|
|
50
|
+
.oc-page-header--sticky { position: sticky; inset-block-start: 0; z-index: 10; background: var(--oc-background); }
|
|
51
|
+
|
|
52
|
+
/* Small: for sub pages and dialogs. */
|
|
53
|
+
.oc-page-header--sm { padding-block: 0.5rem 0.75rem; }
|
|
54
|
+
.oc-page-header--sm .oc-page-header-title { font-size: 1.125rem; }
|
|
@@ -1,91 +1,91 @@
|
|
|
1
|
-
/* File: packages/ui/src/parts/app-severity-card.css | Map: card (details) -> head (summary) -> icon + title + tags -> level badge + chevron -> body + actions -> severity modifiers -> resolved state -> reduced motion */
|
|
2
|
-
/* Severity card: risk-colored expandable card (security finding, incident, audit item).
|
|
3
|
-
Built on <details> / <summary>, so it opens without JavaScript; same name="..." makes a group exclusive.
|
|
4
|
-
Levels: --low, --medium, --high, --critical. Resolved: .is-resolved (muted, no color). */
|
|
5
|
-
|
|
6
|
-
.oc-severity-card {
|
|
7
|
-
--oc-severity-color: var(--oc-muted-foreground);
|
|
8
|
-
overflow: hidden;
|
|
9
|
-
color: var(--oc-foreground);
|
|
10
|
-
background: color-mix(in oklch, var(--oc-severity-color) 6%, var(--oc-card));
|
|
11
|
-
border: 1px solid oklch(from var(--oc-severity-color) l c h / 0.3);
|
|
12
|
-
border-inline-start-width: 3px;
|
|
13
|
-
border-inline-start-color: var(--oc-severity-color);
|
|
14
|
-
border-radius: calc(var(--oc-radius) + 4px);
|
|
15
|
-
interpolate-size: allow-keywords;
|
|
16
|
-
}
|
|
17
|
-
.oc-severity-card + .oc-severity-card { margin-block-start: 0.5rem; }
|
|
18
|
-
|
|
19
|
-
/* Head row (summary): icon, title + tags, level badge, chevron. */
|
|
20
|
-
.oc-severity-card-head {
|
|
21
|
-
display: flex;
|
|
22
|
-
align-items: center;
|
|
23
|
-
gap: 0.75rem;
|
|
24
|
-
padding: 0.875rem 1rem;
|
|
25
|
-
cursor: pointer;
|
|
26
|
-
list-style: none;
|
|
27
|
-
user-select: none;
|
|
28
|
-
}
|
|
29
|
-
.oc-severity-card-head::-webkit-details-marker { display: none; }
|
|
30
|
-
.oc-severity-card-head:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
|
|
31
|
-
.oc-severity-card-head:hover { background: oklch(from var(--oc-severity-color) l c h / 0.06); }
|
|
32
|
-
|
|
33
|
-
.oc-severity-card-icon { display: inline-flex; flex-shrink: 0; color: var(--oc-severity-color); }
|
|
34
|
-
.oc-severity-card-icon svg { inline-size: 1.25rem; block-size: 1.25rem; }
|
|
35
|
-
.oc-severity-card-main { flex: 1; min-inline-size: 0; }
|
|
36
|
-
.oc-severity-card-title { display: block; overflow: hidden; font-size: 0.875rem; font-weight: 600; text-overflow: ellipsis; white-space: nowrap; color: var(--oc-severity-color); }
|
|
37
|
-
/* Tags under the title (data types, categories). */
|
|
38
|
-
.oc-severity-card-tags { display: flex; flex-wrap: wrap; gap: 0.25rem; margin-block-start: 0.375rem; }
|
|
39
|
-
.oc-severity-card-tag { padding: 0.125rem 0.375rem; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.6875rem; color: var(--oc-muted-foreground); background: var(--oc-muted); border-radius: 4px; }
|
|
40
|
-
|
|
41
|
-
/* Level badge ("High") in the severity color. */
|
|
42
|
-
.oc-severity-card-level {
|
|
43
|
-
flex-shrink: 0;
|
|
44
|
-
padding: 0.2rem 0.5rem;
|
|
45
|
-
font-size: 0.6875rem;
|
|
46
|
-
font-weight: 700;
|
|
47
|
-
letter-spacing: 0.04em;
|
|
48
|
-
text-transform: uppercase;
|
|
49
|
-
color: var(--oc-severity-color);
|
|
50
|
-
background: oklch(from var(--oc-severity-color) l c h / 0.14);
|
|
51
|
-
border: 1px solid oklch(from var(--oc-severity-color) l c h / 0.35);
|
|
52
|
-
border-radius: 999px;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/* Chevron (CSS borders), rotates when open. */
|
|
56
|
-
.oc-severity-card-head::after {
|
|
57
|
-
content: "";
|
|
58
|
-
flex-shrink: 0;
|
|
59
|
-
inline-size: 0.45rem;
|
|
60
|
-
block-size: 0.45rem;
|
|
61
|
-
margin-inline: 0.25rem;
|
|
62
|
-
border-inline-end: 1.5px solid var(--oc-muted-foreground);
|
|
63
|
-
border-block-end: 1.5px solid var(--oc-muted-foreground);
|
|
64
|
-
rotate: 45deg;
|
|
65
|
-
translate: 0 -0.15rem;
|
|
66
|
-
transition: rotate var(--oc-transition-fast);
|
|
67
|
-
}
|
|
68
|
-
.oc-severity-card[open] > .oc-severity-card-head::after { rotate: 225deg; translate: 0 0.1rem; }
|
|
69
|
-
|
|
70
|
-
/* Body: details text and an action row. Height animates where ::details-content is supported. */
|
|
71
|
-
.oc-severity-card::details-content { block-size: 0; overflow: clip; transition: block-size var(--oc-transition-normal), content-visibility var(--oc-transition-normal) allow-discrete; }
|
|
72
|
-
.oc-severity-card[open]::details-content { block-size: auto; }
|
|
73
|
-
.oc-severity-card-body { padding: 0 1rem 1rem 3rem; font-size: 0.875rem; line-height: 1.6; color: var(--oc-muted-foreground); }
|
|
74
|
-
.oc-severity-card-body > :first-child { margin-block-start: 0; }
|
|
75
|
-
.oc-severity-card-actions { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-block-start: 0.75rem; }
|
|
76
|
-
|
|
77
|
-
/* Levels (theme tokens; critical is a deeper red). */
|
|
78
|
-
.oc-severity-card--low { --oc-severity-color: var(--oc-success); }
|
|
79
|
-
.oc-severity-card--medium { --oc-severity-color: var(--oc-warning); }
|
|
80
|
-
.oc-severity-card--high { --oc-severity-color: var(--oc-destructive); }
|
|
81
|
-
.oc-severity-card--critical { --oc-severity-color: light-dark(var(--color-red-95), var(--color-red-30)); }
|
|
82
|
-
.oc-severity-card--critical .oc-severity-card-level { color: var(--oc-destructive-foreground); background: var(--oc-severity-color); }
|
|
83
|
-
|
|
84
|
-
/* Resolved: back to neutral colors, title struck through. */
|
|
85
|
-
.oc-severity-card.is-resolved { --oc-severity-color: var(--oc-muted-foreground); background: var(--oc-surface); }
|
|
86
|
-
.oc-severity-card.is-resolved .oc-severity-card-title { text-decoration: line-through; }
|
|
87
|
-
|
|
88
|
-
@media (prefers-reduced-motion: reduce) {
|
|
89
|
-
.oc-severity-card::details-content,
|
|
90
|
-
.oc-severity-card-head::after { transition: none; }
|
|
91
|
-
}
|
|
1
|
+
/* File: packages/ui/src/parts/app-severity-card.css | Map: card (details) -> head (summary) -> icon + title + tags -> level badge + chevron -> body + actions -> severity modifiers -> resolved state -> reduced motion */
|
|
2
|
+
/* Severity card: risk-colored expandable card (security finding, incident, audit item).
|
|
3
|
+
Built on <details> / <summary>, so it opens without JavaScript; same name="..." makes a group exclusive.
|
|
4
|
+
Levels: --low, --medium, --high, --critical. Resolved: .is-resolved (muted, no color). */
|
|
5
|
+
|
|
6
|
+
.oc-severity-card {
|
|
7
|
+
--oc-severity-color: var(--oc-muted-foreground);
|
|
8
|
+
overflow: hidden;
|
|
9
|
+
color: var(--oc-foreground);
|
|
10
|
+
background: color-mix(in oklch, var(--oc-severity-color) 6%, var(--oc-card));
|
|
11
|
+
border: 1px solid oklch(from var(--oc-severity-color) l c h / 0.3);
|
|
12
|
+
border-inline-start-width: 3px;
|
|
13
|
+
border-inline-start-color: var(--oc-severity-color);
|
|
14
|
+
border-radius: calc(var(--oc-radius) + 4px);
|
|
15
|
+
interpolate-size: allow-keywords;
|
|
16
|
+
}
|
|
17
|
+
.oc-severity-card + .oc-severity-card { margin-block-start: 0.5rem; }
|
|
18
|
+
|
|
19
|
+
/* Head row (summary): icon, title + tags, level badge, chevron. */
|
|
20
|
+
.oc-severity-card-head {
|
|
21
|
+
display: flex;
|
|
22
|
+
align-items: center;
|
|
23
|
+
gap: 0.75rem;
|
|
24
|
+
padding: 0.875rem 1rem;
|
|
25
|
+
cursor: pointer;
|
|
26
|
+
list-style: none;
|
|
27
|
+
user-select: none;
|
|
28
|
+
}
|
|
29
|
+
.oc-severity-card-head::-webkit-details-marker { display: none; }
|
|
30
|
+
.oc-severity-card-head:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
|
|
31
|
+
.oc-severity-card-head:hover { background: oklch(from var(--oc-severity-color) l c h / 0.06); }
|
|
32
|
+
|
|
33
|
+
.oc-severity-card-icon { display: inline-flex; flex-shrink: 0; color: var(--oc-severity-color); }
|
|
34
|
+
.oc-severity-card-icon svg { inline-size: 1.25rem; block-size: 1.25rem; }
|
|
35
|
+
.oc-severity-card-main { flex: 1; min-inline-size: 0; }
|
|
36
|
+
.oc-severity-card-title { display: block; overflow: hidden; font-size: 0.875rem; font-weight: 600; text-overflow: ellipsis; white-space: nowrap; color: var(--oc-severity-color); }
|
|
37
|
+
/* Tags under the title (data types, categories). */
|
|
38
|
+
.oc-severity-card-tags { display: flex; flex-wrap: wrap; gap: 0.25rem; margin-block-start: 0.375rem; }
|
|
39
|
+
.oc-severity-card-tag { padding: 0.125rem 0.375rem; font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.6875rem; color: var(--oc-muted-foreground); background: var(--oc-muted); border-radius: 4px; }
|
|
40
|
+
|
|
41
|
+
/* Level badge ("High") in the severity color. */
|
|
42
|
+
.oc-severity-card-level {
|
|
43
|
+
flex-shrink: 0;
|
|
44
|
+
padding: 0.2rem 0.5rem;
|
|
45
|
+
font-size: 0.6875rem;
|
|
46
|
+
font-weight: 700;
|
|
47
|
+
letter-spacing: 0.04em;
|
|
48
|
+
text-transform: uppercase;
|
|
49
|
+
color: var(--oc-severity-color);
|
|
50
|
+
background: oklch(from var(--oc-severity-color) l c h / 0.14);
|
|
51
|
+
border: 1px solid oklch(from var(--oc-severity-color) l c h / 0.35);
|
|
52
|
+
border-radius: 999px;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* Chevron (CSS borders), rotates when open. */
|
|
56
|
+
.oc-severity-card-head::after {
|
|
57
|
+
content: "";
|
|
58
|
+
flex-shrink: 0;
|
|
59
|
+
inline-size: 0.45rem;
|
|
60
|
+
block-size: 0.45rem;
|
|
61
|
+
margin-inline: 0.25rem;
|
|
62
|
+
border-inline-end: 1.5px solid var(--oc-muted-foreground);
|
|
63
|
+
border-block-end: 1.5px solid var(--oc-muted-foreground);
|
|
64
|
+
rotate: 45deg;
|
|
65
|
+
translate: 0 -0.15rem;
|
|
66
|
+
transition: rotate var(--oc-transition-fast);
|
|
67
|
+
}
|
|
68
|
+
.oc-severity-card[open] > .oc-severity-card-head::after { rotate: 225deg; translate: 0 0.1rem; }
|
|
69
|
+
|
|
70
|
+
/* Body: details text and an action row. Height animates where ::details-content is supported. */
|
|
71
|
+
.oc-severity-card::details-content { block-size: 0; overflow: clip; transition: block-size var(--oc-transition-normal), content-visibility var(--oc-transition-normal) allow-discrete; }
|
|
72
|
+
.oc-severity-card[open]::details-content { block-size: auto; }
|
|
73
|
+
.oc-severity-card-body { padding: 0 1rem 1rem 3rem; font-size: 0.875rem; line-height: 1.6; color: var(--oc-muted-foreground); }
|
|
74
|
+
.oc-severity-card-body > :first-child { margin-block-start: 0; }
|
|
75
|
+
.oc-severity-card-actions { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-block-start: 0.75rem; }
|
|
76
|
+
|
|
77
|
+
/* Levels (theme tokens; critical is a deeper red). */
|
|
78
|
+
.oc-severity-card--low { --oc-severity-color: var(--oc-success); }
|
|
79
|
+
.oc-severity-card--medium { --oc-severity-color: var(--oc-warning); }
|
|
80
|
+
.oc-severity-card--high { --oc-severity-color: var(--oc-destructive); }
|
|
81
|
+
.oc-severity-card--critical { --oc-severity-color: light-dark(var(--color-red-95), var(--color-red-30)); }
|
|
82
|
+
.oc-severity-card--critical .oc-severity-card-level { color: var(--oc-destructive-foreground); background: var(--oc-severity-color); }
|
|
83
|
+
|
|
84
|
+
/* Resolved: back to neutral colors, title struck through. */
|
|
85
|
+
.oc-severity-card.is-resolved { --oc-severity-color: var(--oc-muted-foreground); background: var(--oc-surface); }
|
|
86
|
+
.oc-severity-card.is-resolved .oc-severity-card-title { text-decoration: line-through; }
|
|
87
|
+
|
|
88
|
+
@media (prefers-reduced-motion: reduce) {
|
|
89
|
+
.oc-severity-card::details-content,
|
|
90
|
+
.oc-severity-card-head::after { transition: none; }
|
|
91
|
+
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
/* File: packages/ui/src/parts/app-sidebar-dark.css | Map: dark sidebar -> active item accent
|
|
2
|
-
.oc-sidebar--dark: a sidebar that stays dark in the light theme too (classic CMS admin look).
|
|
3
|
-
All --oc-* tokens are light-dark() pairs, so color-scheme: dark on the sidebar switches every token inside it.
|
|
4
|
-
Based on the Verdavita admin sidebar. */
|
|
5
|
-
|
|
6
|
-
.oc-sidebar--dark {
|
|
7
|
-
color-scheme: dark;
|
|
8
|
-
background: var(--oc-card);
|
|
9
|
-
color: var(--oc-foreground);
|
|
10
|
-
border-color: var(--oc-border);
|
|
11
|
-
}
|
|
12
|
-
.oc-sidebar--dark .oc-sidebar-menu-button[aria-current="page"],
|
|
13
|
-
.oc-sidebar--dark .oc-sidebar-menu-button.is-active {
|
|
14
|
-
box-shadow: inset 3px 0 0 var(--oc-primary);
|
|
15
|
-
}
|
|
1
|
+
/* File: packages/ui/src/parts/app-sidebar-dark.css | Map: dark sidebar -> active item accent
|
|
2
|
+
.oc-sidebar--dark: a sidebar that stays dark in the light theme too (classic CMS admin look).
|
|
3
|
+
All --oc-* tokens are light-dark() pairs, so color-scheme: dark on the sidebar switches every token inside it.
|
|
4
|
+
Based on the Verdavita admin sidebar. */
|
|
5
|
+
|
|
6
|
+
.oc-sidebar--dark {
|
|
7
|
+
color-scheme: dark;
|
|
8
|
+
background: var(--oc-card);
|
|
9
|
+
color: var(--oc-foreground);
|
|
10
|
+
border-color: var(--oc-border);
|
|
11
|
+
}
|
|
12
|
+
.oc-sidebar--dark .oc-sidebar-menu-button[aria-current="page"],
|
|
13
|
+
.oc-sidebar--dark .oc-sidebar-menu-button.is-active {
|
|
14
|
+
box-shadow: inset 3px 0 0 var(--oc-primary);
|
|
15
|
+
}
|