@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.
Files changed (214) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +21 -21
  3. package/bin/lib/add.mjs +126 -126
  4. package/bin/lib/catalog.mjs +169 -169
  5. package/bin/lib/project.mjs +90 -90
  6. package/bin/omniaui.mjs +69 -69
  7. package/dist/code-block.css +25 -25
  8. package/dist/components-extra.css +916 -914
  9. package/dist/components.css +6565 -6469
  10. package/dist/components.min.css +1 -1
  11. package/dist/data-table.d.ts +9 -9
  12. package/dist/data-table.js +505 -505
  13. package/dist/docs-ui.css +267 -265
  14. package/dist/oc-theme.css +69 -69
  15. package/dist/parts/app-accordion-accent.css +60 -60
  16. package/dist/parts/app-alpha-tabs.css +68 -68
  17. package/dist/parts/app-busy-overlay.css +25 -25
  18. package/dist/parts/app-column-menu.css +85 -85
  19. package/dist/parts/app-confirm-dialog.css +70 -70
  20. package/dist/parts/app-cookie-consent.css +63 -63
  21. package/dist/parts/app-data-table.css +174 -174
  22. package/dist/parts/app-greeting.css +47 -47
  23. package/dist/parts/app-list-toolbar.css +81 -81
  24. package/dist/parts/app-page-header.css +54 -54
  25. package/dist/parts/app-severity-card.css +91 -91
  26. package/dist/parts/app-sidebar-dark.css +15 -15
  27. package/dist/parts/app-sortable-row.css +52 -52
  28. package/dist/parts/app-stat-card.css +68 -68
  29. package/dist/parts/app-table-actions.css +71 -71
  30. package/dist/parts/app-table-compact.css +54 -54
  31. package/dist/parts/app-top-progress.css +68 -68
  32. package/dist/parts/app-tree.css +104 -104
  33. package/dist/parts/app-upgrade-banner.css +90 -90
  34. package/dist/parts/app-version-banner.css +80 -80
  35. package/dist/parts/data-chart-line.css +167 -167
  36. package/dist/parts/forms-affix-input.css +75 -75
  37. package/dist/parts/forms-barcode-input.css +75 -75
  38. package/dist/parts/forms-chip-filter.css +91 -91
  39. package/dist/parts/forms-color-select.css +97 -89
  40. package/dist/parts/forms-decimal-input.css +51 -51
  41. package/dist/parts/forms-filter-counts.css +94 -94
  42. package/dist/parts/forms-language-select.css +89 -76
  43. package/dist/parts/forms-number-input.css +98 -95
  44. package/dist/parts/forms-password-requirements.css +55 -55
  45. package/dist/parts/forms-phone-input.css +85 -85
  46. package/dist/parts/forms-time-input.css +74 -74
  47. package/dist/parts/forms-toggle-field.css +69 -69
  48. package/dist/parts/media-art.css +21 -21
  49. package/dist/parts/media-attachment.css +160 -160
  50. package/dist/parts/media-browser-frame.css +73 -73
  51. package/dist/parts/media-card.css +83 -83
  52. package/dist/parts/media-chat-composer.css +90 -90
  53. package/dist/parts/media-doc-viewer.css +151 -151
  54. package/dist/parts/media-emoji-picker.css +88 -88
  55. package/dist/parts/media-entity-card.css +52 -52
  56. package/dist/parts/media-flip-card.css +78 -78
  57. package/dist/parts/media-image-zoom.css +68 -68
  58. package/dist/parts/media-lightbox.css +131 -131
  59. package/dist/parts/media-message-thread.css +136 -136
  60. package/dist/parts/media-message.css +160 -160
  61. package/dist/parts/media-row.css +78 -78
  62. package/dist/parts/media-stack-card.css +82 -82
  63. package/dist/parts/media-terminal-log.css +76 -76
  64. package/dist/parts/media-thumb.css +71 -71
  65. package/dist/parts/site-fact-list.css +25 -25
  66. package/dist/parts/site-link-arrow.css +34 -34
  67. package/dist/parts/site-marquee.css +34 -34
  68. package/dist/parts/site-next-teaser.css +75 -75
  69. package/dist/parts/site-price-card.css +91 -75
  70. package/dist/parts/site-product-mark.css +66 -66
  71. package/dist/parts/site-project-card.css +111 -111
  72. package/dist/parts/site-prose.css +124 -124
  73. package/dist/parts/site-stack-list.css +48 -48
  74. package/dist/parts/site-timeline.css +54 -54
  75. package/dist/showcase.css +410 -404
  76. package/package.json +69 -69
  77. package/snippets/accordion-accent.html +24 -24
  78. package/snippets/accordion.html +11 -11
  79. package/snippets/affix-input.html +30 -30
  80. package/snippets/alert-dialog.html +22 -22
  81. package/snippets/alert.html +5 -5
  82. package/snippets/alpha-tabs.html +37 -37
  83. package/snippets/aspect-ratio.html +15 -15
  84. package/snippets/attachment.html +43 -43
  85. package/snippets/avatar.html +6 -6
  86. package/snippets/back-link.html +5 -5
  87. package/snippets/badge.html +5 -5
  88. package/snippets/barcode-input.html +18 -18
  89. package/snippets/breadcrumb.html +6 -6
  90. package/snippets/browser-frame.html +18 -18
  91. package/snippets/busy-overlay.html +31 -31
  92. package/snippets/button-group.html +21 -21
  93. package/snippets/button.html +8 -8
  94. package/snippets/calendar.html +43 -43
  95. package/snippets/card.html +17 -17
  96. package/snippets/carousel.html +21 -21
  97. package/snippets/chart-line.html +46 -46
  98. package/snippets/chart.html +27 -27
  99. package/snippets/chat-composer.html +21 -21
  100. package/snippets/checkbox.html +5 -5
  101. package/snippets/checklist.html +23 -23
  102. package/snippets/chip-filter.html +14 -14
  103. package/snippets/code-window.html +20 -20
  104. package/snippets/collapsible.html +19 -19
  105. package/snippets/color-field.html +13 -13
  106. package/snippets/color-select.html +18 -18
  107. package/snippets/column-menu.html +38 -38
  108. package/snippets/combobox.html +19 -19
  109. package/snippets/command.html +24 -24
  110. package/snippets/confirm-dialog.html +32 -32
  111. package/snippets/context-menu.html +25 -25
  112. package/snippets/cookie-consent.html +70 -70
  113. package/snippets/copy-field.html +19 -19
  114. package/snippets/counter.html +2 -2
  115. package/snippets/data-table.html +151 -151
  116. package/snippets/date-picker.html +32 -32
  117. package/snippets/decimal-input.html +20 -20
  118. package/snippets/definition-list.html +20 -20
  119. package/snippets/demo-panel.html +18 -18
  120. package/snippets/doc-viewer.html +58 -58
  121. package/snippets/drawer.html +30 -30
  122. package/snippets/dropdown-menu.html +27 -27
  123. package/snippets/dropdown.html +9 -9
  124. package/snippets/dropzone.html +13 -13
  125. package/snippets/emoji-picker.html +51 -51
  126. package/snippets/empty-state.html +17 -17
  127. package/snippets/entity-card.html +26 -26
  128. package/snippets/expandable-table.html +26 -26
  129. package/snippets/fact-list.html +14 -14
  130. package/snippets/filter-counts.html +30 -30
  131. package/snippets/flip-card.html +22 -22
  132. package/snippets/form-field.html +6 -6
  133. package/snippets/greeting.html +22 -22
  134. package/snippets/heading.html +14 -14
  135. package/snippets/hover-card.html +18 -18
  136. package/snippets/image-zoom.html +30 -30
  137. package/snippets/input-group.html +10 -10
  138. package/snippets/input.html +5 -5
  139. package/snippets/item.html +26 -26
  140. package/snippets/kbd.html +13 -13
  141. package/snippets/label.html +9 -9
  142. package/snippets/language-select.html +26 -26
  143. package/snippets/launcher-card.html +14 -14
  144. package/snippets/lightbox.html +50 -50
  145. package/snippets/link-arrow.html +10 -10
  146. package/snippets/list-toolbar.html +33 -33
  147. package/snippets/marquee.html +15 -15
  148. package/snippets/media-card.html +28 -28
  149. package/snippets/media-row.html +21 -21
  150. package/snippets/media-thumb.html +12 -12
  151. package/snippets/menubar.html +30 -30
  152. package/snippets/message-thread.html +123 -123
  153. package/snippets/message.html +51 -51
  154. package/snippets/modal.html +15 -15
  155. package/snippets/native-select.html +15 -15
  156. package/snippets/navmenu.html +23 -23
  157. package/snippets/next-teaser.html +15 -15
  158. package/snippets/number-input.html +27 -27
  159. package/snippets/otp-input.html +9 -9
  160. package/snippets/page-header.html +24 -24
  161. package/snippets/pagination.html +6 -6
  162. package/snippets/password-input.html +24 -24
  163. package/snippets/password-requirements.html +30 -30
  164. package/snippets/phone-input.html +22 -22
  165. package/snippets/popover.html +15 -15
  166. package/snippets/price-card.html +34 -34
  167. package/snippets/product-mark.html +13 -13
  168. package/snippets/progress.html +4 -4
  169. package/snippets/project-card.html +23 -23
  170. package/snippets/prose.html +54 -54
  171. package/snippets/radio.html +17 -17
  172. package/snippets/recovery-codes.html +20 -20
  173. package/snippets/resizable.html +16 -16
  174. package/snippets/scroll-area.html +20 -20
  175. package/snippets/search.html +8 -8
  176. package/snippets/segmented.html +11 -11
  177. package/snippets/select.html +7 -7
  178. package/snippets/separator.html +15 -15
  179. package/snippets/severity-card.html +35 -35
  180. package/snippets/sheet.html +32 -32
  181. package/snippets/sidebar-docs.html +24 -24
  182. package/snippets/sidebar.html +55 -55
  183. package/snippets/site-footer.html +6 -6
  184. package/snippets/site-header.html +26 -26
  185. package/snippets/skeleton.html +4 -4
  186. package/snippets/slider.html +17 -17
  187. package/snippets/sortable-row.html +31 -31
  188. package/snippets/spinner.html +14 -14
  189. package/snippets/stack-card.html +17 -17
  190. package/snippets/stack-list.html +16 -16
  191. package/snippets/stat-card.html +24 -24
  192. package/snippets/stepper.html +13 -13
  193. package/snippets/switch.html +6 -6
  194. package/snippets/table-actions.html +39 -39
  195. package/snippets/table-compact.html +24 -24
  196. package/snippets/table.html +29 -29
  197. package/snippets/tabs.html +9 -9
  198. package/snippets/tag-input.html +60 -17
  199. package/snippets/terminal-log.html +23 -23
  200. package/snippets/textarea.html +3 -3
  201. package/snippets/theme-switch.html +6 -6
  202. package/snippets/time-input.html +26 -26
  203. package/snippets/timeline.html +28 -28
  204. package/snippets/toast-stack.html +10 -10
  205. package/snippets/toast.html +36 -36
  206. package/snippets/toc.html +13 -13
  207. package/snippets/toggle-field.html +20 -20
  208. package/snippets/toggle.html +22 -22
  209. package/snippets/tooltip.html +4 -4
  210. package/snippets/top-progress.html +12 -12
  211. package/snippets/tree.html +38 -38
  212. package/snippets/upgrade-banner.html +28 -28
  213. package/snippets/user.html +15 -15
  214. package/snippets/version-banner.html +15 -15
