@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
@@ -1,10 +1,10 @@
1
- <!-- OmniaUI component: input-group - Input with prefix/suffix addon (currency, percent, units). Needs @birdycom/omniaui CSS.
2
- -->
3
- <div class="oc-input-group">
4
- <span class="oc-input-addon">&euro;</span>
5
- <input class="oc-input" type="text" inputmode="decimal" value="125.00" aria-label="Amount">
6
- </div>
7
- <div class="oc-input-group">
8
- <input class="oc-input" type="text" inputmode="decimal" value="21" aria-label="VAT rate">
9
- <span class="oc-input-addon">%</span>
10
- </div>
1
+ <!-- OmniaUI component: input-group - Input with prefix/suffix addon (currency, percent, units). Needs @birdycom/omniaui CSS.
2
+ -->
3
+ <div class="oc-input-group">
4
+ <span class="oc-input-addon">&euro;</span>
5
+ <input class="oc-input" type="text" inputmode="decimal" value="125.00" aria-label="Amount">
6
+ </div>
7
+ <div class="oc-input-group">
8
+ <input class="oc-input" type="text" inputmode="decimal" value="21" aria-label="VAT rate">
9
+ <span class="oc-input-addon">%</span>
10
+ </div>
@@ -1,5 +1,5 @@
1
- <!-- OmniaUI component: input - Text input with states (default, error, disabled). Needs @birdycom/omniaui CSS.
2
- -->
3
- <input class="oc-input" type="text" placeholder="Name">
4
- <input class="oc-input oc-input--error" type="text" value="Invalid" aria-invalid="true">
5
- <input class="oc-input" type="text" value="Disabled" disabled>
1
+ <!-- OmniaUI component: input - Text input with states (default, error, disabled). Needs @birdycom/omniaui CSS.
2
+ -->
3
+ <input class="oc-input" type="text" placeholder="Name">
4
+ <input class="oc-input oc-input--error" type="text" value="Invalid" aria-invalid="true">
5
+ <input class="oc-input" type="text" value="Disabled" disabled>
@@ -1,26 +1,26 @@
1
- <!-- OmniaUI component: item - Item: list row with media, content and actions. Needs @birdycom/omniaui CSS.
2
- Class API (modifiers are extra classes / attributes on the same element):
3
- .oc-item: flex row (div, li or a). Variants: --outline, --muted, --sm, --interactive
4
- .oc-item-media: left slot. Modifiers: --icon (boxed icon), --image
5
- .oc-item-content: grows; holds .oc-item-title and .oc-item-description
6
- .oc-item-actions: right slot (buttons)
7
- .oc-item-header / .oc-item-footer: full-width rows above/below
8
- .oc-item-group: vertical list of items; .oc-item-separator between them
9
- -->
10
- <div class="oc-item oc-item--outline">
11
- <div class="oc-item-media oc-item-media--icon"><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3 4 6v6c0 5 3.5 8 8 9 4.5-1 8-4 8-9V6z"/></svg></div>
12
- <div class="oc-item-content">
13
- <p class="oc-item-title">Two-factor authentication</p>
14
- <p class="oc-item-description">Verify sign-ins with an authenticator app.</p>
15
- </div>
16
- <div class="oc-item-actions"><button class="oc-btn oc-btn--outline oc-btn--sm" type="button">Enable</button></div>
17
- </div>
18
-
19
- <div class="oc-item-group oc-item--outline" style="border:1px solid var(--oc-border);border-radius:var(--oc-radius);padding:.25rem">
20
- <a class="oc-item oc-item--sm" href="#a"><div class="oc-item-media oc-item-media--icon"><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 2h8l5 5v15H6z"/><path d="M14 2v5h5"/></svg></div><div class="oc-item-content"><p class="oc-item-title">invoice-2026-014.pdf</p><p class="oc-item-description">128 KB &middot; today</p></div><div class="oc-item-actions"><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 6 6 6-6 6"/></svg></div></a>
21
- <hr class="oc-item-separator">
22
- <a class="oc-item oc-item--sm" href="#b"><div class="oc-item-media oc-item-media--icon"><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/></svg></div><div class="oc-item-content"><p class="oc-item-title">Contracts</p><p class="oc-item-description">12 files</p></div><div class="oc-item-actions"><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 6 6 6-6 6"/></svg></div></a>
23
- </div>
24
- <div class="oc-item oc-item--muted">
25
- <div class="oc-item-content"><p class="oc-item-title">Muted background, no media</p><p class="oc-item-description">Useful for inline notices and read-only rows.</p></div>
26
- </div>
1
+ <!-- OmniaUI component: item - Item: list row with media, content and actions. Needs @birdycom/omniaui CSS.
2
+ Class API (modifiers are extra classes / attributes on the same element):
3
+ .oc-item: flex row (div, li or a). Variants: --outline, --muted, --sm, --interactive
4
+ .oc-item-media: left slot. Modifiers: --icon (boxed icon), --image
5
+ .oc-item-content: grows; holds .oc-item-title and .oc-item-description
6
+ .oc-item-actions: right slot (buttons)
7
+ .oc-item-header / .oc-item-footer: full-width rows above/below
8
+ .oc-item-group: vertical list of items; .oc-item-separator between them
9
+ -->
10
+ <div class="oc-item oc-item--outline">
11
+ <div class="oc-item-media oc-item-media--icon"><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3 4 6v6c0 5 3.5 8 8 9 4.5-1 8-4 8-9V6z"/></svg></div>
12
+ <div class="oc-item-content">
13
+ <p class="oc-item-title">Two-factor authentication</p>
14
+ <p class="oc-item-description">Verify sign-ins with an authenticator app.</p>
15
+ </div>
16
+ <div class="oc-item-actions"><button class="oc-btn oc-btn--outline oc-btn--sm" type="button">Enable</button></div>
17
+ </div>
18
+
19
+ <div class="oc-item-group oc-item--outline" style="border:1px solid var(--oc-border);border-radius:var(--oc-radius);padding:.25rem">
20
+ <a class="oc-item oc-item--sm" href="#a"><div class="oc-item-media oc-item-media--icon"><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 2h8l5 5v15H6z"/><path d="M14 2v5h5"/></svg></div><div class="oc-item-content"><p class="oc-item-title">invoice-2026-014.pdf</p><p class="oc-item-description">128 KB &middot; today</p></div><div class="oc-item-actions"><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 6 6 6-6 6"/></svg></div></a>
21
+ <hr class="oc-item-separator">
22
+ <a class="oc-item oc-item--sm" href="#b"><div class="oc-item-media oc-item-media--icon"><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/></svg></div><div class="oc-item-content"><p class="oc-item-title">Contracts</p><p class="oc-item-description">12 files</p></div><div class="oc-item-actions"><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 6 6 6-6 6"/></svg></div></a>
23
+ </div>
24
+ <div class="oc-item oc-item--muted">
25
+ <div class="oc-item-content"><p class="oc-item-title">Muted background, no media</p><p class="oc-item-description">Useful for inline notices and read-only rows.</p></div>
26
+ </div>
package/snippets/kbd.html CHANGED
@@ -1,13 +1,13 @@
1
- <!-- OmniaUI component: kbd - Keyboard key and shortcut group. Needs @birdycom/omniaui CSS.
2
- Class API (modifiers are extra classes / attributes on the same element):
3
- .oc-kbd: one key (use on <kbd>)
4
- .oc-kbd-group: row of keys with a gap; .oc-kbd-sep for a '+' between them
5
- -->
6
- <p style="margin:0;display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;font-size:.875rem">
7
- Open the command palette with
8
- <span class="oc-kbd-group"><kbd class="oc-kbd">Ctrl</kbd><kbd class="oc-kbd">K</kbd></span>
9
- or press <kbd class="oc-kbd">/</kbd> to search.
10
- </p>
11
-
12
- <button class="oc-btn oc-btn--outline" type="button">Save <span class="oc-kbd-group"><kbd class="oc-kbd">&#8984;</kbd><kbd class="oc-kbd">S</kbd></span></button>
13
- <span class="oc-kbd-group"><kbd class="oc-kbd">Ctrl</kbd><span class="oc-kbd-sep">+</span><kbd class="oc-kbd">Shift</kbd><span class="oc-kbd-sep">+</span><kbd class="oc-kbd">P</kbd></span>
1
+ <!-- OmniaUI component: kbd - Keyboard key and shortcut group. Needs @birdycom/omniaui CSS.
2
+ Class API (modifiers are extra classes / attributes on the same element):
3
+ .oc-kbd: one key (use on <kbd>)
4
+ .oc-kbd-group: row of keys with a gap; .oc-kbd-sep for a '+' between them
5
+ -->
6
+ <p style="margin:0;display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;font-size:.875rem">
7
+ Open the command palette with
8
+ <span class="oc-kbd-group"><kbd class="oc-kbd">Ctrl</kbd><kbd class="oc-kbd">K</kbd></span>
9
+ or press <kbd class="oc-kbd">/</kbd> to search.
10
+ </p>
11
+
12
+ <button class="oc-btn oc-btn--outline" type="button">Save <span class="oc-kbd-group"><kbd class="oc-kbd">&#8984;</kbd><kbd class="oc-kbd">S</kbd></span></button>
13
+ <span class="oc-kbd-group"><kbd class="oc-kbd">Ctrl</kbd><span class="oc-kbd-sep">+</span><kbd class="oc-kbd">Shift</kbd><span class="oc-kbd-sep">+</span><kbd class="oc-kbd">P</kbd></span>
@@ -1,9 +1,9 @@
1
- <!-- OmniaUI component: label - Form label: block, inline (around a control), required mark, muted. Needs @birdycom/omniaui CSS.
2
- Class API (modifiers are extra classes / attributes on the same element):
3
- .oc-label: block label above a control. Modifiers: --required (red asterisk), --inline (wraps a checkbox/radio), --muted (secondary text)
4
- -->
5
- <div class="oc-form-group">
6
- <label class="oc-label oc-label--required" for="oc-label-email">E-mail</label>
7
- <input class="oc-input" id="oc-label-email" type="email" placeholder="name@example.com">
8
- </div>
9
- <label class="oc-label oc-label--inline"><input class="oc-checkbox" type="checkbox"> Accept terms and conditions</label>
1
+ <!-- OmniaUI component: label - Form label: block, inline (around a control), required mark, muted. Needs @birdycom/omniaui CSS.
2
+ Class API (modifiers are extra classes / attributes on the same element):
3
+ .oc-label: block label above a control. Modifiers: --required (red asterisk), --inline (wraps a checkbox/radio), --muted (secondary text)
4
+ -->
5
+ <div class="oc-form-group">
6
+ <label class="oc-label oc-label--required" for="oc-label-email">E-mail</label>
7
+ <input class="oc-input" id="oc-label-email" type="email" placeholder="name@example.com">
8
+ </div>
9
+ <label class="oc-label oc-label--inline"><input class="oc-checkbox" type="checkbox"> Accept terms and conditions</label>
@@ -1,26 +1,26 @@
1
- <!-- OmniaUI component: language-select - Compact language or currency switcher for a site header. Needs @birdycom/omniaui CSS.
2
- File: packages/ui/snippets/language-select.html | Map: language pill (globe icon + select) -> currency pill (symbol + select)
3
- Class API (modifiers are extra classes / attributes on the same element):
4
- .oc-language-select: Pill frame around icon and select. Modifiers: --ghost (no frame), --currency (symbol in primary color).
5
- .oc-language-select-icon: Leading icon (inline SVG) or symbol; aria-hidden="true"
6
- .oc-language-select-control: The native <select> (give it an aria-label)
7
- States: :focus-within (ring), disabled select (dimmed)
8
- Behaviour: the app listens to "change" (navigate to /nl/..., set a cookie, or submit the form).
9
- -->
10
- <label class="oc-language-select">
11
- <span class="oc-language-select-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="9"/><path d="M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18"/></svg></span>
12
- <select class="oc-language-select-control" name="locale" aria-label="Language">
13
- <option value="en" selected>English</option>
14
- <option value="nl">Nederlands</option>
15
- <option value="fr">Fran&ccedil;ais</option>
16
- <option value="de">Deutsch</option>
17
- </select>
18
- </label>
19
- <label class="oc-language-select oc-language-select--currency">
20
- <span class="oc-language-select-icon" aria-hidden="true">&euro;</span>
21
- <select class="oc-language-select-control" name="currency" aria-label="Currency">
22
- <option value="EUR" selected>EUR</option>
23
- <option value="USD">USD</option>
24
- <option value="GBP">GBP</option>
25
- </select>
26
- </label>
1
+ <!-- OmniaUI component: language-select - Compact language or currency switcher for a site header. Needs @birdycom/omniaui CSS.
2
+ File: packages/ui/snippets/language-select.html | Map: language pill (globe icon + select) -> currency pill (symbol + select)
3
+ Class API (modifiers are extra classes / attributes on the same element):
4
+ .oc-language-select: Pill frame around icon and select. Modifiers: --ghost (no frame), --currency (symbol in primary color).
5
+ .oc-language-select-icon: Leading icon (inline SVG) or symbol; aria-hidden="true"
6
+ .oc-language-select-control: The native <select> (give it an aria-label)
7
+ States: :focus-within (ring), disabled select (dimmed)
8
+ Behaviour: the app listens to "change" (navigate to /nl/..., set a cookie, or submit the form).
9
+ -->
10
+ <label class="oc-language-select">
11
+ <span class="oc-language-select-icon" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="9"/><path d="M3 12h18M12 3a14 14 0 0 1 0 18M12 3a14 14 0 0 0 0 18"/></svg></span>
12
+ <select class="oc-language-select-control" name="locale" aria-label="Language">
13
+ <option value="en" selected>English</option>
14
+ <option value="nl">Nederlands</option>
15
+ <option value="fr">Fran&ccedil;ais</option>
16
+ <option value="de">Deutsch</option>
17
+ </select>
18
+ </label>
19
+ <label class="oc-language-select oc-language-select--currency">
20
+ <span class="oc-language-select-icon" aria-hidden="true">&euro;</span>
21
+ <select class="oc-language-select-control" name="currency" aria-label="Currency">
22
+ <option value="EUR" selected>EUR</option>
23
+ <option value="USD">USD</option>
24
+ <option value="GBP">GBP</option>
25
+ </select>
26
+ </label>
@@ -1,14 +1,14 @@
1
- <!-- OmniaUI component: launcher-card - Large clickable card with icon, title and description (module hub, settings sections). Needs @birdycom/omniaui CSS.
2
- Class API (modifiers are extra classes / attributes on the same element):
3
- .oc-launcher: Card (link or button). State: aria-current="true" / .is-active, aria-disabled="true".
4
- .oc-launcher-icon: Tinted icon tile
5
- .oc-launcher-title: Title (may contain a badge)
6
- .oc-launcher-description: Muted description
7
- .oc-launcher-footer: Optional footer text (e.g. why it is disabled)
8
- Slots: icon, title (+ trailing badge), description, footer
9
- -->
10
- <a class="oc-launcher" href="#" style="max-width:20rem">
11
- <span class="oc-launcher-icon" aria-hidden="true"><svg class="" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="9" cy="8" r="4"/><path d="M2 21c0-4 3-6 7-6s7 2 7 6"/></svg></span>
12
- <h3 class="oc-launcher-title">Contacts <span class="oc-badge oc-badge--success">Active</span></h3>
13
- <p class="oc-launcher-description">Customers, suppliers and the people who work there.</p>
14
- </a>
1
+ <!-- OmniaUI component: launcher-card - Large clickable card with icon, title and description (module hub, settings sections). Needs @birdycom/omniaui CSS.
2
+ Class API (modifiers are extra classes / attributes on the same element):
3
+ .oc-launcher: Card (link or button). State: aria-current="true" / .is-active, aria-disabled="true".
4
+ .oc-launcher-icon: Tinted icon tile
5
+ .oc-launcher-title: Title (may contain a badge)
6
+ .oc-launcher-description: Muted description
7
+ .oc-launcher-footer: Optional footer text (e.g. why it is disabled)
8
+ Slots: icon, title (+ trailing badge), description, footer
9
+ -->
10
+ <a class="oc-launcher" href="#" style="max-width:20rem">
11
+ <span class="oc-launcher-icon" aria-hidden="true"><svg class="" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="9" cy="8" r="4"/><path d="M2 21c0-4 3-6 7-6s7 2 7 6"/></svg></span>
12
+ <h3 class="oc-launcher-title">Contacts <span class="oc-badge oc-badge--success">Active</span></h3>
13
+ <p class="oc-launcher-description">Customers, suppliers and the people who work there.</p>
14
+ </a>
@@ -1,50 +1,50 @@
1
- <!-- OmniaUI component: lightbox — Image viewer on a native <dialog> with prev / next, counter and caption. Needs @birdycom/omniaui CSS.
2
- File: packages/ui/snippets/lightbox.html | Map: thumbnails -> dialog (bar, track of slides) -> optional script
3
- Class API: .oc-lightbox-thumbs > button.oc-lightbox-thumb (command="show-modal" commandfor="<dialog id>") ·
4
- dialog.oc-lightbox > .oc-lightbox__bar (.oc-lightbox__title, button.oc-lightbox__close) ·
5
- .oc-lightbox__track (tabindex=0, autofocus) > figure.oc-lightbox__slide#id >
6
- .oc-lightbox__media (img) · a.oc-lightbox__nav--prev / --next (href="#<slide id>") · figcaption.oc-lightbox__caption (.oc-lightbox__counter).
7
- Modifiers: .oc-lightbox--single (hides nav + counter). Slots: any img / video / .oc-media-art in .oc-lightbox__media.
8
- No JavaScript needed: the thumbnails open the dialog, links jump between slides, Esc / backdrop close it.
9
- The optional script below only makes a thumbnail open the viewer at its own slide (data-oc-lightbox-slide).
10
- -->
11
- <div class="oc-lightbox-thumbs">
12
- <button type="button" class="oc-lightbox-thumb" command="show-modal" commandfor="oc-lightbox-demo" data-oc-lightbox-slide="oc-lightbox-demo-1" aria-label="Open photo 1: Harbour at dawn"><span class="oc-media-art"></span></button>
13
- <button type="button" class="oc-lightbox-thumb" command="show-modal" commandfor="oc-lightbox-demo" data-oc-lightbox-slide="oc-lightbox-demo-2" aria-label="Open photo 2: Forest trail"><span class="oc-media-art oc-media-art--4"></span></button>
14
- <button type="button" class="oc-lightbox-thumb" command="show-modal" commandfor="oc-lightbox-demo" data-oc-lightbox-slide="oc-lightbox-demo-3" aria-label="Open photo 3: Desert road"><span class="oc-media-art oc-media-art--6"></span></button>
15
- </div>
16
-
17
- <dialog class="oc-lightbox" id="oc-lightbox-demo" closedby="any" aria-label="Photo viewer">
18
- <div class="oc-lightbox__bar">
19
- <h2 class="oc-lightbox__title">Holiday photos</h2>
20
- <button type="button" class="oc-lightbox__close" command="close" commandfor="oc-lightbox-demo" aria-label="Close">&#10005;</button>
21
- </div>
22
- <div class="oc-lightbox__track" tabindex="0" autofocus aria-label="Photos, use the arrow keys">
23
- <figure class="oc-lightbox__slide" id="oc-lightbox-demo-1">
24
- <div class="oc-lightbox__media"><div class="oc-media-art" role="img" aria-label="Harbour at dawn"></div></div>
25
- <a class="oc-lightbox__nav oc-lightbox__nav--prev" href="#oc-lightbox-demo-3" aria-label="Previous photo">&#8592;</a>
26
- <a class="oc-lightbox__nav oc-lightbox__nav--next" href="#oc-lightbox-demo-2" aria-label="Next photo">&#8594;</a>
27
- <figcaption class="oc-lightbox__caption"><span class="oc-lightbox__counter">1 / 3</span> Harbour at dawn</figcaption>
28
- </figure>
29
- <figure class="oc-lightbox__slide" id="oc-lightbox-demo-2">
30
- <div class="oc-lightbox__media"><div class="oc-media-art oc-media-art--4" role="img" aria-label="Forest trail"></div></div>
31
- <a class="oc-lightbox__nav oc-lightbox__nav--prev" href="#oc-lightbox-demo-1" aria-label="Previous photo">&#8592;</a>
32
- <a class="oc-lightbox__nav oc-lightbox__nav--next" href="#oc-lightbox-demo-3" aria-label="Next photo">&#8594;</a>
33
- <figcaption class="oc-lightbox__caption"><span class="oc-lightbox__counter">2 / 3</span> Forest trail</figcaption>
34
- </figure>
35
- <figure class="oc-lightbox__slide" id="oc-lightbox-demo-3">
36
- <div class="oc-lightbox__media"><div class="oc-media-art oc-media-art--6" role="img" aria-label="Desert road"></div></div>
37
- <a class="oc-lightbox__nav oc-lightbox__nav--prev" href="#oc-lightbox-demo-2" aria-label="Previous photo">&#8592;</a>
38
- <a class="oc-lightbox__nav oc-lightbox__nav--next" href="#oc-lightbox-demo-1" aria-label="Next photo">&#8594;</a>
39
- <figcaption class="oc-lightbox__caption"><span class="oc-lightbox__counter">3 / 3</span> Desert road</figcaption>
40
- </figure>
41
- </div>
42
- </dialog>
43
- <script>
44
- // Optional: open the viewer at the clicked thumbnail. The "command" event fires before the dialog opens,
45
- // so the jump waits one frame. Without this script the viewer opens at the first (or last viewed) photo.
46
- document.addEventListener("command", (e) => {
47
- const id = e.source?.dataset.ocLightboxSlide;
48
- if (id) requestAnimationFrame(() => document.getElementById(id)?.scrollIntoView({ behavior: "instant", block: "nearest", inline: "center" }));
49
- }, true);
50
- </script>
1
+ <!-- OmniaUI component: lightbox — Image viewer on a native <dialog> with prev / next, counter and caption. Needs @birdycom/omniaui CSS.
2
+ File: packages/ui/snippets/lightbox.html | Map: thumbnails -> dialog (bar, track of slides) -> optional script
3
+ Class API: .oc-lightbox-thumbs > button.oc-lightbox-thumb (command="show-modal" commandfor="<dialog id>") ·
4
+ dialog.oc-lightbox > .oc-lightbox__bar (.oc-lightbox__title, button.oc-lightbox__close) ·
5
+ .oc-lightbox__track (tabindex=0, autofocus) > figure.oc-lightbox__slide#id >
6
+ .oc-lightbox__media (img) · a.oc-lightbox__nav--prev / --next (href="#<slide id>") · figcaption.oc-lightbox__caption (.oc-lightbox__counter).
7
+ Modifiers: .oc-lightbox--single (hides nav + counter). Slots: any img / video / .oc-media-art in .oc-lightbox__media.
8
+ No JavaScript needed: the thumbnails open the dialog, links jump between slides, Esc / backdrop close it.
9
+ The optional script below only makes a thumbnail open the viewer at its own slide (data-oc-lightbox-slide).
10
+ -->
11
+ <div class="oc-lightbox-thumbs">
12
+ <button type="button" class="oc-lightbox-thumb" command="show-modal" commandfor="oc-lightbox-demo" data-oc-lightbox-slide="oc-lightbox-demo-1" aria-label="Open photo 1: Harbour at dawn"><span class="oc-media-art"></span></button>
13
+ <button type="button" class="oc-lightbox-thumb" command="show-modal" commandfor="oc-lightbox-demo" data-oc-lightbox-slide="oc-lightbox-demo-2" aria-label="Open photo 2: Forest trail"><span class="oc-media-art oc-media-art--4"></span></button>
14
+ <button type="button" class="oc-lightbox-thumb" command="show-modal" commandfor="oc-lightbox-demo" data-oc-lightbox-slide="oc-lightbox-demo-3" aria-label="Open photo 3: Desert road"><span class="oc-media-art oc-media-art--6"></span></button>
15
+ </div>
16
+
17
+ <dialog class="oc-lightbox" id="oc-lightbox-demo" closedby="any" aria-label="Photo viewer">
18
+ <div class="oc-lightbox__bar">
19
+ <h2 class="oc-lightbox__title">Holiday photos</h2>
20
+ <button type="button" class="oc-lightbox__close" command="close" commandfor="oc-lightbox-demo" aria-label="Close">&#10005;</button>
21
+ </div>
22
+ <div class="oc-lightbox__track" tabindex="0" autofocus aria-label="Photos, use the arrow keys">
23
+ <figure class="oc-lightbox__slide" id="oc-lightbox-demo-1">
24
+ <div class="oc-lightbox__media"><div class="oc-media-art" role="img" aria-label="Harbour at dawn"></div></div>
25
+ <a class="oc-lightbox__nav oc-lightbox__nav--prev" href="#oc-lightbox-demo-3" aria-label="Previous photo">&#8592;</a>
26
+ <a class="oc-lightbox__nav oc-lightbox__nav--next" href="#oc-lightbox-demo-2" aria-label="Next photo">&#8594;</a>
27
+ <figcaption class="oc-lightbox__caption"><span class="oc-lightbox__counter">1 / 3</span> Harbour at dawn</figcaption>
28
+ </figure>
29
+ <figure class="oc-lightbox__slide" id="oc-lightbox-demo-2">
30
+ <div class="oc-lightbox__media"><div class="oc-media-art oc-media-art--4" role="img" aria-label="Forest trail"></div></div>
31
+ <a class="oc-lightbox__nav oc-lightbox__nav--prev" href="#oc-lightbox-demo-1" aria-label="Previous photo">&#8592;</a>
32
+ <a class="oc-lightbox__nav oc-lightbox__nav--next" href="#oc-lightbox-demo-3" aria-label="Next photo">&#8594;</a>
33
+ <figcaption class="oc-lightbox__caption"><span class="oc-lightbox__counter">2 / 3</span> Forest trail</figcaption>
34
+ </figure>
35
+ <figure class="oc-lightbox__slide" id="oc-lightbox-demo-3">
36
+ <div class="oc-lightbox__media"><div class="oc-media-art oc-media-art--6" role="img" aria-label="Desert road"></div></div>
37
+ <a class="oc-lightbox__nav oc-lightbox__nav--prev" href="#oc-lightbox-demo-2" aria-label="Previous photo">&#8592;</a>
38
+ <a class="oc-lightbox__nav oc-lightbox__nav--next" href="#oc-lightbox-demo-1" aria-label="Next photo">&#8594;</a>
39
+ <figcaption class="oc-lightbox__caption"><span class="oc-lightbox__counter">3 / 3</span> Desert road</figcaption>
40
+ </figure>
41
+ </div>
42
+ </dialog>
43
+ <script>
44
+ // Optional: open the viewer at the clicked thumbnail. The "command" event fires before the dialog opens,
45
+ // so the jump waits one frame. Without this script the viewer opens at the first (or last viewed) photo.
46
+ document.addEventListener("command", (e) => {
47
+ const id = e.source?.dataset.ocLightboxSlide;
48
+ if (id) requestAnimationFrame(() => document.getElementById(id)?.scrollIntoView({ behavior: "instant", block: "nearest", inline: "center" }));
49
+ }, true);
50
+ </script>
@@ -1,10 +1,10 @@
1
- <!-- OmniaUI component: link-arrow - Text link with an arrow that moves on hover and focus. Needs @birdycom/omniaui CSS.
2
- File: packages/ui/snippets/link-arrow.html | Map: a.oc-link-arrow per variant
3
- Class API (modifiers are extra classes / attributes on the same element):
4
- .oc-link-arrow: Link with "→" after the text (brand color)
5
- Modifiers: --back (← before the text), --external (↗), --accent (element accent), --muted, --sm, --lg
6
- Slots: text
7
- -->
8
- <a class="oc-link-arrow" href="#more">Read the case study</a>
9
- <a class="oc-link-arrow oc-link-arrow--back oc-link-arrow--muted" href="#back">All projects</a>
10
- <a class="oc-link-arrow oc-link-arrow--external" href="#docs" rel="noopener">Documentation</a>
1
+ <!-- OmniaUI component: link-arrow - Text link with an arrow that moves on hover and focus. Needs @birdycom/omniaui CSS.
2
+ File: packages/ui/snippets/link-arrow.html | Map: a.oc-link-arrow per variant
3
+ Class API (modifiers are extra classes / attributes on the same element):
4
+ .oc-link-arrow: Link with "→" after the text (brand color)
5
+ Modifiers: --back (← before the text), --external (↗), --accent (element accent), --muted, --sm, --lg
6
+ Slots: text
7
+ -->
8
+ <a class="oc-link-arrow" href="#more">Read the case study</a>
9
+ <a class="oc-link-arrow oc-link-arrow--back oc-link-arrow--muted" href="#back">All projects</a>
10
+ <a class="oc-link-arrow oc-link-arrow--external" href="#docs" rel="noopener">Documentation</a>
@@ -1,33 +1,33 @@
1
- <!-- OmniaUI component: list-toolbar - Search, result count, cards / table view toggle and actions above a list; the toggle switches views with :has() - no JavaScript. Needs @birdycom/omniaui CSS.
2
- File: packages/ui/snippets/list-toolbar.html | Map: scope -> toolbar (search, count, spacer, view toggle, actions) -> cards panel -> table panel
3
- Class API (modifiers are extra classes / attributes on the same element):
4
- .oc-list-toolbar: Toolbar row (wraps). Modifiers: --sticky (sticks to the top), --bordered (framed bar).
5
- .oc-list-toolbar-search: Search area (holds an .oc-input type="search")
6
- .oc-list-toolbar-count / -spacer / -actions: Result count, flexible gap, end buttons
7
- .oc-list-toolbar-views: Radio group (role="radiogroup") for the view
8
- .oc-list-toolbar-view: label + input[type=radio][value=cards|table|list] + icon; checked = active
9
- .oc-list-toolbar-scope: Optional wrapper; shows only the .oc-list-toolbar-panel[data-view] that matches the checked radio
10
- Slots: search, count, views, actions, panels
11
- -->
12
- <div class="oc-list-toolbar-scope">
13
- <div class="oc-list-toolbar" role="toolbar" aria-label="Products">
14
- <div class="oc-list-toolbar-search"><input class="oc-input" type="search" placeholder="Search products" aria-label="Search products"></div>
15
- <span class="oc-list-toolbar-count">3 items</span>
16
- <span class="oc-list-toolbar-spacer"></span>
17
- <div class="oc-list-toolbar-views" role="radiogroup" aria-label="View">
18
- <label class="oc-list-toolbar-view" title="Cards"><input type="radio" name="oc-list-view" value="cards" checked aria-label="Cards"><svg class="" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/><rect x="14" y="14" width="7" height="7" rx="1"/></svg></label>
19
- <label class="oc-list-toolbar-view" title="Table"><input type="radio" name="oc-list-view" value="table" aria-label="Table"><svg class="" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 5h18M3 12h18M3 19h18"/></svg></label>
20
- </div>
21
- <div class="oc-list-toolbar-actions"><button class="oc-btn oc-btn--sm" type="button">New product</button></div>
22
- </div>
23
- <div class="oc-list-toolbar-panel" data-view="cards">
24
- <div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(10rem,1fr));gap:.75rem">
25
- <div class="oc-card oc-card--sm"><div class="oc-card-content">Oak table</div></div>
26
- <div class="oc-card oc-card--sm"><div class="oc-card-content">Linen chair</div></div>
27
- <div class="oc-card oc-card--sm"><div class="oc-card-content">Brass lamp</div></div>
28
- </div>
29
- </div>
30
- <div class="oc-list-toolbar-panel" data-view="table">
31
- <table class="oc-table"><thead><tr><th>Product</th></tr></thead><tbody><tr><td>Oak table</td></tr><tr><td>Linen chair</td></tr><tr><td>Brass lamp</td></tr></tbody></table>
32
- </div>
33
- </div>
1
+ <!-- OmniaUI component: list-toolbar - Search, result count, cards / table view toggle and actions above a list; the toggle switches views with :has() - no JavaScript. Needs @birdycom/omniaui CSS.
2
+ File: packages/ui/snippets/list-toolbar.html | Map: scope -> toolbar (search, count, spacer, view toggle, actions) -> cards panel -> table panel
3
+ Class API (modifiers are extra classes / attributes on the same element):
4
+ .oc-list-toolbar: Toolbar row (wraps). Modifiers: --sticky (sticks to the top), --bordered (framed bar).
5
+ .oc-list-toolbar-search: Search area (holds an .oc-input type="search")
6
+ .oc-list-toolbar-count / -spacer / -actions: Result count, flexible gap, end buttons
7
+ .oc-list-toolbar-views: Radio group (role="radiogroup") for the view
8
+ .oc-list-toolbar-view: label + input[type=radio][value=cards|table|list] + icon; checked = active
9
+ .oc-list-toolbar-scope: Optional wrapper; shows only the .oc-list-toolbar-panel[data-view] that matches the checked radio
10
+ Slots: search, count, views, actions, panels
11
+ -->
12
+ <div class="oc-list-toolbar-scope">
13
+ <div class="oc-list-toolbar" role="toolbar" aria-label="Products">
14
+ <div class="oc-list-toolbar-search"><input class="oc-input" type="search" placeholder="Search products" aria-label="Search products"></div>
15
+ <span class="oc-list-toolbar-count">3 items</span>
16
+ <span class="oc-list-toolbar-spacer"></span>
17
+ <div class="oc-list-toolbar-views" role="radiogroup" aria-label="View">
18
+ <label class="oc-list-toolbar-view" title="Cards"><input type="radio" name="oc-list-view" value="cards" checked aria-label="Cards"><svg class="" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/><rect x="14" y="14" width="7" height="7" rx="1"/></svg></label>
19
+ <label class="oc-list-toolbar-view" title="Table"><input type="radio" name="oc-list-view" value="table" aria-label="Table"><svg class="" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 5h18M3 12h18M3 19h18"/></svg></label>
20
+ </div>
21
+ <div class="oc-list-toolbar-actions"><button class="oc-btn oc-btn--sm" type="button">New product</button></div>
22
+ </div>
23
+ <div class="oc-list-toolbar-panel" data-view="cards">
24
+ <div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(10rem,1fr));gap:.75rem">
25
+ <div class="oc-card oc-card--sm"><div class="oc-card-content">Oak table</div></div>
26
+ <div class="oc-card oc-card--sm"><div class="oc-card-content">Linen chair</div></div>
27
+ <div class="oc-card oc-card--sm"><div class="oc-card-content">Brass lamp</div></div>
28
+ </div>
29
+ </div>
30
+ <div class="oc-list-toolbar-panel" data-view="table">
31
+ <table class="oc-table"><thead><tr><th>Product</th></tr></thead><tbody><tr><td>Oak table</td></tr><tr><td>Linen chair</td></tr><tr><td>Brass lamp</td></tr></tbody></table>
32
+ </div>
33
+ </div>
@@ -1,15 +1,15 @@
1
- <!-- OmniaUI component: marquee - Endless scrolling strip of chips; pauses on hover and focus, static with reduced motion. Needs @birdycom/omniaui CSS.
2
- File: packages/ui/snippets/marquee.html | Map: .oc-marquee -> .oc-marquee__track -> items + aria-hidden copies
3
- Class API (modifiers are extra classes / attributes on the same element):
4
- .oc-marquee: Clipping wrapper (aria-label describes the list). Modifiers: --reverse, --slow, --fast, --plain (text only), --no-fade
5
- .oc-marquee__track: The moving row. Render the items twice; the second set gets aria-hidden="true"
6
- .oc-marquee__item: One chip
7
- --oc-marquee-duration: Custom speed (default 40s)
8
- Slots: items (rendered twice for a seamless loop)
9
- -->
10
- <div class="oc-marquee" aria-label="Technologies">
11
- <div class="oc-marquee__track">
12
- <span class="oc-marquee__item">HTML</span><span class="oc-marquee__item">CSS</span><span class="oc-marquee__item">PHP</span><span class="oc-marquee__item">MySQL</span><span class="oc-marquee__item">TypeScript</span><span class="oc-marquee__item">Node.js</span>
13
- <span class="oc-marquee__item" aria-hidden="true">HTML</span><span class="oc-marquee__item" aria-hidden="true">CSS</span><span class="oc-marquee__item" aria-hidden="true">PHP</span><span class="oc-marquee__item" aria-hidden="true">MySQL</span><span class="oc-marquee__item" aria-hidden="true">TypeScript</span><span class="oc-marquee__item" aria-hidden="true">Node.js</span>
14
- </div>
15
- </div>
1
+ <!-- OmniaUI component: marquee - Endless scrolling strip of chips; pauses on hover and focus, static with reduced motion. Needs @birdycom/omniaui CSS.
2
+ File: packages/ui/snippets/marquee.html | Map: .oc-marquee -> .oc-marquee__track -> items + aria-hidden copies
3
+ Class API (modifiers are extra classes / attributes on the same element):
4
+ .oc-marquee: Clipping wrapper (aria-label describes the list). Modifiers: --reverse, --slow, --fast, --plain (text only), --no-fade
5
+ .oc-marquee__track: The moving row. Render the items twice; the second set gets aria-hidden="true"
6
+ .oc-marquee__item: One chip
7
+ --oc-marquee-duration: Custom speed (default 40s)
8
+ Slots: items (rendered twice for a seamless loop)
9
+ -->
10
+ <div class="oc-marquee" aria-label="Technologies">
11
+ <div class="oc-marquee__track">
12
+ <span class="oc-marquee__item">HTML</span><span class="oc-marquee__item">CSS</span><span class="oc-marquee__item">PHP</span><span class="oc-marquee__item">MySQL</span><span class="oc-marquee__item">TypeScript</span><span class="oc-marquee__item">Node.js</span>
13
+ <span class="oc-marquee__item" aria-hidden="true">HTML</span><span class="oc-marquee__item" aria-hidden="true">CSS</span><span class="oc-marquee__item" aria-hidden="true">PHP</span><span class="oc-marquee__item" aria-hidden="true">MySQL</span><span class="oc-marquee__item" aria-hidden="true">TypeScript</span><span class="oc-marquee__item" aria-hidden="true">Node.js</span>
14
+ </div>
15
+ </div>
@@ -1,28 +1,28 @@
1
- <!-- OmniaUI component: media-card — Video card: thumb, avatar, two-line title, meta and an overflow menu. Needs @birdycom/omniaui CSS.
2
- File: packages/ui/snippets/media-card.html | Map: card -> media thumb -> body (avatar, text, menu button) -> dropdown menu (popover)
3
- Class API: article.oc-media-card > .oc-media-thumb (see media-thumb) · .oc-media-card__body >
4
- .oc-media-card__avatar (img or initials) · .oc-media-card__text (h3.oc-media-card__title > a, p.oc-media-card__meta) ·
5
- button.oc-media-card__menu (popovertarget → any .oc-dropdown-menu).
6
- Modifiers: .oc-media-card--compact. The title link covers the whole card; meta links and the menu stay clickable.
7
- -->
8
- <article class="oc-media-card" style="max-inline-size:20rem">
9
- <div class="oc-media-thumb">
10
- <div class="oc-media-art oc-media-art--2"></div>
11
- <span class="oc-media-thumb__duration">18:32</span>
12
- <progress class="oc-media-thumb__progress" value="65" max="100" aria-label="Watched 65%">65%</progress>
13
- </div>
14
- <div class="oc-media-card__body">
15
- <span class="oc-media-card__avatar" aria-hidden="true">NS</span>
16
- <div class="oc-media-card__text">
17
- <h3 class="oc-media-card__title"><a href="#">Building a cabin by the lake, part 3: the roof goes on</a></h3>
18
- <p class="oc-media-card__meta"><a href="#">North Studio</a> · 24K views · 3 days ago</p>
19
- </div>
20
- <button type="button" class="oc-media-card__menu" popovertarget="oc-media-card-menu" aria-label="More actions">&#8942;</button>
21
- </div>
22
- <div class="oc-dropdown-menu" id="oc-media-card-menu" popover>
23
- <a class="oc-dropdown-item" href="#">Save to playlist</a>
24
- <a class="oc-dropdown-item" href="#">Share</a>
25
- <div class="oc-dropdown-separator"></div>
26
- <a class="oc-dropdown-item" href="#">Not interested</a>
27
- </div>
28
- </article>
1
+ <!-- OmniaUI component: media-card — Video card: thumb, avatar, two-line title, meta and an overflow menu. Needs @birdycom/omniaui CSS.
2
+ File: packages/ui/snippets/media-card.html | Map: card -> media thumb -> body (avatar, text, menu button) -> dropdown menu (popover)
3
+ Class API: article.oc-media-card > .oc-media-thumb (see media-thumb) · .oc-media-card__body >
4
+ .oc-media-card__avatar (img or initials) · .oc-media-card__text (h3.oc-media-card__title > a, p.oc-media-card__meta) ·
5
+ button.oc-media-card__menu (popovertarget → any .oc-dropdown-menu).
6
+ Modifiers: .oc-media-card--compact. The title link covers the whole card; meta links and the menu stay clickable.
7
+ -->
8
+ <article class="oc-media-card" style="max-inline-size:20rem">
9
+ <div class="oc-media-thumb">
10
+ <div class="oc-media-art oc-media-art--2"></div>
11
+ <span class="oc-media-thumb__duration">18:32</span>
12
+ <progress class="oc-media-thumb__progress" value="65" max="100" aria-label="Watched 65%">65%</progress>
13
+ </div>
14
+ <div class="oc-media-card__body">
15
+ <span class="oc-media-card__avatar" aria-hidden="true">NS</span>
16
+ <div class="oc-media-card__text">
17
+ <h3 class="oc-media-card__title"><a href="#">Building a cabin by the lake, part 3: the roof goes on</a></h3>
18
+ <p class="oc-media-card__meta"><a href="#">North Studio</a> · 24K views · 3 days ago</p>
19
+ </div>
20
+ <button type="button" class="oc-media-card__menu" popovertarget="oc-media-card-menu" aria-label="More actions">&#8942;</button>
21
+ </div>
22
+ <div class="oc-dropdown-menu" id="oc-media-card-menu" popover>
23
+ <a class="oc-dropdown-item" href="#">Save to playlist</a>
24
+ <a class="oc-dropdown-item" href="#">Share</a>
25
+ <div class="oc-dropdown-separator"></div>
26
+ <a class="oc-dropdown-item" href="#">Not interested</a>
27
+ </div>
28
+ </article>
@@ -1,21 +1,21 @@
1
- <!-- OmniaUI component: media-row — Compact horizontal media item for up-next lists and numbered playlists. Needs @birdycom/omniaui CSS.
2
- File: packages/ui/snippets/media-row.html | Map: list -> row (thumb, text, menu) -> numbered playlist variant
3
- Class API: ul/ol.oc-media-row-list > li.oc-media-row > .oc-media-thumb (see media-thumb) ·
4
- .oc-media-row__text (h3.oc-media-row__title > a, p.oc-media-row__meta) · button.oc-media-row__menu (optional).
5
- Modifiers: .oc-media-row-list--numbered (CSS counter column). States: aria-current="true" (now playing).
6
- The title link covers the row; the menu button stays clickable. No JavaScript.
7
- -->
8
- <ol class="oc-media-row-list oc-media-row-list--numbered" aria-label="Playlist: Cabin build" style="max-inline-size:26rem">
9
- <li class="oc-media-row">
10
- <div class="oc-media-thumb"><div class="oc-media-art"></div><span class="oc-media-thumb__duration">9:12</span><progress class="oc-media-thumb__progress" value="100" max="100" aria-label="Watched">100%</progress></div>
11
- <div class="oc-media-row__text"><h3 class="oc-media-row__title"><a href="#">Part 1: clearing the site</a></h3><p class="oc-media-row__meta">North Studio</p></div>
12
- </li>
13
- <li class="oc-media-row" aria-current="true">
14
- <div class="oc-media-thumb"><div class="oc-media-art oc-media-art--2"></div><span class="oc-media-thumb__duration">14:40</span><progress class="oc-media-thumb__progress" value="30" max="100" aria-label="Watched 30%">30%</progress></div>
15
- <div class="oc-media-row__text"><h3 class="oc-media-row__title"><a href="#">Part 2: walls and windows</a></h3><p class="oc-media-row__meta">North Studio</p></div>
16
- </li>
17
- <li class="oc-media-row">
18
- <div class="oc-media-thumb"><div class="oc-media-art oc-media-art--4"></div><span class="oc-media-thumb__duration">18:32</span></div>
19
- <div class="oc-media-row__text"><h3 class="oc-media-row__title"><a href="#">Part 3: the roof goes on</a></h3><p class="oc-media-row__meta">North Studio</p></div>
20
- </li>
21
- </ol>
1
+ <!-- OmniaUI component: media-row — Compact horizontal media item for up-next lists and numbered playlists. Needs @birdycom/omniaui CSS.
2
+ File: packages/ui/snippets/media-row.html | Map: list -> row (thumb, text, menu) -> numbered playlist variant
3
+ Class API: ul/ol.oc-media-row-list > li.oc-media-row > .oc-media-thumb (see media-thumb) ·
4
+ .oc-media-row__text (h3.oc-media-row__title > a, p.oc-media-row__meta) · button.oc-media-row__menu (optional).
5
+ Modifiers: .oc-media-row-list--numbered (CSS counter column). States: aria-current="true" (now playing).
6
+ The title link covers the row; the menu button stays clickable. No JavaScript.
7
+ -->
8
+ <ol class="oc-media-row-list oc-media-row-list--numbered" aria-label="Playlist: Cabin build" style="max-inline-size:26rem">
9
+ <li class="oc-media-row">
10
+ <div class="oc-media-thumb"><div class="oc-media-art"></div><span class="oc-media-thumb__duration">9:12</span><progress class="oc-media-thumb__progress" value="100" max="100" aria-label="Watched">100%</progress></div>
11
+ <div class="oc-media-row__text"><h3 class="oc-media-row__title"><a href="#">Part 1: clearing the site</a></h3><p class="oc-media-row__meta">North Studio</p></div>
12
+ </li>
13
+ <li class="oc-media-row" aria-current="true">
14
+ <div class="oc-media-thumb"><div class="oc-media-art oc-media-art--2"></div><span class="oc-media-thumb__duration">14:40</span><progress class="oc-media-thumb__progress" value="30" max="100" aria-label="Watched 30%">30%</progress></div>
15
+ <div class="oc-media-row__text"><h3 class="oc-media-row__title"><a href="#">Part 2: walls and windows</a></h3><p class="oc-media-row__meta">North Studio</p></div>
16
+ </li>
17
+ <li class="oc-media-row">
18
+ <div class="oc-media-thumb"><div class="oc-media-art oc-media-art--4"></div><span class="oc-media-thumb__duration">18:32</span></div>
19
+ <div class="oc-media-row__text"><h3 class="oc-media-row__title"><a href="#">Part 3: the roof goes on</a></h3><p class="oc-media-row__meta">North Studio</p></div>
20
+ </li>
21
+ </ol>