@birdycom/omniaui 0.11.0 → 0.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +21 -21
  3. package/bin/lib/add.mjs +126 -126
  4. package/bin/lib/catalog.mjs +169 -169
  5. package/bin/lib/project.mjs +90 -90
  6. package/bin/omniaui.mjs +69 -69
  7. package/dist/code-block.css +25 -25
  8. package/dist/components-extra.css +916 -914
  9. package/dist/components.css +6565 -6469
  10. package/dist/components.min.css +1 -1
  11. package/dist/data-table.d.ts +9 -9
  12. package/dist/data-table.js +505 -505
  13. package/dist/docs-ui.css +267 -265
  14. package/dist/oc-theme.css +69 -69
  15. package/dist/parts/app-accordion-accent.css +60 -60
  16. package/dist/parts/app-alpha-tabs.css +68 -68
  17. package/dist/parts/app-busy-overlay.css +25 -25
  18. package/dist/parts/app-column-menu.css +85 -85
  19. package/dist/parts/app-confirm-dialog.css +70 -70
  20. package/dist/parts/app-cookie-consent.css +63 -63
  21. package/dist/parts/app-data-table.css +174 -174
  22. package/dist/parts/app-greeting.css +47 -47
  23. package/dist/parts/app-list-toolbar.css +81 -81
  24. package/dist/parts/app-page-header.css +54 -54
  25. package/dist/parts/app-severity-card.css +91 -91
  26. package/dist/parts/app-sidebar-dark.css +15 -15
  27. package/dist/parts/app-sortable-row.css +52 -52
  28. package/dist/parts/app-stat-card.css +68 -68
  29. package/dist/parts/app-table-actions.css +71 -71
  30. package/dist/parts/app-table-compact.css +54 -54
  31. package/dist/parts/app-top-progress.css +68 -68
  32. package/dist/parts/app-tree.css +104 -104
  33. package/dist/parts/app-upgrade-banner.css +90 -90
  34. package/dist/parts/app-version-banner.css +80 -80
  35. package/dist/parts/data-chart-line.css +167 -167
  36. package/dist/parts/forms-affix-input.css +75 -75
  37. package/dist/parts/forms-barcode-input.css +75 -75
  38. package/dist/parts/forms-chip-filter.css +91 -91
  39. package/dist/parts/forms-color-select.css +97 -89
  40. package/dist/parts/forms-decimal-input.css +51 -51
  41. package/dist/parts/forms-filter-counts.css +94 -94
  42. package/dist/parts/forms-language-select.css +89 -76
  43. package/dist/parts/forms-number-input.css +98 -95
  44. package/dist/parts/forms-password-requirements.css +55 -55
  45. package/dist/parts/forms-phone-input.css +85 -85
  46. package/dist/parts/forms-time-input.css +74 -74
  47. package/dist/parts/forms-toggle-field.css +69 -69
  48. package/dist/parts/media-art.css +21 -21
  49. package/dist/parts/media-attachment.css +160 -160
  50. package/dist/parts/media-browser-frame.css +73 -73
  51. package/dist/parts/media-card.css +83 -83
  52. package/dist/parts/media-chat-composer.css +90 -90
  53. package/dist/parts/media-doc-viewer.css +151 -151
  54. package/dist/parts/media-emoji-picker.css +88 -88
  55. package/dist/parts/media-entity-card.css +52 -52
  56. package/dist/parts/media-flip-card.css +78 -78
  57. package/dist/parts/media-image-zoom.css +68 -68
  58. package/dist/parts/media-lightbox.css +131 -131
  59. package/dist/parts/media-message-thread.css +136 -136
  60. package/dist/parts/media-message.css +160 -160
  61. package/dist/parts/media-row.css +78 -78
  62. package/dist/parts/media-stack-card.css +82 -82
  63. package/dist/parts/media-terminal-log.css +76 -76
  64. package/dist/parts/media-thumb.css +71 -71
  65. package/dist/parts/site-fact-list.css +25 -25
  66. package/dist/parts/site-link-arrow.css +34 -34
  67. package/dist/parts/site-marquee.css +34 -34
  68. package/dist/parts/site-next-teaser.css +75 -75
  69. package/dist/parts/site-price-card.css +91 -75
  70. package/dist/parts/site-product-mark.css +66 -66
  71. package/dist/parts/site-project-card.css +111 -111
  72. package/dist/parts/site-prose.css +124 -124
  73. package/dist/parts/site-stack-list.css +48 -48
  74. package/dist/parts/site-timeline.css +54 -54
  75. package/dist/showcase.css +410 -404
  76. package/package.json +69 -69
  77. package/snippets/accordion-accent.html +24 -24
  78. package/snippets/accordion.html +11 -11
  79. package/snippets/affix-input.html +30 -30
  80. package/snippets/alert-dialog.html +22 -22
  81. package/snippets/alert.html +5 -5
  82. package/snippets/alpha-tabs.html +37 -37
  83. package/snippets/aspect-ratio.html +15 -15
  84. package/snippets/attachment.html +43 -43
  85. package/snippets/avatar.html +6 -6
  86. package/snippets/back-link.html +5 -5
  87. package/snippets/badge.html +5 -5
  88. package/snippets/barcode-input.html +18 -18
  89. package/snippets/breadcrumb.html +6 -6
  90. package/snippets/browser-frame.html +18 -18
  91. package/snippets/busy-overlay.html +31 -31
  92. package/snippets/button-group.html +21 -21
  93. package/snippets/button.html +8 -8
  94. package/snippets/calendar.html +43 -43
  95. package/snippets/card.html +17 -17
  96. package/snippets/carousel.html +21 -21
  97. package/snippets/chart-line.html +46 -46
  98. package/snippets/chart.html +27 -27
  99. package/snippets/chat-composer.html +21 -21
  100. package/snippets/checkbox.html +5 -5
  101. package/snippets/checklist.html +23 -23
  102. package/snippets/chip-filter.html +14 -14
  103. package/snippets/code-window.html +20 -20
  104. package/snippets/collapsible.html +19 -19
  105. package/snippets/color-field.html +13 -13
  106. package/snippets/color-select.html +18 -18
  107. package/snippets/column-menu.html +38 -38
  108. package/snippets/combobox.html +19 -19
  109. package/snippets/command.html +24 -24
  110. package/snippets/confirm-dialog.html +32 -32
  111. package/snippets/context-menu.html +25 -25
  112. package/snippets/cookie-consent.html +70 -70
  113. package/snippets/copy-field.html +19 -19
  114. package/snippets/counter.html +2 -2
  115. package/snippets/data-table.html +151 -151
  116. package/snippets/date-picker.html +32 -32
  117. package/snippets/decimal-input.html +20 -20
  118. package/snippets/definition-list.html +20 -20
  119. package/snippets/demo-panel.html +18 -18
  120. package/snippets/doc-viewer.html +58 -58
  121. package/snippets/drawer.html +30 -30
  122. package/snippets/dropdown-menu.html +27 -27
  123. package/snippets/dropdown.html +9 -9
  124. package/snippets/dropzone.html +13 -13
  125. package/snippets/emoji-picker.html +51 -51
  126. package/snippets/empty-state.html +17 -17
  127. package/snippets/entity-card.html +26 -26
  128. package/snippets/expandable-table.html +26 -26
  129. package/snippets/fact-list.html +14 -14
  130. package/snippets/filter-counts.html +30 -30
  131. package/snippets/flip-card.html +22 -22
  132. package/snippets/form-field.html +6 -6
  133. package/snippets/greeting.html +22 -22
  134. package/snippets/heading.html +14 -14
  135. package/snippets/hover-card.html +18 -18
  136. package/snippets/image-zoom.html +30 -30
  137. package/snippets/input-group.html +10 -10
  138. package/snippets/input.html +5 -5
  139. package/snippets/item.html +26 -26
  140. package/snippets/kbd.html +13 -13
  141. package/snippets/label.html +9 -9
  142. package/snippets/language-select.html +26 -26
  143. package/snippets/launcher-card.html +14 -14
  144. package/snippets/lightbox.html +50 -50
  145. package/snippets/link-arrow.html +10 -10
  146. package/snippets/list-toolbar.html +33 -33
  147. package/snippets/marquee.html +15 -15
  148. package/snippets/media-card.html +28 -28
  149. package/snippets/media-row.html +21 -21
  150. package/snippets/media-thumb.html +12 -12
  151. package/snippets/menubar.html +30 -30
  152. package/snippets/message-thread.html +123 -123
  153. package/snippets/message.html +51 -51
  154. package/snippets/modal.html +15 -15
  155. package/snippets/native-select.html +15 -15
  156. package/snippets/navmenu.html +23 -23
  157. package/snippets/next-teaser.html +15 -15
  158. package/snippets/number-input.html +27 -27
  159. package/snippets/otp-input.html +9 -9
  160. package/snippets/page-header.html +24 -24
  161. package/snippets/pagination.html +6 -6
  162. package/snippets/password-input.html +24 -24
  163. package/snippets/password-requirements.html +30 -30
  164. package/snippets/phone-input.html +22 -22
  165. package/snippets/popover.html +15 -15
  166. package/snippets/price-card.html +34 -34
  167. package/snippets/product-mark.html +13 -13
  168. package/snippets/progress.html +4 -4
  169. package/snippets/project-card.html +23 -23
  170. package/snippets/prose.html +54 -54
  171. package/snippets/radio.html +17 -17
  172. package/snippets/recovery-codes.html +20 -20
  173. package/snippets/resizable.html +16 -16
  174. package/snippets/scroll-area.html +20 -20
  175. package/snippets/search.html +8 -8
  176. package/snippets/segmented.html +11 -11
  177. package/snippets/select.html +7 -7
  178. package/snippets/separator.html +15 -15
  179. package/snippets/severity-card.html +35 -35
  180. package/snippets/sheet.html +32 -32
  181. package/snippets/sidebar-docs.html +24 -24
  182. package/snippets/sidebar.html +55 -55
  183. package/snippets/site-footer.html +6 -6
  184. package/snippets/site-header.html +26 -26
  185. package/snippets/skeleton.html +4 -4
  186. package/snippets/slider.html +17 -17
  187. package/snippets/sortable-row.html +31 -31
  188. package/snippets/spinner.html +14 -14
  189. package/snippets/stack-card.html +17 -17
  190. package/snippets/stack-list.html +16 -16
  191. package/snippets/stat-card.html +24 -24
  192. package/snippets/stepper.html +13 -13
  193. package/snippets/switch.html +6 -6
  194. package/snippets/table-actions.html +39 -39
  195. package/snippets/table-compact.html +24 -24
  196. package/snippets/table.html +29 -29
  197. package/snippets/tabs.html +9 -9
  198. package/snippets/tag-input.html +60 -17
  199. package/snippets/terminal-log.html +23 -23
  200. package/snippets/textarea.html +3 -3
  201. package/snippets/theme-switch.html +6 -6
  202. package/snippets/time-input.html +26 -26
  203. package/snippets/timeline.html +28 -28
  204. package/snippets/toast-stack.html +10 -10
  205. package/snippets/toast.html +36 -36
  206. package/snippets/toc.html +13 -13
  207. package/snippets/toggle-field.html +20 -20
  208. package/snippets/toggle.html +22 -22
  209. package/snippets/tooltip.html +4 -4
  210. package/snippets/top-progress.html +12 -12
  211. package/snippets/tree.html +38 -38
  212. package/snippets/upgrade-banner.html +28 -28
  213. package/snippets/user.html +15 -15
  214. package/snippets/version-banner.html +15 -15