@@ -1,151 +1,151 @@
1
- /* File: packages/ui/src/parts/media-doc-viewer.css | Map: grid -> card (bar, label, expand) -> frame (pdf, video, image)
2
- -> full-screen dialog -> small screens
3
- Document viewer: a PDF, video or image shown inline in a card with a label, plus a full-screen view on a native
4
- <dialog> opened with command="show-modal". Based on the PDF and video viewers of the Verdavita service pages. */
5
-
6
- /* ---- Grid of viewers: cards keep their width, the group is centred ---- */
7
- .oc-doc-viewer-grid {
8
- display: grid;
9
- grid-template-columns: repeat(auto-fill, minmax(min(100%, 15rem), 1fr));
10
- gap: 1rem 1.5rem;
11
- inline-size: 100%;
12
- }
13
-
14
- /* ---- Card ---- */
15
- .oc-doc-viewer {
16
- display: grid;
17
- align-content: start;
18
- gap: 0.5rem;
19
- min-inline-size: 0;
20
- margin: 0;
21
- }
22
- .oc-doc-viewer__bar {
23
- display: flex;
24
- align-items: center;
25
- justify-content: space-between;
26
- gap: 0.5rem;
27
- min-inline-size: 0;
28
- }
29
- .oc-doc-viewer__label {
30
- flex: 1 1 auto;
31
- min-inline-size: 0;
32
- overflow: hidden;
33
- color: var(--oc-foreground);
34
- font-size: 0.875rem;
35
- font-weight: 600;
36
- white-space: nowrap;
37
- text-overflow: ellipsis;
38
- }
39
- .oc-doc-viewer__meta { flex: none; color: var(--oc-muted-foreground); font-size: 0.75rem; }
40
- .oc-doc-viewer__expand {
41
- flex: none;
42
- display: grid;
43
- place-items: center;
44
- inline-size: 2rem;
45
- block-size: 2rem;
46
- padding: 0;
47
- border: 1px solid var(--oc-border);
48
- border-radius: var(--oc-radius);
49
- background: var(--oc-card);
50
- color: var(--oc-foreground);
51
- font-size: 0.95rem;
52
- cursor: zoom-in;
53
- transition: background var(--oc-transition-normal), border-color var(--oc-transition-normal);
54
- }
55
- .oc-doc-viewer__expand:hover { background: var(--oc-muted); border-color: var(--oc-border-strong, var(--oc-border)); }
56
- .oc-doc-viewer__expand:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 2px; }
57
-
58
- /* ---- Frame: A4 for PDF, 16/9 for video, free for images ---- */
59
- .oc-doc-viewer__frame {
60
- position: relative;
61
- overflow: hidden;
62
- aspect-ratio: 1 / 1.414;
63
- border: 1px solid var(--oc-border);
64
- border-radius: var(--oc-radius);
65
- background: var(--oc-muted);
66
- }
67
- .oc-doc-viewer--video .oc-doc-viewer__frame { aspect-ratio: 16 / 9; background: var(--color-black-40); }
68
- .oc-doc-viewer--image .oc-doc-viewer__frame { aspect-ratio: auto; }
69
- .oc-doc-viewer__frame > :is(iframe, video, img, object, .oc-media-art) {
70
- display: block;
71
- inline-size: 100%;
72
- block-size: 100%;
73
- border: 0;
74
- object-fit: contain;
75
- }
76
- .oc-doc-viewer--image .oc-doc-viewer__frame > img { block-size: auto; }
77
-
78
- /* A whole-card link variant ("click for full screen") */
79
- .oc-doc-viewer__frame > .oc-doc-viewer__open {
80
- position: absolute;
81
- inset: 0;
82
- display: grid;
83
- place-items: end center;
84
- padding: 0.75rem;
85
- border: 0;
86
- background: linear-gradient(transparent 55%, oklch(from var(--color-black-50) l c h / 0.55));
87
- color: var(--color-white-50);
88
- font: inherit;
89
- font-size: 0.8rem;
90
- font-weight: 600;
91
- opacity: 0;
92
- cursor: zoom-in;
93
- transition: opacity var(--oc-transition-normal);
94
- }
95
- .oc-doc-viewer__frame:hover > .oc-doc-viewer__open,
96
- .oc-doc-viewer__open:focus-visible { opacity: 1; }
97
- .oc-doc-viewer__open:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: -4px; }
98
-
99
- /* ---- Full-screen view ---- */
100
- .oc-doc-viewer-dialog {
101
- inline-size: min(100vw - 2rem, 72rem);
102
- block-size: min(100dvh - 2rem, 60rem);
103
- max-inline-size: none;
104
- max-block-size: none;
105
- padding: 0;
106
- overflow: hidden;
107
- border: 1px solid var(--oc-border);
108
- border-radius: var(--oc-radius-lg, 12px);
109
- background: var(--oc-card);
110
- color: var(--oc-foreground);
111
- }
112
- .oc-doc-viewer-dialog[open] { display: grid; grid-template-rows: auto minmax(0, 1fr); }
113
- .oc-doc-viewer-dialog::backdrop { background: oklch(from var(--color-black-60) l c h / 0.8); backdrop-filter: blur(6px); }
114
- .oc-doc-viewer-dialog--video { background: var(--color-black-40); color: var(--color-white-50); }
115
- .oc-doc-viewer-dialog__bar {
116
- display: flex;
117
- align-items: center;
118
- justify-content: space-between;
119
- gap: 1rem;
120
- padding: 0.6rem 0.75rem 0.6rem 1rem;
121
- border-block-end: 1px solid var(--oc-border);
122
- }
123
- .oc-doc-viewer-dialog--video .oc-doc-viewer-dialog__bar { border-color: oklch(from var(--color-white-50) l c h / 0.15); }
124
- .oc-doc-viewer-dialog__title { margin: 0; overflow: hidden; font-size: 0.95rem; font-weight: 600; white-space: nowrap; text-overflow: ellipsis; }
125
- .oc-doc-viewer-dialog__actions { display: flex; align-items: center; gap: 0.5rem; }
126
- .oc-doc-viewer-dialog__close {
127
- display: grid;
128
- place-items: center;
129
- inline-size: 2.25rem;
130
- block-size: 2.25rem;
131
- padding: 0;
132
- border: 0;
133
- border-radius: 50%;
134
- background: transparent;
135
- color: inherit;
136
- font-size: 1.1rem;
137
- cursor: pointer;
138
- }
139
- .oc-doc-viewer-dialog__close:hover { background: oklch(from currentColor l c h / 0.1); }
140
- .oc-doc-viewer-dialog__close:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 2px; }
141
- .oc-doc-viewer-dialog__body { display: grid; min-block-size: 0; }
142
- .oc-doc-viewer-dialog__body > :is(iframe, video, img, object, .oc-media-art) {
143
- inline-size: 100%;
144
- block-size: 100%;
145
- border: 0;
146
- object-fit: contain;
147
- }
148
-
149
- @media (prefers-reduced-motion: reduce) {
150
- .oc-doc-viewer__open, .oc-doc-viewer__expand { transition: none; }
151
- }
1
+ /* File: packages/ui/src/parts/media-doc-viewer.css | Map: grid -> card (bar, label, expand) -> frame (pdf, video, image)
2
+ -> full-screen dialog -> small screens
3
+ Document viewer: a PDF, video or image shown inline in a card with a label, plus a full-screen view on a native
4
+ <dialog> opened with command="show-modal". Based on the PDF and video viewers of the Verdavita service pages. */
5
+
6
+ /* ---- Grid of viewers: cards keep their width, the group is centred ---- */
7
+ .oc-doc-viewer-grid {
8
+ display: grid;
9
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 15rem), 1fr));
10
+ gap: 1rem 1.5rem;
11
+ inline-size: 100%;
12
+ }
13
+
14
+ /* ---- Card ---- */
15
+ .oc-doc-viewer {
16
+ display: grid;
17
+ align-content: start;
18
+ gap: 0.5rem;
19
+ min-inline-size: 0;
20
+ margin: 0;
21
+ }
22
+ .oc-doc-viewer__bar {
23
+ display: flex;
24
+ align-items: center;
25
+ justify-content: space-between;
26
+ gap: 0.5rem;
27
+ min-inline-size: 0;
28
+ }
29
+ .oc-doc-viewer__label {
30
+ flex: 1 1 auto;
31
+ min-inline-size: 0;
32
+ overflow: hidden;
33
+ color: var(--oc-foreground);
34
+ font-size: 0.875rem;
35
+ font-weight: 600;
36
+ white-space: nowrap;
37
+ text-overflow: ellipsis;
38
+ }
39
+ .oc-doc-viewer__meta { flex: none; color: var(--oc-muted-foreground); font-size: 0.75rem; }
40
+ .oc-doc-viewer__expand {
41
+ flex: none;
42
+ display: grid;
43
+ place-items: center;
44
+ inline-size: 2rem;
45
+ block-size: 2rem;
46
+ padding: 0;
47
+ border: 1px solid var(--oc-border);
48
+ border-radius: var(--oc-radius);
49
+ background: var(--oc-card);
50
+ color: var(--oc-foreground);
51
+ font-size: 0.95rem;
52
+ cursor: zoom-in;
53
+ transition: background var(--oc-transition-normal), border-color var(--oc-transition-normal);
54
+ }
55
+ .oc-doc-viewer__expand:hover { background: var(--oc-muted); border-color: var(--oc-border-strong, var(--oc-border)); }
56
+ .oc-doc-viewer__expand:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 2px; }
57
+
58
+ /* ---- Frame: A4 for PDF, 16/9 for video, free for images ---- */
59
+ .oc-doc-viewer__frame {
60
+ position: relative;
61
+ overflow: hidden;
62
+ aspect-ratio: 1 / 1.414;
63
+ border: 1px solid var(--oc-border);
64
+ border-radius: var(--oc-radius);
65
+ background: var(--oc-muted);
66
+ }
67
+ .oc-doc-viewer--video .oc-doc-viewer__frame { aspect-ratio: 16 / 9; background: var(--color-black-40); }
68
+ .oc-doc-viewer--image .oc-doc-viewer__frame { aspect-ratio: auto; }
69
+ .oc-doc-viewer__frame > :is(iframe, video, img, object, .oc-media-art) {
70
+ display: block;
71
+ inline-size: 100%;
72
+ block-size: 100%;
73
+ border: 0;
74
+ object-fit: contain;
75
+ }
76
+ .oc-doc-viewer--image .oc-doc-viewer__frame > img { block-size: auto; }
77
+
78
+ /* A whole-card link variant ("click for full screen") */
79
+ .oc-doc-viewer__frame > .oc-doc-viewer__open {
80
+ position: absolute;
81
+ inset: 0;
82
+ display: grid;
83
+ place-items: end center;
84
+ padding: 0.75rem;
85
+ border: 0;
86
+ background: linear-gradient(transparent 55%, oklch(from var(--color-black-50) l c h / 0.55));
87
+ color: var(--color-white-50);
88
+ font: inherit;
89
+ font-size: 0.8rem;
90
+ font-weight: 600;
91
+ opacity: 0;
92
+ cursor: zoom-in;
93
+ transition: opacity var(--oc-transition-normal);
94
+ }
95
+ .oc-doc-viewer__frame:hover > .oc-doc-viewer__open,
96
+ .oc-doc-viewer__open:focus-visible { opacity: 1; }
97
+ .oc-doc-viewer__open:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: -4px; }
98
+
99
+ /* ---- Full-screen view ---- */
100
+ .oc-doc-viewer-dialog {
101
+ inline-size: min(100vw - 2rem, 72rem);
102
+ block-size: min(100dvh - 2rem, 60rem);
103
+ max-inline-size: none;
104
+ max-block-size: none;
105
+ padding: 0;
106
+ overflow: hidden;
107
+ border: 1px solid var(--oc-border);
108
+ border-radius: var(--oc-radius-lg, 12px);
109
+ background: var(--oc-card);
110
+ color: var(--oc-foreground);
111
+ }
112
+ .oc-doc-viewer-dialog[open] { display: grid; grid-template-rows: auto minmax(0, 1fr); }
113
+ .oc-doc-viewer-dialog::backdrop { background: oklch(from var(--color-black-60) l c h / 0.8); backdrop-filter: blur(6px); }
114
+ .oc-doc-viewer-dialog--video { background: var(--color-black-40); color: var(--color-white-50); }
115
+ .oc-doc-viewer-dialog__bar {
116
+ display: flex;
117
+ align-items: center;
118
+ justify-content: space-between;
119
+ gap: 1rem;
120
+ padding: 0.6rem 0.75rem 0.6rem 1rem;
121
+ border-block-end: 1px solid var(--oc-border);
122
+ }
123
+ .oc-doc-viewer-dialog--video .oc-doc-viewer-dialog__bar { border-color: oklch(from var(--color-white-50) l c h / 0.15); }
124
+ .oc-doc-viewer-dialog__title { margin: 0; overflow: hidden; font-size: 0.95rem; font-weight: 600; white-space: nowrap; text-overflow: ellipsis; }
125
+ .oc-doc-viewer-dialog__actions { display: flex; align-items: center; gap: 0.5rem; }
126
+ .oc-doc-viewer-dialog__close {
127
+ display: grid;
128
+ place-items: center;
129
+ inline-size: 2.25rem;
130
+ block-size: 2.25rem;
131
+ padding: 0;
132
+ border: 0;
133
+ border-radius: 50%;
134
+ background: transparent;
135
+ color: inherit;
136
+ font-size: 1.1rem;
137
+ cursor: pointer;
138
+ }
139
+ .oc-doc-viewer-dialog__close:hover { background: oklch(from currentColor l c h / 0.1); }
140
+ .oc-doc-viewer-dialog__close:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 2px; }
141
+ .oc-doc-viewer-dialog__body { display: grid; min-block-size: 0; }
142
+ .oc-doc-viewer-dialog__body > :is(iframe, video, img, object, .oc-media-art) {
143
+ inline-size: 100%;
144
+ block-size: 100%;
145
+ border: 0;
146
+ object-fit: contain;
147
+ }
148
+
149
+ @media (prefers-reduced-motion: reduce) {
150
+ .oc-doc-viewer__open, .oc-doc-viewer__expand { transition: none; }
151
+ }
@@ -1,88 +1,88 @@
1
- /* File: packages/ui/src/parts/media-emoji-picker.css | Map: trigger button -> popover panel (anchor positioned)
2
- -> group label -> grid -> emoji buttons -> inline modifier -> motion
3
- Emoji picker: a popover with a grid of emoji buttons. Opening / closing is the popover attribute;
4
- inserting the emoji into a field is one small optional script (see the snippet). */
5
-
6
- /* Round trigger (a smiley), the same size as a toolbar icon button. */
7
- .oc-emoji-picker__trigger {
8
- display: inline-grid;
9
- place-items: center;
10
- inline-size: 2.25rem;
11
- aspect-ratio: 1;
12
- padding: 0;
13
- border: 0;
14
- border-radius: 50%;
15
- background: transparent;
16
- font-size: 1.15rem;
17
- line-height: 1;
18
- cursor: pointer;
19
- }
20
- .oc-emoji-picker__trigger:hover { background: var(--oc-surface-strong); }
21
- .oc-emoji-picker__trigger:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 1px; }
22
-
23
- /* The panel: floats above the trigger (implicit anchor of popovertarget), flips when there is no room. */
24
- .oc-emoji-picker[popover] {
25
- position: fixed;
26
- inset: auto;
27
- margin: 0 0 0.375rem;
28
- position-area: block-start span-inline-end;
29
- position-try-fallbacks: flip-block, flip-inline;
30
- inline-size: 17.5rem;
31
- max-block-size: 18rem;
32
- overflow-y: auto;
33
- padding: 0.5rem;
34
- border: 1px solid var(--oc-border);
35
- border-radius: calc(var(--oc-radius) + 2px);
36
- background: var(--oc-popover);
37
- color: var(--oc-popover-foreground);
38
- box-shadow: 0 8px 24px oklch(from var(--color-black-60) l c h / 0.15);
39
- scrollbar-width: thin;
40
- }
41
-
42
- /* Inline: the same panel, always visible inside the page (no popover). */
43
- .oc-emoji-picker--inline {
44
- inline-size: 17.5rem;
45
- padding: 0.5rem;
46
- border: 1px solid var(--oc-border);
47
- border-radius: calc(var(--oc-radius) + 2px);
48
- background: var(--oc-popover);
49
- }
50
-
51
- .oc-emoji-picker__label {
52
- position: sticky;
53
- inset-block-start: -0.5rem;
54
- margin: 0;
55
- padding: 0.375rem 0.25rem 0.25rem;
56
- background: var(--oc-popover);
57
- font-size: 0.6875rem;
58
- font-weight: 600;
59
- letter-spacing: 0.05em;
60
- text-transform: uppercase;
61
- color: var(--oc-muted-foreground);
62
- }
63
-
64
- .oc-emoji-picker__grid { display: grid; grid-template-columns: repeat(8, 1fr); gap: 0.125rem; margin-block-end: 0.25rem; }
65
- .oc-emoji-picker__item {
66
- display: grid;
67
- place-items: center;
68
- aspect-ratio: 1;
69
- padding: 0;
70
- border: 0;
71
- border-radius: calc(var(--oc-radius) - 2px);
72
- background: transparent;
73
- font-size: 1.25rem;
74
- line-height: 1;
75
- cursor: pointer;
76
- }
77
- .oc-emoji-picker__item:hover { background: var(--oc-surface-strong); }
78
- .oc-emoji-picker__item:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
79
-
80
- /* Fade + small rise when it opens. */
81
- @media (prefers-reduced-motion: no-preference) {
82
- .oc-emoji-picker[popover] {
83
- transition: opacity var(--oc-transition-fast), translate var(--oc-transition-fast), display var(--oc-transition-fast) allow-discrete, overlay var(--oc-transition-fast) allow-discrete;
84
- }
85
- .oc-emoji-picker[popover]:popover-open { @starting-style { opacity: 0; translate: 0 0.25rem; } }
86
- .oc-emoji-picker__item { transition: transform var(--oc-transition-fast); }
87
- .oc-emoji-picker__item:hover { transform: scale(1.15); }
88
- }
1
+ /* File: packages/ui/src/parts/media-emoji-picker.css | Map: trigger button -> popover panel (anchor positioned)
2
+ -> group label -> grid -> emoji buttons -> inline modifier -> motion
3
+ Emoji picker: a popover with a grid of emoji buttons. Opening / closing is the popover attribute;
4
+ inserting the emoji into a field is one small optional script (see the snippet). */
5
+
6
+ /* Round trigger (a smiley), the same size as a toolbar icon button. */
7
+ .oc-emoji-picker__trigger {
8
+ display: inline-grid;
9
+ place-items: center;
10
+ inline-size: 2.25rem;
11
+ aspect-ratio: 1;
12
+ padding: 0;
13
+ border: 0;
14
+ border-radius: 50%;
15
+ background: transparent;
16
+ font-size: 1.15rem;
17
+ line-height: 1;
18
+ cursor: pointer;
19
+ }
20
+ .oc-emoji-picker__trigger:hover { background: var(--oc-surface-strong); }
21
+ .oc-emoji-picker__trigger:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 1px; }
22
+
23
+ /* The panel: floats above the trigger (implicit anchor of popovertarget), flips when there is no room. */
24
+ .oc-emoji-picker[popover] {
25
+ position: fixed;
26
+ inset: auto;
27
+ margin: 0 0 0.375rem;
28
+ position-area: block-start span-inline-end;
29
+ position-try-fallbacks: flip-block, flip-inline;
30
+ inline-size: 17.5rem;
31
+ max-block-size: 18rem;
32
+ overflow-y: auto;
33
+ padding: 0.5rem;
34
+ border: 1px solid var(--oc-border);
35
+ border-radius: calc(var(--oc-radius) + 2px);
36
+ background: var(--oc-popover);
37
+ color: var(--oc-popover-foreground);
38
+ box-shadow: 0 8px 24px oklch(from var(--color-black-60) l c h / 0.15);
39
+ scrollbar-width: thin;
40
+ }
41
+
42
+ /* Inline: the same panel, always visible inside the page (no popover). */
43
+ .oc-emoji-picker--inline {
44
+ inline-size: 17.5rem;
45
+ padding: 0.5rem;
46
+ border: 1px solid var(--oc-border);
47
+ border-radius: calc(var(--oc-radius) + 2px);
48
+ background: var(--oc-popover);
49
+ }
50
+
51
+ .oc-emoji-picker__label {
52
+ position: sticky;
53
+ inset-block-start: -0.5rem;
54
+ margin: 0;
55
+ padding: 0.375rem 0.25rem 0.25rem;
56
+ background: var(--oc-popover);
57
+ font-size: 0.6875rem;
58
+ font-weight: 600;
59
+ letter-spacing: 0.05em;
60
+ text-transform: uppercase;
61
+ color: var(--oc-muted-foreground);
62
+ }
63
+
64
+ .oc-emoji-picker__grid { display: grid; grid-template-columns: repeat(8, 1fr); gap: 0.125rem; margin-block-end: 0.25rem; }
65
+ .oc-emoji-picker__item {
66
+ display: grid;
67
+ place-items: center;
68
+ aspect-ratio: 1;
69
+ padding: 0;
70
+ border: 0;
71
+ border-radius: calc(var(--oc-radius) - 2px);
72
+ background: transparent;
73
+ font-size: 1.25rem;
74
+ line-height: 1;
75
+ cursor: pointer;
76
+ }
77
+ .oc-emoji-picker__item:hover { background: var(--oc-surface-strong); }
78
+ .oc-emoji-picker__item:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
79
+
80
+ /* Fade + small rise when it opens. */
81
+ @media (prefers-reduced-motion: no-preference) {
82
+ .oc-emoji-picker[popover] {
83
+ transition: opacity var(--oc-transition-fast), translate var(--oc-transition-fast), display var(--oc-transition-fast) allow-discrete, overlay var(--oc-transition-fast) allow-discrete;
84
+ }
85
+ .oc-emoji-picker[popover]:popover-open { @starting-style { opacity: 0; translate: 0 0.25rem; } }
86
+ .oc-emoji-picker__item { transition: transform var(--oc-transition-fast); }
87
+ .oc-emoji-picker__item:hover { transform: scale(1.15); }
88
+ }
@@ -1,52 +1,52 @@
1
- /* File: packages/ui/src/parts/media-entity-card.css | Map: card grid (frame | body) -> framed media cell
2
- -> glyph -> body (eyebrow, title, description) -> facts (key / value) -> stacked + small modifiers -> narrow containers
3
- Entity card: a framed square "specimen" cell (image, glyph, icon) next to a detail column.
4
- Good for dictionary entries, collection items, symbols, products. */
5
-
6
- .oc-entity-card {
7
- container-type: inline-size;
8
- inline-size: 100%;
9
- border: 1px solid var(--oc-border);
10
- border-radius: calc(var(--oc-radius) + 4px);
11
- background: var(--oc-card);
12
- color: var(--oc-foreground);
13
- }
14
- .oc-entity-card__grid { display: grid; grid-template-columns: 9rem minmax(0, 1fr); gap: 1.25rem; padding: 1.25rem; }
15
-
16
- /* Framed cell: a double frame (border + inset ring) around a soft radial background. */
17
- .oc-entity-card__frame {
18
- display: grid;
19
- place-items: center;
20
- aspect-ratio: 1;
21
- overflow: hidden;
22
- border: 1px solid var(--oc-border-strong);
23
- border-radius: var(--oc-radius);
24
- background: radial-gradient(circle at 50% 40%, var(--oc-surface-strong), var(--oc-muted));
25
- box-shadow: inset 0 0 0 0.35rem var(--oc-card), inset 0 0 0 calc(0.35rem + 1px) var(--oc-border);
26
- }
27
- .oc-entity-card__frame > :is(img, svg, .oc-media-art) { inline-size: 100%; block-size: 100%; object-fit: cover; }
28
- /* Contained pictures (logos, symbols) keep a margin inside the frame. */
29
- .oc-entity-card__frame--contain > :is(img, svg) { inline-size: 70%; block-size: 70%; object-fit: contain; }
30
- .oc-entity-card__glyph { font-size: 3.5rem; line-height: 1; color: var(--oc-foreground); }
31
-
32
- /* Detail column. */
33
- .oc-entity-card__body { display: grid; align-content: start; gap: 0.35rem; min-inline-size: 0; }
34
- .oc-entity-card__eyebrow { margin: 0; font-size: 0.75rem; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--oc-primary); }
35
- .oc-entity-card__title { margin: 0; font-size: 1.15rem; font-weight: 700; line-height: 1.3; }
36
- .oc-entity-card__description { margin: 0; font-size: 0.875rem; color: var(--oc-muted-foreground); }
37
-
38
- /* Facts: small key / value grid. */
39
- .oc-entity-card__facts { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 0.25rem 1rem; margin: 0.5rem 0 0; font-size: 0.8125rem; }
40
- .oc-entity-card__facts > dt { color: var(--oc-muted-foreground); }
41
- .oc-entity-card__facts > dd { margin: 0; font-weight: 500; }
42
-
43
- /* Footer row for tags or actions. */
44
- .oc-entity-card__footer { display: flex; flex-wrap: wrap; gap: 0.5rem; padding: 0.75rem 1.25rem; border-block-start: 1px solid var(--oc-border); }
45
-
46
- /* Stacked: frame on top (also used automatically in narrow containers). */
47
- .oc-entity-card--stacked .oc-entity-card__grid { grid-template-columns: minmax(0, 1fr); }
48
- .oc-entity-card--sm .oc-entity-card__grid { grid-template-columns: 5.5rem minmax(0, 1fr); gap: 0.875rem; padding: 0.875rem; }
49
- .oc-entity-card--sm .oc-entity-card__glyph { font-size: 2.25rem; }
50
- @container (max-width: 22rem) {
51
- .oc-entity-card__grid { grid-template-columns: minmax(0, 1fr); }
52
- }
1
+ /* File: packages/ui/src/parts/media-entity-card.css | Map: card grid (frame | body) -> framed media cell
2
+ -> glyph -> body (eyebrow, title, description) -> facts (key / value) -> stacked + small modifiers -> narrow containers
3
+ Entity card: a framed square "specimen" cell (image, glyph, icon) next to a detail column.
4
+ Good for dictionary entries, collection items, symbols, products. */
5
+
6
+ .oc-entity-card {
7
+ container-type: inline-size;
8
+ inline-size: 100%;
9
+ border: 1px solid var(--oc-border);
10
+ border-radius: calc(var(--oc-radius) + 4px);
11
+ background: var(--oc-card);
12
+ color: var(--oc-foreground);
13
+ }
14
+ .oc-entity-card__grid { display: grid; grid-template-columns: 9rem minmax(0, 1fr); gap: 1.25rem; padding: 1.25rem; }
15
+
16
+ /* Framed cell: a double frame (border + inset ring) around a soft radial background. */
17
+ .oc-entity-card__frame {
18
+ display: grid;
19
+ place-items: center;
20
+ aspect-ratio: 1;
21
+ overflow: hidden;
22
+ border: 1px solid var(--oc-border-strong);
23
+ border-radius: var(--oc-radius);
24
+ background: radial-gradient(circle at 50% 40%, var(--oc-surface-strong), var(--oc-muted));
25
+ box-shadow: inset 0 0 0 0.35rem var(--oc-card), inset 0 0 0 calc(0.35rem + 1px) var(--oc-border);
26
+ }
27
+ .oc-entity-card__frame > :is(img, svg, .oc-media-art) { inline-size: 100%; block-size: 100%; object-fit: cover; }
28
+ /* Contained pictures (logos, symbols) keep a margin inside the frame. */
29
+ .oc-entity-card__frame--contain > :is(img, svg) { inline-size: 70%; block-size: 70%; object-fit: contain; }
30
+ .oc-entity-card__glyph { font-size: 3.5rem; line-height: 1; color: var(--oc-foreground); }
31
+
32
+ /* Detail column. */
33
+ .oc-entity-card__body { display: grid; align-content: start; gap: 0.35rem; min-inline-size: 0; }
34
+ .oc-entity-card__eyebrow { margin: 0; font-size: 0.75rem; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--oc-primary); }
35
+ .oc-entity-card__title { margin: 0; font-size: 1.15rem; font-weight: 700; line-height: 1.3; }
36
+ .oc-entity-card__description { margin: 0; font-size: 0.875rem; color: var(--oc-muted-foreground); }
37
+
38
+ /* Facts: small key / value grid. */
39
+ .oc-entity-card__facts { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 0.25rem 1rem; margin: 0.5rem 0 0; font-size: 0.8125rem; }
40
+ .oc-entity-card__facts > dt { color: var(--oc-muted-foreground); }
41
+ .oc-entity-card__facts > dd { margin: 0; font-weight: 500; }
42
+
43
+ /* Footer row for tags or actions. */
44
+ .oc-entity-card__footer { display: flex; flex-wrap: wrap; gap: 0.5rem; padding: 0.75rem 1.25rem; border-block-start: 1px solid var(--oc-border); }
45
+
46
+ /* Stacked: frame on top (also used automatically in narrow containers). */
47
+ .oc-entity-card--stacked .oc-entity-card__grid { grid-template-columns: minmax(0, 1fr); }
48
+ .oc-entity-card--sm .oc-entity-card__grid { grid-template-columns: 5.5rem minmax(0, 1fr); gap: 0.875rem; padding: 0.875rem; }
49
+ .oc-entity-card--sm .oc-entity-card__glyph { font-size: 2.25rem; }
50
+ @container (max-width: 22rem) {
51
+ .oc-entity-card__grid { grid-template-columns: minmax(0, 1fr); }
52
+ }