@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.
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 +6559 -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 +404 -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
package/dist/docs-ui.css CHANGED
@@ -1,265 +1,267 @@
1
- /* ===================================================================
2
- DOCS UI — the pieces the OmniaCSS documentation site is built from, offered as components.
3
- Index: sidebar--docs · toc · topbar (+ navmenu--site) · footerbar · search · demo panel · code-window copy ·
4
- btn--toggle ("Show more")
5
- Every color is an --oc-* theme token or an Omnia palette token, so light and dark follow the theme.
6
- =================================================================== */
7
-
8
- /* ---- Sidebar, documentation variant: .oc-sidebar.oc-sidebar--docs -------------------------------
9
- Same parts as the app sidebar (menu, menu-button, menu-sub, group-label) plus .oc-sidebar-title.
10
- Outlined "pill" items, always-visible sub items, no own scroll (the page shell scrolls it). */
11
- .oc-sidebar--docs {
12
- --oc-sidebar-width: auto;
13
- --oc-sidebar-docs-active: oklch(from var(--oc-primary) l c h / 0.1);
14
- inline-size: auto;
15
- block-size: auto;
16
- background: transparent;
17
- border: 0;
18
- gap: 0;
19
- }
20
- .oc-sidebar-title { margin: 0 0 0.75rem; font-size: 1rem; font-weight: 600; color: var(--oc-foreground); }
21
- .oc-sidebar--docs .oc-sidebar-group-label {
22
- margin: 1rem 0 0.5rem;
23
- padding: 0;
24
- font-size: 0.75rem;
25
- text-transform: uppercase;
26
- letter-spacing: 0.08em;
27
- color: var(--oc-muted-foreground);
28
- }
29
- .oc-sidebar--docs .oc-sidebar-menu { gap: 6px; }
30
- .oc-sidebar--docs .oc-sidebar-menu-button {
31
- display: block;
32
- padding: 0.5rem 0.625rem;
33
- border: 1px solid transparent;
34
- border-radius: 8px;
35
- }
36
- .oc-sidebar--docs .oc-sidebar-menu-button:hover {
37
- color: var(--oc-foreground);
38
- border-color: var(--oc-border);
39
- background: oklch(from var(--oc-foreground) l c h / 0.03);
40
- }
41
- .oc-sidebar--docs .oc-sidebar-menu-button[aria-current="page"],
42
- .oc-sidebar--docs .oc-sidebar-menu-button.is-active {
43
- color: var(--oc-foreground);
44
- font-weight: 500;
45
- border-color: var(--oc-primary);
46
- background: var(--oc-sidebar-docs-active);
47
- }
48
- .oc-sidebar--docs .oc-sidebar-menu-sub {
49
- margin: 4px 0 0 0.625rem;
50
- padding: 0 0 0 0.625rem;
51
- gap: 4px;
52
- border-inline-start: 1px dashed var(--oc-border);
53
- }
54
- .oc-sidebar--docs .oc-sidebar-menu-sub .oc-sidebar-menu-button { padding: 0.375rem 0.5rem; font-size: 0.84rem; }
55
- .oc-sidebar--docs details.oc-sidebar-collapsible > summary { display: flex; }
56
- /* Docs sidebars never switch to icon-only mode */
57
- .oc-sidebar--docs.oc-sidebar--collapsed { inline-size: auto; }
58
-
59
- /* ---- On this page: .oc-toc ---------------------------------------------------------------------- */
60
- .oc-toc { position: sticky; inset-block-start: 0; max-block-size: 100%; overflow: auto; padding-block-start: 2px; padding-inline-end: 0.5rem; }
61
- .oc-toc-title { margin: 1rem 0 0.5rem; font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--oc-muted-foreground); }
62
- .oc-toc-list { display: grid; gap: 4px; margin: 0; padding: 0; list-style: none; }
63
- .oc-toc-link {
64
- display: block;
65
- padding: 0.375rem 0.5rem;
66
- font-size: 0.875rem;
67
- color: var(--oc-muted-foreground);
68
- text-decoration: none;
69
- border: 1px solid transparent;
70
- border-radius: 8px;
71
- overflow-wrap: anywhere;
72
- }
73
- .oc-toc-link:hover { color: var(--oc-foreground); border-color: var(--oc-border); }
74
- .oc-toc-link:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
75
- .oc-toc-link[aria-current],
76
- .oc-toc-link.is-active { color: var(--oc-foreground); border-color: var(--oc-primary); background: oklch(from var(--oc-primary) l c h / 0.1); }
77
- /* Scroll-spy without JavaScript: the link of the heading you are reading is highlighted (native :target-current). */
78
- .oc-toc-list { scroll-target-group: auto; }
79
- .oc-toc-link:target-current { color: var(--oc-foreground); border-color: var(--oc-primary); background: oklch(from var(--oc-primary) l c h / 0.1); }
80
- .oc-toc-item--sub { margin-inline-start: 0.75rem; }
81
- .oc-toc-item--sub .oc-toc-link { font-size: 0.8125rem; }
82
-
83
- /* ---- Site header: .oc-topbar (+ .oc-navmenu--site) ----------------------------------------------
84
- Brand · navigation · actions. Tune per site with --ocm-header-height, --ocm-header-bg, --ocm-header-border. */
85
- .oc-topbar {
86
- position: relative;
87
- display: flex;
88
- align-items: center;
89
- justify-content: space-between;
90
- gap: 1rem;
91
- box-sizing: border-box;
92
- min-block-size: var(--ocm-header-height, 3.75rem);
93
- flex-wrap: wrap;
94
- padding-inline: clamp(14px, 2vw, 28px);
95
- color: var(--oc-foreground);
96
- background: var(--ocm-header-bg, oklch(from var(--oc-background) l c h / 0.78));
97
- border-block-end: 1px solid var(--ocm-header-border, var(--oc-border));
98
- backdrop-filter: blur(6px);
99
- }
100
- .oc-topbar--fixed { position: fixed; inset: 0 0 auto 0; z-index: 1100; }
101
- .oc-topbar-brand { margin: 0; font-size: 1.1rem; font-weight: 700; letter-spacing: 0.02em; color: inherit; text-decoration: none; white-space: nowrap; }
102
- .oc-topbar-nav { display: block; }
103
- .oc-topbar-actions { display: flex; align-items: center; gap: 0.5rem; flex-shrink: 0; margin: 0; }
104
-
105
- /* Pill style menu (site navigation) */
106
- .oc-navmenu--site { gap: 8px; }
107
- .oc-navmenu--site .oc-navmenu-link {
108
- gap: 4px;
109
- padding: 0.5rem 0.75rem;
110
- font-weight: 400;
111
- border: 1px solid var(--oc-border);
112
- border-radius: 10px;
113
- background: oklch(from var(--oc-foreground) l c h / 0.03);
114
- }
115
- .oc-navmenu--site .oc-navmenu-link:hover,
116
- .oc-navmenu--site .oc-navmenu-link[aria-current="page"] {
117
- color: var(--oc-foreground);
118
- border-color: var(--oc-primary);
119
- background: oklch(from var(--oc-foreground) l c h / 0.03);
120
- }
121
- .oc-navmenu-icon { inline-size: 1.25rem; block-size: 1.25rem; flex-shrink: 0; }
122
-
123
- /* CSS-only mobile menu: <input type="checkbox" class="oc-topbar-toggle"> + <label class="oc-topbar-burger"> */
124
- .oc-topbar-toggle { position: absolute; opacity: 0; pointer-events: none; }
125
- .oc-topbar-burger {
126
- display: none;
127
- align-items: center;
128
- justify-content: center;
129
- inline-size: 2.25rem;
130
- block-size: 2.25rem;
131
- border: 1px solid var(--oc-border);
132
- border-radius: var(--oc-radius);
133
- cursor: pointer;
134
- color: var(--oc-foreground);
135
- }
136
- .oc-topbar-burger:hover { background: var(--oc-accent); }
137
- .oc-topbar-toggle:focus-visible + .oc-topbar-burger { outline: 2px solid var(--oc-ring); outline-offset: 2px; }
138
- @media (max-width: 760px) {
139
- .oc-topbar { padding-block: 8px; }
140
- .oc-topbar--collapsible .oc-topbar-burger { display: inline-flex; }
141
- .oc-topbar--collapsible .oc-topbar-nav { display: none; order: 3; inline-size: 100%; }
142
- .oc-topbar--collapsible:has(.oc-topbar-toggle:checked) .oc-topbar-nav { display: block; }
143
- }
144
-
145
- /* ---- Site footer bar: .oc-footerbar ------------------------------------------------------------- */
146
- .oc-footerbar {
147
- display: flex;
148
- align-items: center;
149
- justify-content: center;
150
- gap: 0.25em;
151
- box-sizing: border-box;
152
- block-size: var(--ocm-footer-height, 2.25rem);
153
- padding-inline: clamp(14px, 2vw, 28px);
154
- font-size: 0.82rem;
155
- text-align: center;
156
- color: var(--oc-muted-foreground);
157
- background: var(--ocm-footer-bg, oklch(from var(--oc-background) l c h / 0.9));
158
- border-block-start: 1px solid var(--ocm-header-border, var(--oc-border));
159
- backdrop-filter: blur(6px);
160
- }
161
- .oc-footerbar a { color: var(--oc-primary); }
162
- .oc-footerbar--fixed { position: fixed; inset: auto 0 0 0; z-index: 1000; }
163
-
164
- /* ---- Search field: .oc-search ------------------------------------------------------------------- */
165
- .oc-search {
166
- display: flex;
167
- align-items: center;
168
- gap: 0.5rem;
169
- inline-size: 100%;
170
- max-inline-size: 20rem;
171
- padding-inline: 0.625rem;
172
- color: var(--oc-muted-foreground);
173
- background: var(--oc-background);
174
- border: 1px solid var(--oc-border-strong);
175
- border-radius: var(--oc-radius);
176
- }
177
- .oc-search:focus-within { border-color: var(--oc-ring); box-shadow: 0 0 0 2px color-mix(in srgb, var(--oc-ring) 25%, transparent); }
178
- .oc-search-icon { inline-size: 1rem; block-size: 1rem; flex-shrink: 0; }
179
- .oc-search-input { flex: 1; min-inline-size: 0; padding-block: 0.5rem; font: inherit; font-size: 0.875rem; color: var(--oc-foreground); background: none; border: 0; outline: 0; }
180
- .oc-search-input::placeholder { color: var(--oc-muted-foreground); }
181
- .oc-search-input::-webkit-search-cancel-button { cursor: pointer; }
182
- .oc-search-hint {
183
- padding: 0.1rem 0.4rem;
184
- font: 0.72rem var(--oc-font-mono, ui-monospace, monospace);
185
- color: var(--oc-muted-foreground);
186
- border: 1px solid var(--oc-border);
187
- border-radius: 4px;
188
- }
189
- .oc-search:focus-within .oc-search-hint { display: none; }
190
-
191
- /* ---- Demo panel: .oc-demo -----------------------------------------------------------------------
192
- "Demo" title -> live preview -> "Code" title -> code block. Variant --tabs shows preview OR code (radio tabs, CSS only). */
193
- .oc-demo {
194
- display: flex;
195
- flex-direction: column;
196
- gap: 10px;
197
- margin: 12px 0 20px;
198
- padding: clamp(12px, 2vw, 20px);
199
- border: 1px solid var(--oc-border);
200
- border-radius: 12px;
201
- background: color-mix(in oklch, light-dark(var(--color-white-50), var(--color-shallowblue-80)) 70%, transparent);
202
- }
203
- .oc-demo > .oc-preview__title { margin: 4px 0 0; }
204
- .oc-demo__preview {
205
- display: flex;
206
- flex-wrap: wrap;
207
- gap: 16px;
208
- align-items: flex-start;
209
- padding: clamp(12px, 2vw, 20px);
210
- border: 1px solid var(--oc-border);
211
- border-radius: 10px;
212
- background: var(--oc-background);
213
- overflow-x: auto;
214
- }
215
- .oc-demo__preview > * { min-width: 0; }
216
- .oc-demo__preview--tall { min-block-size: 20rem; align-items: flex-start; overflow: visible; }
217
- .oc-demo__preview--center { justify-content: center; align-items: center; }
218
- .oc-demo .oc-code-block { margin: 0; }
219
-
220
- .oc-demo__tablist { display: flex; gap: 4px; padding: 3px; inline-size: fit-content; border-radius: calc(var(--oc-radius) + 2px); background: var(--oc-muted); }
221
- .oc-demo__tab { position: relative; padding: 0.3rem 0.9rem; font-size: 0.8125rem; font-weight: 500; color: var(--oc-muted-foreground); border-radius: var(--oc-radius); cursor: pointer; }
222
- .oc-demo__tab input { position: absolute; opacity: 0; inset: 0; margin: 0; cursor: pointer; }
223
- .oc-demo__tab:has(input:checked) { color: var(--oc-foreground); background: var(--oc-background); box-shadow: 0 1px 2px oklch(from var(--oc-foreground) l c h / 0.15); }
224
- .oc-demo__tab:has(input:focus-visible) { outline: 2px solid var(--oc-ring); outline-offset: 1px; }
225
- .oc-demo--tabs > .oc-demo__code { display: none; }
226
- .oc-demo--tabs:has(.oc-demo__tab:nth-child(2) input:checked) > .oc-demo__preview { display: none; }
227
- .oc-demo--tabs:has(.oc-demo__tab:nth-child(2) input:checked) > .oc-demo__code { display: block; }
228
-
229
- /* ---- Code window + copy button ------------------------------------------------------------------- */
230
- .oc-code-copy {
231
- position: absolute;
232
- inset-block-start: 0.5rem;
233
- inset-inline-end: 0.5rem;
234
- padding: 0.25rem 0.625rem;
235
- font: inherit;
236
- font-size: 0.75rem;
237
- color: var(--oc-muted-foreground);
238
- background: var(--oc-card);
239
- border: 1px solid var(--oc-border);
240
- border-radius: calc(var(--oc-radius) - 2px);
241
- cursor: pointer;
242
- transition: color var(--oc-transition-fast), border-color var(--oc-transition-fast);
243
- }
244
- .oc-code-copy:hover { color: var(--oc-foreground); border-color: var(--oc-border-strong); }
245
- .oc-code-copy:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 2px; }
246
- .oc-code-copy.is-copied { color: var(--oc-success); border-color: currentColor; }
247
- .oc-code-window:has(.oc-code-copy) { position: relative; }
248
- .oc-code-window__bar .oc-code-copy { position: static; margin-inline-start: auto; }
249
-
250
- /* ---- Toggle button ("Show more / Show less"): .oc-btn--toggle ------------------------------------
251
- <label class="oc-btn oc-btn--outline oc-btn--toggle"><input type="checkbox"> <span class="oc-btn-toggle__off">…</span> <span class="oc-btn-toggle__on">…</span></label>
252
- Reveal content in the same container with .oc-showmore / .oc-showmore__extra. */
253
- .oc-btn--toggle { position: relative; }
254
- .oc-btn--toggle > input { position: absolute; opacity: 0; inset: 0; margin: 0; cursor: pointer; }
255
- .oc-btn--toggle:has(> input:focus-visible) { outline: 2px solid var(--oc-ring); outline-offset: 2px; }
256
- .oc-btn--toggle .oc-btn-toggle__on,
257
- .oc-btn--toggle:has(> input:checked) .oc-btn-toggle__off { display: none; }
258
- .oc-btn--toggle:has(> input:checked) .oc-btn-toggle__on { display: inline; }
259
- .oc-showmore__extra { display: none; }
260
- .oc-showmore:has(.oc-btn--toggle > input:checked) .oc-showmore__extra { display: revert; }
261
-
262
- /* Wide docs components take the full width of a demo preview */
263
- .oc-demo__preview > :is(.oc-topbar, .oc-footerbar, .oc-demo, .oc-code-window, .oc-expandable-table, .oc-showmore) { flex: 1 1 100%; }
264
- /* Marketing pieces that should span the preview stage (timeline, facts, project and price cards). */
265
- .oc-demo__preview > :is(.oc-timeline, .oc-fact-list, .oc-project-card, .oc-price-card) { inline-size: 100%; }
1
+ /* ===================================================================
2
+ DOCS UI — the pieces the OmniaCSS documentation site is built from, offered as components.
3
+ Index: sidebar--docs · toc · topbar (+ navmenu--site) · footerbar · search · demo panel · code-window copy ·
4
+ btn--toggle ("Show more")
5
+ Every color is an --oc-* theme token or an Omnia palette token, so light and dark follow the theme.
6
+ =================================================================== */
7
+
8
+ /* ---- Sidebar, documentation variant: .oc-sidebar.oc-sidebar--docs -------------------------------
9
+ Same parts as the app sidebar (menu, menu-button, menu-sub, group-label) plus .oc-sidebar-title.
10
+ Outlined "pill" items, always-visible sub items, no own scroll (the page shell scrolls it). */
11
+ .oc-sidebar--docs {
12
+ --oc-sidebar-width: auto;
13
+ --oc-sidebar-docs-active: oklch(from var(--oc-primary) l c h / 0.1);
14
+ inline-size: auto;
15
+ block-size: auto;
16
+ background: transparent;
17
+ border: 0;
18
+ gap: 0;
19
+ }
20
+ .oc-sidebar-title { margin: 0 0 0.75rem; font-size: 1rem; font-weight: 600; color: var(--oc-foreground); }
21
+ .oc-sidebar--docs .oc-sidebar-group-label {
22
+ margin: 1rem 0 0.5rem;
23
+ padding: 0;
24
+ font-size: 0.75rem;
25
+ text-transform: uppercase;
26
+ letter-spacing: 0.08em;
27
+ color: var(--oc-muted-foreground);
28
+ }
29
+ .oc-sidebar--docs .oc-sidebar-menu { gap: 6px; }
30
+ .oc-sidebar--docs .oc-sidebar-menu-button {
31
+ display: block;
32
+ padding: 0.5rem 0.625rem;
33
+ border: 1px solid transparent;
34
+ border-radius: 8px;
35
+ }
36
+ .oc-sidebar--docs .oc-sidebar-menu-button:hover {
37
+ color: var(--oc-foreground);
38
+ border-color: var(--oc-border);
39
+ background: oklch(from var(--oc-foreground) l c h / 0.03);
40
+ }
41
+ .oc-sidebar--docs .oc-sidebar-menu-button[aria-current="page"],
42
+ .oc-sidebar--docs .oc-sidebar-menu-button.is-active {
43
+ color: var(--oc-foreground);
44
+ font-weight: 500;
45
+ border-color: var(--oc-primary);
46
+ background: var(--oc-sidebar-docs-active);
47
+ }
48
+ .oc-sidebar--docs .oc-sidebar-menu-sub {
49
+ margin: 4px 0 0 0.625rem;
50
+ padding: 0 0 0 0.625rem;
51
+ gap: 4px;
52
+ border-inline-start: 1px dashed var(--oc-border);
53
+ }
54
+ .oc-sidebar--docs .oc-sidebar-menu-sub .oc-sidebar-menu-button { padding: 0.375rem 0.5rem; font-size: 0.84rem; }
55
+ .oc-sidebar--docs details.oc-sidebar-collapsible > summary { display: flex; }
56
+ /* Docs sidebars never switch to icon-only mode */
57
+ .oc-sidebar--docs.oc-sidebar--collapsed { inline-size: auto; }
58
+
59
+ /* ---- On this page: .oc-toc ---------------------------------------------------------------------- */
60
+ .oc-toc { position: sticky; inset-block-start: 0; max-block-size: 100%; overflow: auto; padding-block-start: 2px; padding-inline-end: 0.5rem; }
61
+ .oc-toc-title { margin: 1rem 0 0.5rem; font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--oc-muted-foreground); }
62
+ .oc-toc-list { display: grid; gap: 4px; margin: 0; padding: 0; list-style: none; }
63
+ .oc-toc-link {
64
+ display: block;
65
+ padding: 0.375rem 0.5rem;
66
+ font-size: 0.875rem;
67
+ color: var(--oc-muted-foreground);
68
+ text-decoration: none;
69
+ border: 1px solid transparent;
70
+ border-radius: 8px;
71
+ overflow-wrap: anywhere;
72
+ }
73
+ .oc-toc-link:hover { color: var(--oc-foreground); border-color: var(--oc-border); }
74
+ .oc-toc-link:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
75
+ .oc-toc-link[aria-current],
76
+ .oc-toc-link.is-active { color: var(--oc-foreground); border-color: var(--oc-primary); background: oklch(from var(--oc-primary) l c h / 0.1); }
77
+ /* Scroll-spy without JavaScript: the link of the heading you are reading is highlighted (native :target-current). */
78
+ .oc-toc-list { scroll-target-group: auto; }
79
+ .oc-toc-link:target-current { color: var(--oc-foreground); border-color: var(--oc-primary); background: oklch(from var(--oc-primary) l c h / 0.1); }
80
+ .oc-toc-item--sub { margin-inline-start: 0.75rem; }
81
+ .oc-toc-item--sub .oc-toc-link { font-size: 0.8125rem; }
82
+
83
+ /* ---- Site header: .oc-topbar (+ .oc-navmenu--site) ----------------------------------------------
84
+ Brand · navigation · actions. Tune per site with --ocm-header-height, --ocm-header-bg, --ocm-header-border. */
85
+ .oc-topbar {
86
+ position: relative;
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: space-between;
90
+ gap: 1rem;
91
+ box-sizing: border-box;
92
+ min-block-size: var(--ocm-header-height, 3.75rem);
93
+ flex-wrap: wrap;
94
+ padding-inline: clamp(14px, 2vw, 28px);
95
+ color: var(--oc-foreground);
96
+ background: var(--ocm-header-bg, oklch(from var(--oc-background) l c h / 0.78));
97
+ border-block-end: 1px solid var(--ocm-header-border, var(--oc-border));
98
+ backdrop-filter: blur(6px);
99
+ }
100
+ .oc-topbar--fixed { position: fixed; inset: 0 0 auto 0; z-index: 1100; }
101
+ .oc-topbar-brand { margin: 0; font-size: 1.1rem; font-weight: 700; letter-spacing: 0.02em; color: inherit; text-decoration: none; white-space: nowrap; }
102
+ .oc-topbar-nav { display: block; }
103
+ .oc-topbar-actions { display: flex; align-items: center; gap: 0.5rem; flex-shrink: 0; margin: 0; }
104
+
105
+ /* Pill style menu (site navigation) */
106
+ .oc-navmenu--site { gap: 8px; }
107
+ .oc-navmenu--site .oc-navmenu-link {
108
+ gap: 4px;
109
+ padding: 0.5rem 0.75rem;
110
+ font-weight: 400;
111
+ border: 1px solid var(--oc-border);
112
+ border-radius: 10px;
113
+ background: oklch(from var(--oc-foreground) l c h / 0.03);
114
+ }
115
+ .oc-navmenu--site .oc-navmenu-link:hover,
116
+ .oc-navmenu--site .oc-navmenu-link[aria-current="page"] {
117
+ color: var(--oc-foreground);
118
+ border-color: var(--oc-primary);
119
+ background: oklch(from var(--oc-foreground) l c h / 0.03);
120
+ }
121
+ .oc-navmenu-icon { inline-size: 1.25rem; block-size: 1.25rem; flex-shrink: 0; }
122
+
123
+ /* CSS-only mobile menu: <input type="checkbox" class="oc-topbar-toggle"> + <label class="oc-topbar-burger"> */
124
+ .oc-topbar-toggle { position: absolute; opacity: 0; pointer-events: none; }
125
+ .oc-topbar-burger {
126
+ display: none;
127
+ align-items: center;
128
+ justify-content: center;
129
+ inline-size: 2.25rem;
130
+ block-size: 2.25rem;
131
+ border: 1px solid var(--oc-border);
132
+ border-radius: var(--oc-radius);
133
+ cursor: pointer;
134
+ color: var(--oc-foreground);
135
+ }
136
+ .oc-topbar-burger:hover { background: var(--oc-accent); }
137
+ .oc-topbar-toggle:focus-visible + .oc-topbar-burger { outline: 2px solid var(--oc-ring); outline-offset: 2px; }
138
+ @media (max-width: 760px) {
139
+ .oc-topbar { padding-block: 8px; }
140
+ .oc-topbar--collapsible .oc-topbar-burger { display: inline-flex; }
141
+ .oc-topbar--collapsible .oc-topbar-nav { display: none; order: 3; inline-size: 100%; }
142
+ .oc-topbar--collapsible:has(.oc-topbar-toggle:checked) .oc-topbar-nav { display: block; }
143
+ }
144
+
145
+ /* ---- Site footer bar: .oc-footerbar ------------------------------------------------------------- */
146
+ .oc-footerbar {
147
+ display: flex;
148
+ align-items: center;
149
+ justify-content: center;
150
+ gap: 0.25em;
151
+ box-sizing: border-box;
152
+ block-size: var(--ocm-footer-height, 2.25rem);
153
+ padding-inline: clamp(14px, 2vw, 28px);
154
+ font-size: 0.82rem;
155
+ text-align: center;
156
+ color: var(--oc-muted-foreground);
157
+ background: var(--ocm-footer-bg, oklch(from var(--oc-background) l c h / 0.9));
158
+ border-block-start: 1px solid var(--ocm-header-border, var(--oc-border));
159
+ backdrop-filter: blur(6px);
160
+ }
161
+ .oc-footerbar a { color: var(--oc-primary); }
162
+ .oc-footerbar--fixed { position: fixed; inset: auto 0 0 0; z-index: 1000; }
163
+
164
+ /* ---- Search field: .oc-search ------------------------------------------------------------------- */
165
+ .oc-search {
166
+ display: flex;
167
+ align-items: center;
168
+ gap: 0.5rem;
169
+ inline-size: 100%;
170
+ max-inline-size: 20rem;
171
+ padding-inline: 0.625rem;
172
+ color: var(--oc-muted-foreground);
173
+ background: var(--oc-background);
174
+ border: 1px solid var(--oc-border-strong);
175
+ border-radius: var(--oc-radius);
176
+ }
177
+ .oc-search:focus-within { border-color: var(--oc-ring); box-shadow: 0 0 0 2px color-mix(in srgb, var(--oc-ring) 25%, transparent); }
178
+ .oc-search-icon { inline-size: 1rem; block-size: 1rem; flex-shrink: 0; }
179
+ .oc-search-input { flex: 1; min-inline-size: 0; padding-block: 0.5rem; font: inherit; font-size: 0.875rem; color: var(--oc-foreground); background: none; border: 0; outline: 0; }
180
+ .oc-search-input::placeholder { color: var(--oc-muted-foreground); }
181
+ .oc-search-input::-webkit-search-cancel-button { cursor: pointer; }
182
+ .oc-search-hint {
183
+ padding: 0.1rem 0.4rem;
184
+ font: 0.72rem var(--oc-font-mono, ui-monospace, monospace);
185
+ color: var(--oc-muted-foreground);
186
+ border: 1px solid var(--oc-border);
187
+ border-radius: 4px;
188
+ }
189
+ .oc-search:focus-within .oc-search-hint { display: none; }
190
+
191
+ /* ---- Demo panel: .oc-demo -----------------------------------------------------------------------
192
+ "Demo" title -> live preview -> "Code" title -> code block. Variant --tabs shows preview OR code (radio tabs, CSS only). */
193
+ .oc-demo {
194
+ display: flex;
195
+ flex-direction: column;
196
+ gap: 10px;
197
+ margin: 12px 0 20px;
198
+ padding: clamp(12px, 2vw, 20px);
199
+ border: 1px solid var(--oc-border);
200
+ border-radius: 12px;
201
+ background: color-mix(in oklch, light-dark(var(--color-white-50), var(--color-shallowblue-80)) 70%, transparent);
202
+ }
203
+ .oc-demo > .oc-preview__title { margin: 4px 0 0; }
204
+ .oc-demo__preview {
205
+ display: flex;
206
+ flex-wrap: wrap;
207
+ gap: 16px;
208
+ align-items: flex-start;
209
+ padding: clamp(12px, 2vw, 20px);
210
+ border: 1px solid var(--oc-border);
211
+ border-radius: 10px;
212
+ background: var(--oc-background);
213
+ overflow-x: auto;
214
+ }
215
+ .oc-demo__preview > * { min-width: 0; }
216
+ .oc-demo__preview--tall { min-block-size: 20rem; align-items: flex-start; overflow: visible; }
217
+ .oc-demo__preview--center { justify-content: center; align-items: center; }
218
+ .oc-demo .oc-code-block { margin: 0; }
219
+
220
+ .oc-demo__tablist { display: flex; gap: 4px; padding: 3px; inline-size: fit-content; border-radius: calc(var(--oc-radius) + 2px); background: var(--oc-muted); }
221
+ .oc-demo__tab { position: relative; padding: 0.3rem 0.9rem; font-size: 0.8125rem; font-weight: 500; color: var(--oc-muted-foreground); border-radius: var(--oc-radius); cursor: pointer; }
222
+ .oc-demo__tab input { position: absolute; opacity: 0; inset: 0; margin: 0; cursor: pointer; }
223
+ .oc-demo__tab:has(input:checked) { color: var(--oc-foreground); background: var(--oc-background); box-shadow: 0 1px 2px oklch(from var(--oc-foreground) l c h / 0.15); }
224
+ .oc-demo__tab:has(input:focus-visible) { outline: 2px solid var(--oc-ring); outline-offset: 1px; }
225
+ .oc-demo--tabs > .oc-demo__code { display: none; }
226
+ .oc-demo--tabs:has(.oc-demo__tab:nth-child(2) input:checked) > .oc-demo__preview { display: none; }
227
+ .oc-demo--tabs:has(.oc-demo__tab:nth-child(2) input:checked) > .oc-demo__code { display: block; }
228
+
229
+ /* ---- Code window + copy button ------------------------------------------------------------------- */
230
+ .oc-code-copy {
231
+ position: absolute;
232
+ inset-block-start: 0.5rem;
233
+ inset-inline-end: 0.5rem;
234
+ padding: 0.25rem 0.625rem;
235
+ font: inherit;
236
+ font-size: 0.75rem;
237
+ color: var(--oc-muted-foreground);
238
+ background: var(--oc-card);
239
+ border: 1px solid var(--oc-border);
240
+ border-radius: calc(var(--oc-radius) - 2px);
241
+ cursor: pointer;
242
+ transition: color var(--oc-transition-fast), border-color var(--oc-transition-fast);
243
+ }
244
+ .oc-code-copy:hover { color: var(--oc-foreground); border-color: var(--oc-border-strong); }
245
+ .oc-code-copy:focus-visible { outline: 2px solid var(--oc-ring); outline-offset: 2px; }
246
+ .oc-code-copy.is-copied { color: var(--oc-success); border-color: currentColor; }
247
+ .oc-code-window:has(.oc-code-copy) { position: relative; }
248
+ .oc-code-window__bar .oc-code-copy { position: static; margin-inline-start: auto; }
249
+
250
+ /* ---- Toggle button ("Show more / Show less"): .oc-btn--toggle ------------------------------------
251
+ <label class="oc-btn oc-btn--outline oc-btn--toggle"><input type="checkbox"> <span class="oc-btn-toggle__off">…</span> <span class="oc-btn-toggle__on">…</span></label>
252
+ Reveal content in the same container with .oc-showmore / .oc-showmore__extra. */
253
+ .oc-btn--toggle { position: relative; }
254
+ .oc-btn--toggle > input { position: absolute; opacity: 0; inset: 0; margin: 0; cursor: pointer; }
255
+ .oc-btn--toggle:has(> input:focus-visible) { outline: 2px solid var(--oc-ring); outline-offset: 2px; }
256
+ .oc-btn--toggle .oc-btn-toggle__on,
257
+ .oc-btn--toggle:has(> input:checked) .oc-btn-toggle__off { display: none; }
258
+ .oc-btn--toggle:has(> input:checked) .oc-btn-toggle__on { display: inline; }
259
+ .oc-showmore__extra { display: none; }
260
+ .oc-showmore:has(.oc-btn--toggle > input:checked) .oc-showmore__extra { display: revert; }
261
+
262
+ /* Wide docs components take the full width of a demo preview */
263
+ .oc-demo__preview > :is(.oc-topbar, .oc-footerbar, .oc-demo, .oc-code-window, .oc-expandable-table, .oc-showmore) { flex: 1 1 100%; }
264
+ /* Marketing pieces that should span the preview stage (timeline, facts, project and price cards). */
265
+ .oc-demo__preview > :is(.oc-timeline, .oc-fact-list, .oc-project-card) { inline-size: 100%; }
266
+ /* A single price card keeps a card width; in a grid it fills its column. */
267
+ .oc-demo__preview > .oc-price-card { inline-size: min(100%, 24rem); }