@@ -1,32 +1,32 @@
1
- <!-- OmniaUI component: date-picker - Date picker: trigger button with a calendar popover, or a native date input. Needs @birdycom/omniaui CSS.
2
- Class API (modifiers are extra classes / attributes on the same element):
3
- button.oc-btn.oc-btn--outline.oc-date-picker-trigger[popovertarget]: shows the value ([data-empty] = placeholder)
4
- div.oc-popover.oc-popover--calendar[popover] > .oc-calendar
5
- input.oc-input[type=date]: native alternative (color-scheme aware)
6
- -->
7
- <div style="display:flex;gap:1rem;flex-wrap:wrap;align-items:center">
8
- <button class="oc-btn oc-btn--outline oc-date-picker-trigger" type="button" popovertarget="oc-dp-pop" aria-haspopup="dialog">
9
- <span>16 October 2026</span> <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"><rect x="3" y="5" width="18" height="16" rx="2"/><path d="M8 3v4M16 3v4M3 10h18"/></svg>
10
- </button>
11
- <div class="oc-popover oc-popover--calendar" id="oc-dp-pop" popover>
12
- <div class="oc-calendar" role="group" aria-label="October 2026">
13
- <div class="oc-calendar-header">
14
- <button class="oc-calendar-nav" type="button" aria-label="Previous month"><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="m15 6-6 6 6 6"/></svg></button>
15
- <h3 class="oc-calendar-title" aria-live="polite">October 2026</h3>
16
- <button class="oc-calendar-nav" type="button" aria-label="Next month"><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></button>
17
- </div>
18
- <table class="oc-calendar-grid" role="grid" aria-label="October 2026">
19
- <thead><tr><th class="oc-calendar-weekday" scope="col" abbr="Monday">Mo</th><th class="oc-calendar-weekday" scope="col" abbr="Tuesday">Tu</th><th class="oc-calendar-weekday" scope="col" abbr="Wednesday">We</th><th class="oc-calendar-weekday" scope="col" abbr="Thursday">Th</th><th class="oc-calendar-weekday" scope="col" abbr="Friday">Fr</th><th class="oc-calendar-weekday" scope="col" abbr="Saturday">Sa</th><th class="oc-calendar-weekday" scope="col" abbr="Sunday">Su</th></tr></thead>
20
- <tbody>
21
- <tr><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-09-28" tabindex="-1">28</button></td><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-09-29" tabindex="-1">29</button></td><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-09-30" tabindex="-1">30</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-01">1</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-02">2</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-03">3</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-04">4</button></td></tr>
22
- <tr><td><button class="oc-calendar-day" type="button" data-date="2026-10-05">5</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-06">6</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-07">7</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-08">8</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-09">9</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-10">10</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-11">11</button></td></tr>
23
- <tr><td><button class="oc-calendar-day" type="button" data-date="2026-10-12">12</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-13">13</button></td><td><button class="oc-calendar-day oc-calendar-day--today" type="button" data-date="2026-10-14" aria-current="date">14</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-15">15</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-16" aria-selected="true">16</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-17">17</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-18">18</button></td></tr>
24
- <tr><td><button class="oc-calendar-day" type="button" data-date="2026-10-19">19</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-20">20</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-21">21</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-22">22</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-23">23</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-24">24</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-25">25</button></td></tr>
25
- <tr><td><button class="oc-calendar-day" type="button" data-date="2026-10-26">26</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-27">27</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-28">28</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-29">29</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-30">30</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-31">31</button></td><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-11-01" tabindex="-1">1</button></td></tr>
26
- <tr><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-11-02" tabindex="-1">2</button></td><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-11-03" tabindex="-1">3</button></td><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-11-04" tabindex="-1">4</button></td><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-11-05" tabindex="-1">5</button></td><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-11-06" tabindex="-1">6</button></td><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-11-07" tabindex="-1">7</button></td><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-11-08" tabindex="-1">8</button></td></tr>
27
- </tbody>
28
- </table>
29
- </div>
30
- </div>
31
- <input class="oc-input" type="date" value="2026-10-16" aria-label="Date (native)">
32
- </div>
1
+ <!-- OmniaUI component: date-picker - Date picker: trigger button with a calendar popover, or a native date input. Needs @birdycom/omniaui CSS.
2
+ Class API (modifiers are extra classes / attributes on the same element):
3
+ button.oc-btn.oc-btn--outline.oc-date-picker-trigger[popovertarget]: shows the value ([data-empty] = placeholder)
4
+ div.oc-popover.oc-popover--calendar[popover] > .oc-calendar
5
+ input.oc-input[type=date]: native alternative (color-scheme aware)
6
+ -->
7
+ <div style="display:flex;gap:1rem;flex-wrap:wrap;align-items:center">
8
+ <button class="oc-btn oc-btn--outline oc-date-picker-trigger" type="button" popovertarget="oc-dp-pop" aria-haspopup="dialog">
9
+ <span>16 October 2026</span> <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"><rect x="3" y="5" width="18" height="16" rx="2"/><path d="M8 3v4M16 3v4M3 10h18"/></svg>
10
+ </button>
11
+ <div class="oc-popover oc-popover--calendar" id="oc-dp-pop" popover>
12
+ <div class="oc-calendar" role="group" aria-label="October 2026">
13
+ <div class="oc-calendar-header">
14
+ <button class="oc-calendar-nav" type="button" aria-label="Previous month"><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="m15 6-6 6 6 6"/></svg></button>
15
+ <h3 class="oc-calendar-title" aria-live="polite">October 2026</h3>
16
+ <button class="oc-calendar-nav" type="button" aria-label="Next month"><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></button>
17
+ </div>
18
+ <table class="oc-calendar-grid" role="grid" aria-label="October 2026">
19
+ <thead><tr><th class="oc-calendar-weekday" scope="col" abbr="Monday">Mo</th><th class="oc-calendar-weekday" scope="col" abbr="Tuesday">Tu</th><th class="oc-calendar-weekday" scope="col" abbr="Wednesday">We</th><th class="oc-calendar-weekday" scope="col" abbr="Thursday">Th</th><th class="oc-calendar-weekday" scope="col" abbr="Friday">Fr</th><th class="oc-calendar-weekday" scope="col" abbr="Saturday">Sa</th><th class="oc-calendar-weekday" scope="col" abbr="Sunday">Su</th></tr></thead>
20
+ <tbody>
21
+ <tr><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-09-28" tabindex="-1">28</button></td><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-09-29" tabindex="-1">29</button></td><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-09-30" tabindex="-1">30</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-01">1</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-02">2</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-03">3</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-04">4</button></td></tr>
22
+ <tr><td><button class="oc-calendar-day" type="button" data-date="2026-10-05">5</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-06">6</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-07">7</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-08">8</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-09">9</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-10">10</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-11">11</button></td></tr>
23
+ <tr><td><button class="oc-calendar-day" type="button" data-date="2026-10-12">12</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-13">13</button></td><td><button class="oc-calendar-day oc-calendar-day--today" type="button" data-date="2026-10-14" aria-current="date">14</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-15">15</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-16" aria-selected="true">16</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-17">17</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-18">18</button></td></tr>
24
+ <tr><td><button class="oc-calendar-day" type="button" data-date="2026-10-19">19</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-20">20</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-21">21</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-22">22</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-23">23</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-24">24</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-25">25</button></td></tr>
25
+ <tr><td><button class="oc-calendar-day" type="button" data-date="2026-10-26">26</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-27">27</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-28">28</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-29">29</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-30">30</button></td><td><button class="oc-calendar-day" type="button" data-date="2026-10-31">31</button></td><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-11-01" tabindex="-1">1</button></td></tr>
26
+ <tr><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-11-02" tabindex="-1">2</button></td><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-11-03" tabindex="-1">3</button></td><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-11-04" tabindex="-1">4</button></td><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-11-05" tabindex="-1">5</button></td><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-11-06" tabindex="-1">6</button></td><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-11-07" tabindex="-1">7</button></td><td><button class="oc-calendar-day oc-calendar-day--outside" type="button" data-date="2026-11-08" tabindex="-1">8</button></td></tr>
27
+ </tbody>
28
+ </table>
29
+ </div>
30
+ </div>
31
+ <input class="oc-input" type="date" value="2026-10-16" aria-label="Date (native)">
32
+ </div>
@@ -1,20 +1,20 @@
1
- <!-- OmniaUI component: decimal-input - Text field for locale decimals like 1.234,56, with an optional unit. Needs @birdycom/omniaui CSS.
2
- File: packages/ui/snippets/decimal-input.html | Map: plain field -> field with unit (wrapper + unit)
3
- Class API (modifiers are extra classes / attributes on the same element):
4
- .oc-decimal-input: Add to .oc-input. Right-aligned tabular digits. Modifier: --start (left-aligned).
5
- .oc-decimal-field: Optional frame around the input and a unit
6
- .oc-decimal-field-unit: Unit text after the value (m², kg, h)
7
- States: :user-invalid when the pattern does not match (red), aria-invalid="true", disabled
8
- Pattern below accepts 1234,5 / 1.234,56 (comma decimals). For dot decimals use [0-9,]*(\.[0-9]+)?
9
- -->
10
- <div class="oc-field">
11
- <label class="oc-field-label" for="oc-decimal-demo">Amount</label>
12
- <input class="oc-input oc-decimal-input" id="oc-decimal-demo" name="amount" type="text" inputmode="decimal" value="1.234,56" pattern="[0-9.]*(,[0-9]{1,2})?">
13
- </div>
14
- <div class="oc-field">
15
- <label class="oc-field-label" for="oc-decimal-unit-demo">Surface</label>
16
- <div class="oc-decimal-field">
17
- <input class="oc-input oc-decimal-input" id="oc-decimal-unit-demo" name="surface" type="text" inputmode="decimal" value="42,5" pattern="[0-9.]*(,[0-9]{1,2})?">
18
- <span class="oc-decimal-field-unit">m&sup2;</span>
19
- </div>
20
- </div>
1
+ <!-- OmniaUI component: decimal-input - Text field for locale decimals like 1.234,56, with an optional unit. Needs @birdycom/omniaui CSS.
2
+ File: packages/ui/snippets/decimal-input.html | Map: plain field -> field with unit (wrapper + unit)
3
+ Class API (modifiers are extra classes / attributes on the same element):
4
+ .oc-decimal-input: Add to .oc-input. Right-aligned tabular digits. Modifier: --start (left-aligned).
5
+ .oc-decimal-field: Optional frame around the input and a unit
6
+ .oc-decimal-field-unit: Unit text after the value (m², kg, h)
7
+ States: :user-invalid when the pattern does not match (red), aria-invalid="true", disabled
8
+ Pattern below accepts 1234,5 / 1.234,56 (comma decimals). For dot decimals use [0-9,]*(\.[0-9]+)?
9
+ -->
10
+ <div class="oc-field">
11
+ <label class="oc-field-label" for="oc-decimal-demo">Amount</label>
12
+ <input class="oc-input oc-decimal-input" id="oc-decimal-demo" name="amount" type="text" inputmode="decimal" value="1.234,56" pattern="[0-9.]*(,[0-9]{1,2})?">
13
+ </div>
14
+ <div class="oc-field">
15
+ <label class="oc-field-label" for="oc-decimal-unit-demo">Surface</label>
16
+ <div class="oc-decimal-field">
17
+ <input class="oc-input oc-decimal-input" id="oc-decimal-unit-demo" name="surface" type="text" inputmode="decimal" value="42,5" pattern="[0-9.]*(,[0-9]{1,2})?">
18
+ <span class="oc-decimal-field-unit">m&sup2;</span>
19
+ </div>
20
+ </div>
@@ -1,20 +1,20 @@
1
- <!-- OmniaUI component: definition-list - Label / value rows in a panel (dl). Needs @birdycom/omniaui CSS.
2
- Class API (modifiers are extra classes / attributes on the same element):
3
- .oc-dl-panel: Panel wrapper (role="region")
4
- .oc-dl-title / -description: Panel heading and note
5
- .oc-dl: The dl
6
- .oc-dl-row: div grouping one term and detail
7
- .oc-dl-term / .oc-dl-detail: dt / dd
8
- .oc-dl-footer: Optional footer (actions)
9
- Slots: title, description, rows (term + detail), footer
10
- -->
11
- <div class="oc-dl-panel" role="region" aria-label="Company data">
12
- <h3 class="oc-dl-title">Company data found</h3>
13
- <p class="oc-dl-description">Retrieved from the VAT register.</p>
14
- <dl class="oc-dl">
15
- <div class="oc-dl-row"><dt class="oc-dl-term">Name</dt><dd class="oc-dl-detail">Birdy Systems BV</dd></div>
16
- <div class="oc-dl-row"><dt class="oc-dl-term">Enterprise number</dt><dd class="oc-dl-detail">BE 0123.456.789</dd></div>
17
- <div class="oc-dl-row"><dt class="oc-dl-term">Address</dt><dd class="oc-dl-detail">Main Street 1, 2000 Antwerp</dd></div>
18
- </dl>
19
- <div class="oc-dl-footer"><button class="oc-btn oc-btn--sm" type="button">Use these details</button></div>
20
- </div>
1
+ <!-- OmniaUI component: definition-list - Label / value rows in a panel (dl). Needs @birdycom/omniaui CSS.
2
+ Class API (modifiers are extra classes / attributes on the same element):
3
+ .oc-dl-panel: Panel wrapper (role="region")
4
+ .oc-dl-title / -description: Panel heading and note
5
+ .oc-dl: The dl
6
+ .oc-dl-row: div grouping one term and detail
7
+ .oc-dl-term / .oc-dl-detail: dt / dd
8
+ .oc-dl-footer: Optional footer (actions)
9
+ Slots: title, description, rows (term + detail), footer
10
+ -->
11
+ <div class="oc-dl-panel" role="region" aria-label="Company data">
12
+ <h3 class="oc-dl-title">Company data found</h3>
13
+ <p class="oc-dl-description">Retrieved from the VAT register.</p>
14
+ <dl class="oc-dl">
15
+ <div class="oc-dl-row"><dt class="oc-dl-term">Name</dt><dd class="oc-dl-detail">Birdy Systems BV</dd></div>
16
+ <div class="oc-dl-row"><dt class="oc-dl-term">Enterprise number</dt><dd class="oc-dl-detail">BE 0123.456.789</dd></div>
17
+ <div class="oc-dl-row"><dt class="oc-dl-term">Address</dt><dd class="oc-dl-detail">Main Street 1, 2000 Antwerp</dd></div>
18
+ </dl>
19
+ <div class="oc-dl-footer"><button class="oc-btn oc-btn--sm" type="button">Use these details</button></div>
20
+ </div>
@@ -1,18 +1,18 @@
1
- <!-- OmniaUI component: demo-panel - Live preview + code, stacked or in tabs. Needs @birdycom/omniaui CSS.
2
- Class API: .oc-demo (--tabs = preview/code tabs) · .oc-preview__title (small heading) · .oc-demo__preview (--tall, --center) ·
3
- .oc-demo__tablist > label.oc-demo__tab > input[type=radio] (first = preview, second = code) · .oc-demo__code (code panel in the tabs variant)
4
- -->
5
- <div class="oc-demo oc-demo--tabs">
6
- <div class="oc-demo__tablist" role="radiogroup" aria-label="View">
7
- <label class="oc-demo__tab"><input type="radio" name="oc-demo-view" checked> Preview</label>
8
- <label class="oc-demo__tab"><input type="radio" name="oc-demo-view"> Code</label>
9
- </div>
10
- <div class="oc-demo__preview">
11
- <button class="oc-btn">Save</button>
12
- <button class="oc-btn oc-btn--outline">Cancel</button>
13
- </div>
14
- <div class="oc-demo__code">
15
- <pre class="oc-code-window__body"><code>&lt;button class="oc-btn"&gt;Save&lt;/button&gt;
16
- &lt;button class="oc-btn oc-btn--outline"&gt;Cancel&lt;/button&gt;</code></pre>
17
- </div>
18
- </div>
1
+ <!-- OmniaUI component: demo-panel - Live preview + code, stacked or in tabs. Needs @birdycom/omniaui CSS.
2
+ Class API: .oc-demo (--tabs = preview/code tabs) · .oc-preview__title (small heading) · .oc-demo__preview (--tall, --center) ·
3
+ .oc-demo__tablist > label.oc-demo__tab > input[type=radio] (first = preview, second = code) · .oc-demo__code (code panel in the tabs variant)
4
+ -->
5
+ <div class="oc-demo oc-demo--tabs">
6
+ <div class="oc-demo__tablist" role="radiogroup" aria-label="View">
7
+ <label class="oc-demo__tab"><input type="radio" name="oc-demo-view" checked> Preview</label>
8
+ <label class="oc-demo__tab"><input type="radio" name="oc-demo-view"> Code</label>
9
+ </div>
10
+ <div class="oc-demo__preview">
11
+ <button class="oc-btn">Save</button>
12
+ <button class="oc-btn oc-btn--outline">Cancel</button>
13
+ </div>
14
+ <div class="oc-demo__code">
15
+ <pre class="oc-code-window__body"><code>&lt;button class="oc-btn"&gt;Save&lt;/button&gt;
16
+ &lt;button class="oc-btn oc-btn--outline"&gt;Cancel&lt;/button&gt;</code></pre>
17
+ </div>
18
+ </div>
@@ -1,58 +1,58 @@
1
- <!-- OmniaUI component: doc-viewer — PDF, video or image in a card with a label and a full-screen view on a native <dialog>. Needs @birdycom/omniaui CSS.
2
- File: packages/ui/snippets/doc-viewer.html | Map: grid -> card (bar: label + expand button, frame) -> full-screen dialog
3
- Class API (modifiers are extra classes / attributes on the same element):
4
- .oc-doc-viewer-grid: Optional grid of viewers (auto-fill, min 15rem)
5
- figure.oc-doc-viewer: One card. Modifiers: --video (16/9, dark), --image (natural height). Default frame is A4 (PDF).
6
- .oc-doc-viewer__bar > .oc-doc-viewer__label, .oc-doc-viewer__meta, button.oc-doc-viewer__expand (command="show-modal" commandfor="<dialog id>")
7
- .oc-doc-viewer__frame > iframe | video | img | object: The inline preview
8
- button.oc-doc-viewer__open: Optional, inside the frame: the whole preview opens the dialog ("Click for full screen")
9
- dialog.oc-doc-viewer-dialog (--video): Full-screen view > .oc-doc-viewer-dialog__bar (__title, __actions, __close) + .oc-doc-viewer-dialog__body
10
- No JavaScript: the buttons open the dialog with invoker commands; Esc, the close button or a click on the backdrop close it.
11
- PDF: <iframe src="file.pdf#toolbar=0&view=FitH" title="…" loading="lazy">. Video: <video src="…" controls preload="metadata">.
12
- -->
13
- <div class="oc-doc-viewer-grid">
14
- <figure class="oc-doc-viewer">
15
- <figcaption class="oc-doc-viewer__bar">
16
- <span class="oc-doc-viewer__label">Brochure 2026</span>
17
- <span class="oc-doc-viewer__meta">PDF · 2.4 MB</span>
18
- <button type="button" class="oc-doc-viewer__expand" command="show-modal" commandfor="oc-doc-viewer-demo-pdf" aria-label="Open Brochure 2026 full screen">&#10530;</button>
19
- </figcaption>
20
- <div class="oc-doc-viewer__frame">
21
- <div class="oc-media-art oc-media-art--2" role="img" aria-label="First page of Brochure 2026"></div>
22
- </div>
23
- </figure>
24
-
25
- <figure class="oc-doc-viewer oc-doc-viewer--video">
26
- <figcaption class="oc-doc-viewer__bar">
27
- <span class="oc-doc-viewer__label">Site visit</span>
28
- <span class="oc-doc-viewer__meta">1:42</span>
29
- </figcaption>
30
- <div class="oc-doc-viewer__frame">
31
- <div class="oc-media-art oc-media-art--5" role="img" aria-label="Video still: site visit"></div>
32
- <button type="button" class="oc-doc-viewer__open" command="show-modal" commandfor="oc-doc-viewer-demo-video">Click for full screen</button>
33
- </div>
34
- </figure>
35
- </div>
36
-
37
- <dialog class="oc-doc-viewer-dialog" id="oc-doc-viewer-demo-pdf" closedby="any" aria-labelledby="oc-doc-viewer-demo-pdf-title">
38
- <div class="oc-doc-viewer-dialog__bar">
39
- <h2 class="oc-doc-viewer-dialog__title" id="oc-doc-viewer-demo-pdf-title">Brochure 2026</h2>
40
- <div class="oc-doc-viewer-dialog__actions">
41
- <a class="oc-btn oc-btn--outline oc-btn--sm" href="#brochure.pdf" download>Download</a>
42
- <button type="button" class="oc-doc-viewer-dialog__close" command="close" commandfor="oc-doc-viewer-demo-pdf" aria-label="Close">&#10005;</button>
43
- </div>
44
- </div>
45
- <div class="oc-doc-viewer-dialog__body">
46
- <div class="oc-media-art oc-media-art--2" role="img" aria-label="Brochure 2026"></div>
47
- </div>
48
- </dialog>
49
-
50
- <dialog class="oc-doc-viewer-dialog oc-doc-viewer-dialog--video" id="oc-doc-viewer-demo-video" closedby="any" aria-labelledby="oc-doc-viewer-demo-video-title">
51
- <div class="oc-doc-viewer-dialog__bar">
52
- <h2 class="oc-doc-viewer-dialog__title" id="oc-doc-viewer-demo-video-title">Site visit</h2>
53
- <button type="button" class="oc-doc-viewer-dialog__close" command="close" commandfor="oc-doc-viewer-demo-video" aria-label="Close">&#10005;</button>
54
- </div>
55
- <div class="oc-doc-viewer-dialog__body">
56
- <div class="oc-media-art oc-media-art--5" role="img" aria-label="Site visit video"></div>
57
- </div>
58
- </dialog>
1
+ <!-- OmniaUI component: doc-viewer — PDF, video or image in a card with a label and a full-screen view on a native <dialog>. Needs @birdycom/omniaui CSS.
2
+ File: packages/ui/snippets/doc-viewer.html | Map: grid -> card (bar: label + expand button, frame) -> full-screen dialog
3
+ Class API (modifiers are extra classes / attributes on the same element):
4
+ .oc-doc-viewer-grid: Optional grid of viewers (auto-fill, min 15rem)
5
+ figure.oc-doc-viewer: One card. Modifiers: --video (16/9, dark), --image (natural height). Default frame is A4 (PDF).
6
+ .oc-doc-viewer__bar > .oc-doc-viewer__label, .oc-doc-viewer__meta, button.oc-doc-viewer__expand (command="show-modal" commandfor="<dialog id>")
7
+ .oc-doc-viewer__frame > iframe | video | img | object: The inline preview
8
+ button.oc-doc-viewer__open: Optional, inside the frame: the whole preview opens the dialog ("Click for full screen")
9
+ dialog.oc-doc-viewer-dialog (--video): Full-screen view > .oc-doc-viewer-dialog__bar (__title, __actions, __close) + .oc-doc-viewer-dialog__body
10
+ No JavaScript: the buttons open the dialog with invoker commands; Esc, the close button or a click on the backdrop close it.
11
+ PDF: <iframe src="file.pdf#toolbar=0&view=FitH" title="…" loading="lazy">. Video: <video src="…" controls preload="metadata">.
12
+ -->
13
+ <div class="oc-doc-viewer-grid">
14
+ <figure class="oc-doc-viewer">
15
+ <figcaption class="oc-doc-viewer__bar">
16
+ <span class="oc-doc-viewer__label">Brochure 2026</span>
17
+ <span class="oc-doc-viewer__meta">PDF · 2.4 MB</span>
18
+ <button type="button" class="oc-doc-viewer__expand" command="show-modal" commandfor="oc-doc-viewer-demo-pdf" aria-label="Open Brochure 2026 full screen">&#10530;</button>
19
+ </figcaption>
20
+ <div class="oc-doc-viewer__frame">
21
+ <div class="oc-media-art oc-media-art--2" role="img" aria-label="First page of Brochure 2026"></div>
22
+ </div>
23
+ </figure>
24
+
25
+ <figure class="oc-doc-viewer oc-doc-viewer--video">
26
+ <figcaption class="oc-doc-viewer__bar">
27
+ <span class="oc-doc-viewer__label">Site visit</span>
28
+ <span class="oc-doc-viewer__meta">1:42</span>
29
+ </figcaption>
30
+ <div class="oc-doc-viewer__frame">
31
+ <div class="oc-media-art oc-media-art--5" role="img" aria-label="Video still: site visit"></div>
32
+ <button type="button" class="oc-doc-viewer__open" command="show-modal" commandfor="oc-doc-viewer-demo-video">Click for full screen</button>
33
+ </div>
34
+ </figure>
35
+ </div>
36
+
37
+ <dialog class="oc-doc-viewer-dialog" id="oc-doc-viewer-demo-pdf" closedby="any" aria-labelledby="oc-doc-viewer-demo-pdf-title">
38
+ <div class="oc-doc-viewer-dialog__bar">
39
+ <h2 class="oc-doc-viewer-dialog__title" id="oc-doc-viewer-demo-pdf-title">Brochure 2026</h2>
40
+ <div class="oc-doc-viewer-dialog__actions">
41
+ <a class="oc-btn oc-btn--outline oc-btn--sm" href="#brochure.pdf" download>Download</a>
42
+ <button type="button" class="oc-doc-viewer-dialog__close" command="close" commandfor="oc-doc-viewer-demo-pdf" aria-label="Close">&#10005;</button>
43
+ </div>
44
+ </div>
45
+ <div class="oc-doc-viewer-dialog__body">
46
+ <div class="oc-media-art oc-media-art--2" role="img" aria-label="Brochure 2026"></div>
47
+ </div>
48
+ </dialog>
49
+
50
+ <dialog class="oc-doc-viewer-dialog oc-doc-viewer-dialog--video" id="oc-doc-viewer-demo-video" closedby="any" aria-labelledby="oc-doc-viewer-demo-video-title">
51
+ <div class="oc-doc-viewer-dialog__bar">
52
+ <h2 class="oc-doc-viewer-dialog__title" id="oc-doc-viewer-demo-video-title">Site visit</h2>
53
+ <button type="button" class="oc-doc-viewer-dialog__close" command="close" commandfor="oc-doc-viewer-demo-video" aria-label="Close">&#10005;</button>
54
+ </div>
55
+ <div class="oc-doc-viewer-dialog__body">
56
+ <div class="oc-media-art oc-media-art--5" role="img" aria-label="Site visit video"></div>
57
+ </div>
58
+ </dialog>
@@ -1,30 +1,30 @@
1
- <!-- OmniaUI component: drawer - Drawer: bottom sheet on dialog with drag handle look, no JavaScript. Needs @birdycom/omniaui CSS.
2
- Class API (modifiers are extra classes / attributes on the same element):
3
- dialog.oc-drawer: the dialog (closedby="any"). Modifier: --center (centered from 40rem up)
4
- .oc-drawer-content: the panel
5
- .oc-drawer-handle: grabber bar (decorative)
6
- .oc-drawer-header / -title / -description: heading
7
- .oc-drawer-body: scrolling content
8
- .oc-drawer-footer: stacked actions
9
- -->
10
- <button class="oc-btn oc-btn--outline" type="button" command="show-modal" commandfor="oc-drawer-demo">Open drawer</button>
11
-
12
- <dialog class="oc-drawer" id="oc-drawer-demo" closedby="any" aria-labelledby="oc-drawer-demo-title">
13
- <div class="oc-drawer-content">
14
- <div class="oc-drawer-handle" aria-hidden="true"></div>
15
- <div class="oc-drawer-header">
16
- <h2 class="oc-drawer-title" id="oc-drawer-demo-title">Move goal</h2>
17
- <p class="oc-drawer-description">Set your daily activity goal.</p>
18
- </div>
19
- <div class="oc-drawer-body">
20
- <div class="oc-field">
21
- <label class="oc-field-label" for="oc-drawer-goal">Calories per day</label>
22
- <input class="oc-slider" id="oc-drawer-goal" type="range" min="100" max="600" value="350" style="--oc-slider-progress: 50%" oninput="this.style.setProperty('--oc-slider-progress', (this.value - this.min) / (this.max - this.min) * 100 + '%')">
23
- </div>
24
- </div>
25
- <div class="oc-drawer-footer">
26
- <button class="oc-btn" type="button" command="close" commandfor="oc-drawer-demo">Submit</button>
27
- <button class="oc-btn oc-btn--outline" type="button" command="close" commandfor="oc-drawer-demo">Cancel</button>
28
- </div>
29
- </div>
30
- </dialog>
1
+ <!-- OmniaUI component: drawer - Drawer: bottom sheet on dialog with drag handle look, no JavaScript. Needs @birdycom/omniaui CSS.
2
+ Class API (modifiers are extra classes / attributes on the same element):
3
+ dialog.oc-drawer: the dialog (closedby="any"). Modifier: --center (centered from 40rem up)
4
+ .oc-drawer-content: the panel
5
+ .oc-drawer-handle: grabber bar (decorative)
6
+ .oc-drawer-header / -title / -description: heading
7
+ .oc-drawer-body: scrolling content
8
+ .oc-drawer-footer: stacked actions
9
+ -->
10
+ <button class="oc-btn oc-btn--outline" type="button" command="show-modal" commandfor="oc-drawer-demo">Open drawer</button>
11
+
12
+ <dialog class="oc-drawer" id="oc-drawer-demo" closedby="any" aria-labelledby="oc-drawer-demo-title">
13
+ <div class="oc-drawer-content">
14
+ <div class="oc-drawer-handle" aria-hidden="true"></div>
15
+ <div class="oc-drawer-header">
16
+ <h2 class="oc-drawer-title" id="oc-drawer-demo-title">Move goal</h2>
17
+ <p class="oc-drawer-description">Set your daily activity goal.</p>
18
+ </div>
19
+ <div class="oc-drawer-body">
20
+ <div class="oc-field">
21
+ <label class="oc-field-label" for="oc-drawer-goal">Calories per day</label>
22
+ <input class="oc-slider" id="oc-drawer-goal" type="range" min="100" max="600" value="350" style="--oc-slider-progress: 50%" oninput="this.style.setProperty('--oc-slider-progress', (this.value - this.min) / (this.max - this.min) * 100 + '%')">
23
+ </div>
24
+ </div>
25
+ <div class="oc-drawer-footer">
26
+ <button class="oc-btn" type="button" command="close" commandfor="oc-drawer-demo">Submit</button>
27
+ <button class="oc-btn oc-btn--outline" type="button" command="close" commandfor="oc-drawer-demo">Cancel</button>
28
+ </div>
29
+ </div>
30
+ </dialog>
@@ -1,27 +1,27 @@
1
- <!-- OmniaUI component: dropdown-menu - Dropdown extras: sub-menus, checkbox and radio items, shortcuts, destructive/disabled items. Needs @birdycom/omniaui CSS.
2
- Class API (modifiers are extra classes / attributes on the same element):
3
- .oc-dropdown-sub > button.oc-dropdown-item + .oc-dropdown-submenu: nested menu (opens on hover and focus-within, chevron added)
4
- .oc-dropdown-item[role="menuitemcheckbox"|"menuitemradio"][aria-checked]: check mark / dot indicator
5
- .oc-dropdown-shortcut: right aligned key hint
6
- .oc-dropdown-item--destructive | --inset | [aria-disabled=true]
7
- -->
8
- <button class="oc-btn oc-btn--outline" type="button" popovertarget="oc-dd-extras">Open menu</button>
9
- <div class="oc-dropdown-menu" id="oc-dd-extras" popover role="menu">
10
- <div class="oc-dropdown-label">Appearance</div>
11
- <button class="oc-dropdown-item" type="button" role="menuitemcheckbox" aria-checked="true">Status bar <span class="oc-dropdown-shortcut">Ctrl B</span></button>
12
- <button class="oc-dropdown-item" type="button" role="menuitemcheckbox" aria-checked="false">Activity bar</button>
13
- <div class="oc-dropdown-separator" role="separator"></div>
14
- <div class="oc-dropdown-label">Panel position</div>
15
- <button class="oc-dropdown-item" type="button" role="menuitemradio" aria-checked="false">Top</button>
16
- <button class="oc-dropdown-item" type="button" role="menuitemradio" aria-checked="true">Bottom</button>
17
- <div class="oc-dropdown-separator" role="separator"></div>
18
- <div class="oc-dropdown-sub">
19
- <button class="oc-dropdown-item" type="button" role="menuitem" aria-haspopup="menu">More tools</button>
20
- <div class="oc-dropdown-submenu" role="menu">
21
- <button class="oc-dropdown-item" type="button" role="menuitem">Save page as&hellip;</button>
22
- <button class="oc-dropdown-item" type="button" role="menuitem">Developer tools</button>
23
- </div>
24
- </div>
25
- <button class="oc-dropdown-item" type="button" role="menuitem" aria-disabled="true">Disabled item</button>
26
- <button class="oc-dropdown-item oc-dropdown-item--destructive" type="button" role="menuitem">Delete</button>
27
- </div>
1
+ <!-- OmniaUI component: dropdown-menu - Dropdown extras: sub-menus, checkbox and radio items, shortcuts, destructive/disabled items. Needs @birdycom/omniaui CSS.
2
+ Class API (modifiers are extra classes / attributes on the same element):
3
+ .oc-dropdown-sub > button.oc-dropdown-item + .oc-dropdown-submenu: nested menu (opens on hover and focus-within, chevron added)
4
+ .oc-dropdown-item[role="menuitemcheckbox"|"menuitemradio"][aria-checked]: check mark / dot indicator
5
+ .oc-dropdown-shortcut: right aligned key hint
6
+ .oc-dropdown-item--destructive | --inset | [aria-disabled=true]
7
+ -->
8
+ <button class="oc-btn oc-btn--outline" type="button" popovertarget="oc-dd-extras">Open menu</button>
9
+ <div class="oc-dropdown-menu" id="oc-dd-extras" popover role="menu">
10
+ <div class="oc-dropdown-label">Appearance</div>
11
+ <button class="oc-dropdown-item" type="button" role="menuitemcheckbox" aria-checked="true">Status bar <span class="oc-dropdown-shortcut">Ctrl B</span></button>
12
+ <button class="oc-dropdown-item" type="button" role="menuitemcheckbox" aria-checked="false">Activity bar</button>
13
+ <div class="oc-dropdown-separator" role="separator"></div>
14
+ <div class="oc-dropdown-label">Panel position</div>
15
+ <button class="oc-dropdown-item" type="button" role="menuitemradio" aria-checked="false">Top</button>
16
+ <button class="oc-dropdown-item" type="button" role="menuitemradio" aria-checked="true">Bottom</button>
17
+ <div class="oc-dropdown-separator" role="separator"></div>
18
+ <div class="oc-dropdown-sub">
19
+ <button class="oc-dropdown-item" type="button" role="menuitem" aria-haspopup="menu">More tools</button>
20
+ <div class="oc-dropdown-submenu" role="menu">
21
+ <button class="oc-dropdown-item" type="button" role="menuitem">Save page as&hellip;</button>
22
+ <button class="oc-dropdown-item" type="button" role="menuitem">Developer tools</button>
23
+ </div>
24
+ </div>
25
+ <button class="oc-dropdown-item" type="button" role="menuitem" aria-disabled="true">Disabled item</button>
26
+ <button class="oc-dropdown-item oc-dropdown-item--destructive" type="button" role="menuitem">Delete</button>
27
+ </div>
@@ -1,9 +1,9 @@
1
- <!-- OmniaUI component: dropdown — Dropdown menu on popover + anchor positioning — no JavaScript. Needs @birdycom/omniaui CSS. -->
2
- <button class="oc-btn oc-btn--outline" popovertarget="oc-menu-demo">Options</button>
3
- <div class="oc-dropdown-menu" id="oc-menu-demo" popover>
4
- <div class="oc-dropdown-label">My account</div>
5
- <a class="oc-dropdown-item" href="#profile">Profile</a>
6
- <a class="oc-dropdown-item" href="#settings">Settings</a>
7
- <div class="oc-dropdown-separator"></div>
8
- <a class="oc-dropdown-item" href="#logout">Log out</a>
9
- </div>
1
+ <!-- OmniaUI component: dropdown — Dropdown menu on popover + anchor positioning — no JavaScript. Needs @birdycom/omniaui CSS. -->
2
+ <button class="oc-btn oc-btn--outline" popovertarget="oc-menu-demo">Options</button>
3
+ <div class="oc-dropdown-menu" id="oc-menu-demo" popover>
4
+ <div class="oc-dropdown-label">My account</div>
5
+ <a class="oc-dropdown-item" href="#profile">Profile</a>
6
+ <a class="oc-dropdown-item" href="#settings">Settings</a>
7
+ <div class="oc-dropdown-separator"></div>
8
+ <a class="oc-dropdown-item" href="#logout">Log out</a>
9
+ </div>
@@ -1,13 +1,13 @@
1
- <!-- OmniaUI component: dropzone - File upload target - a label around a real file input. Needs @birdycom/omniaui CSS.
2
- Class API (modifiers are extra classes / attributes on the same element):
3
- .oc-dropzone: Label wrapper. State: .is-dragover; disabled via the input.
4
- input[type=file]: The real input, stretched over the zone
5
- .oc-dropzone-icon: Optional icon
6
- .oc-dropzone-hint: Small hint text (accepted types, size)
7
- -->
8
- <label class="oc-dropzone">
9
- <input type="file" accept=".pdf,.xml" multiple>
10
- <span class="oc-dropzone-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"><path d="M12 16V4M7 9l5-5 5 5M4 20h16"/></svg></span>
11
- <span><strong>Drop invoices here</strong> or click to choose</span>
12
- <span class="oc-dropzone-hint">PDF or UBL XML, up to 10 MB</span>
13
- </label>
1
+ <!-- OmniaUI component: dropzone - File upload target - a label around a real file input. Needs @birdycom/omniaui CSS.
2
+ Class API (modifiers are extra classes / attributes on the same element):
3
+ .oc-dropzone: Label wrapper. State: .is-dragover; disabled via the input.
4
+ input[type=file]: The real input, stretched over the zone
5
+ .oc-dropzone-icon: Optional icon
6
+ .oc-dropzone-hint: Small hint text (accepted types, size)
7
+ -->
8
+ <label class="oc-dropzone">
9
+ <input type="file" accept=".pdf,.xml" multiple>
10
+ <span class="oc-dropzone-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"><path d="M12 16V4M7 9l5-5 5 5M4 20h16"/></svg></span>
11
+ <span><strong>Drop invoices here</strong> or click to choose</span>
12
+ <span class="oc-dropzone-hint">PDF or UBL XML, up to 10 MB</span>
13
+ </label>