@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
package/dist/parts/app-tree.css
CHANGED
|
@@ -1,104 +1,104 @@
|
|
|
1
|
-
/* File: packages/ui/src/parts/app-tree.css | Map: wrapper (scroll box) -> head row -> lists + indent -> row -> chevron (details) -> label + icon -> sticky actions -> states -> sticky modifier */
|
|
2
|
-
/* Tree: nested list of folders (<details>) and leaves. Names may scroll horizontally;
|
|
3
|
-
the action column (.oc-tree-actions) stays pinned to the end edge with position: sticky.
|
|
4
|
-
Open / close is native <details>; no JavaScript. Selected row: aria-current="true" or .is-selected. */
|
|
5
|
-
|
|
6
|
-
/* Scroll box around the whole tree. Card look by default. */
|
|
7
|
-
.oc-tree {
|
|
8
|
-
--oc-tree-row: 2rem;
|
|
9
|
-
--oc-tree-indent: 1rem;
|
|
10
|
-
--oc-tree-bg: var(--oc-card);
|
|
11
|
-
overflow: auto;
|
|
12
|
-
max-block-size: var(--oc-tree-height, none);
|
|
13
|
-
font-size: 0.875rem;
|
|
14
|
-
color: var(--oc-foreground);
|
|
15
|
-
background: var(--oc-tree-bg);
|
|
16
|
-
border: 1px solid var(--oc-border);
|
|
17
|
-
border-radius: var(--oc-radius);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/* Optional head row (root of the tree, e.g. "All projects"). Sticks to the top while scrolling. */
|
|
21
|
-
.oc-tree-head {
|
|
22
|
-
position: sticky;
|
|
23
|
-
inset-block-start: 0;
|
|
24
|
-
z-index: 2;
|
|
25
|
-
font-weight: 600;
|
|
26
|
-
background: var(--oc-tree-bg);
|
|
27
|
-
border-block-end: 1px solid var(--oc-border);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/* Lists: no bullets; each nested list moves one indent step inward. */
|
|
31
|
-
.oc-tree-list { margin: 0; padding: 0.25rem 0; list-style: none; min-inline-size: max-content; }
|
|
32
|
-
.oc-tree-list .oc-tree-list { padding-block: 0; padding-inline-start: var(--oc-tree-indent); }
|
|
33
|
-
|
|
34
|
-
/* One row: chevron + icon + label, then the actions. Works on <summary>, <div>, <a> or <button>. */
|
|
35
|
-
.oc-tree-row {
|
|
36
|
-
display: flex;
|
|
37
|
-
align-items: center;
|
|
38
|
-
gap: 0.375rem;
|
|
39
|
-
min-block-size: var(--oc-tree-row);
|
|
40
|
-
padding-inline: 0.5rem 0;
|
|
41
|
-
color: inherit;
|
|
42
|
-
text-decoration: none;
|
|
43
|
-
list-style: none;
|
|
44
|
-
}
|
|
45
|
-
summary.oc-tree-row { cursor: pointer; }
|
|
46
|
-
.oc-tree-row::-webkit-details-marker { display: none; }
|
|
47
|
-
.oc-tree-row:hover { background: var(--oc-accent); }
|
|
48
|
-
.oc-tree-row:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
|
|
49
|
-
|
|
50
|
-
/* Chevron: drawn with borders. Folders rotate it when open; leaves keep an empty spacer. */
|
|
51
|
-
.oc-tree-row::before {
|
|
52
|
-
content: "";
|
|
53
|
-
flex-shrink: 0;
|
|
54
|
-
inline-size: 0.4rem;
|
|
55
|
-
block-size: 0.4rem;
|
|
56
|
-
margin-inline: 0.2rem 0.35rem;
|
|
57
|
-
border-inline-end: 1.5px solid currentColor;
|
|
58
|
-
border-block-end: 1.5px solid currentColor;
|
|
59
|
-
color: var(--oc-muted-foreground);
|
|
60
|
-
rotate: -45deg;
|
|
61
|
-
transition: rotate var(--oc-transition-fast);
|
|
62
|
-
}
|
|
63
|
-
.oc-tree-node[open] > .oc-tree-row::before { rotate: 45deg; }
|
|
64
|
-
.oc-tree-row:not(summary)::before { visibility: hidden; }
|
|
65
|
-
|
|
66
|
-
/* Icon and label. The label never wraps; long names make the box scroll sideways. */
|
|
67
|
-
.oc-tree-icon { display: inline-flex; flex-shrink: 0; color: var(--oc-muted-foreground); }
|
|
68
|
-
.oc-tree-icon svg { inline-size: 1rem; block-size: 1rem; }
|
|
69
|
-
.oc-tree-label { flex: 1 0 auto; white-space: nowrap; padding-inline-end: 0.75rem; color: inherit; text-decoration: none; }
|
|
70
|
-
/* A leaf row is a div; its label may be a link (no buttons inside links). */
|
|
71
|
-
a.oc-tree-label:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 1px; border-radius: 2px; }
|
|
72
|
-
.oc-tree-count { margin-inline-end: 0.5rem; font-size: 0.75rem; color: var(--oc-muted-foreground); font-variant-numeric: tabular-nums; }
|
|
73
|
-
|
|
74
|
-
/* Actions: pinned to the end edge, with the row background behind it so names slide underneath. */
|
|
75
|
-
.oc-tree-actions {
|
|
76
|
-
position: sticky;
|
|
77
|
-
inset-inline-end: 0;
|
|
78
|
-
z-index: 1;
|
|
79
|
-
display: inline-flex;
|
|
80
|
-
align-items: center;
|
|
81
|
-
gap: 0.125rem;
|
|
82
|
-
margin-inline-start: auto;
|
|
83
|
-
padding-inline: 0.5rem 0.375rem;
|
|
84
|
-
background: var(--oc-tree-bg);
|
|
85
|
-
box-shadow: -0.75rem 0 0.75rem -0.75rem oklch(from var(--color-black-60) l c h / 0.25);
|
|
86
|
-
}
|
|
87
|
-
.oc-tree-row:hover > .oc-tree-actions { background: linear-gradient(var(--oc-accent), var(--oc-accent)), var(--oc-tree-bg); }
|
|
88
|
-
/* Hide actions until hover or focus (optional): .oc-tree--quiet */
|
|
89
|
-
.oc-tree--quiet .oc-tree-actions { opacity: 0; }
|
|
90
|
-
.oc-tree--quiet .oc-tree-row:is(:hover, :focus-within) > .oc-tree-actions { opacity: 1; }
|
|
91
|
-
|
|
92
|
-
/* Selected row: tinted with the primary token. */
|
|
93
|
-
.oc-tree-row:is([aria-current="true"], .is-selected, :has(> .oc-tree-label[aria-current="true"])) { color: var(--oc-primary); font-weight: 500; background: oklch(from var(--oc-primary) l c h / 0.1); }
|
|
94
|
-
.oc-tree-row:is([aria-current="true"], .is-selected, :has(> .oc-tree-label[aria-current="true"])) > .oc-tree-actions { background: linear-gradient(oklch(from var(--oc-primary) l c h / 0.1), oklch(from var(--oc-primary) l c h / 0.1)), var(--oc-tree-bg); }
|
|
95
|
-
/* Muted row (archived, empty folder). */
|
|
96
|
-
.oc-tree-row.is-muted { color: var(--oc-muted-foreground); }
|
|
97
|
-
|
|
98
|
-
/* Flush: no frame, for use inside a card or sidebar. */
|
|
99
|
-
.oc-tree--flush { border: 0; border-radius: 0; --oc-tree-bg: transparent; }
|
|
100
|
-
.oc-tree--flush .oc-tree-actions { background: var(--oc-card); }
|
|
101
|
-
|
|
102
|
-
@media (prefers-reduced-motion: reduce) {
|
|
103
|
-
.oc-tree-row::before { transition: none; }
|
|
104
|
-
}
|
|
1
|
+
/* File: packages/ui/src/parts/app-tree.css | Map: wrapper (scroll box) -> head row -> lists + indent -> row -> chevron (details) -> label + icon -> sticky actions -> states -> sticky modifier */
|
|
2
|
+
/* Tree: nested list of folders (<details>) and leaves. Names may scroll horizontally;
|
|
3
|
+
the action column (.oc-tree-actions) stays pinned to the end edge with position: sticky.
|
|
4
|
+
Open / close is native <details>; no JavaScript. Selected row: aria-current="true" or .is-selected. */
|
|
5
|
+
|
|
6
|
+
/* Scroll box around the whole tree. Card look by default. */
|
|
7
|
+
.oc-tree {
|
|
8
|
+
--oc-tree-row: 2rem;
|
|
9
|
+
--oc-tree-indent: 1rem;
|
|
10
|
+
--oc-tree-bg: var(--oc-card);
|
|
11
|
+
overflow: auto;
|
|
12
|
+
max-block-size: var(--oc-tree-height, none);
|
|
13
|
+
font-size: 0.875rem;
|
|
14
|
+
color: var(--oc-foreground);
|
|
15
|
+
background: var(--oc-tree-bg);
|
|
16
|
+
border: 1px solid var(--oc-border);
|
|
17
|
+
border-radius: var(--oc-radius);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* Optional head row (root of the tree, e.g. "All projects"). Sticks to the top while scrolling. */
|
|
21
|
+
.oc-tree-head {
|
|
22
|
+
position: sticky;
|
|
23
|
+
inset-block-start: 0;
|
|
24
|
+
z-index: 2;
|
|
25
|
+
font-weight: 600;
|
|
26
|
+
background: var(--oc-tree-bg);
|
|
27
|
+
border-block-end: 1px solid var(--oc-border);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* Lists: no bullets; each nested list moves one indent step inward. */
|
|
31
|
+
.oc-tree-list { margin: 0; padding: 0.25rem 0; list-style: none; min-inline-size: max-content; }
|
|
32
|
+
.oc-tree-list .oc-tree-list { padding-block: 0; padding-inline-start: var(--oc-tree-indent); }
|
|
33
|
+
|
|
34
|
+
/* One row: chevron + icon + label, then the actions. Works on <summary>, <div>, <a> or <button>. */
|
|
35
|
+
.oc-tree-row {
|
|
36
|
+
display: flex;
|
|
37
|
+
align-items: center;
|
|
38
|
+
gap: 0.375rem;
|
|
39
|
+
min-block-size: var(--oc-tree-row);
|
|
40
|
+
padding-inline: 0.5rem 0;
|
|
41
|
+
color: inherit;
|
|
42
|
+
text-decoration: none;
|
|
43
|
+
list-style: none;
|
|
44
|
+
}
|
|
45
|
+
summary.oc-tree-row { cursor: pointer; }
|
|
46
|
+
.oc-tree-row::-webkit-details-marker { display: none; }
|
|
47
|
+
.oc-tree-row:hover { background: var(--oc-accent); }
|
|
48
|
+
.oc-tree-row:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
|
|
49
|
+
|
|
50
|
+
/* Chevron: drawn with borders. Folders rotate it when open; leaves keep an empty spacer. */
|
|
51
|
+
.oc-tree-row::before {
|
|
52
|
+
content: "";
|
|
53
|
+
flex-shrink: 0;
|
|
54
|
+
inline-size: 0.4rem;
|
|
55
|
+
block-size: 0.4rem;
|
|
56
|
+
margin-inline: 0.2rem 0.35rem;
|
|
57
|
+
border-inline-end: 1.5px solid currentColor;
|
|
58
|
+
border-block-end: 1.5px solid currentColor;
|
|
59
|
+
color: var(--oc-muted-foreground);
|
|
60
|
+
rotate: -45deg;
|
|
61
|
+
transition: rotate var(--oc-transition-fast);
|
|
62
|
+
}
|
|
63
|
+
.oc-tree-node[open] > .oc-tree-row::before { rotate: 45deg; }
|
|
64
|
+
.oc-tree-row:not(summary)::before { visibility: hidden; }
|
|
65
|
+
|
|
66
|
+
/* Icon and label. The label never wraps; long names make the box scroll sideways. */
|
|
67
|
+
.oc-tree-icon { display: inline-flex; flex-shrink: 0; color: var(--oc-muted-foreground); }
|
|
68
|
+
.oc-tree-icon svg { inline-size: 1rem; block-size: 1rem; }
|
|
69
|
+
.oc-tree-label { flex: 1 0 auto; white-space: nowrap; padding-inline-end: 0.75rem; color: inherit; text-decoration: none; }
|
|
70
|
+
/* A leaf row is a div; its label may be a link (no buttons inside links). */
|
|
71
|
+
a.oc-tree-label:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 1px; border-radius: 2px; }
|
|
72
|
+
.oc-tree-count { margin-inline-end: 0.5rem; font-size: 0.75rem; color: var(--oc-muted-foreground); font-variant-numeric: tabular-nums; }
|
|
73
|
+
|
|
74
|
+
/* Actions: pinned to the end edge, with the row background behind it so names slide underneath. */
|
|
75
|
+
.oc-tree-actions {
|
|
76
|
+
position: sticky;
|
|
77
|
+
inset-inline-end: 0;
|
|
78
|
+
z-index: 1;
|
|
79
|
+
display: inline-flex;
|
|
80
|
+
align-items: center;
|
|
81
|
+
gap: 0.125rem;
|
|
82
|
+
margin-inline-start: auto;
|
|
83
|
+
padding-inline: 0.5rem 0.375rem;
|
|
84
|
+
background: var(--oc-tree-bg);
|
|
85
|
+
box-shadow: -0.75rem 0 0.75rem -0.75rem oklch(from var(--color-black-60) l c h / 0.25);
|
|
86
|
+
}
|
|
87
|
+
.oc-tree-row:hover > .oc-tree-actions { background: linear-gradient(var(--oc-accent), var(--oc-accent)), var(--oc-tree-bg); }
|
|
88
|
+
/* Hide actions until hover or focus (optional): .oc-tree--quiet */
|
|
89
|
+
.oc-tree--quiet .oc-tree-actions { opacity: 0; }
|
|
90
|
+
.oc-tree--quiet .oc-tree-row:is(:hover, :focus-within) > .oc-tree-actions { opacity: 1; }
|
|
91
|
+
|
|
92
|
+
/* Selected row: tinted with the primary token. */
|
|
93
|
+
.oc-tree-row:is([aria-current="true"], .is-selected, :has(> .oc-tree-label[aria-current="true"])) { color: var(--oc-primary); font-weight: 500; background: oklch(from var(--oc-primary) l c h / 0.1); }
|
|
94
|
+
.oc-tree-row:is([aria-current="true"], .is-selected, :has(> .oc-tree-label[aria-current="true"])) > .oc-tree-actions { background: linear-gradient(oklch(from var(--oc-primary) l c h / 0.1), oklch(from var(--oc-primary) l c h / 0.1)), var(--oc-tree-bg); }
|
|
95
|
+
/* Muted row (archived, empty folder). */
|
|
96
|
+
.oc-tree-row.is-muted { color: var(--oc-muted-foreground); }
|
|
97
|
+
|
|
98
|
+
/* Flush: no frame, for use inside a card or sidebar. */
|
|
99
|
+
.oc-tree--flush { border: 0; border-radius: 0; --oc-tree-bg: transparent; }
|
|
100
|
+
.oc-tree--flush .oc-tree-actions { background: var(--oc-card); }
|
|
101
|
+
|
|
102
|
+
@media (prefers-reduced-motion: reduce) {
|
|
103
|
+
.oc-tree-row::before { transition: none; }
|
|
104
|
+
}
|
|
@@ -1,90 +1,90 @@
|
|
|
1
|
-
/* File: packages/ui/src/parts/app-upgrade-banner.css | Map: callout -> icon -> body (title + plan badge, text) -> usage meter -> actions + dismiss -> modifiers (premium, compact) */
|
|
2
|
-
/* Upgrade banner: soft callout for a free plan with limits ("3 of 5 projects used - upgrade").
|
|
3
|
-
Usage is a native <meter> element. Tone follows --oc-upgrade-color (warning by default). */
|
|
4
|
-
|
|
5
|
-
.oc-upgrade-banner {
|
|
6
|
-
--oc-upgrade-color: var(--oc-warning);
|
|
7
|
-
position: relative;
|
|
8
|
-
display: flex;
|
|
9
|
-
flex-wrap: wrap;
|
|
10
|
-
align-items: flex-start;
|
|
11
|
-
gap: 0.75rem 1rem;
|
|
12
|
-
padding: 1rem 1.25rem;
|
|
13
|
-
font-size: 0.875rem;
|
|
14
|
-
color: var(--oc-foreground);
|
|
15
|
-
background: color-mix(in oklch, var(--oc-upgrade-color) 8%, var(--oc-card));
|
|
16
|
-
border: 1px solid oklch(from var(--oc-upgrade-color) l c h / 0.35);
|
|
17
|
-
border-radius: calc(var(--oc-radius) + 4px);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/* Icon (sparkle, crown, lock) in the tone color. */
|
|
21
|
-
.oc-upgrade-banner-icon { display: inline-flex; flex-shrink: 0; color: var(--oc-upgrade-color); }
|
|
22
|
-
.oc-upgrade-banner-icon svg { inline-size: 1.25rem; block-size: 1.25rem; }
|
|
23
|
-
|
|
24
|
-
/* Text column. */
|
|
25
|
-
.oc-upgrade-banner-body { flex: 1 1 18rem; min-inline-size: 0; }
|
|
26
|
-
.oc-upgrade-banner-title { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; margin: 0; font-size: 0.9375rem; font-weight: 600; }
|
|
27
|
-
.oc-upgrade-banner-plan {
|
|
28
|
-
padding: 0.125rem 0.5rem;
|
|
29
|
-
font-size: 0.6875rem;
|
|
30
|
-
font-weight: 600;
|
|
31
|
-
color: var(--oc-upgrade-color);
|
|
32
|
-
background: oklch(from var(--oc-upgrade-color) l c h / 0.14);
|
|
33
|
-
border-radius: 999px;
|
|
34
|
-
}
|
|
35
|
-
.oc-upgrade-banner-text { margin: 0.25rem 0 0; line-height: 1.55; color: var(--oc-muted-foreground); }
|
|
36
|
-
.oc-upgrade-banner-text a { color: var(--oc-primary); }
|
|
37
|
-
|
|
38
|
-
/* Usage row: label + <meter> + "3 / 5". */
|
|
39
|
-
.oc-upgrade-banner-usage { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 0.5rem; margin-block-start: 0.625rem; font-size: 0.75rem; color: var(--oc-muted-foreground); }
|
|
40
|
-
.oc-upgrade-banner-meter {
|
|
41
|
-
inline-size: 100%;
|
|
42
|
-
block-size: 0.375rem;
|
|
43
|
-
appearance: none;
|
|
44
|
-
background: var(--oc-surface-strong);
|
|
45
|
-
border: 0;
|
|
46
|
-
border-radius: 999px;
|
|
47
|
-
}
|
|
48
|
-
.oc-upgrade-banner-meter::-webkit-meter-bar { background: var(--oc-surface-strong); border: 0; border-radius: 999px; block-size: 0.375rem; }
|
|
49
|
-
.oc-upgrade-banner-meter::-webkit-meter-optimum-value,
|
|
50
|
-
.oc-upgrade-banner-meter::-webkit-meter-suboptimum-value,
|
|
51
|
-
.oc-upgrade-banner-meter::-webkit-meter-even-less-good-value { background: var(--oc-upgrade-color); border-radius: 999px; }
|
|
52
|
-
.oc-upgrade-banner-meter::-moz-meter-bar { background: var(--oc-upgrade-color); border-radius: 999px; }
|
|
53
|
-
|
|
54
|
-
/* Actions: upgrade button (+ secondary link). */
|
|
55
|
-
.oc-upgrade-banner-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; align-self: center; }
|
|
56
|
-
|
|
57
|
-
/* Dismiss (X) in the top corner; the app hides the banner (hidden attribute). */
|
|
58
|
-
.oc-upgrade-banner-dismiss {
|
|
59
|
-
position: absolute;
|
|
60
|
-
inset-block-start: 0.5rem;
|
|
61
|
-
inset-inline-end: 0.5rem;
|
|
62
|
-
display: grid;
|
|
63
|
-
place-items: center;
|
|
64
|
-
inline-size: 1.75rem;
|
|
65
|
-
block-size: 1.75rem;
|
|
66
|
-
padding: 0;
|
|
67
|
-
font-size: 1.1rem;
|
|
68
|
-
line-height: 1;
|
|
69
|
-
color: var(--oc-muted-foreground);
|
|
70
|
-
background: none;
|
|
71
|
-
border: 0;
|
|
72
|
-
border-radius: var(--oc-radius);
|
|
73
|
-
cursor: pointer;
|
|
74
|
-
}
|
|
75
|
-
.oc-upgrade-banner-dismiss:hover { color: var(--oc-foreground); background: var(--oc-accent); }
|
|
76
|
-
.oc-upgrade-banner-dismiss:focus-visible { outline: 2px solid var(--oc-ring); }
|
|
77
|
-
.oc-upgrade-banner:has(.oc-upgrade-banner-dismiss) { padding-inline-end: 2.75rem; }
|
|
78
|
-
.oc-upgrade-banner[hidden] { display: none; }
|
|
79
|
-
|
|
80
|
-
/* Premium: brand gradient frame and primary tone. */
|
|
81
|
-
.oc-upgrade-banner--premium {
|
|
82
|
-
--oc-upgrade-color: var(--oc-primary);
|
|
83
|
-
border-color: transparent;
|
|
84
|
-
background: linear-gradient(color-mix(in oklch, var(--oc-primary) 6%, var(--oc-card)), color-mix(in oklch, var(--oc-primary) 6%, var(--oc-card))) padding-box, var(--oc-gradient-brand) border-box;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/* Compact: one line (title + text inline), smaller padding. */
|
|
88
|
-
.oc-upgrade-banner--compact { align-items: center; padding: 0.5rem 0.75rem; }
|
|
89
|
-
.oc-upgrade-banner--compact .oc-upgrade-banner-body { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.25rem 0.5rem; }
|
|
90
|
-
.oc-upgrade-banner--compact .oc-upgrade-banner-text { margin: 0; }
|
|
1
|
+
/* File: packages/ui/src/parts/app-upgrade-banner.css | Map: callout -> icon -> body (title + plan badge, text) -> usage meter -> actions + dismiss -> modifiers (premium, compact) */
|
|
2
|
+
/* Upgrade banner: soft callout for a free plan with limits ("3 of 5 projects used - upgrade").
|
|
3
|
+
Usage is a native <meter> element. Tone follows --oc-upgrade-color (warning by default). */
|
|
4
|
+
|
|
5
|
+
.oc-upgrade-banner {
|
|
6
|
+
--oc-upgrade-color: var(--oc-warning);
|
|
7
|
+
position: relative;
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-wrap: wrap;
|
|
10
|
+
align-items: flex-start;
|
|
11
|
+
gap: 0.75rem 1rem;
|
|
12
|
+
padding: 1rem 1.25rem;
|
|
13
|
+
font-size: 0.875rem;
|
|
14
|
+
color: var(--oc-foreground);
|
|
15
|
+
background: color-mix(in oklch, var(--oc-upgrade-color) 8%, var(--oc-card));
|
|
16
|
+
border: 1px solid oklch(from var(--oc-upgrade-color) l c h / 0.35);
|
|
17
|
+
border-radius: calc(var(--oc-radius) + 4px);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* Icon (sparkle, crown, lock) in the tone color. */
|
|
21
|
+
.oc-upgrade-banner-icon { display: inline-flex; flex-shrink: 0; color: var(--oc-upgrade-color); }
|
|
22
|
+
.oc-upgrade-banner-icon svg { inline-size: 1.25rem; block-size: 1.25rem; }
|
|
23
|
+
|
|
24
|
+
/* Text column. */
|
|
25
|
+
.oc-upgrade-banner-body { flex: 1 1 18rem; min-inline-size: 0; }
|
|
26
|
+
.oc-upgrade-banner-title { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; margin: 0; font-size: 0.9375rem; font-weight: 600; }
|
|
27
|
+
.oc-upgrade-banner-plan {
|
|
28
|
+
padding: 0.125rem 0.5rem;
|
|
29
|
+
font-size: 0.6875rem;
|
|
30
|
+
font-weight: 600;
|
|
31
|
+
color: var(--oc-upgrade-color);
|
|
32
|
+
background: oklch(from var(--oc-upgrade-color) l c h / 0.14);
|
|
33
|
+
border-radius: 999px;
|
|
34
|
+
}
|
|
35
|
+
.oc-upgrade-banner-text { margin: 0.25rem 0 0; line-height: 1.55; color: var(--oc-muted-foreground); }
|
|
36
|
+
.oc-upgrade-banner-text a { color: var(--oc-primary); }
|
|
37
|
+
|
|
38
|
+
/* Usage row: label + <meter> + "3 / 5". */
|
|
39
|
+
.oc-upgrade-banner-usage { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 0.5rem; margin-block-start: 0.625rem; font-size: 0.75rem; color: var(--oc-muted-foreground); }
|
|
40
|
+
.oc-upgrade-banner-meter {
|
|
41
|
+
inline-size: 100%;
|
|
42
|
+
block-size: 0.375rem;
|
|
43
|
+
appearance: none;
|
|
44
|
+
background: var(--oc-surface-strong);
|
|
45
|
+
border: 0;
|
|
46
|
+
border-radius: 999px;
|
|
47
|
+
}
|
|
48
|
+
.oc-upgrade-banner-meter::-webkit-meter-bar { background: var(--oc-surface-strong); border: 0; border-radius: 999px; block-size: 0.375rem; }
|
|
49
|
+
.oc-upgrade-banner-meter::-webkit-meter-optimum-value,
|
|
50
|
+
.oc-upgrade-banner-meter::-webkit-meter-suboptimum-value,
|
|
51
|
+
.oc-upgrade-banner-meter::-webkit-meter-even-less-good-value { background: var(--oc-upgrade-color); border-radius: 999px; }
|
|
52
|
+
.oc-upgrade-banner-meter::-moz-meter-bar { background: var(--oc-upgrade-color); border-radius: 999px; }
|
|
53
|
+
|
|
54
|
+
/* Actions: upgrade button (+ secondary link). */
|
|
55
|
+
.oc-upgrade-banner-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; align-self: center; }
|
|
56
|
+
|
|
57
|
+
/* Dismiss (X) in the top corner; the app hides the banner (hidden attribute). */
|
|
58
|
+
.oc-upgrade-banner-dismiss {
|
|
59
|
+
position: absolute;
|
|
60
|
+
inset-block-start: 0.5rem;
|
|
61
|
+
inset-inline-end: 0.5rem;
|
|
62
|
+
display: grid;
|
|
63
|
+
place-items: center;
|
|
64
|
+
inline-size: 1.75rem;
|
|
65
|
+
block-size: 1.75rem;
|
|
66
|
+
padding: 0;
|
|
67
|
+
font-size: 1.1rem;
|
|
68
|
+
line-height: 1;
|
|
69
|
+
color: var(--oc-muted-foreground);
|
|
70
|
+
background: none;
|
|
71
|
+
border: 0;
|
|
72
|
+
border-radius: var(--oc-radius);
|
|
73
|
+
cursor: pointer;
|
|
74
|
+
}
|
|
75
|
+
.oc-upgrade-banner-dismiss:hover { color: var(--oc-foreground); background: var(--oc-accent); }
|
|
76
|
+
.oc-upgrade-banner-dismiss:focus-visible { outline: 2px solid var(--oc-ring); }
|
|
77
|
+
.oc-upgrade-banner:has(.oc-upgrade-banner-dismiss) { padding-inline-end: 2.75rem; }
|
|
78
|
+
.oc-upgrade-banner[hidden] { display: none; }
|
|
79
|
+
|
|
80
|
+
/* Premium: brand gradient frame and primary tone. */
|
|
81
|
+
.oc-upgrade-banner--premium {
|
|
82
|
+
--oc-upgrade-color: var(--oc-primary);
|
|
83
|
+
border-color: transparent;
|
|
84
|
+
background: linear-gradient(color-mix(in oklch, var(--oc-primary) 6%, var(--oc-card)), color-mix(in oklch, var(--oc-primary) 6%, var(--oc-card))) padding-box, var(--oc-gradient-brand) border-box;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/* Compact: one line (title + text inline), smaller padding. */
|
|
88
|
+
.oc-upgrade-banner--compact { align-items: center; padding: 0.5rem 0.75rem; }
|
|
89
|
+
.oc-upgrade-banner--compact .oc-upgrade-banner-body { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.25rem 0.5rem; }
|
|
90
|
+
.oc-upgrade-banner--compact .oc-upgrade-banner-text { margin: 0; }
|
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
/* File: packages/ui/src/parts/app-version-banner.css | Map: chip -> icon + text (long / short) -> action -> tone modifiers -> floating modifier -> entry animation -> reduced motion */
|
|
2
|
-
/* Version banner: small "New version available - reload" chip, e.g. at the end of the app header.
|
|
3
|
-
Reload without JavaScript: the action is a link with href="" (the current page).
|
|
4
|
-
Show it only when your app detects a newer build (remove the hidden attribute). */
|
|
5
|
-
|
|
6
|
-
.oc-version-banner {
|
|
7
|
-
--oc-version-banner-color: var(--oc-warning);
|
|
8
|
-
display: inline-flex;
|
|
9
|
-
align-items: center;
|
|
10
|
-
gap: 0.5rem;
|
|
11
|
-
min-inline-size: 0;
|
|
12
|
-
max-inline-size: 100%;
|
|
13
|
-
padding: 0.25rem 0.25rem 0.25rem 0.625rem;
|
|
14
|
-
font-size: 0.75rem;
|
|
15
|
-
line-height: 1.3;
|
|
16
|
-
color: var(--oc-foreground);
|
|
17
|
-
background: oklch(from var(--oc-version-banner-color) l c h / 0.12);
|
|
18
|
-
border: 1px solid oklch(from var(--oc-version-banner-color) l c h / 0.4);
|
|
19
|
-
border-radius: 999px;
|
|
20
|
-
transition: opacity var(--oc-transition-normal), translate var(--oc-transition-normal);
|
|
21
|
-
@starting-style { opacity: 0; translate: 0 -0.25rem; }
|
|
22
|
-
}
|
|
23
|
-
.oc-version-banner[hidden] { display: none; }
|
|
24
|
-
|
|
25
|
-
/* Small dot in the tone color (pulses gently). */
|
|
26
|
-
.oc-version-banner-dot {
|
|
27
|
-
flex-shrink: 0;
|
|
28
|
-
inline-size: 0.5rem;
|
|
29
|
-
block-size: 0.5rem;
|
|
30
|
-
border-radius: 50%;
|
|
31
|
-
background: var(--oc-version-banner-color);
|
|
32
|
-
animation: oc-version-banner-pulse 2s ease-in-out infinite;
|
|
33
|
-
}
|
|
34
|
-
@keyframes oc-version-banner-pulse { 50% { box-shadow: 0 0 0 4px oklch(from var(--oc-version-banner-color) l c h / 0.2); } }
|
|
35
|
-
|
|
36
|
-
/* Text: the long text hides on small screens, the short one shows instead. */
|
|
37
|
-
.oc-version-banner-text { min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
38
|
-
.oc-version-banner-short { display: none; white-space: nowrap; }
|
|
39
|
-
@media (max-width: 40rem) {
|
|
40
|
-
.oc-version-banner-text:has(+ .oc-version-banner-short) { display: none; }
|
|
41
|
-
.oc-version-banner-short { display: inline; }
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/* Action (link or button): compact pill button. */
|
|
45
|
-
.oc-version-banner-action {
|
|
46
|
-
flex-shrink: 0;
|
|
47
|
-
display: inline-flex;
|
|
48
|
-
align-items: center;
|
|
49
|
-
gap: 0.25rem;
|
|
50
|
-
padding: 0.25rem 0.625rem;
|
|
51
|
-
font: inherit;
|
|
52
|
-
font-weight: 600;
|
|
53
|
-
color: var(--oc-foreground);
|
|
54
|
-
text-decoration: none;
|
|
55
|
-
background: var(--oc-background);
|
|
56
|
-
border: 1px solid oklch(from var(--oc-version-banner-color) l c h / 0.4);
|
|
57
|
-
border-radius: 999px;
|
|
58
|
-
cursor: pointer;
|
|
59
|
-
}
|
|
60
|
-
.oc-version-banner-action:hover { background: oklch(from var(--oc-version-banner-color) l c h / 0.15); }
|
|
61
|
-
.oc-version-banner-action:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 1px; }
|
|
62
|
-
|
|
63
|
-
/* Tone modifiers. */
|
|
64
|
-
.oc-version-banner--info { --oc-version-banner-color: var(--oc-primary); }
|
|
65
|
-
.oc-version-banner--success { --oc-version-banner-color: var(--oc-success); }
|
|
66
|
-
|
|
67
|
-
/* Floating: fixed at the bottom end of the window (for apps without a header slot). */
|
|
68
|
-
.oc-version-banner--floating {
|
|
69
|
-
position: fixed;
|
|
70
|
-
inset-block-end: 1rem;
|
|
71
|
-
inset-inline-end: 1rem;
|
|
72
|
-
z-index: 900;
|
|
73
|
-
background: var(--oc-popover);
|
|
74
|
-
box-shadow: 0 8px 24px oklch(from var(--color-black-60) l c h / 0.15);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
@media (prefers-reduced-motion: reduce) {
|
|
78
|
-
.oc-version-banner { transition: none; }
|
|
79
|
-
.oc-version-banner-dot { animation: none; }
|
|
80
|
-
}
|
|
1
|
+
/* File: packages/ui/src/parts/app-version-banner.css | Map: chip -> icon + text (long / short) -> action -> tone modifiers -> floating modifier -> entry animation -> reduced motion */
|
|
2
|
+
/* Version banner: small "New version available - reload" chip, e.g. at the end of the app header.
|
|
3
|
+
Reload without JavaScript: the action is a link with href="" (the current page).
|
|
4
|
+
Show it only when your app detects a newer build (remove the hidden attribute). */
|
|
5
|
+
|
|
6
|
+
.oc-version-banner {
|
|
7
|
+
--oc-version-banner-color: var(--oc-warning);
|
|
8
|
+
display: inline-flex;
|
|
9
|
+
align-items: center;
|
|
10
|
+
gap: 0.5rem;
|
|
11
|
+
min-inline-size: 0;
|
|
12
|
+
max-inline-size: 100%;
|
|
13
|
+
padding: 0.25rem 0.25rem 0.25rem 0.625rem;
|
|
14
|
+
font-size: 0.75rem;
|
|
15
|
+
line-height: 1.3;
|
|
16
|
+
color: var(--oc-foreground);
|
|
17
|
+
background: oklch(from var(--oc-version-banner-color) l c h / 0.12);
|
|
18
|
+
border: 1px solid oklch(from var(--oc-version-banner-color) l c h / 0.4);
|
|
19
|
+
border-radius: 999px;
|
|
20
|
+
transition: opacity var(--oc-transition-normal), translate var(--oc-transition-normal);
|
|
21
|
+
@starting-style { opacity: 0; translate: 0 -0.25rem; }
|
|
22
|
+
}
|
|
23
|
+
.oc-version-banner[hidden] { display: none; }
|
|
24
|
+
|
|
25
|
+
/* Small dot in the tone color (pulses gently). */
|
|
26
|
+
.oc-version-banner-dot {
|
|
27
|
+
flex-shrink: 0;
|
|
28
|
+
inline-size: 0.5rem;
|
|
29
|
+
block-size: 0.5rem;
|
|
30
|
+
border-radius: 50%;
|
|
31
|
+
background: var(--oc-version-banner-color);
|
|
32
|
+
animation: oc-version-banner-pulse 2s ease-in-out infinite;
|
|
33
|
+
}
|
|
34
|
+
@keyframes oc-version-banner-pulse { 50% { box-shadow: 0 0 0 4px oklch(from var(--oc-version-banner-color) l c h / 0.2); } }
|
|
35
|
+
|
|
36
|
+
/* Text: the long text hides on small screens, the short one shows instead. */
|
|
37
|
+
.oc-version-banner-text { min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
38
|
+
.oc-version-banner-short { display: none; white-space: nowrap; }
|
|
39
|
+
@media (max-width: 40rem) {
|
|
40
|
+
.oc-version-banner-text:has(+ .oc-version-banner-short) { display: none; }
|
|
41
|
+
.oc-version-banner-short { display: inline; }
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Action (link or button): compact pill button. */
|
|
45
|
+
.oc-version-banner-action {
|
|
46
|
+
flex-shrink: 0;
|
|
47
|
+
display: inline-flex;
|
|
48
|
+
align-items: center;
|
|
49
|
+
gap: 0.25rem;
|
|
50
|
+
padding: 0.25rem 0.625rem;
|
|
51
|
+
font: inherit;
|
|
52
|
+
font-weight: 600;
|
|
53
|
+
color: var(--oc-foreground);
|
|
54
|
+
text-decoration: none;
|
|
55
|
+
background: var(--oc-background);
|
|
56
|
+
border: 1px solid oklch(from var(--oc-version-banner-color) l c h / 0.4);
|
|
57
|
+
border-radius: 999px;
|
|
58
|
+
cursor: pointer;
|
|
59
|
+
}
|
|
60
|
+
.oc-version-banner-action:hover { background: oklch(from var(--oc-version-banner-color) l c h / 0.15); }
|
|
61
|
+
.oc-version-banner-action:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 1px; }
|
|
62
|
+
|
|
63
|
+
/* Tone modifiers. */
|
|
64
|
+
.oc-version-banner--info { --oc-version-banner-color: var(--oc-primary); }
|
|
65
|
+
.oc-version-banner--success { --oc-version-banner-color: var(--oc-success); }
|
|
66
|
+
|
|
67
|
+
/* Floating: fixed at the bottom end of the window (for apps without a header slot). */
|
|
68
|
+
.oc-version-banner--floating {
|
|
69
|
+
position: fixed;
|
|
70
|
+
inset-block-end: 1rem;
|
|
71
|
+
inset-inline-end: 1rem;
|
|
72
|
+
z-index: 900;
|
|
73
|
+
background: var(--oc-popover);
|
|
74
|
+
box-shadow: 0 8px 24px oklch(from var(--color-black-60) l c h / 0.15);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
@media (prefers-reduced-motion: reduce) {
|
|
78
|
+
.oc-version-banner { transition: none; }
|
|
79
|
+
.oc-version-banner-dot { animation: none; }
|
|
80
|
+
}
|