@birdycom/omniaui 0.0.0-stage → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +20 -2
- package/bin/lib/add.mjs +126 -0
- package/bin/lib/catalog.mjs +169 -0
- package/bin/lib/project.mjs +90 -0
- package/bin/omniaui.mjs +70 -0
- package/dist/code-block.css +163 -0
- package/dist/components-extra.css +914 -0
- package/dist/components.css +10081 -0
- package/dist/components.min.css +1 -0
- package/dist/data-table.d.ts +9 -0
- package/dist/data-table.js +505 -0
- package/dist/docs-ui.css +265 -0
- package/dist/oc-theme.css +69 -0
- package/dist/parts/.gitkeep +0 -0
- package/dist/parts/app-accordion-accent.css +60 -0
- package/dist/parts/app-alpha-tabs.css +68 -0
- package/dist/parts/app-busy-overlay.css +25 -0
- package/dist/parts/app-column-menu.css +85 -0
- package/dist/parts/app-confirm-dialog.css +70 -0
- package/dist/parts/app-cookie-consent.css +63 -0
- package/dist/parts/app-data-table.css +174 -0
- package/dist/parts/app-greeting.css +47 -0
- package/dist/parts/app-list-toolbar.css +81 -0
- package/dist/parts/app-page-header.css +54 -0
- package/dist/parts/app-severity-card.css +91 -0
- package/dist/parts/app-sidebar-dark.css +15 -0
- package/dist/parts/app-sortable-row.css +52 -0
- package/dist/parts/app-stat-card.css +68 -0
- package/dist/parts/app-table-actions.css +71 -0
- package/dist/parts/app-table-compact.css +54 -0
- package/dist/parts/app-top-progress.css +68 -0
- package/dist/parts/app-tree.css +104 -0
- package/dist/parts/app-upgrade-banner.css +90 -0
- package/dist/parts/app-version-banner.css +80 -0
- package/dist/parts/data-chart-line.css +167 -0
- package/dist/parts/forms-affix-input.css +75 -0
- package/dist/parts/forms-barcode-input.css +75 -0
- package/dist/parts/forms-chip-filter.css +91 -0
- package/dist/parts/forms-color-select.css +89 -0
- package/dist/parts/forms-decimal-input.css +51 -0
- package/dist/parts/forms-filter-counts.css +94 -0
- package/dist/parts/forms-language-select.css +76 -0
- package/dist/parts/forms-number-input.css +95 -0
- package/dist/parts/forms-password-requirements.css +55 -0
- package/dist/parts/forms-phone-input.css +85 -0
- package/dist/parts/forms-time-input.css +74 -0
- package/dist/parts/forms-toggle-field.css +69 -0
- package/dist/parts/media-art.css +21 -0
- package/dist/parts/media-attachment.css +160 -0
- package/dist/parts/media-browser-frame.css +73 -0
- package/dist/parts/media-card.css +83 -0
- package/dist/parts/media-chat-composer.css +90 -0
- package/dist/parts/media-doc-viewer.css +151 -0
- package/dist/parts/media-emoji-picker.css +88 -0
- package/dist/parts/media-entity-card.css +52 -0
- package/dist/parts/media-flip-card.css +78 -0
- package/dist/parts/media-image-zoom.css +68 -0
- package/dist/parts/media-lightbox.css +131 -0
- package/dist/parts/media-message-thread.css +136 -0
- package/dist/parts/media-message.css +160 -0
- package/dist/parts/media-row.css +78 -0
- package/dist/parts/media-stack-card.css +82 -0
- package/dist/parts/media-terminal-log.css +76 -0
- package/dist/parts/media-thumb.css +71 -0
- package/dist/parts/site-fact-list.css +25 -0
- package/dist/parts/site-link-arrow.css +34 -0
- package/dist/parts/site-marquee.css +34 -0
- package/dist/parts/site-next-teaser.css +75 -0
- package/dist/parts/site-price-card.css +75 -0
- package/dist/parts/site-product-mark.css +66 -0
- package/dist/parts/site-project-card.css +111 -0
- package/dist/parts/site-prose.css +124 -0
- package/dist/parts/site-stack-list.css +48 -0
- package/dist/parts/site-timeline.css +54 -0
- package/dist/showcase.css +404 -0
- package/manifest.json +1108 -0
- package/package.json +67 -4
- package/snippets/accordion-accent.html +24 -0
- package/snippets/accordion.html +11 -0
- package/snippets/affix-input.html +30 -0
- package/snippets/alert-dialog.html +22 -0
- package/snippets/alert.html +5 -0
- package/snippets/alpha-tabs.html +37 -0
- package/snippets/aspect-ratio.html +15 -0
- package/snippets/attachment.html +43 -0
- package/snippets/avatar.html +6 -0
- package/snippets/back-link.html +5 -0
- package/snippets/badge.html +5 -0
- package/snippets/barcode-input.html +18 -0
- package/snippets/breadcrumb.html +6 -0
- package/snippets/browser-frame.html +18 -0
- package/snippets/busy-overlay.html +31 -0
- package/snippets/button-group.html +21 -0
- package/snippets/button.html +8 -0
- package/snippets/calendar.html +43 -0
- package/snippets/card.html +17 -0
- package/snippets/carousel.html +21 -0
- package/snippets/chart-line.html +46 -0
- package/snippets/chart.html +27 -0
- package/snippets/chat-composer.html +21 -0
- package/snippets/checkbox.html +5 -0
- package/snippets/checklist.html +23 -0
- package/snippets/chip-filter.html +14 -0
- package/snippets/code-window.html +20 -0
- package/snippets/collapsible.html +19 -0
- package/snippets/color-field.html +13 -0
- package/snippets/color-select.html +18 -0
- package/snippets/column-menu.html +38 -0
- package/snippets/combobox.html +19 -0
- package/snippets/command.html +24 -0
- package/snippets/confirm-dialog.html +32 -0
- package/snippets/context-menu.html +25 -0
- package/snippets/cookie-consent.html +70 -0
- package/snippets/copy-field.html +19 -0
- package/snippets/counter.html +2 -0
- package/snippets/data-table.html +151 -0
- package/snippets/date-picker.html +32 -0
- package/snippets/decimal-input.html +20 -0
- package/snippets/definition-list.html +20 -0
- package/snippets/demo-panel.html +18 -0
- package/snippets/doc-viewer.html +58 -0
- package/snippets/drawer.html +30 -0
- package/snippets/dropdown-menu.html +27 -0
- package/snippets/dropdown.html +9 -0
- package/snippets/dropzone.html +13 -0
- package/snippets/emoji-picker.html +51 -0
- package/snippets/empty-state.html +17 -0
- package/snippets/entity-card.html +26 -0
- package/snippets/expandable-table.html +26 -0
- package/snippets/fact-list.html +14 -0
- package/snippets/filter-counts.html +30 -0
- package/snippets/flip-card.html +22 -0
- package/snippets/form-field.html +6 -0
- package/snippets/greeting.html +22 -0
- package/snippets/heading.html +14 -0
- package/snippets/hover-card.html +18 -0
- package/snippets/image-zoom.html +30 -0
- package/snippets/input-group.html +10 -0
- package/snippets/input.html +5 -0
- package/snippets/item.html +26 -0
- package/snippets/kbd.html +13 -0
- package/snippets/label.html +9 -0
- package/snippets/language-select.html +26 -0
- package/snippets/launcher-card.html +14 -0
- package/snippets/lightbox.html +50 -0
- package/snippets/link-arrow.html +10 -0
- package/snippets/list-toolbar.html +33 -0
- package/snippets/marquee.html +15 -0
- package/snippets/media-card.html +28 -0
- package/snippets/media-row.html +21 -0
- package/snippets/media-thumb.html +12 -0
- package/snippets/menubar.html +30 -0
- package/snippets/message-thread.html +123 -0
- package/snippets/message.html +51 -0
- package/snippets/modal.html +15 -0
- package/snippets/native-select.html +15 -0
- package/snippets/navmenu.html +23 -0
- package/snippets/next-teaser.html +15 -0
- package/snippets/number-input.html +27 -0
- package/snippets/otp-input.html +9 -0
- package/snippets/page-header.html +24 -0
- package/snippets/pagination.html +6 -0
- package/snippets/password-input.html +24 -0
- package/snippets/password-requirements.html +30 -0
- package/snippets/phone-input.html +22 -0
- package/snippets/popover.html +15 -0
- package/snippets/price-card.html +34 -0
- package/snippets/product-mark.html +13 -0
- package/snippets/progress.html +4 -0
- package/snippets/project-card.html +23 -0
- package/snippets/prose.html +54 -0
- package/snippets/radio.html +17 -0
- package/snippets/recovery-codes.html +20 -0
- package/snippets/resizable.html +16 -0
- package/snippets/scroll-area.html +20 -0
- package/snippets/search.html +8 -0
- package/snippets/segmented.html +11 -0
- package/snippets/select.html +7 -0
- package/snippets/separator.html +15 -0
- package/snippets/severity-card.html +35 -0
- package/snippets/sheet.html +32 -0
- package/snippets/sidebar-docs.html +24 -0
- package/snippets/sidebar.html +55 -0
- package/snippets/site-footer.html +6 -0
- package/snippets/site-header.html +26 -0
- package/snippets/skeleton.html +4 -0
- package/snippets/slider.html +17 -0
- package/snippets/sortable-row.html +31 -0
- package/snippets/spinner.html +14 -0
- package/snippets/stack-card.html +17 -0
- package/snippets/stack-list.html +16 -0
- package/snippets/stat-card.html +24 -0
- package/snippets/stepper.html +13 -0
- package/snippets/switch.html +6 -0
- package/snippets/table-actions.html +39 -0
- package/snippets/table-compact.html +24 -0
- package/snippets/table.html +29 -0
- package/snippets/tabs.html +9 -0
- package/snippets/tag-input.html +17 -0
- package/snippets/terminal-log.html +23 -0
- package/snippets/textarea.html +3 -0
- package/snippets/theme-switch.html +6 -0
- package/snippets/time-input.html +26 -0
- package/snippets/timeline.html +28 -0
- package/snippets/toast-stack.html +10 -0
- package/snippets/toast.html +36 -0
- package/snippets/toc.html +13 -0
- package/snippets/toggle-field.html +20 -0
- package/snippets/toggle.html +22 -0
- package/snippets/tooltip.html +4 -0
- package/snippets/top-progress.html +12 -0
- package/snippets/tree.html +38 -0
- package/snippets/upgrade-banner.html +28 -0
- package/snippets/user.html +15 -0
- package/snippets/version-banner.html +15 -0
|
@@ -0,0 +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>
|
|
@@ -0,0 +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²</span>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
@@ -0,0 +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>
|
|
@@ -0,0 +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><button class="oc-btn">Save</button>
|
|
16
|
+
<button class="oc-btn oc-btn--outline">Cancel</button></code></pre>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
@@ -0,0 +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">⤢</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">✕</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">✕</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>
|
|
@@ -0,0 +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>
|
|
@@ -0,0 +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…</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>
|
|
@@ -0,0 +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>
|
|
@@ -0,0 +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>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<!-- OmniaUI component: emoji-picker — Compact popover grid of emoji buttons, anchored to its trigger. Needs @birdycom/omniaui CSS.
|
|
2
|
+
File: packages/ui/snippets/emoji-picker.html | Map: target field -> trigger -> popover (groups: label + grid of buttons) -> optional script
|
|
3
|
+
Class API: button.oc-emoji-picker__trigger (popovertarget) · div.oc-emoji-picker[popover] (data-oc-emoji-target = selector of a field) >
|
|
4
|
+
.oc-emoji-picker__label + .oc-emoji-picker__grid > button.oc-emoji-picker__item.
|
|
5
|
+
Modifiers: .oc-emoji-picker--inline (always visible, no popover). Open / close / Esc / light dismiss: native popover.
|
|
6
|
+
The optional script inserts the clicked emoji at the cursor of the target field and closes the panel.
|
|
7
|
+
-->
|
|
8
|
+
<div style="display:flex;gap:0.5rem;align-items:center">
|
|
9
|
+
<input class="oc-input" id="oc-emoji-field" placeholder="Say something nice" style="inline-size:16rem">
|
|
10
|
+
<button type="button" class="oc-emoji-picker__trigger" popovertarget="oc-emoji-demo" aria-label="Insert emoji">🙂</button>
|
|
11
|
+
</div>
|
|
12
|
+
<div class="oc-emoji-picker" id="oc-emoji-demo" popover data-oc-emoji-target="#oc-emoji-field" aria-label="Emoji">
|
|
13
|
+
<p class="oc-emoji-picker__label">Smileys</p>
|
|
14
|
+
<div class="oc-emoji-picker__grid">
|
|
15
|
+
<button type="button" class="oc-emoji-picker__item">😀</button><button type="button" class="oc-emoji-picker__item">😃</button>
|
|
16
|
+
<button type="button" class="oc-emoji-picker__item">😄</button><button type="button" class="oc-emoji-picker__item">😁</button>
|
|
17
|
+
<button type="button" class="oc-emoji-picker__item">😂</button><button type="button" class="oc-emoji-picker__item">🙂</button>
|
|
18
|
+
<button type="button" class="oc-emoji-picker__item">😉</button><button type="button" class="oc-emoji-picker__item">😍</button>
|
|
19
|
+
<button type="button" class="oc-emoji-picker__item">🤔</button><button type="button" class="oc-emoji-picker__item">😎</button>
|
|
20
|
+
<button type="button" class="oc-emoji-picker__item">😢</button><button type="button" class="oc-emoji-picker__item">😴</button>
|
|
21
|
+
<button type="button" class="oc-emoji-picker__item">😯</button><button type="button" class="oc-emoji-picker__item">🥳</button>
|
|
22
|
+
<button type="button" class="oc-emoji-picker__item">😤</button><button type="button" class="oc-emoji-picker__item">🤗</button>
|
|
23
|
+
</div>
|
|
24
|
+
<p class="oc-emoji-picker__label">Gestures</p>
|
|
25
|
+
<div class="oc-emoji-picker__grid">
|
|
26
|
+
<button type="button" class="oc-emoji-picker__item">👍</button><button type="button" class="oc-emoji-picker__item">👎</button>
|
|
27
|
+
<button type="button" class="oc-emoji-picker__item">👏</button><button type="button" class="oc-emoji-picker__item">🙌</button>
|
|
28
|
+
<button type="button" class="oc-emoji-picker__item">👋</button><button type="button" class="oc-emoji-picker__item">🙏</button>
|
|
29
|
+
<button type="button" class="oc-emoji-picker__item">✌️</button><button type="button" class="oc-emoji-picker__item">💪</button>
|
|
30
|
+
</div>
|
|
31
|
+
<p class="oc-emoji-picker__label">Objects</p>
|
|
32
|
+
<div class="oc-emoji-picker__grid">
|
|
33
|
+
<button type="button" class="oc-emoji-picker__item">❤️</button><button type="button" class="oc-emoji-picker__item">⭐</button>
|
|
34
|
+
<button type="button" class="oc-emoji-picker__item">🔥</button><button type="button" class="oc-emoji-picker__item">🎉</button>
|
|
35
|
+
<button type="button" class="oc-emoji-picker__item">✅</button><button type="button" class="oc-emoji-picker__item">🚀</button>
|
|
36
|
+
<button type="button" class="oc-emoji-picker__item">💡</button><button type="button" class="oc-emoji-picker__item">☕</button>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
<script>
|
|
40
|
+
// Optional: put the clicked emoji at the cursor of the field in data-oc-emoji-target, then close the picker.
|
|
41
|
+
document.addEventListener("click", (e) => {
|
|
42
|
+
const item = e.target.closest(".oc-emoji-picker__item");
|
|
43
|
+
const picker = item?.closest(".oc-emoji-picker");
|
|
44
|
+
const field = picker?.dataset.ocEmojiTarget && document.querySelector(picker.dataset.ocEmojiTarget);
|
|
45
|
+
if (!field) return;
|
|
46
|
+
field.setRangeText(item.textContent, field.selectionStart ?? field.value.length, field.selectionEnd ?? field.value.length, "end");
|
|
47
|
+
field.dispatchEvent(new Event("input", { bubbles: true }));
|
|
48
|
+
picker.hidePopover?.();
|
|
49
|
+
field.focus();
|
|
50
|
+
});
|
|
51
|
+
</script>
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
<!-- OmniaUI component: empty-state - Icon, title, text and actions for lists without data. Needs @birdycom/omniaui CSS.
|
|
2
|
+
Class API (modifiers are extra classes / attributes on the same element):
|
|
3
|
+
.oc-empty: Centered column wrapper
|
|
4
|
+
.oc-empty-icon: Round icon holder (glyph, emoji or inline SVG)
|
|
5
|
+
.oc-empty-title: Heading
|
|
6
|
+
.oc-empty-text: Explanation
|
|
7
|
+
.oc-empty-actions: Row for buttons (optional)
|
|
8
|
+
-->
|
|
9
|
+
<div class="oc-empty">
|
|
10
|
+
<span class="oc-empty-icon" aria-hidden="true">+</span>
|
|
11
|
+
<h3 class="oc-empty-title">No contacts yet</h3>
|
|
12
|
+
<p class="oc-empty-text">Add your first contact to start tracking conversations and invoices.</p>
|
|
13
|
+
<div class="oc-empty-actions">
|
|
14
|
+
<button class="oc-btn" type="button">New contact</button>
|
|
15
|
+
<button class="oc-btn oc-btn--outline" type="button">Import</button>
|
|
16
|
+
</div>
|
|
17
|
+
</div>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!-- OmniaUI component: entity-card — Framed media cell (image, glyph, icon) next to a detail column with facts. Needs @birdycom/omniaui CSS.
|
|
2
|
+
File: packages/ui/snippets/entity-card.html | Map: card -> grid (frame | body: eyebrow, title, description, facts) -> footer
|
|
3
|
+
Class API: article.oc-entity-card > .oc-entity-card__grid > .oc-entity-card__frame (img / svg / .oc-entity-card__glyph;
|
|
4
|
+
--contain keeps a margin) + .oc-entity-card__body (.oc-entity-card__eyebrow, h3.oc-entity-card__title,
|
|
5
|
+
p.oc-entity-card__description, dl.oc-entity-card__facts) · .oc-entity-card__footer (tags, actions; optional).
|
|
6
|
+
Modifiers: .oc-entity-card--stacked (frame on top), --sm. Stacks by itself in containers under 22rem. No JavaScript.
|
|
7
|
+
-->
|
|
8
|
+
<article class="oc-entity-card" style="max-inline-size:34rem">
|
|
9
|
+
<div class="oc-entity-card__grid">
|
|
10
|
+
<div class="oc-entity-card__frame"><span class="oc-entity-card__glyph" aria-hidden="true">☥</span></div>
|
|
11
|
+
<div class="oc-entity-card__body">
|
|
12
|
+
<p class="oc-entity-card__eyebrow">Symbol · Ancient Egypt</p>
|
|
13
|
+
<h3 class="oc-entity-card__title">Ankh</h3>
|
|
14
|
+
<p class="oc-entity-card__description">The sign of life. Often held by gods in temple reliefs.</p>
|
|
15
|
+
<dl class="oc-entity-card__facts">
|
|
16
|
+
<dt>Code</dt><dd>S34</dd>
|
|
17
|
+
<dt>Period</dt><dd>Early Dynastic onwards</dd>
|
|
18
|
+
<dt>Reading</dt><dd>ʿnḫ</dd>
|
|
19
|
+
</dl>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
<div class="oc-entity-card__footer">
|
|
23
|
+
<span class="oc-badge oc-badge--secondary">Life</span>
|
|
24
|
+
<span class="oc-badge oc-badge--secondary">Amulet</span>
|
|
25
|
+
</div>
|
|
26
|
+
</article>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!-- OmniaUI component: expandable-table - Table that shows the first rows, "Show more" reveals the rest (CSS only). Needs @birdycom/omniaui CSS.
|
|
2
|
+
Class API: .oc-expandable-table (wrapper) · .oc-expandable-table__row-dimmed (last visible row, faded) · .oc-expandable-table__row-more (hidden rows) ·
|
|
3
|
+
.oc-expandable-table__wrap (+ --full) holds the toggle · label.oc-expandable-table__trigger.oc-btn > input.oc-expandable-table__toggle + .__more / .__less
|
|
4
|
+
Generic toggle button: label.oc-btn.oc-btn--toggle > input[type=checkbox] + .oc-btn-toggle__off / .oc-btn-toggle__on ; reveal area: .oc-showmore > .oc-showmore__extra
|
|
5
|
+
-->
|
|
6
|
+
<div class="oc-expandable-table">
|
|
7
|
+
<table class="oc-table-ref">
|
|
8
|
+
<thead><tr><th>Class</th><th>Description</th></tr></thead>
|
|
9
|
+
<tbody>
|
|
10
|
+
<tr><td><code>.oc-btn</code></td><td>Primary button</td></tr>
|
|
11
|
+
<tr><td><code>.oc-btn--secondary</code></td><td>Quiet button</td></tr>
|
|
12
|
+
<tr class="oc-expandable-table__row-dimmed"><td><code>.oc-btn--outline</code></td><td>Outlined button</td></tr>
|
|
13
|
+
<tr class="oc-expandable-table__row-more"><td><code>.oc-btn--ghost</code></td><td>Frameless button</td></tr>
|
|
14
|
+
<tr class="oc-expandable-table__row-more"><td><code>.oc-btn--link</code></td><td>Looks like a link</td></tr>
|
|
15
|
+
</tbody>
|
|
16
|
+
</table>
|
|
17
|
+
<div class="oc-expandable-table__wrap oc-expandable-table__wrap--full">
|
|
18
|
+
<label class="oc-btn oc-btn--secondary oc-expandable-table__trigger"><input type="checkbox" class="oc-expandable-table__toggle"><span class="oc-expandable-table__more">Show more</span><span class="oc-expandable-table__less">Show less</span></label>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
|
|
22
|
+
<div class="oc-showmore">
|
|
23
|
+
<p>Short text that is always visible.</p>
|
|
24
|
+
<p class="oc-showmore__extra">Extra text that appears after pressing the button.</p>
|
|
25
|
+
<label class="oc-btn oc-btn--outline oc-btn--toggle"><input type="checkbox"><span class="oc-btn-toggle__off">Show more</span><span class="oc-btn-toggle__on">Show less</span></label>
|
|
26
|
+
</div>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!-- OmniaUI component: fact-list - Key / value product facts in a card, a variant of the definition list. Needs @birdycom/omniaui CSS.
|
|
2
|
+
File: packages/ui/snippets/fact-list.html | Map: dl.oc-fact-list -> div rows (dt label + dd value)
|
|
3
|
+
Class API (modifiers are extra classes / attributes on the same element):
|
|
4
|
+
.oc-fact-list: The dl (card with a line between rows)
|
|
5
|
+
Modifiers: --plain (no card), --compact, --stacked (value below label), --accent (values in the accent)
|
|
6
|
+
Rows: <div><dt>Label</dt><dd>Value</dd></div>
|
|
7
|
+
Slots: rows (label + value)
|
|
8
|
+
-->
|
|
9
|
+
<dl class="oc-fact-list">
|
|
10
|
+
<div><dt>Platform</dt><dd>Web, desktop</dd></div>
|
|
11
|
+
<div><dt>Built with</dt><dd>PHP 8.4, MySQL</dd></div>
|
|
12
|
+
<div><dt>License</dt><dd>Subscription</dd></div>
|
|
13
|
+
<div><dt>Status</dt><dd>Live since 2021</dd></div>
|
|
14
|
+
</dl>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<!-- OmniaUI component: filter-counts - View filter tiles with counts (active / deleted / all) - no JavaScript. Needs @birdycom/omniaui CSS.
|
|
2
|
+
File: packages/ui/snippets/filter-counts.html | Map: group (fieldset) -> one tile per view (radio + value + label + hint)
|
|
3
|
+
Class API (modifiers are extra classes / attributes on the same element):
|
|
4
|
+
.oc-filter-counts: Group of tiles (a <fieldset> or role="radiogroup"). Modifier: --compact (inline pills "Active 12").
|
|
5
|
+
.oc-filter-counts-item: Tile label around one radio. Tones: --success, --destructive, --muted (default primary).
|
|
6
|
+
.oc-filter-counts-value: The count (big number)
|
|
7
|
+
.oc-filter-counts-label: Name of the view
|
|
8
|
+
.oc-filter-counts-hint: Short description (hidden in --compact)
|
|
9
|
+
States: checked (accent border + background), :focus-visible (outline), disabled (faded)
|
|
10
|
+
-->
|
|
11
|
+
<fieldset class="oc-filter-counts" aria-label="Show transactions">
|
|
12
|
+
<label class="oc-filter-counts-item oc-filter-counts-item--success">
|
|
13
|
+
<input type="radio" name="view" value="active" checked>
|
|
14
|
+
<span class="oc-filter-counts-value">128</span>
|
|
15
|
+
<span class="oc-filter-counts-label">Active</span>
|
|
16
|
+
<span class="oc-filter-counts-hint">Visible in reports</span>
|
|
17
|
+
</label>
|
|
18
|
+
<label class="oc-filter-counts-item oc-filter-counts-item--destructive">
|
|
19
|
+
<input type="radio" name="view" value="deleted">
|
|
20
|
+
<span class="oc-filter-counts-value">6</span>
|
|
21
|
+
<span class="oc-filter-counts-label">Deleted</span>
|
|
22
|
+
<span class="oc-filter-counts-hint">Can be restored</span>
|
|
23
|
+
</label>
|
|
24
|
+
<label class="oc-filter-counts-item">
|
|
25
|
+
<input type="radio" name="view" value="all">
|
|
26
|
+
<span class="oc-filter-counts-value">134</span>
|
|
27
|
+
<span class="oc-filter-counts-label">All</span>
|
|
28
|
+
<span class="oc-filter-counts-hint">Everything together</span>
|
|
29
|
+
</label>
|
|
30
|
+
</fieldset>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<!-- OmniaUI component: flip-card — 3D flip card (front / back) on a checkbox toggle or on hover and focus. Needs @birdycom/omniaui CSS.
|
|
2
|
+
File: packages/ui/snippets/flip-card.html | Map: card -> hidden checkbox -> inner -> front face (+ flip label) -> back face (+ flip label)
|
|
3
|
+
Class API: .oc-flip-card > input.oc-flip-card__toggle[type=checkbox] (optional) + .oc-flip-card__inner >
|
|
4
|
+
.oc-flip-card__face--front / --back (.oc-flip-card__title, .oc-flip-card__text, label.oc-flip-card__flip for the checkbox).
|
|
5
|
+
Modifiers: .oc-flip-card--hover (flip on hover / focus; give the card tabindex="0"), .oc-flip-card--vertical.
|
|
6
|
+
States: checkbox :checked or .is-flipped. Reduced motion: no 3D turn, the faces cross-fade. No JavaScript.
|
|
7
|
+
-->
|
|
8
|
+
<div class="oc-flip-card" style="max-inline-size:18rem">
|
|
9
|
+
<input type="checkbox" class="oc-flip-card__toggle" id="oc-flip-demo">
|
|
10
|
+
<div class="oc-flip-card__inner">
|
|
11
|
+
<div class="oc-flip-card__face oc-flip-card__face--front">
|
|
12
|
+
<p class="oc-flip-card__text">Translate</p>
|
|
13
|
+
<h3 class="oc-flip-card__title">la mariposa</h3>
|
|
14
|
+
<label class="oc-flip-card__flip" for="oc-flip-demo">Show answer</label>
|
|
15
|
+
</div>
|
|
16
|
+
<div class="oc-flip-card__face oc-flip-card__face--back">
|
|
17
|
+
<p class="oc-flip-card__text">Spanish → English</p>
|
|
18
|
+
<h3 class="oc-flip-card__title">the butterfly</h3>
|
|
19
|
+
<label class="oc-flip-card__flip" for="oc-flip-demo">Back to question</label>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<!-- OmniaUI component: form-field — Form field with label, description and error. Needs @birdycom/omniaui CSS. -->
|
|
2
|
+
<div class="oc-field">
|
|
3
|
+
<label class="oc-field-label" for="email">Email</label>
|
|
4
|
+
<input class="oc-input" id="email" type="email" placeholder="you@example.com" aria-describedby="email-help">
|
|
5
|
+
<p class="oc-field-description" id="email-help">We never share your email.</p>
|
|
6
|
+
</div>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<!-- OmniaUI component: greeting - Dashboard header with a time-of-day greeting, the date and actions. Needs @birdycom/omniaui CSS.
|
|
2
|
+
File: packages/ui/snippets/greeting.html | Map: header -> icon tile -> body (eyebrow, title with name, date) -> actions
|
|
3
|
+
Class API (modifiers are extra classes / attributes on the same element):
|
|
4
|
+
.oc-greeting: Header row. Modifiers: --morning / --afternoon / --evening (tint, chosen by your app or wrapper), --lg.
|
|
5
|
+
.oc-greeting-icon: Tinted icon tile (sun, moon)
|
|
6
|
+
.oc-greeting-body / -eyebrow / -title / -name: Text column, small label, heading and the highlighted name
|
|
7
|
+
time.oc-greeting-date: Today's date (datetime attribute)
|
|
8
|
+
.oc-greeting-actions: Buttons at the end
|
|
9
|
+
Slots: icon, eyebrow, title, date, actions
|
|
10
|
+
-->
|
|
11
|
+
<header class="oc-greeting oc-greeting--morning">
|
|
12
|
+
<span class="oc-greeting-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="12" cy="12" r="4"/><path d="M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4"/></svg></span>
|
|
13
|
+
<div class="oc-greeting-body">
|
|
14
|
+
<p class="oc-greeting-eyebrow">Dashboard</p>
|
|
15
|
+
<h1 class="oc-greeting-title">Good morning, <span class="oc-greeting-name">Ada</span></h1>
|
|
16
|
+
<time class="oc-greeting-date" datetime="2026-10-15">Thursday 15 October 2026</time>
|
|
17
|
+
</div>
|
|
18
|
+
<div class="oc-greeting-actions">
|
|
19
|
+
<a class="oc-btn oc-btn--outline oc-btn--sm" href="#">Agenda</a>
|
|
20
|
+
<button class="oc-btn oc-btn--sm" type="button">New project</button>
|
|
21
|
+
</div>
|
|
22
|
+
</header>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<!-- OmniaUI component: heading - Page or section title with a muted description. Needs @birdycom/omniaui CSS.
|
|
2
|
+
Class API (modifiers are extra classes / attributes on the same element):
|
|
3
|
+
.oc-heading: Wrapper (title + description). Modifier: --sm for a section heading.
|
|
4
|
+
.oc-heading-title: Title (use h1-h3 as fits the outline)
|
|
5
|
+
.oc-heading-description: Muted description (optional)
|
|
6
|
+
-->
|
|
7
|
+
<div class="oc-heading">
|
|
8
|
+
<h2 class="oc-heading-title">Profile</h2>
|
|
9
|
+
<p class="oc-heading-description">Update your name and e-mail address.</p>
|
|
10
|
+
</div>
|
|
11
|
+
<div class="oc-heading oc-heading--sm">
|
|
12
|
+
<h3 class="oc-heading-title">Password</h3>
|
|
13
|
+
<p class="oc-heading-description">Use a long, random password.</p>
|
|
14
|
+
</div>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<!-- OmniaUI component: hover-card - Hover card: preview on hover/focus via interestfor + popover, CSS hover fallback. Needs @birdycom/omniaui CSS.
|
|
2
|
+
Class API (modifiers are extra classes / attributes on the same element):
|
|
3
|
+
.oc-hover-card: inline wrapper (anchor scope)
|
|
4
|
+
.oc-hover-card-trigger: the link/button (add interestfor="id" for the popover engine)
|
|
5
|
+
.oc-hover-card-content: the card (id, popover, role="tooltip" or region). Sizes: --sm. Wrapper modifier: .oc-hover-card--top
|
|
6
|
+
-->
|
|
7
|
+
<span class="oc-hover-card">
|
|
8
|
+
<a class="oc-hover-card-trigger" href="#omniacss" interestfor="oc-hc-demo">@omniacss</a>
|
|
9
|
+
<div class="oc-hover-card-content" id="oc-hc-demo" popover>
|
|
10
|
+
<div class="oc-item oc-item--sm" style="padding:0">
|
|
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"><circle cx="12" cy="8" r="4"/><path d="M4 21a8 8 0 0 1 16 0"/></svg></div>
|
|
12
|
+
<div class="oc-item-content">
|
|
13
|
+
<p class="oc-item-title">OmniaCSS</p>
|
|
14
|
+
<p class="oc-item-description">CSS-first components and utilities. Light, dark and no build step.</p>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
</div>
|
|
18
|
+
</span>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
<!-- OmniaUI component: image-zoom — Zoom and pan viewport with CSS-only zoom levels. Needs @birdycom/omniaui CSS.
|
|
2
|
+
File: packages/ui/snippets/image-zoom.html | Map: root -> toolbar (radio chips) -> viewport -> canvas (img)
|
|
3
|
+
Class API: .oc-image-zoom > .oc-image-zoom__toolbar (.oc-image-zoom__label, label.oc-image-zoom__level > input[type=radio][value]) ·
|
|
4
|
+
.oc-image-zoom__viewport (tabindex=0, scroll = pan) > .oc-image-zoom__canvas > img / svg / .oc-media-art.
|
|
5
|
+
Zoom levels: radio values 1, 1.5, 2, 3, 4 (picked up with :has()), or a fixed class .oc-image-zoom--150 / --200 / --300,
|
|
6
|
+
or style="--oc-zoom: 2.5". Ratio: 16 / 9 default, .oc-image-zoom--square / --photo or --oc-image-zoom-ratio.
|
|
7
|
+
Pan: scrollbars, mouse wheel (Shift = sideways), touch drag, or arrow keys on the focused viewport. No JavaScript.
|
|
8
|
+
-->
|
|
9
|
+
<div class="oc-image-zoom">
|
|
10
|
+
<div class="oc-image-zoom__toolbar" role="radiogroup" aria-label="Zoom level">
|
|
11
|
+
<span class="oc-image-zoom__label">Zoom</span>
|
|
12
|
+
<label class="oc-image-zoom__level"><input type="radio" name="oc-zoom-demo" value="1" checked>100%</label>
|
|
13
|
+
<label class="oc-image-zoom__level"><input type="radio" name="oc-zoom-demo" value="1.5">150%</label>
|
|
14
|
+
<label class="oc-image-zoom__level"><input type="radio" name="oc-zoom-demo" value="2">200%</label>
|
|
15
|
+
<label class="oc-image-zoom__level"><input type="radio" name="oc-zoom-demo" value="3">300%</label>
|
|
16
|
+
</div>
|
|
17
|
+
<div class="oc-image-zoom__viewport" tabindex="0" role="region" aria-label="Harbour map, scroll to pan">
|
|
18
|
+
<div class="oc-image-zoom__canvas">
|
|
19
|
+
<div class="oc-media-art oc-media-art--2">
|
|
20
|
+
<svg viewBox="0 0 160 90" role="img" aria-label="Harbour map" style="display:block;inline-size:100%;block-size:100%;color:var(--color-white-50)">
|
|
21
|
+
<path d="M0 15H160M0 30H160M0 45H160M0 60H160M0 75H160M20 0V90M40 0V90M60 0V90M80 0V90M100 0V90M120 0V90M140 0V90" fill="none" stroke="currentColor" stroke-opacity=".35" stroke-width=".3"/>
|
|
22
|
+
<path d="M10 70C40 50 60 80 90 55S140 30 150 20" fill="none" stroke="currentColor" stroke-width="1.2"/>
|
|
23
|
+
<circle cx="90" cy="55" r="3" fill="currentColor"/>
|
|
24
|
+
<text x="95" y="52" font-size="5" fill="currentColor">Harbour</text>
|
|
25
|
+
<text x="12" y="76" font-size="2" fill="currentColor">Small print: zoom in to read this line.</text>
|
|
26
|
+
</svg>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
@@ -0,0 +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">€</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>
|
|
@@ -0,0 +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>
|