@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
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
/* File: packages/ui/src/parts/app-confirm-dialog.css | Map: confirm modifier (icon ring) -> close button -> typed confirm field -> confirm lock -> three-button footer -> narrow screens */
|
|
2
|
-
/* Confirm dialog: a variant of the alert dialog (dialog.oc-modal + .oc-alert-dialog).
|
|
3
|
-
Add .oc-alert-dialog--confirm next to the type modifier (--warning, --error, ...).
|
|
4
|
-
Extras: a larger thin icon ring, a close (X) button, an optional typed confirmation
|
|
5
|
-
("type DELETE to confirm") and a third "discard" action. No JavaScript: the confirm button is a
|
|
6
|
-
submit button of a <form method="dialog">, so the browser blocks it until the typed value matches. */
|
|
7
|
-
|
|
8
|
-
/* Larger content box, room for the close button. */
|
|
9
|
-
.oc-alert-dialog--confirm { position: relative; max-inline-size: 27.5rem; padding: 1.75rem 1.5rem 0; border-radius: calc(var(--oc-radius) + 8px); }
|
|
10
|
-
|
|
11
|
-
/* Thin ring (80px) with the glyph or an SVG in the type color; the inner disc uses the card color. */
|
|
12
|
-
.oc-alert-dialog--confirm .oc-alert-dialog-icon {
|
|
13
|
-
inline-size: 5rem;
|
|
14
|
-
block-size: 5rem;
|
|
15
|
-
margin-block-end: 1.25rem;
|
|
16
|
-
font-size: 2.25rem;
|
|
17
|
-
font-weight: 400;
|
|
18
|
-
border-width: 2px;
|
|
19
|
-
background: var(--oc-card);
|
|
20
|
-
box-shadow: 0 0 0 6px oklch(from var(--oc-alert-dialog-color, var(--oc-warning)) l c h / 0.1);
|
|
21
|
-
}
|
|
22
|
-
.oc-alert-dialog--confirm .oc-alert-dialog-icon svg { inline-size: 2.25rem; block-size: 2.25rem; }
|
|
23
|
-
|
|
24
|
-
/* Close (X) in the top corner. Use command="close" commandfor="<dialog id>". */
|
|
25
|
-
.oc-alert-dialog-close {
|
|
26
|
-
position: absolute;
|
|
27
|
-
inset-block-start: 0.75rem;
|
|
28
|
-
inset-inline-end: 0.75rem;
|
|
29
|
-
display: grid;
|
|
30
|
-
place-items: center;
|
|
31
|
-
inline-size: 2rem;
|
|
32
|
-
block-size: 2rem;
|
|
33
|
-
padding: 0;
|
|
34
|
-
font-size: 1.25rem;
|
|
35
|
-
line-height: 1;
|
|
36
|
-
color: var(--oc-muted-foreground);
|
|
37
|
-
background: none;
|
|
38
|
-
border: 0;
|
|
39
|
-
border-radius: var(--oc-radius);
|
|
40
|
-
cursor: pointer;
|
|
41
|
-
}
|
|
42
|
-
.oc-alert-dialog-close:hover { color: var(--oc-foreground); background: var(--oc-accent); }
|
|
43
|
-
.oc-alert-dialog-close:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 1px; }
|
|
44
|
-
|
|
45
|
-
/* The form wraps body + footer; it adds no layout of its own. */
|
|
46
|
-
.oc-alert-dialog-form { display: contents; }
|
|
47
|
-
|
|
48
|
-
/* Typed confirmation: label with the word in <code>, then the input. */
|
|
49
|
-
.oc-alert-dialog-typed { display: grid; gap: 0.375rem; align-self: stretch; margin-block-end: 1rem; text-align: start; font-size: 0.875rem; }
|
|
50
|
-
.oc-alert-dialog-typed code {
|
|
51
|
-
padding: 0.1rem 0.35rem;
|
|
52
|
-
font-size: 0.8125rem;
|
|
53
|
-
color: var(--oc-alert-dialog-color, var(--oc-warning));
|
|
54
|
-
background: oklch(from var(--oc-alert-dialog-color, var(--oc-warning)) l c h / 0.1);
|
|
55
|
-
border-radius: 4px;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/* While the typed value does not match the pattern, the confirm button looks disabled. */
|
|
59
|
-
.oc-alert-dialog--confirm:has(.oc-alert-dialog-typed input:invalid) .oc-alert-dialog-confirm { opacity: 0.5; cursor: not-allowed; }
|
|
60
|
-
|
|
61
|
-
/* Three buttons: discard at the start, cancel + confirm at the end. */
|
|
62
|
-
.oc-alert-dialog--confirm .oc-modal-footer { flex-wrap: wrap; gap: 0.5rem; padding-block: 0.5rem 1.5rem; }
|
|
63
|
-
.oc-alert-dialog-discard { margin-inline-end: auto; }
|
|
64
|
-
.oc-alert-dialog--confirm .oc-modal-footer:has(.oc-alert-dialog-discard) { justify-content: flex-end; }
|
|
65
|
-
|
|
66
|
-
/* Narrow screens: full-width stacked buttons, confirm on top. */
|
|
67
|
-
@media (max-width: 30rem) {
|
|
68
|
-
.oc-alert-dialog--confirm .oc-modal-footer { flex-direction: column-reverse; }
|
|
69
|
-
.oc-alert-dialog--confirm .oc-modal-footer > * { inline-size: 100%; margin: 0; }
|
|
70
|
-
}
|
|
1
|
+
/* File: packages/ui/src/parts/app-confirm-dialog.css | Map: confirm modifier (icon ring) -> close button -> typed confirm field -> confirm lock -> three-button footer -> narrow screens */
|
|
2
|
+
/* Confirm dialog: a variant of the alert dialog (dialog.oc-modal + .oc-alert-dialog).
|
|
3
|
+
Add .oc-alert-dialog--confirm next to the type modifier (--warning, --error, ...).
|
|
4
|
+
Extras: a larger thin icon ring, a close (X) button, an optional typed confirmation
|
|
5
|
+
("type DELETE to confirm") and a third "discard" action. No JavaScript: the confirm button is a
|
|
6
|
+
submit button of a <form method="dialog">, so the browser blocks it until the typed value matches. */
|
|
7
|
+
|
|
8
|
+
/* Larger content box, room for the close button. */
|
|
9
|
+
.oc-alert-dialog--confirm { position: relative; max-inline-size: 27.5rem; padding: 1.75rem 1.5rem 0; border-radius: calc(var(--oc-radius) + 8px); }
|
|
10
|
+
|
|
11
|
+
/* Thin ring (80px) with the glyph or an SVG in the type color; the inner disc uses the card color. */
|
|
12
|
+
.oc-alert-dialog--confirm .oc-alert-dialog-icon {
|
|
13
|
+
inline-size: 5rem;
|
|
14
|
+
block-size: 5rem;
|
|
15
|
+
margin-block-end: 1.25rem;
|
|
16
|
+
font-size: 2.25rem;
|
|
17
|
+
font-weight: 400;
|
|
18
|
+
border-width: 2px;
|
|
19
|
+
background: var(--oc-card);
|
|
20
|
+
box-shadow: 0 0 0 6px oklch(from var(--oc-alert-dialog-color, var(--oc-warning)) l c h / 0.1);
|
|
21
|
+
}
|
|
22
|
+
.oc-alert-dialog--confirm .oc-alert-dialog-icon svg { inline-size: 2.25rem; block-size: 2.25rem; }
|
|
23
|
+
|
|
24
|
+
/* Close (X) in the top corner. Use command="close" commandfor="<dialog id>". */
|
|
25
|
+
.oc-alert-dialog-close {
|
|
26
|
+
position: absolute;
|
|
27
|
+
inset-block-start: 0.75rem;
|
|
28
|
+
inset-inline-end: 0.75rem;
|
|
29
|
+
display: grid;
|
|
30
|
+
place-items: center;
|
|
31
|
+
inline-size: 2rem;
|
|
32
|
+
block-size: 2rem;
|
|
33
|
+
padding: 0;
|
|
34
|
+
font-size: 1.25rem;
|
|
35
|
+
line-height: 1;
|
|
36
|
+
color: var(--oc-muted-foreground);
|
|
37
|
+
background: none;
|
|
38
|
+
border: 0;
|
|
39
|
+
border-radius: var(--oc-radius);
|
|
40
|
+
cursor: pointer;
|
|
41
|
+
}
|
|
42
|
+
.oc-alert-dialog-close:hover { color: var(--oc-foreground); background: var(--oc-accent); }
|
|
43
|
+
.oc-alert-dialog-close:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 1px; }
|
|
44
|
+
|
|
45
|
+
/* The form wraps body + footer; it adds no layout of its own. */
|
|
46
|
+
.oc-alert-dialog-form { display: contents; }
|
|
47
|
+
|
|
48
|
+
/* Typed confirmation: label with the word in <code>, then the input. */
|
|
49
|
+
.oc-alert-dialog-typed { display: grid; gap: 0.375rem; align-self: stretch; margin-block-end: 1rem; text-align: start; font-size: 0.875rem; }
|
|
50
|
+
.oc-alert-dialog-typed code {
|
|
51
|
+
padding: 0.1rem 0.35rem;
|
|
52
|
+
font-size: 0.8125rem;
|
|
53
|
+
color: var(--oc-alert-dialog-color, var(--oc-warning));
|
|
54
|
+
background: oklch(from var(--oc-alert-dialog-color, var(--oc-warning)) l c h / 0.1);
|
|
55
|
+
border-radius: 4px;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/* While the typed value does not match the pattern, the confirm button looks disabled. */
|
|
59
|
+
.oc-alert-dialog--confirm:has(.oc-alert-dialog-typed input:invalid) .oc-alert-dialog-confirm { opacity: 0.5; cursor: not-allowed; }
|
|
60
|
+
|
|
61
|
+
/* Three buttons: discard at the start, cancel + confirm at the end. */
|
|
62
|
+
.oc-alert-dialog--confirm .oc-modal-footer { flex-wrap: wrap; gap: 0.5rem; padding-block: 0.5rem 1.5rem; }
|
|
63
|
+
.oc-alert-dialog-discard { margin-inline-end: auto; }
|
|
64
|
+
.oc-alert-dialog--confirm .oc-modal-footer:has(.oc-alert-dialog-discard) { justify-content: flex-end; }
|
|
65
|
+
|
|
66
|
+
/* Narrow screens: full-width stacked buttons, confirm on top. */
|
|
67
|
+
@media (max-width: 30rem) {
|
|
68
|
+
.oc-alert-dialog--confirm .oc-modal-footer { flex-direction: column-reverse; }
|
|
69
|
+
.oc-alert-dialog--confirm .oc-modal-footer > * { inline-size: 100%; margin: 0; }
|
|
70
|
+
}
|
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
/* File: packages/ui/src/parts/app-cookie-consent.css | Map: popover box (corner / bar) -> text -> preferences (details)
|
|
2
|
-
-> category rows -> actions -> entry animation -> small screens
|
|
3
|
-
Cookie consent: a non-modal popover="manual" in the top layer, so it never blocks the page. Categories are rows with
|
|
4
|
-
the switch component; "necessary" is locked on. Based on the cookie banner of the Verdavita site. */
|
|
5
|
-
|
|
6
|
-
.oc-cookie-consent {
|
|
7
|
-
position: fixed;
|
|
8
|
-
inset: auto 1rem 1rem auto;
|
|
9
|
-
inline-size: min(100vw - 2rem, 28rem);
|
|
10
|
-
max-block-size: calc(100dvh - 2rem);
|
|
11
|
-
margin: 0;
|
|
12
|
-
padding: 1.25rem;
|
|
13
|
-
overflow: auto;
|
|
14
|
-
border: 1px solid var(--oc-border);
|
|
15
|
-
border-radius: 12px;
|
|
16
|
-
background: var(--oc-popover, var(--oc-card));
|
|
17
|
-
color: var(--oc-foreground);
|
|
18
|
-
box-shadow: 0 1rem 2.5rem oklch(from var(--color-black-50) l c h / 0.2);
|
|
19
|
-
}
|
|
20
|
-
.oc-cookie-consent:popover-open { display: grid; gap: 0.9rem; }
|
|
21
|
-
/* Full-width bar at the bottom */
|
|
22
|
-
.oc-cookie-consent--bar { inset: auto 0 0 0; inline-size: 100%; max-inline-size: none; border-radius: 0; border-inline: 0; border-block-end: 0; }
|
|
23
|
-
.oc-cookie-consent--bar:popover-open { grid-template-columns: minmax(0, 1fr) auto; align-items: center; }
|
|
24
|
-
.oc-cookie-consent--bar .oc-cookie-consent__prefs { grid-column: 1 / -1; }
|
|
25
|
-
|
|
26
|
-
.oc-cookie-consent__title { display: flex; align-items: center; gap: 0.5rem; margin: 0; font-size: 1rem; font-weight: 700; }
|
|
27
|
-
.oc-cookie-consent__text { margin: 0; color: var(--oc-muted-foreground); font-size: 0.875rem; line-height: 1.55; }
|
|
28
|
-
.oc-cookie-consent__text a { color: var(--oc-link-color, var(--oc-primary)); }
|
|
29
|
-
|
|
30
|
-
/* Preferences: a native <details>, so "Customize" needs no script */
|
|
31
|
-
.oc-cookie-consent__prefs { border-block: 1px solid var(--oc-border); }
|
|
32
|
-
.oc-cookie-consent__prefs > summary {
|
|
33
|
-
padding-block: 0.6rem;
|
|
34
|
-
font-size: 0.875rem;
|
|
35
|
-
font-weight: 600;
|
|
36
|
-
cursor: pointer;
|
|
37
|
-
}
|
|
38
|
-
.oc-cookie-consent__prefs > summary:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 2px; border-radius: 4px; }
|
|
39
|
-
.oc-cookie-consent__category {
|
|
40
|
-
display: grid;
|
|
41
|
-
grid-template-columns: minmax(0, 1fr) auto;
|
|
42
|
-
align-items: center;
|
|
43
|
-
gap: 0.15rem 1rem;
|
|
44
|
-
padding-block: 0.6rem;
|
|
45
|
-
border-block-start: 1px solid var(--oc-border);
|
|
46
|
-
}
|
|
47
|
-
.oc-cookie-consent__category-name { font-size: 0.875rem; font-weight: 600; }
|
|
48
|
-
.oc-cookie-consent__category-text { grid-column: 1; color: var(--oc-muted-foreground); font-size: 0.8rem; }
|
|
49
|
-
.oc-cookie-consent__category > .oc-switch { grid-row: 1 / span 2; grid-column: 2; }
|
|
50
|
-
|
|
51
|
-
.oc-cookie-consent__actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 0.5rem; }
|
|
52
|
-
.oc-cookie-consent__actions > .oc-btn { flex: 1 1 auto; }
|
|
53
|
-
|
|
54
|
-
/* Entry: slide up from the corner */
|
|
55
|
-
.oc-cookie-consent { transition: opacity 0.3s, translate 0.3s, overlay 0.3s allow-discrete, display 0.3s allow-discrete; }
|
|
56
|
-
@starting-style { .oc-cookie-consent:popover-open { opacity: 0; translate: 0 1rem; } }
|
|
57
|
-
.oc-cookie-consent:not(:popover-open) { opacity: 0; translate: 0 1rem; }
|
|
58
|
-
|
|
59
|
-
@media (width < 36rem) {
|
|
60
|
-
.oc-cookie-consent { inset: auto 0.5rem 0.5rem; inline-size: auto; }
|
|
61
|
-
.oc-cookie-consent--bar:popover-open { grid-template-columns: 1fr; }
|
|
62
|
-
}
|
|
63
|
-
@media (prefers-reduced-motion: reduce) { .oc-cookie-consent { transition: none; } }
|
|
1
|
+
/* File: packages/ui/src/parts/app-cookie-consent.css | Map: popover box (corner / bar) -> text -> preferences (details)
|
|
2
|
+
-> category rows -> actions -> entry animation -> small screens
|
|
3
|
+
Cookie consent: a non-modal popover="manual" in the top layer, so it never blocks the page. Categories are rows with
|
|
4
|
+
the switch component; "necessary" is locked on. Based on the cookie banner of the Verdavita site. */
|
|
5
|
+
|
|
6
|
+
.oc-cookie-consent {
|
|
7
|
+
position: fixed;
|
|
8
|
+
inset: auto 1rem 1rem auto;
|
|
9
|
+
inline-size: min(100vw - 2rem, 28rem);
|
|
10
|
+
max-block-size: calc(100dvh - 2rem);
|
|
11
|
+
margin: 0;
|
|
12
|
+
padding: 1.25rem;
|
|
13
|
+
overflow: auto;
|
|
14
|
+
border: 1px solid var(--oc-border);
|
|
15
|
+
border-radius: 12px;
|
|
16
|
+
background: var(--oc-popover, var(--oc-card));
|
|
17
|
+
color: var(--oc-foreground);
|
|
18
|
+
box-shadow: 0 1rem 2.5rem oklch(from var(--color-black-50) l c h / 0.2);
|
|
19
|
+
}
|
|
20
|
+
.oc-cookie-consent:popover-open { display: grid; gap: 0.9rem; }
|
|
21
|
+
/* Full-width bar at the bottom */
|
|
22
|
+
.oc-cookie-consent--bar { inset: auto 0 0 0; inline-size: 100%; max-inline-size: none; border-radius: 0; border-inline: 0; border-block-end: 0; }
|
|
23
|
+
.oc-cookie-consent--bar:popover-open { grid-template-columns: minmax(0, 1fr) auto; align-items: center; }
|
|
24
|
+
.oc-cookie-consent--bar .oc-cookie-consent__prefs { grid-column: 1 / -1; }
|
|
25
|
+
|
|
26
|
+
.oc-cookie-consent__title { display: flex; align-items: center; gap: 0.5rem; margin: 0; font-size: 1rem; font-weight: 700; }
|
|
27
|
+
.oc-cookie-consent__text { margin: 0; color: var(--oc-muted-foreground); font-size: 0.875rem; line-height: 1.55; }
|
|
28
|
+
.oc-cookie-consent__text a { color: var(--oc-link-color, var(--oc-primary)); }
|
|
29
|
+
|
|
30
|
+
/* Preferences: a native <details>, so "Customize" needs no script */
|
|
31
|
+
.oc-cookie-consent__prefs { border-block: 1px solid var(--oc-border); }
|
|
32
|
+
.oc-cookie-consent__prefs > summary {
|
|
33
|
+
padding-block: 0.6rem;
|
|
34
|
+
font-size: 0.875rem;
|
|
35
|
+
font-weight: 600;
|
|
36
|
+
cursor: pointer;
|
|
37
|
+
}
|
|
38
|
+
.oc-cookie-consent__prefs > summary:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 2px; border-radius: 4px; }
|
|
39
|
+
.oc-cookie-consent__category {
|
|
40
|
+
display: grid;
|
|
41
|
+
grid-template-columns: minmax(0, 1fr) auto;
|
|
42
|
+
align-items: center;
|
|
43
|
+
gap: 0.15rem 1rem;
|
|
44
|
+
padding-block: 0.6rem;
|
|
45
|
+
border-block-start: 1px solid var(--oc-border);
|
|
46
|
+
}
|
|
47
|
+
.oc-cookie-consent__category-name { font-size: 0.875rem; font-weight: 600; }
|
|
48
|
+
.oc-cookie-consent__category-text { grid-column: 1; color: var(--oc-muted-foreground); font-size: 0.8rem; }
|
|
49
|
+
.oc-cookie-consent__category > .oc-switch { grid-row: 1 / span 2; grid-column: 2; }
|
|
50
|
+
|
|
51
|
+
.oc-cookie-consent__actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 0.5rem; }
|
|
52
|
+
.oc-cookie-consent__actions > .oc-btn { flex: 1 1 auto; }
|
|
53
|
+
|
|
54
|
+
/* Entry: slide up from the corner */
|
|
55
|
+
.oc-cookie-consent { transition: opacity 0.3s, translate 0.3s, overlay 0.3s allow-discrete, display 0.3s allow-discrete; }
|
|
56
|
+
@starting-style { .oc-cookie-consent:popover-open { opacity: 0; translate: 0 1rem; } }
|
|
57
|
+
.oc-cookie-consent:not(:popover-open) { opacity: 0; translate: 0 1rem; }
|
|
58
|
+
|
|
59
|
+
@media (width < 36rem) {
|
|
60
|
+
.oc-cookie-consent { inset: auto 0.5rem 0.5rem; inline-size: auto; }
|
|
61
|
+
.oc-cookie-consent--bar:popover-open { grid-template-columns: 1fr; }
|
|
62
|
+
}
|
|
63
|
+
@media (prefers-reduced-motion: reduce) { .oc-cookie-consent { transition: none; } }
|
|
@@ -1,174 +1,174 @@
|
|
|
1
|
-
/* File: packages/ui/src/parts/app-data-table.css | Map: shell -> toolbar -> frame and scroll -> header resize -> select and actions columns -> deleted row -> bulk bar -> card view -> footer and pager -> compact density */
|
|
2
|
-
/* List table from Korrekt and OmniaDesk. The frame, toolbar and footer are styling.
|
|
3
|
-
Behaviour (search, sort, pages, resize, drag, trash, bulk) lives in src/data-table.js.
|
|
4
|
-
Set --oc-data-table-max on the shell when the body should scroll and the header should stick. */
|
|
5
|
-
|
|
6
|
-
.oc-data-table {
|
|
7
|
-
display: flex;
|
|
8
|
-
flex-direction: column;
|
|
9
|
-
gap: 0.75rem;
|
|
10
|
-
padding: 1rem;
|
|
11
|
-
color: var(--oc-card-foreground);
|
|
12
|
-
background: var(--oc-card);
|
|
13
|
-
border: 1px solid var(--oc-border);
|
|
14
|
-
border-radius: var(--oc-radius);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/* Toolbar: title + gear, search, trash pills, table/cards toggle, page actions. */
|
|
18
|
-
.oc-data-table-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }
|
|
19
|
-
.oc-data-table-heading { display: flex; align-items: center; gap: 0.5rem; min-inline-size: 0; }
|
|
20
|
-
.oc-data-table-title { font-size: 0.875rem; font-weight: 600; }
|
|
21
|
-
.oc-data-table-search { flex: 1 1 12rem; min-inline-size: 10rem; max-inline-size: 22rem; }
|
|
22
|
-
.oc-data-table-actions { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-inline-start: auto; }
|
|
23
|
-
.oc-data-table-view { display: inline-flex; gap: 0.25rem; }
|
|
24
|
-
.oc-data-table-view [aria-pressed="true"] {
|
|
25
|
-
color: var(--oc-primary);
|
|
26
|
-
background: oklch(from var(--oc-primary) l c h / 0.1);
|
|
27
|
-
border-color: oklch(from var(--oc-primary) l c h / 0.35);
|
|
28
|
-
}
|
|
29
|
-
.oc-data-table-sort-summary { flex-basis: 100%; margin: 0; font-size: 0.75rem; color: var(--oc-muted-foreground); }
|
|
30
|
-
.oc-data-table-sort-summary:empty { display: none; }
|
|
31
|
-
.oc-data-table-file { display: none; }
|
|
32
|
-
|
|
33
|
-
/* The table sits in its own rounded frame. The scroll box keeps the header sticky. */
|
|
34
|
-
.oc-data-table-frame {
|
|
35
|
-
overflow: hidden;
|
|
36
|
-
background: var(--oc-background);
|
|
37
|
-
border: 1px solid var(--oc-border);
|
|
38
|
-
border-radius: calc(var(--oc-radius) - 2px);
|
|
39
|
-
}
|
|
40
|
-
.oc-data-table-scroll { overflow: auto; max-block-size: var(--oc-data-table-max, none); }
|
|
41
|
-
.oc-data-table .oc-table :is(th, td) { border-inline: 0; border-block-start: 0; }
|
|
42
|
-
.oc-data-table .oc-table thead th {
|
|
43
|
-
position: sticky;
|
|
44
|
-
inset-block-start: 0;
|
|
45
|
-
z-index: 1;
|
|
46
|
-
block-size: 2.5rem;
|
|
47
|
-
font-size: 0.75rem;
|
|
48
|
-
font-weight: 500;
|
|
49
|
-
background: var(--oc-card);
|
|
50
|
-
}
|
|
51
|
-
.oc-data-table .oc-table tbody tr:nth-child(even) { background: var(--oc-surface); }
|
|
52
|
-
.oc-data-table .oc-table tbody tr:last-child > td { border-block-end: 0; }
|
|
53
|
-
|
|
54
|
-
/* Header label and the drag handle that sets the column width. */
|
|
55
|
-
.oc-data-table-th { display: flex; align-items: center; gap: 0.25rem; position: relative; min-inline-size: 0; }
|
|
56
|
-
.oc-data-table-resize {
|
|
57
|
-
position: absolute;
|
|
58
|
-
inset-block: 0;
|
|
59
|
-
inset-inline-end: -0.45rem;
|
|
60
|
-
inline-size: 0.55rem;
|
|
61
|
-
padding: 0;
|
|
62
|
-
background: none;
|
|
63
|
-
border: 0;
|
|
64
|
-
cursor: col-resize;
|
|
65
|
-
touch-action: none;
|
|
66
|
-
}
|
|
67
|
-
.oc-data-table-resize::after {
|
|
68
|
-
content: "";
|
|
69
|
-
position: absolute;
|
|
70
|
-
inset-block: 0.4rem;
|
|
71
|
-
inset-inline-start: 0.25rem;
|
|
72
|
-
inline-size: 1px;
|
|
73
|
-
background: var(--oc-border);
|
|
74
|
-
}
|
|
75
|
-
.oc-data-table.is-resizing { cursor: col-resize; user-select: none; }
|
|
76
|
-
/* After a resize the table grows with its columns and the frame scrolls sideways. */
|
|
77
|
-
.oc-data-table-table--sized { inline-size: max-content; min-inline-size: 100%; }
|
|
78
|
-
|
|
79
|
-
/* Narrow control columns. The actions column stays on the right while the rest scrolls. */
|
|
80
|
-
.oc-data-table .oc-table :is(th, td)[data-oc-col="select"],
|
|
81
|
-
.oc-data-table .oc-table :is(th, td)[data-oc-col="order"] {
|
|
82
|
-
inline-size: 2.25rem;
|
|
83
|
-
padding-inline: 0.25rem;
|
|
84
|
-
text-align: center;
|
|
85
|
-
}
|
|
86
|
-
.oc-data-table .oc-table :is(th, td)[data-oc-col="actions"] {
|
|
87
|
-
position: sticky;
|
|
88
|
-
inset-inline-end: 0;
|
|
89
|
-
z-index: 2;
|
|
90
|
-
background: var(--oc-card);
|
|
91
|
-
box-shadow: -1px 0 0 var(--oc-border);
|
|
92
|
-
}
|
|
93
|
-
.oc-data-table .oc-table thead th[data-oc-col="actions"] { z-index: 3; }
|
|
94
|
-
.oc-data-table .oc-table tbody tr:nth-child(even) > td[data-oc-col="actions"] { background: var(--oc-surface); }
|
|
95
|
-
|
|
96
|
-
/* Trash and archive rows stay readable but quieter than active rows. */
|
|
97
|
-
.oc-data-table tr[data-oc-status="deleted"],
|
|
98
|
-
.oc-data-table tr[data-oc-status="archived"] { color: var(--oc-muted-foreground); }
|
|
99
|
-
|
|
100
|
-
/* Bar above the table once at least one row is checked. */
|
|
101
|
-
.oc-data-table-bulk {
|
|
102
|
-
display: flex;
|
|
103
|
-
flex-wrap: wrap;
|
|
104
|
-
align-items: center;
|
|
105
|
-
gap: 0.5rem;
|
|
106
|
-
padding: 0.5rem 0.75rem;
|
|
107
|
-
background: var(--oc-surface);
|
|
108
|
-
border: 1px solid var(--oc-border);
|
|
109
|
-
border-radius: var(--oc-radius);
|
|
110
|
-
}
|
|
111
|
-
.oc-data-table-bulk[hidden] { display: none; }
|
|
112
|
-
|
|
113
|
-
/* Card view: one card per row on this page. The script fills it. */
|
|
114
|
-
.oc-data-table-grid { display: none; }
|
|
115
|
-
.oc-data-table--grid .oc-data-table-scroll { display: none; }
|
|
116
|
-
.oc-data-table--grid .oc-data-table-grid {
|
|
117
|
-
display: grid;
|
|
118
|
-
grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
|
|
119
|
-
gap: 0.75rem;
|
|
120
|
-
padding: 0.75rem;
|
|
121
|
-
}
|
|
122
|
-
.oc-data-table-card {
|
|
123
|
-
padding: 0.75rem;
|
|
124
|
-
background: var(--oc-card);
|
|
125
|
-
border: 1px solid var(--oc-border);
|
|
126
|
-
border-radius: calc(var(--oc-radius) - 2px);
|
|
127
|
-
}
|
|
128
|
-
.oc-data-table-card-title { margin: 0; font-size: 0.875rem; font-weight: 600; }
|
|
129
|
-
|
|
130
|
-
.oc-data-table-empty { margin: 0; padding: 2rem 1rem; text-align: center; color: var(--oc-muted-foreground); }
|
|
131
|
-
.oc-data-table-empty[hidden] { display: none; }
|
|
132
|
-
|
|
133
|
-
/* Footer: count on the left, rows-per-page in the middle, pager on the right. */
|
|
134
|
-
.oc-data-table-footer {
|
|
135
|
-
display: grid;
|
|
136
|
-
grid-template-columns: 1fr auto 1fr;
|
|
137
|
-
align-items: center;
|
|
138
|
-
gap: 0.75rem;
|
|
139
|
-
}
|
|
140
|
-
.oc-data-table-summary { margin: 0; font-size: 0.8125rem; color: var(--oc-muted-foreground); }
|
|
141
|
-
.oc-data-table-per-page { display: inline-flex; align-items: center; gap: 0.5rem; font-size: 0.8125rem; }
|
|
142
|
-
.oc-data-table-per-page .oc-select { inline-size: auto; }
|
|
143
|
-
.oc-data-table-pager { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 0.25rem; }
|
|
144
|
-
.oc-data-table-page {
|
|
145
|
-
min-inline-size: 2rem;
|
|
146
|
-
padding: 0.25rem 0.45rem;
|
|
147
|
-
font: inherit;
|
|
148
|
-
font-size: 0.8125rem;
|
|
149
|
-
color: var(--oc-foreground);
|
|
150
|
-
background: var(--oc-card);
|
|
151
|
-
border: 1px solid var(--oc-border);
|
|
152
|
-
border-radius: calc(var(--oc-radius) - 2px);
|
|
153
|
-
cursor: pointer;
|
|
154
|
-
}
|
|
155
|
-
.oc-data-table-page[aria-current="page"] {
|
|
156
|
-
color: var(--oc-primary);
|
|
157
|
-
background: oklch(from var(--oc-primary) l c h / 0.1);
|
|
158
|
-
border-color: oklch(from var(--oc-primary) l c h / 0.35);
|
|
159
|
-
}
|
|
160
|
-
.oc-data-table-page:disabled { opacity: 0.4; cursor: default; }
|
|
161
|
-
.oc-data-table-page:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 1px; }
|
|
162
|
-
.oc-data-table-ellipsis { padding-inline: 0.25rem; color: var(--oc-muted-foreground); }
|
|
163
|
-
|
|
164
|
-
/* Design choice from the gear menu: tighter rows, like the compact article lists. */
|
|
165
|
-
.oc-data-table--compact .oc-table :is(th, td) { padding: 0.25rem 0.5rem; font-size: 0.8125rem; }
|
|
166
|
-
.oc-data-table--compact .oc-table thead th { block-size: 2rem; }
|
|
167
|
-
|
|
168
|
-
@media (max-width: 40rem) {
|
|
169
|
-
.oc-data-table-footer { grid-template-columns: 1fr; }
|
|
170
|
-
.oc-data-table-pager { justify-content: flex-start; }
|
|
171
|
-
}
|
|
172
|
-
@media (prefers-reduced-motion: reduce) {
|
|
173
|
-
.oc-data-table .oc-table tbody tr { transition: none; }
|
|
174
|
-
}
|
|
1
|
+
/* File: packages/ui/src/parts/app-data-table.css | Map: shell -> toolbar -> frame and scroll -> header resize -> select and actions columns -> deleted row -> bulk bar -> card view -> footer and pager -> compact density */
|
|
2
|
+
/* List table from Korrekt and OmniaDesk. The frame, toolbar and footer are styling.
|
|
3
|
+
Behaviour (search, sort, pages, resize, drag, trash, bulk) lives in src/data-table.js.
|
|
4
|
+
Set --oc-data-table-max on the shell when the body should scroll and the header should stick. */
|
|
5
|
+
|
|
6
|
+
.oc-data-table {
|
|
7
|
+
display: flex;
|
|
8
|
+
flex-direction: column;
|
|
9
|
+
gap: 0.75rem;
|
|
10
|
+
padding: 1rem;
|
|
11
|
+
color: var(--oc-card-foreground);
|
|
12
|
+
background: var(--oc-card);
|
|
13
|
+
border: 1px solid var(--oc-border);
|
|
14
|
+
border-radius: var(--oc-radius);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/* Toolbar: title + gear, search, trash pills, table/cards toggle, page actions. */
|
|
18
|
+
.oc-data-table-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; }
|
|
19
|
+
.oc-data-table-heading { display: flex; align-items: center; gap: 0.5rem; min-inline-size: 0; }
|
|
20
|
+
.oc-data-table-title { font-size: 0.875rem; font-weight: 600; }
|
|
21
|
+
.oc-data-table-search { flex: 1 1 12rem; min-inline-size: 10rem; max-inline-size: 22rem; }
|
|
22
|
+
.oc-data-table-actions { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-inline-start: auto; }
|
|
23
|
+
.oc-data-table-view { display: inline-flex; gap: 0.25rem; }
|
|
24
|
+
.oc-data-table-view [aria-pressed="true"] {
|
|
25
|
+
color: var(--oc-primary);
|
|
26
|
+
background: oklch(from var(--oc-primary) l c h / 0.1);
|
|
27
|
+
border-color: oklch(from var(--oc-primary) l c h / 0.35);
|
|
28
|
+
}
|
|
29
|
+
.oc-data-table-sort-summary { flex-basis: 100%; margin: 0; font-size: 0.75rem; color: var(--oc-muted-foreground); }
|
|
30
|
+
.oc-data-table-sort-summary:empty { display: none; }
|
|
31
|
+
.oc-data-table-file { display: none; }
|
|
32
|
+
|
|
33
|
+
/* The table sits in its own rounded frame. The scroll box keeps the header sticky. */
|
|
34
|
+
.oc-data-table-frame {
|
|
35
|
+
overflow: hidden;
|
|
36
|
+
background: var(--oc-background);
|
|
37
|
+
border: 1px solid var(--oc-border);
|
|
38
|
+
border-radius: calc(var(--oc-radius) - 2px);
|
|
39
|
+
}
|
|
40
|
+
.oc-data-table-scroll { overflow: auto; max-block-size: var(--oc-data-table-max, none); }
|
|
41
|
+
.oc-data-table .oc-table :is(th, td) { border-inline: 0; border-block-start: 0; }
|
|
42
|
+
.oc-data-table .oc-table thead th {
|
|
43
|
+
position: sticky;
|
|
44
|
+
inset-block-start: 0;
|
|
45
|
+
z-index: 1;
|
|
46
|
+
block-size: 2.5rem;
|
|
47
|
+
font-size: 0.75rem;
|
|
48
|
+
font-weight: 500;
|
|
49
|
+
background: var(--oc-card);
|
|
50
|
+
}
|
|
51
|
+
.oc-data-table .oc-table tbody tr:nth-child(even) { background: var(--oc-surface); }
|
|
52
|
+
.oc-data-table .oc-table tbody tr:last-child > td { border-block-end: 0; }
|
|
53
|
+
|
|
54
|
+
/* Header label and the drag handle that sets the column width. */
|
|
55
|
+
.oc-data-table-th { display: flex; align-items: center; gap: 0.25rem; position: relative; min-inline-size: 0; }
|
|
56
|
+
.oc-data-table-resize {
|
|
57
|
+
position: absolute;
|
|
58
|
+
inset-block: 0;
|
|
59
|
+
inset-inline-end: -0.45rem;
|
|
60
|
+
inline-size: 0.55rem;
|
|
61
|
+
padding: 0;
|
|
62
|
+
background: none;
|
|
63
|
+
border: 0;
|
|
64
|
+
cursor: col-resize;
|
|
65
|
+
touch-action: none;
|
|
66
|
+
}
|
|
67
|
+
.oc-data-table-resize::after {
|
|
68
|
+
content: "";
|
|
69
|
+
position: absolute;
|
|
70
|
+
inset-block: 0.4rem;
|
|
71
|
+
inset-inline-start: 0.25rem;
|
|
72
|
+
inline-size: 1px;
|
|
73
|
+
background: var(--oc-border);
|
|
74
|
+
}
|
|
75
|
+
.oc-data-table.is-resizing { cursor: col-resize; user-select: none; }
|
|
76
|
+
/* After a resize the table grows with its columns and the frame scrolls sideways. */
|
|
77
|
+
.oc-data-table-table--sized { inline-size: max-content; min-inline-size: 100%; }
|
|
78
|
+
|
|
79
|
+
/* Narrow control columns. The actions column stays on the right while the rest scrolls. */
|
|
80
|
+
.oc-data-table .oc-table :is(th, td)[data-oc-col="select"],
|
|
81
|
+
.oc-data-table .oc-table :is(th, td)[data-oc-col="order"] {
|
|
82
|
+
inline-size: 2.25rem;
|
|
83
|
+
padding-inline: 0.25rem;
|
|
84
|
+
text-align: center;
|
|
85
|
+
}
|
|
86
|
+
.oc-data-table .oc-table :is(th, td)[data-oc-col="actions"] {
|
|
87
|
+
position: sticky;
|
|
88
|
+
inset-inline-end: 0;
|
|
89
|
+
z-index: 2;
|
|
90
|
+
background: var(--oc-card);
|
|
91
|
+
box-shadow: -1px 0 0 var(--oc-border);
|
|
92
|
+
}
|
|
93
|
+
.oc-data-table .oc-table thead th[data-oc-col="actions"] { z-index: 3; }
|
|
94
|
+
.oc-data-table .oc-table tbody tr:nth-child(even) > td[data-oc-col="actions"] { background: var(--oc-surface); }
|
|
95
|
+
|
|
96
|
+
/* Trash and archive rows stay readable but quieter than active rows. */
|
|
97
|
+
.oc-data-table tr[data-oc-status="deleted"],
|
|
98
|
+
.oc-data-table tr[data-oc-status="archived"] { color: var(--oc-muted-foreground); }
|
|
99
|
+
|
|
100
|
+
/* Bar above the table once at least one row is checked. */
|
|
101
|
+
.oc-data-table-bulk {
|
|
102
|
+
display: flex;
|
|
103
|
+
flex-wrap: wrap;
|
|
104
|
+
align-items: center;
|
|
105
|
+
gap: 0.5rem;
|
|
106
|
+
padding: 0.5rem 0.75rem;
|
|
107
|
+
background: var(--oc-surface);
|
|
108
|
+
border: 1px solid var(--oc-border);
|
|
109
|
+
border-radius: var(--oc-radius);
|
|
110
|
+
}
|
|
111
|
+
.oc-data-table-bulk[hidden] { display: none; }
|
|
112
|
+
|
|
113
|
+
/* Card view: one card per row on this page. The script fills it. */
|
|
114
|
+
.oc-data-table-grid { display: none; }
|
|
115
|
+
.oc-data-table--grid .oc-data-table-scroll { display: none; }
|
|
116
|
+
.oc-data-table--grid .oc-data-table-grid {
|
|
117
|
+
display: grid;
|
|
118
|
+
grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
|
|
119
|
+
gap: 0.75rem;
|
|
120
|
+
padding: 0.75rem;
|
|
121
|
+
}
|
|
122
|
+
.oc-data-table-card {
|
|
123
|
+
padding: 0.75rem;
|
|
124
|
+
background: var(--oc-card);
|
|
125
|
+
border: 1px solid var(--oc-border);
|
|
126
|
+
border-radius: calc(var(--oc-radius) - 2px);
|
|
127
|
+
}
|
|
128
|
+
.oc-data-table-card-title { margin: 0; font-size: 0.875rem; font-weight: 600; }
|
|
129
|
+
|
|
130
|
+
.oc-data-table-empty { margin: 0; padding: 2rem 1rem; text-align: center; color: var(--oc-muted-foreground); }
|
|
131
|
+
.oc-data-table-empty[hidden] { display: none; }
|
|
132
|
+
|
|
133
|
+
/* Footer: count on the left, rows-per-page in the middle, pager on the right. */
|
|
134
|
+
.oc-data-table-footer {
|
|
135
|
+
display: grid;
|
|
136
|
+
grid-template-columns: 1fr auto 1fr;
|
|
137
|
+
align-items: center;
|
|
138
|
+
gap: 0.75rem;
|
|
139
|
+
}
|
|
140
|
+
.oc-data-table-summary { margin: 0; font-size: 0.8125rem; color: var(--oc-muted-foreground); }
|
|
141
|
+
.oc-data-table-per-page { display: inline-flex; align-items: center; gap: 0.5rem; font-size: 0.8125rem; }
|
|
142
|
+
.oc-data-table-per-page .oc-select { inline-size: auto; }
|
|
143
|
+
.oc-data-table-pager { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 0.25rem; }
|
|
144
|
+
.oc-data-table-page {
|
|
145
|
+
min-inline-size: 2rem;
|
|
146
|
+
padding: 0.25rem 0.45rem;
|
|
147
|
+
font: inherit;
|
|
148
|
+
font-size: 0.8125rem;
|
|
149
|
+
color: var(--oc-foreground);
|
|
150
|
+
background: var(--oc-card);
|
|
151
|
+
border: 1px solid var(--oc-border);
|
|
152
|
+
border-radius: calc(var(--oc-radius) - 2px);
|
|
153
|
+
cursor: pointer;
|
|
154
|
+
}
|
|
155
|
+
.oc-data-table-page[aria-current="page"] {
|
|
156
|
+
color: var(--oc-primary);
|
|
157
|
+
background: oklch(from var(--oc-primary) l c h / 0.1);
|
|
158
|
+
border-color: oklch(from var(--oc-primary) l c h / 0.35);
|
|
159
|
+
}
|
|
160
|
+
.oc-data-table-page:disabled { opacity: 0.4; cursor: default; }
|
|
161
|
+
.oc-data-table-page:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 1px; }
|
|
162
|
+
.oc-data-table-ellipsis { padding-inline: 0.25rem; color: var(--oc-muted-foreground); }
|
|
163
|
+
|
|
164
|
+
/* Design choice from the gear menu: tighter rows, like the compact article lists. */
|
|
165
|
+
.oc-data-table--compact .oc-table :is(th, td) { padding: 0.25rem 0.5rem; font-size: 0.8125rem; }
|
|
166
|
+
.oc-data-table--compact .oc-table thead th { block-size: 2rem; }
|
|
167
|
+
|
|
168
|
+
@media (max-width: 40rem) {
|
|
169
|
+
.oc-data-table-footer { grid-template-columns: 1fr; }
|
|
170
|
+
.oc-data-table-pager { justify-content: flex-start; }
|
|
171
|
+
}
|
|
172
|
+
@media (prefers-reduced-motion: reduce) {
|
|
173
|
+
.oc-data-table .oc-table tbody tr { transition: none; }
|
|
174
|
+
}
|