@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,136 +1,136 @@
|
|
|
1
|
-
/* File: packages/ui/src/parts/media-message-thread.css | Map: frame (grid: header / messages / composer) -> header (title, meta,
|
|
2
|
-
people, status, actions) -> wallpaper (masked doodles in a token color) -> scroll area (starts at the bottom)
|
|
3
|
-
-> composer footer -> sending overlay (aria-busy) -> reduced motion
|
|
4
|
-
Message thread: one conversation. The scroll area uses flex-direction: column-reverse, so it opens at the newest message
|
|
5
|
-
and stays there when messages are added, without a script. Based on the question chat of the Korrekt app. */
|
|
6
|
-
|
|
7
|
-
.oc-message-thread {
|
|
8
|
-
--oc-message-thread-height: 32rem;
|
|
9
|
-
position: relative;
|
|
10
|
-
display: grid;
|
|
11
|
-
grid-template-rows: auto minmax(0, 1fr) auto;
|
|
12
|
-
grid-template-columns: minmax(0, 1fr);
|
|
13
|
-
block-size: var(--oc-message-thread-height);
|
|
14
|
-
min-inline-size: 0;
|
|
15
|
-
overflow: hidden;
|
|
16
|
-
border: 1px solid var(--oc-border);
|
|
17
|
-
border-radius: calc(var(--oc-radius) + 4px);
|
|
18
|
-
background: color-mix(in oklch, var(--oc-muted) 40%, var(--oc-background));
|
|
19
|
-
color: var(--oc-foreground);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/* ---- Header ---- */
|
|
23
|
-
.oc-message-thread__header {
|
|
24
|
-
grid-row: 1;
|
|
25
|
-
display: flex;
|
|
26
|
-
align-items: center;
|
|
27
|
-
gap: 0.75rem;
|
|
28
|
-
min-inline-size: 0;
|
|
29
|
-
padding: 0.6rem 0.6rem 0.6rem 1rem;
|
|
30
|
-
border-block-end: 1px solid var(--oc-border);
|
|
31
|
-
background: var(--oc-card);
|
|
32
|
-
}
|
|
33
|
-
.oc-message-thread__heading { display: grid; flex: 1 1 auto; gap: 0.1rem; min-inline-size: 0; }
|
|
34
|
-
/* Two classes, so global heading styles (text-wrap on h3) cannot make the title wrap */
|
|
35
|
-
.oc-message-thread__heading > .oc-message-thread__title {
|
|
36
|
-
margin: 0;
|
|
37
|
-
overflow: hidden;
|
|
38
|
-
font-size: 0.95rem;
|
|
39
|
-
font-weight: 650;
|
|
40
|
-
line-height: 1.3;
|
|
41
|
-
white-space: nowrap;
|
|
42
|
-
text-overflow: ellipsis;
|
|
43
|
-
}
|
|
44
|
-
.oc-message-thread__heading > .oc-message-thread__meta {
|
|
45
|
-
margin: 0;
|
|
46
|
-
overflow: hidden;
|
|
47
|
-
color: var(--oc-muted-foreground);
|
|
48
|
-
font-size: 0.75rem;
|
|
49
|
-
white-space: nowrap;
|
|
50
|
-
text-overflow: ellipsis;
|
|
51
|
-
}
|
|
52
|
-
.oc-message-thread__meta strong { color: var(--oc-primary); font-weight: 600; }
|
|
53
|
-
.oc-message-thread__people { flex: none; }
|
|
54
|
-
.oc-message-thread__people .oc-avatar { inline-size: 1.75rem; block-size: 1.75rem; font-size: 0.62rem; border-color: var(--oc-card); }
|
|
55
|
-
.oc-message-thread__actions { display: flex; flex: none; align-items: center; gap: 0.35rem; }
|
|
56
|
-
.oc-message-thread__icon-btn {
|
|
57
|
-
display: grid;
|
|
58
|
-
place-items: center;
|
|
59
|
-
inline-size: 2rem;
|
|
60
|
-
block-size: 2rem;
|
|
61
|
-
padding: 0;
|
|
62
|
-
border: 0;
|
|
63
|
-
border-radius: 50%;
|
|
64
|
-
background: transparent;
|
|
65
|
-
color: var(--oc-muted-foreground);
|
|
66
|
-
cursor: pointer;
|
|
67
|
-
}
|
|
68
|
-
.oc-message-thread__icon-btn svg { inline-size: 1.1rem; block-size: 1.1rem; }
|
|
69
|
-
.oc-message-thread__icon-btn:hover { background: var(--oc-surface-strong); color: var(--oc-foreground); }
|
|
70
|
-
.oc-message-thread__icon-btn:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 1px; }
|
|
71
|
-
|
|
72
|
-
/* ---- Wallpaper: line doodles (chat bubble, note, sun, house, lamp…) as a mask, painted in a token color ---- */
|
|
73
|
-
.oc-message-thread::before {
|
|
74
|
-
content: "";
|
|
75
|
-
grid-row: 2;
|
|
76
|
-
grid-column: 1;
|
|
77
|
-
pointer-events: none;
|
|
78
|
-
background: oklch(from var(--oc-muted-foreground) l c h / 0.11);
|
|
79
|
-
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220' viewBox='0 0 220 220'%3E%3Cg fill='none' stroke='currentColor' stroke-width='1.25' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M28 36h28a6 6 0 0 1 6 6v14a6 6 0 0 1-6 6H40l-10 8v-8h-2a6 6 0 0 1-6-6V42a6 6 0 0 1 6-6z'/%3E%3Cpath d='M118 42h22v28H118z'/%3E%3Cpath d='M122 50h14M122 56h10'/%3E%3Ccircle cx='188' cy='52' r='10'/%3E%3Cpath d='M188 42v4M188 58v4M178 52h4M194 52h4'/%3E%3Cpath d='M42 118l8-4 8 4v10l-8 4-8-4z'/%3E%3Ccircle cx='50' cy='123' r='2.5'/%3E%3Cpath d='M128 112h24v18H128zM132 118h16M132 124h10'/%3E%3Cpath d='M178 118c6 0 10 4 10 10s-4 10-10 10-10-4-10-10 4-10 10-10z'/%3E%3Cpath d='M178 124v8M174 128h8'/%3E%3Cpath d='M36 178h20l4 12H32z'/%3E%3Cpath d='M120 176c8 0 14 6 14 14H106c0-8 6-14 14-14z'/%3E%3Ccircle cx='120' cy='168' r='7'/%3E%3Cpath d='M176 172h24v20h-24z'/%3E%3Cpath d='M182 178h12M182 184h8'/%3E%3C/g%3E%3C/svg%3E") 0 0 / 220px 220px repeat;
|
|
80
|
-
}
|
|
81
|
-
.oc-message-thread--plain::before { display: none; }
|
|
82
|
-
|
|
83
|
-
/* ---- Scroll area: column-reverse keeps the newest message in view ---- */
|
|
84
|
-
.oc-message-thread__scroll {
|
|
85
|
-
grid-row: 2;
|
|
86
|
-
grid-column: 1;
|
|
87
|
-
display: flex;
|
|
88
|
-
flex-direction: column-reverse;
|
|
89
|
-
min-block-size: 0;
|
|
90
|
-
overflow-y: auto;
|
|
91
|
-
overscroll-behavior: contain;
|
|
92
|
-
scrollbar-width: thin;
|
|
93
|
-
scrollbar-color: var(--oc-border-strong, var(--oc-border)) transparent;
|
|
94
|
-
}
|
|
95
|
-
.oc-message-thread__scroll:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
|
|
96
|
-
.oc-message-thread__scroll > .oc-message-list { padding: 1rem 0.85rem; }
|
|
97
|
-
|
|
98
|
-
/* ---- Composer footer: optional attachment chips + the chat-composer ---- */
|
|
99
|
-
.oc-message-thread__footer {
|
|
100
|
-
grid-row: 3;
|
|
101
|
-
display: grid;
|
|
102
|
-
gap: 0.5rem;
|
|
103
|
-
padding: 0.6rem 0.75rem 0.75rem;
|
|
104
|
-
border-block-start: 1px solid var(--oc-border);
|
|
105
|
-
background: var(--oc-card);
|
|
106
|
-
box-shadow: 0 -4px 16px oklch(from var(--color-black-60) l c h / 0.05);
|
|
107
|
-
}
|
|
108
|
-
.oc-message-thread__footer .oc-chat-composer { background: var(--oc-background); }
|
|
109
|
-
.oc-message-thread__note { margin: 0; color: var(--oc-muted-foreground); font-size: 0.75rem; text-align: center; }
|
|
110
|
-
|
|
111
|
-
/* ---- Sending overlay: set aria-busy="true" on the thread while a message or upload is on its way ---- */
|
|
112
|
-
.oc-message-thread__busy {
|
|
113
|
-
position: absolute;
|
|
114
|
-
inset: 0;
|
|
115
|
-
z-index: 3;
|
|
116
|
-
display: none;
|
|
117
|
-
place-content: center;
|
|
118
|
-
justify-items: center;
|
|
119
|
-
gap: 0.4rem;
|
|
120
|
-
padding: 1.5rem;
|
|
121
|
-
background: color-mix(in oklch, var(--oc-background) 82%, transparent);
|
|
122
|
-
backdrop-filter: blur(2px);
|
|
123
|
-
text-align: center;
|
|
124
|
-
}
|
|
125
|
-
.oc-message-thread[aria-busy="true"] > .oc-message-thread__busy { display: grid; }
|
|
126
|
-
.oc-message-thread__busy > .oc-spinner { margin-block-end: 0.35rem; color: var(--oc-primary); }
|
|
127
|
-
.oc-message-thread__busy strong { font-size: 0.9rem; }
|
|
128
|
-
.oc-message-thread__busy span { color: var(--oc-muted-foreground); font-size: 0.78rem; }
|
|
129
|
-
|
|
130
|
-
@container (width < 26rem) {
|
|
131
|
-
.oc-message-thread__people { display: none; }
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
@media (prefers-reduced-motion: reduce) {
|
|
135
|
-
.oc-message-thread__busy { backdrop-filter: none; }
|
|
136
|
-
}
|
|
1
|
+
/* File: packages/ui/src/parts/media-message-thread.css | Map: frame (grid: header / messages / composer) -> header (title, meta,
|
|
2
|
+
people, status, actions) -> wallpaper (masked doodles in a token color) -> scroll area (starts at the bottom)
|
|
3
|
+
-> composer footer -> sending overlay (aria-busy) -> reduced motion
|
|
4
|
+
Message thread: one conversation. The scroll area uses flex-direction: column-reverse, so it opens at the newest message
|
|
5
|
+
and stays there when messages are added, without a script. Based on the question chat of the Korrekt app. */
|
|
6
|
+
|
|
7
|
+
.oc-message-thread {
|
|
8
|
+
--oc-message-thread-height: 32rem;
|
|
9
|
+
position: relative;
|
|
10
|
+
display: grid;
|
|
11
|
+
grid-template-rows: auto minmax(0, 1fr) auto;
|
|
12
|
+
grid-template-columns: minmax(0, 1fr);
|
|
13
|
+
block-size: var(--oc-message-thread-height);
|
|
14
|
+
min-inline-size: 0;
|
|
15
|
+
overflow: hidden;
|
|
16
|
+
border: 1px solid var(--oc-border);
|
|
17
|
+
border-radius: calc(var(--oc-radius) + 4px);
|
|
18
|
+
background: color-mix(in oklch, var(--oc-muted) 40%, var(--oc-background));
|
|
19
|
+
color: var(--oc-foreground);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/* ---- Header ---- */
|
|
23
|
+
.oc-message-thread__header {
|
|
24
|
+
grid-row: 1;
|
|
25
|
+
display: flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
gap: 0.75rem;
|
|
28
|
+
min-inline-size: 0;
|
|
29
|
+
padding: 0.6rem 0.6rem 0.6rem 1rem;
|
|
30
|
+
border-block-end: 1px solid var(--oc-border);
|
|
31
|
+
background: var(--oc-card);
|
|
32
|
+
}
|
|
33
|
+
.oc-message-thread__heading { display: grid; flex: 1 1 auto; gap: 0.1rem; min-inline-size: 0; }
|
|
34
|
+
/* Two classes, so global heading styles (text-wrap on h3) cannot make the title wrap */
|
|
35
|
+
.oc-message-thread__heading > .oc-message-thread__title {
|
|
36
|
+
margin: 0;
|
|
37
|
+
overflow: hidden;
|
|
38
|
+
font-size: 0.95rem;
|
|
39
|
+
font-weight: 650;
|
|
40
|
+
line-height: 1.3;
|
|
41
|
+
white-space: nowrap;
|
|
42
|
+
text-overflow: ellipsis;
|
|
43
|
+
}
|
|
44
|
+
.oc-message-thread__heading > .oc-message-thread__meta {
|
|
45
|
+
margin: 0;
|
|
46
|
+
overflow: hidden;
|
|
47
|
+
color: var(--oc-muted-foreground);
|
|
48
|
+
font-size: 0.75rem;
|
|
49
|
+
white-space: nowrap;
|
|
50
|
+
text-overflow: ellipsis;
|
|
51
|
+
}
|
|
52
|
+
.oc-message-thread__meta strong { color: var(--oc-primary); font-weight: 600; }
|
|
53
|
+
.oc-message-thread__people { flex: none; }
|
|
54
|
+
.oc-message-thread__people .oc-avatar { inline-size: 1.75rem; block-size: 1.75rem; font-size: 0.62rem; border-color: var(--oc-card); }
|
|
55
|
+
.oc-message-thread__actions { display: flex; flex: none; align-items: center; gap: 0.35rem; }
|
|
56
|
+
.oc-message-thread__icon-btn {
|
|
57
|
+
display: grid;
|
|
58
|
+
place-items: center;
|
|
59
|
+
inline-size: 2rem;
|
|
60
|
+
block-size: 2rem;
|
|
61
|
+
padding: 0;
|
|
62
|
+
border: 0;
|
|
63
|
+
border-radius: 50%;
|
|
64
|
+
background: transparent;
|
|
65
|
+
color: var(--oc-muted-foreground);
|
|
66
|
+
cursor: pointer;
|
|
67
|
+
}
|
|
68
|
+
.oc-message-thread__icon-btn svg { inline-size: 1.1rem; block-size: 1.1rem; }
|
|
69
|
+
.oc-message-thread__icon-btn:hover { background: var(--oc-surface-strong); color: var(--oc-foreground); }
|
|
70
|
+
.oc-message-thread__icon-btn:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 1px; }
|
|
71
|
+
|
|
72
|
+
/* ---- Wallpaper: line doodles (chat bubble, note, sun, house, lamp…) as a mask, painted in a token color ---- */
|
|
73
|
+
.oc-message-thread::before {
|
|
74
|
+
content: "";
|
|
75
|
+
grid-row: 2;
|
|
76
|
+
grid-column: 1;
|
|
77
|
+
pointer-events: none;
|
|
78
|
+
background: oklch(from var(--oc-muted-foreground) l c h / 0.11);
|
|
79
|
+
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220' viewBox='0 0 220 220'%3E%3Cg fill='none' stroke='currentColor' stroke-width='1.25' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M28 36h28a6 6 0 0 1 6 6v14a6 6 0 0 1-6 6H40l-10 8v-8h-2a6 6 0 0 1-6-6V42a6 6 0 0 1 6-6z'/%3E%3Cpath d='M118 42h22v28H118z'/%3E%3Cpath d='M122 50h14M122 56h10'/%3E%3Ccircle cx='188' cy='52' r='10'/%3E%3Cpath d='M188 42v4M188 58v4M178 52h4M194 52h4'/%3E%3Cpath d='M42 118l8-4 8 4v10l-8 4-8-4z'/%3E%3Ccircle cx='50' cy='123' r='2.5'/%3E%3Cpath d='M128 112h24v18H128zM132 118h16M132 124h10'/%3E%3Cpath d='M178 118c6 0 10 4 10 10s-4 10-10 10-10-4-10-10 4-10 10-10z'/%3E%3Cpath d='M178 124v8M174 128h8'/%3E%3Cpath d='M36 178h20l4 12H32z'/%3E%3Cpath d='M120 176c8 0 14 6 14 14H106c0-8 6-14 14-14z'/%3E%3Ccircle cx='120' cy='168' r='7'/%3E%3Cpath d='M176 172h24v20h-24z'/%3E%3Cpath d='M182 178h12M182 184h8'/%3E%3C/g%3E%3C/svg%3E") 0 0 / 220px 220px repeat;
|
|
80
|
+
}
|
|
81
|
+
.oc-message-thread--plain::before { display: none; }
|
|
82
|
+
|
|
83
|
+
/* ---- Scroll area: column-reverse keeps the newest message in view ---- */
|
|
84
|
+
.oc-message-thread__scroll {
|
|
85
|
+
grid-row: 2;
|
|
86
|
+
grid-column: 1;
|
|
87
|
+
display: flex;
|
|
88
|
+
flex-direction: column-reverse;
|
|
89
|
+
min-block-size: 0;
|
|
90
|
+
overflow-y: auto;
|
|
91
|
+
overscroll-behavior: contain;
|
|
92
|
+
scrollbar-width: thin;
|
|
93
|
+
scrollbar-color: var(--oc-border-strong, var(--oc-border)) transparent;
|
|
94
|
+
}
|
|
95
|
+
.oc-message-thread__scroll:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
|
|
96
|
+
.oc-message-thread__scroll > .oc-message-list { padding: 1rem 0.85rem; }
|
|
97
|
+
|
|
98
|
+
/* ---- Composer footer: optional attachment chips + the chat-composer ---- */
|
|
99
|
+
.oc-message-thread__footer {
|
|
100
|
+
grid-row: 3;
|
|
101
|
+
display: grid;
|
|
102
|
+
gap: 0.5rem;
|
|
103
|
+
padding: 0.6rem 0.75rem 0.75rem;
|
|
104
|
+
border-block-start: 1px solid var(--oc-border);
|
|
105
|
+
background: var(--oc-card);
|
|
106
|
+
box-shadow: 0 -4px 16px oklch(from var(--color-black-60) l c h / 0.05);
|
|
107
|
+
}
|
|
108
|
+
.oc-message-thread__footer .oc-chat-composer { background: var(--oc-background); }
|
|
109
|
+
.oc-message-thread__note { margin: 0; color: var(--oc-muted-foreground); font-size: 0.75rem; text-align: center; }
|
|
110
|
+
|
|
111
|
+
/* ---- Sending overlay: set aria-busy="true" on the thread while a message or upload is on its way ---- */
|
|
112
|
+
.oc-message-thread__busy {
|
|
113
|
+
position: absolute;
|
|
114
|
+
inset: 0;
|
|
115
|
+
z-index: 3;
|
|
116
|
+
display: none;
|
|
117
|
+
place-content: center;
|
|
118
|
+
justify-items: center;
|
|
119
|
+
gap: 0.4rem;
|
|
120
|
+
padding: 1.5rem;
|
|
121
|
+
background: color-mix(in oklch, var(--oc-background) 82%, transparent);
|
|
122
|
+
backdrop-filter: blur(2px);
|
|
123
|
+
text-align: center;
|
|
124
|
+
}
|
|
125
|
+
.oc-message-thread[aria-busy="true"] > .oc-message-thread__busy { display: grid; }
|
|
126
|
+
.oc-message-thread__busy > .oc-spinner { margin-block-end: 0.35rem; color: var(--oc-primary); }
|
|
127
|
+
.oc-message-thread__busy strong { font-size: 0.9rem; }
|
|
128
|
+
.oc-message-thread__busy span { color: var(--oc-muted-foreground); font-size: 0.78rem; }
|
|
129
|
+
|
|
130
|
+
@container (width < 26rem) {
|
|
131
|
+
.oc-message-thread__people { display: none; }
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
@media (prefers-reduced-motion: reduce) {
|
|
135
|
+
.oc-message-thread__busy { backdrop-filter: none; }
|
|
136
|
+
}
|
|
@@ -1,160 +1,160 @@
|
|
|
1
|
-
/* File: packages/ui/src/parts/media-message.css | Map: list -> row (in / out) -> avatar -> bubble (sender, quote, text, attachments, meta)
|
|
2
|
-
-> grouping (:has) -> hover actions -> date divider + system line -> reduced motion
|
|
3
|
-
Message: one chat bubble. Incoming on the left with the avatar, outgoing on the right in the primary tint.
|
|
4
|
-
Consecutive messages of one sender group by themselves: the avatar shows once (on the last one), the name once (on the
|
|
5
|
-
first one). Based on the question chat of the Korrekt app. */
|
|
6
|
-
|
|
7
|
-
.oc-message-list {
|
|
8
|
-
--oc-message-in: var(--oc-card);
|
|
9
|
-
--oc-message-out: color-mix(in oklch, var(--oc-primary) 14%, var(--oc-card));
|
|
10
|
-
--oc-message-shadow: 0 1px 2px oklch(from var(--color-black-60) l c h / 0.08), 0 4px 12px oklch(from var(--color-black-60) l c h / 0.06);
|
|
11
|
-
display: flex;
|
|
12
|
-
flex-direction: column;
|
|
13
|
-
gap: 0.75rem;
|
|
14
|
-
margin: 0;
|
|
15
|
-
padding: 0.75rem;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/* ---- Row: avatar | bubble | actions (mirrored for outgoing) ---- */
|
|
19
|
-
.oc-message {
|
|
20
|
-
display: flex;
|
|
21
|
-
align-items: flex-end;
|
|
22
|
-
gap: 0.5rem;
|
|
23
|
-
min-inline-size: 0;
|
|
24
|
-
margin: 0;
|
|
25
|
-
}
|
|
26
|
-
.oc-message--out { flex-direction: row-reverse; }
|
|
27
|
-
.oc-message__avatar { inline-size: 2rem; block-size: 2rem; font-size: 0.7rem; border: 1px solid var(--oc-border); }
|
|
28
|
-
.oc-message--out .oc-message__avatar { background: color-mix(in oklch, var(--oc-primary) 18%, var(--oc-card)); color: var(--oc-primary); }
|
|
29
|
-
|
|
30
|
-
/* ---- Bubble ---- */
|
|
31
|
-
.oc-message__bubble {
|
|
32
|
-
display: grid;
|
|
33
|
-
gap: 0.25rem;
|
|
34
|
-
min-inline-size: 0;
|
|
35
|
-
max-inline-size: min(78%, 34rem);
|
|
36
|
-
padding: 0.5rem 0.8rem 0.4rem;
|
|
37
|
-
border: 1px solid var(--oc-border);
|
|
38
|
-
border-radius: 1rem 1rem 1rem 0.25rem;
|
|
39
|
-
background: var(--oc-message-in, var(--oc-card));
|
|
40
|
-
box-shadow: var(--oc-message-shadow, none);
|
|
41
|
-
color: var(--oc-foreground);
|
|
42
|
-
font-size: 0.875rem;
|
|
43
|
-
line-height: 1.5;
|
|
44
|
-
}
|
|
45
|
-
.oc-message--out .oc-message__bubble {
|
|
46
|
-
border-color: color-mix(in oklch, var(--oc-primary) 22%, var(--oc-border));
|
|
47
|
-
border-radius: 1rem 1rem 0.25rem 1rem;
|
|
48
|
-
background: var(--oc-message-out, var(--oc-muted));
|
|
49
|
-
}
|
|
50
|
-
.oc-message__sender { margin: 0; color: var(--oc-primary); font-size: 0.72rem; font-weight: 650; }
|
|
51
|
-
|
|
52
|
-
/* Message text: paragraphs, lists, bold/italic, links and inline code (the output of a small markdown renderer) */
|
|
53
|
-
.oc-message__text { min-inline-size: 0; overflow-wrap: anywhere; }
|
|
54
|
-
.oc-message__text > :is(p, ul, ol) { margin: 0; }
|
|
55
|
-
.oc-message__text > * + * { margin-block-start: 0.35rem; }
|
|
56
|
-
.oc-message__text :is(ul, ol) { padding-inline-start: 1.15rem; }
|
|
57
|
-
.oc-message__text a { color: var(--oc-primary); text-decoration: underline; text-underline-offset: 2px; }
|
|
58
|
-
.oc-message__text a:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 2px; border-radius: 2px; }
|
|
59
|
-
.oc-message__text code { padding: 0.05rem 0.3rem; border-radius: 4px; background: var(--oc-surface-strong); font-size: 0.85em; }
|
|
60
|
-
|
|
61
|
-
/* Reply quote: the message this one answers (a link back to it) */
|
|
62
|
-
.oc-message__quote {
|
|
63
|
-
display: grid;
|
|
64
|
-
gap: 0.1rem;
|
|
65
|
-
padding: 0.35rem 0.6rem;
|
|
66
|
-
border-inline-start: 3px solid var(--oc-primary);
|
|
67
|
-
border-radius: 0.4rem;
|
|
68
|
-
background: var(--oc-surface-strong);
|
|
69
|
-
color: var(--oc-muted-foreground);
|
|
70
|
-
font-size: 0.8rem;
|
|
71
|
-
line-height: 1.4;
|
|
72
|
-
text-decoration: none;
|
|
73
|
-
}
|
|
74
|
-
.oc-message__quote > strong { color: var(--oc-foreground); font-size: 0.72rem; font-weight: 650; }
|
|
75
|
-
.oc-message__quote > span { overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
|
|
76
|
-
a.oc-message__quote:hover { background: color-mix(in oklch, var(--oc-primary) 10%, transparent); }
|
|
77
|
-
a.oc-message__quote:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 2px; }
|
|
78
|
-
|
|
79
|
-
.oc-message__attachments { display: grid; gap: 0.35rem; margin-block-start: 0.15rem; }
|
|
80
|
-
|
|
81
|
-
/* Time + read receipt, small and right aligned */
|
|
82
|
-
.oc-message__meta {
|
|
83
|
-
display: flex;
|
|
84
|
-
flex-wrap: wrap;
|
|
85
|
-
justify-content: flex-end;
|
|
86
|
-
align-items: center;
|
|
87
|
-
gap: 0.35rem;
|
|
88
|
-
margin: 0;
|
|
89
|
-
color: var(--oc-muted-foreground);
|
|
90
|
-
font-size: 0.68rem;
|
|
91
|
-
font-variant-numeric: tabular-nums;
|
|
92
|
-
}
|
|
93
|
-
.oc-message__status { display: inline-flex; align-items: center; gap: 0.2rem; }
|
|
94
|
-
.oc-message__status--read { color: var(--oc-success); font-weight: 600; }
|
|
95
|
-
.oc-message__status--failed { color: var(--oc-destructive); font-weight: 600; }
|
|
96
|
-
.oc-message__status svg { inline-size: 0.85rem; block-size: 0.85rem; }
|
|
97
|
-
|
|
98
|
-
/* ---- Grouping: a --continued message follows one of the same sender ---- */
|
|
99
|
-
.oc-message--continued { margin-block-start: -0.5rem; }
|
|
100
|
-
.oc-message--continued .oc-message__sender { display: none; }
|
|
101
|
-
.oc-message:has(+ .oc-message--continued) .oc-message__avatar { visibility: hidden; }
|
|
102
|
-
.oc-message:has(+ .oc-message--continued) .oc-message__bubble { border-end-start-radius: 1rem; }
|
|
103
|
-
.oc-message--out:has(+ .oc-message--continued) .oc-message__bubble { border-end-start-radius: 1rem; border-end-end-radius: 1rem; }
|
|
104
|
-
.oc-message--continued .oc-message__bubble { border-start-start-radius: 0.25rem; }
|
|
105
|
-
.oc-message--out.oc-message--continued .oc-message__bubble { border-start-start-radius: 1rem; border-start-end-radius: 0.25rem; }
|
|
106
|
-
|
|
107
|
-
/* ---- Actions: appear on hover and keyboard focus (always visible on touch screens) ---- */
|
|
108
|
-
.oc-message__actions {
|
|
109
|
-
display: flex;
|
|
110
|
-
align-self: center;
|
|
111
|
-
gap: 0.15rem;
|
|
112
|
-
opacity: 0;
|
|
113
|
-
transition: opacity var(--oc-transition-normal);
|
|
114
|
-
}
|
|
115
|
-
.oc-message:hover .oc-message__actions,
|
|
116
|
-
.oc-message:focus-within .oc-message__actions { opacity: 1; }
|
|
117
|
-
@media (hover: none) { .oc-message__actions { opacity: 1; } }
|
|
118
|
-
.oc-message__action {
|
|
119
|
-
display: grid;
|
|
120
|
-
place-items: center;
|
|
121
|
-
inline-size: 1.85rem;
|
|
122
|
-
block-size: 1.85rem;
|
|
123
|
-
padding: 0;
|
|
124
|
-
border: 0;
|
|
125
|
-
border-radius: 50%;
|
|
126
|
-
background: transparent;
|
|
127
|
-
color: var(--oc-muted-foreground);
|
|
128
|
-
cursor: pointer;
|
|
129
|
-
}
|
|
130
|
-
.oc-message__action svg { inline-size: 1rem; block-size: 1rem; }
|
|
131
|
-
.oc-message__action:hover { background: var(--oc-surface-strong); color: var(--oc-foreground); }
|
|
132
|
-
.oc-message__action--destructive:hover { background: oklch(from var(--oc-destructive) l c h / 0.12); color: var(--oc-destructive); }
|
|
133
|
-
.oc-message__action:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 1px; }
|
|
134
|
-
|
|
135
|
-
/* ---- Date divider and system line ---- */
|
|
136
|
-
.oc-message-divider {
|
|
137
|
-
display: flex;
|
|
138
|
-
align-items: center;
|
|
139
|
-
gap: 0.75rem;
|
|
140
|
-
margin: 0.25rem 0;
|
|
141
|
-
color: var(--oc-muted-foreground);
|
|
142
|
-
font-size: 0.72rem;
|
|
143
|
-
font-weight: 600;
|
|
144
|
-
}
|
|
145
|
-
.oc-message-divider::before,
|
|
146
|
-
.oc-message-divider::after { content: ""; flex: 1; border-block-start: 1px solid var(--oc-border); }
|
|
147
|
-
.oc-message-divider > * {
|
|
148
|
-
padding: 0.15rem 0.6rem;
|
|
149
|
-
border: 1px solid var(--oc-border);
|
|
150
|
-
border-radius: 999px;
|
|
151
|
-
background: var(--oc-card);
|
|
152
|
-
}
|
|
153
|
-
.oc-message-divider--system { justify-content: center; font-weight: 500; }
|
|
154
|
-
.oc-message-divider--system::before,
|
|
155
|
-
.oc-message-divider--system::after { display: none; }
|
|
156
|
-
.oc-message-divider--system > * { max-inline-size: 85%; border-style: dashed; background: var(--oc-background); text-align: center; }
|
|
157
|
-
|
|
158
|
-
@media (prefers-reduced-motion: reduce) {
|
|
159
|
-
.oc-message__actions { transition: none; }
|
|
160
|
-
}
|
|
1
|
+
/* File: packages/ui/src/parts/media-message.css | Map: list -> row (in / out) -> avatar -> bubble (sender, quote, text, attachments, meta)
|
|
2
|
+
-> grouping (:has) -> hover actions -> date divider + system line -> reduced motion
|
|
3
|
+
Message: one chat bubble. Incoming on the left with the avatar, outgoing on the right in the primary tint.
|
|
4
|
+
Consecutive messages of one sender group by themselves: the avatar shows once (on the last one), the name once (on the
|
|
5
|
+
first one). Based on the question chat of the Korrekt app. */
|
|
6
|
+
|
|
7
|
+
.oc-message-list {
|
|
8
|
+
--oc-message-in: var(--oc-card);
|
|
9
|
+
--oc-message-out: color-mix(in oklch, var(--oc-primary) 14%, var(--oc-card));
|
|
10
|
+
--oc-message-shadow: 0 1px 2px oklch(from var(--color-black-60) l c h / 0.08), 0 4px 12px oklch(from var(--color-black-60) l c h / 0.06);
|
|
11
|
+
display: flex;
|
|
12
|
+
flex-direction: column;
|
|
13
|
+
gap: 0.75rem;
|
|
14
|
+
margin: 0;
|
|
15
|
+
padding: 0.75rem;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/* ---- Row: avatar | bubble | actions (mirrored for outgoing) ---- */
|
|
19
|
+
.oc-message {
|
|
20
|
+
display: flex;
|
|
21
|
+
align-items: flex-end;
|
|
22
|
+
gap: 0.5rem;
|
|
23
|
+
min-inline-size: 0;
|
|
24
|
+
margin: 0;
|
|
25
|
+
}
|
|
26
|
+
.oc-message--out { flex-direction: row-reverse; }
|
|
27
|
+
.oc-message__avatar { inline-size: 2rem; block-size: 2rem; font-size: 0.7rem; border: 1px solid var(--oc-border); }
|
|
28
|
+
.oc-message--out .oc-message__avatar { background: color-mix(in oklch, var(--oc-primary) 18%, var(--oc-card)); color: var(--oc-primary); }
|
|
29
|
+
|
|
30
|
+
/* ---- Bubble ---- */
|
|
31
|
+
.oc-message__bubble {
|
|
32
|
+
display: grid;
|
|
33
|
+
gap: 0.25rem;
|
|
34
|
+
min-inline-size: 0;
|
|
35
|
+
max-inline-size: min(78%, 34rem);
|
|
36
|
+
padding: 0.5rem 0.8rem 0.4rem;
|
|
37
|
+
border: 1px solid var(--oc-border);
|
|
38
|
+
border-radius: 1rem 1rem 1rem 0.25rem;
|
|
39
|
+
background: var(--oc-message-in, var(--oc-card));
|
|
40
|
+
box-shadow: var(--oc-message-shadow, none);
|
|
41
|
+
color: var(--oc-foreground);
|
|
42
|
+
font-size: 0.875rem;
|
|
43
|
+
line-height: 1.5;
|
|
44
|
+
}
|
|
45
|
+
.oc-message--out .oc-message__bubble {
|
|
46
|
+
border-color: color-mix(in oklch, var(--oc-primary) 22%, var(--oc-border));
|
|
47
|
+
border-radius: 1rem 1rem 0.25rem 1rem;
|
|
48
|
+
background: var(--oc-message-out, var(--oc-muted));
|
|
49
|
+
}
|
|
50
|
+
.oc-message__sender { margin: 0; color: var(--oc-primary); font-size: 0.72rem; font-weight: 650; }
|
|
51
|
+
|
|
52
|
+
/* Message text: paragraphs, lists, bold/italic, links and inline code (the output of a small markdown renderer) */
|
|
53
|
+
.oc-message__text { min-inline-size: 0; overflow-wrap: anywhere; }
|
|
54
|
+
.oc-message__text > :is(p, ul, ol) { margin: 0; }
|
|
55
|
+
.oc-message__text > * + * { margin-block-start: 0.35rem; }
|
|
56
|
+
.oc-message__text :is(ul, ol) { padding-inline-start: 1.15rem; }
|
|
57
|
+
.oc-message__text a { color: var(--oc-primary); text-decoration: underline; text-underline-offset: 2px; }
|
|
58
|
+
.oc-message__text a:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 2px; border-radius: 2px; }
|
|
59
|
+
.oc-message__text code { padding: 0.05rem 0.3rem; border-radius: 4px; background: var(--oc-surface-strong); font-size: 0.85em; }
|
|
60
|
+
|
|
61
|
+
/* Reply quote: the message this one answers (a link back to it) */
|
|
62
|
+
.oc-message__quote {
|
|
63
|
+
display: grid;
|
|
64
|
+
gap: 0.1rem;
|
|
65
|
+
padding: 0.35rem 0.6rem;
|
|
66
|
+
border-inline-start: 3px solid var(--oc-primary);
|
|
67
|
+
border-radius: 0.4rem;
|
|
68
|
+
background: var(--oc-surface-strong);
|
|
69
|
+
color: var(--oc-muted-foreground);
|
|
70
|
+
font-size: 0.8rem;
|
|
71
|
+
line-height: 1.4;
|
|
72
|
+
text-decoration: none;
|
|
73
|
+
}
|
|
74
|
+
.oc-message__quote > strong { color: var(--oc-foreground); font-size: 0.72rem; font-weight: 650; }
|
|
75
|
+
.oc-message__quote > span { overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
|
|
76
|
+
a.oc-message__quote:hover { background: color-mix(in oklch, var(--oc-primary) 10%, transparent); }
|
|
77
|
+
a.oc-message__quote:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 2px; }
|
|
78
|
+
|
|
79
|
+
.oc-message__attachments { display: grid; gap: 0.35rem; margin-block-start: 0.15rem; }
|
|
80
|
+
|
|
81
|
+
/* Time + read receipt, small and right aligned */
|
|
82
|
+
.oc-message__meta {
|
|
83
|
+
display: flex;
|
|
84
|
+
flex-wrap: wrap;
|
|
85
|
+
justify-content: flex-end;
|
|
86
|
+
align-items: center;
|
|
87
|
+
gap: 0.35rem;
|
|
88
|
+
margin: 0;
|
|
89
|
+
color: var(--oc-muted-foreground);
|
|
90
|
+
font-size: 0.68rem;
|
|
91
|
+
font-variant-numeric: tabular-nums;
|
|
92
|
+
}
|
|
93
|
+
.oc-message__status { display: inline-flex; align-items: center; gap: 0.2rem; }
|
|
94
|
+
.oc-message__status--read { color: var(--oc-success); font-weight: 600; }
|
|
95
|
+
.oc-message__status--failed { color: var(--oc-destructive); font-weight: 600; }
|
|
96
|
+
.oc-message__status svg { inline-size: 0.85rem; block-size: 0.85rem; }
|
|
97
|
+
|
|
98
|
+
/* ---- Grouping: a --continued message follows one of the same sender ---- */
|
|
99
|
+
.oc-message--continued { margin-block-start: -0.5rem; }
|
|
100
|
+
.oc-message--continued .oc-message__sender { display: none; }
|
|
101
|
+
.oc-message:has(+ .oc-message--continued) .oc-message__avatar { visibility: hidden; }
|
|
102
|
+
.oc-message:has(+ .oc-message--continued) .oc-message__bubble { border-end-start-radius: 1rem; }
|
|
103
|
+
.oc-message--out:has(+ .oc-message--continued) .oc-message__bubble { border-end-start-radius: 1rem; border-end-end-radius: 1rem; }
|
|
104
|
+
.oc-message--continued .oc-message__bubble { border-start-start-radius: 0.25rem; }
|
|
105
|
+
.oc-message--out.oc-message--continued .oc-message__bubble { border-start-start-radius: 1rem; border-start-end-radius: 0.25rem; }
|
|
106
|
+
|
|
107
|
+
/* ---- Actions: appear on hover and keyboard focus (always visible on touch screens) ---- */
|
|
108
|
+
.oc-message__actions {
|
|
109
|
+
display: flex;
|
|
110
|
+
align-self: center;
|
|
111
|
+
gap: 0.15rem;
|
|
112
|
+
opacity: 0;
|
|
113
|
+
transition: opacity var(--oc-transition-normal);
|
|
114
|
+
}
|
|
115
|
+
.oc-message:hover .oc-message__actions,
|
|
116
|
+
.oc-message:focus-within .oc-message__actions { opacity: 1; }
|
|
117
|
+
@media (hover: none) { .oc-message__actions { opacity: 1; } }
|
|
118
|
+
.oc-message__action {
|
|
119
|
+
display: grid;
|
|
120
|
+
place-items: center;
|
|
121
|
+
inline-size: 1.85rem;
|
|
122
|
+
block-size: 1.85rem;
|
|
123
|
+
padding: 0;
|
|
124
|
+
border: 0;
|
|
125
|
+
border-radius: 50%;
|
|
126
|
+
background: transparent;
|
|
127
|
+
color: var(--oc-muted-foreground);
|
|
128
|
+
cursor: pointer;
|
|
129
|
+
}
|
|
130
|
+
.oc-message__action svg { inline-size: 1rem; block-size: 1rem; }
|
|
131
|
+
.oc-message__action:hover { background: var(--oc-surface-strong); color: var(--oc-foreground); }
|
|
132
|
+
.oc-message__action--destructive:hover { background: oklch(from var(--oc-destructive) l c h / 0.12); color: var(--oc-destructive); }
|
|
133
|
+
.oc-message__action:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 1px; }
|
|
134
|
+
|
|
135
|
+
/* ---- Date divider and system line ---- */
|
|
136
|
+
.oc-message-divider {
|
|
137
|
+
display: flex;
|
|
138
|
+
align-items: center;
|
|
139
|
+
gap: 0.75rem;
|
|
140
|
+
margin: 0.25rem 0;
|
|
141
|
+
color: var(--oc-muted-foreground);
|
|
142
|
+
font-size: 0.72rem;
|
|
143
|
+
font-weight: 600;
|
|
144
|
+
}
|
|
145
|
+
.oc-message-divider::before,
|
|
146
|
+
.oc-message-divider::after { content: ""; flex: 1; border-block-start: 1px solid var(--oc-border); }
|
|
147
|
+
.oc-message-divider > * {
|
|
148
|
+
padding: 0.15rem 0.6rem;
|
|
149
|
+
border: 1px solid var(--oc-border);
|
|
150
|
+
border-radius: 999px;
|
|
151
|
+
background: var(--oc-card);
|
|
152
|
+
}
|
|
153
|
+
.oc-message-divider--system { justify-content: center; font-weight: 500; }
|
|
154
|
+
.oc-message-divider--system::before,
|
|
155
|
+
.oc-message-divider--system::after { display: none; }
|
|
156
|
+
.oc-message-divider--system > * { max-inline-size: 85%; border-style: dashed; background: var(--oc-background); text-align: center; }
|
|
157
|
+
|
|
158
|
+
@media (prefers-reduced-motion: reduce) {
|
|
159
|
+
.oc-message__actions { transition: none; }
|
|
160
|
+
}
|