@birdycom/omniaui 0.12.5 → 0.12.6
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/README.md +1 -1
- package/bin/lib/copy-js.mjs +10 -1
- package/bin/omniaui.mjs +2 -2
- package/dist/barcode.d.ts +15 -0
- package/dist/barcode.js +164 -0
- package/dist/components-extra.css +15 -1
- package/dist/components.css +1489 -187
- package/dist/components.min.css +1 -1
- package/dist/data-table.js +135 -98
- package/dist/form-extras.d.ts +11 -0
- package/dist/form-extras.js +214 -0
- package/dist/lazy.d.ts +5 -0
- package/dist/lazy.js +37 -0
- package/dist/oc-theme.css +1 -1
- package/dist/parts/app-data-table-footer.css +38 -0
- package/dist/parts/app-data-table-rich.css +161 -0
- package/dist/parts/app-data-table.css +44 -74
- package/dist/parts/app-name-card.css +65 -0
- package/dist/parts/app-titlebar.css +16 -8
- package/dist/parts/data-meter-row.css +40 -0
- package/dist/parts/data-price.css +20 -0
- package/dist/parts/data-ribbon.css +76 -0
- package/dist/parts/data-spec-list.css +36 -0
- package/dist/parts/data-stock.css +41 -0
- package/dist/parts/forms-affix-input.css +1 -1
- package/dist/parts/forms-avatar-picker.css +43 -0
- package/dist/parts/forms-date-field.css +53 -0
- package/dist/parts/forms-density.css +13 -0
- package/dist/parts/forms-form-section.css +64 -0
- package/dist/parts/forms-quantity.css +55 -0
- package/dist/parts/forms-rating.css +81 -0
- package/dist/parts/media-attachment.css +1 -1
- package/dist/parts/media-barcode.css +23 -0
- package/dist/parts/media-chat-composer.css +3 -0
- package/dist/parts/media-emoji-picker.css +3 -1
- package/dist/parts/media-gallery.css +55 -0
- package/dist/parts/media-glass-liquid.css +99 -0
- package/dist/parts/media-glass-options.css +50 -0
- package/dist/parts/media-lazy.css +46 -0
- package/dist/parts/media-message-thread.css +1 -1
- package/dist/parts/media-message.css +1 -1
- package/dist/parts/nav-topbar-variants.css +96 -0
- package/dist/parts/site-header-variants.css +70 -0
- package/dist/parts/site-prose.css +1 -1
- package/dist/showcase.css +33 -3
- package/manifest.json +121 -9
- package/package.json +5 -2
- package/snippets/accordion-accent.html +1 -1
- package/snippets/attachment.html +4 -4
- package/snippets/avatar-picker.html +40 -0
- package/snippets/barcode.html +20 -0
- package/snippets/chat-composer.html +3 -3
- package/snippets/data-table.html +51 -76
- package/snippets/date-field.html +44 -0
- package/snippets/doc-viewer.html +1 -1
- package/snippets/emoji-picker.html +1 -1
- package/snippets/form-density.html +25 -0
- package/snippets/form-section.html +47 -0
- package/snippets/gallery.html +25 -0
- package/snippets/lazy.html +39 -0
- package/snippets/message-thread.html +12 -12
- package/snippets/message.html +10 -10
- package/snippets/meter-row.html +29 -0
- package/snippets/name-card.html +72 -0
- package/snippets/page-header.html +1 -1
- package/snippets/price.html +25 -0
- package/snippets/prose.html +3 -3
- package/snippets/quantity.html +12 -0
- package/snippets/rating.html +26 -0
- package/snippets/ribbon.html +48 -0
- package/snippets/sidebar.html +3 -3
- package/snippets/spec-list.html +34 -0
- package/snippets/stock.html +20 -0
- package/snippets/table-actions.html +5 -5
- package/snippets/table.html +2 -2
- package/snippets/titlebar.html +1 -1
- package/snippets/user.html +3 -3
- package/dist/parts/app-column-menu.css +0 -85
- package/snippets/column-menu.html +0 -38
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<!-- OmniaUI component: meter-row - Usage line with a label, the amount as text, a colored bar and when it resets. Needs @birdycom/omniaui CSS.
|
|
2
|
+
File: packages/ui/snippets/meter-row.html | Map: meter row demo markup.
|
|
3
|
+
Class API (modifiers are extra classes / attributes on the same element):
|
|
4
|
+
.oc-meter-row: Grid: label and value on the first line, the bar and the reset line below.
|
|
5
|
+
--oc-meter: The fill, 0–100% (inline style or your code).
|
|
6
|
+
data-level="warn" / "critical": Orange / red bar (and a red value at critical). Without it the bar is green.
|
|
7
|
+
.oc-meter-row__bar[role=meter]: The bar; give it aria-valuenow and a label for screen readers.
|
|
8
|
+
.oc-meter-list (--compact): A stack of rows; --compact for a small widget.
|
|
9
|
+
-->
|
|
10
|
+
<div class="oc-meter-list" style="inline-size:min(100%,28rem)">
|
|
11
|
+
<div class="oc-meter-row" style="--oc-meter: 62%">
|
|
12
|
+
<span class="oc-meter-row__label">Session (5 hours)</span>
|
|
13
|
+
<span class="oc-meter-row__value"><strong>62%</strong> · 31k / 50k tokens</span>
|
|
14
|
+
<span class="oc-meter-row__bar" role="meter" aria-label="Session (5 hours)" aria-valuemin="0" aria-valuemax="100" aria-valuenow="62"></span>
|
|
15
|
+
<span class="oc-meter-row__reset"><iconify-icon icon="mdi:timer-sand" aria-hidden="true"></iconify-icon>Resets in 2 h 14 min</span>
|
|
16
|
+
</div>
|
|
17
|
+
<div class="oc-meter-row" data-level="warn" style="--oc-meter: 81%">
|
|
18
|
+
<span class="oc-meter-row__label">Week</span>
|
|
19
|
+
<span class="oc-meter-row__value"><strong>81%</strong> · 1.6M / 2M tokens</span>
|
|
20
|
+
<span class="oc-meter-row__bar" role="meter" aria-label="Week" aria-valuemin="0" aria-valuemax="100" aria-valuenow="81"></span>
|
|
21
|
+
<span class="oc-meter-row__reset"><iconify-icon icon="mdi:timer-sand" aria-hidden="true"></iconify-icon>Resets Monday 09:00</span>
|
|
22
|
+
</div>
|
|
23
|
+
<div class="oc-meter-row" data-level="critical" style="--oc-meter: 96%">
|
|
24
|
+
<span class="oc-meter-row__label">Storage</span>
|
|
25
|
+
<span class="oc-meter-row__value"><strong>96%</strong> · 9.6 / 10 GB</span>
|
|
26
|
+
<span class="oc-meter-row__bar" role="meter" aria-label="Storage" aria-valuemin="0" aria-valuemax="100" aria-valuenow="96"></span>
|
|
27
|
+
<span class="oc-meter-row__reset"><iconify-icon icon="mdi:timer-sand" aria-hidden="true"></iconify-icon>Upgrade or clean up to keep syncing</span>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
<!-- OmniaUI component: name-card - Collapsible card with a name, rename pencil, amount and delete button; nests for titles and parts. Needs @birdycom/omniaui CSS.
|
|
2
|
+
File: packages/ui/snippets/name-card.html | Map: name card demo markup. Behaviour: form-extras.js.
|
|
3
|
+
Class API (modifiers are extra classes / attributes on the same element):
|
|
4
|
+
.oc-name-card: The card: a <details>; open shows the content.
|
|
5
|
+
.oc-name-card__head: The <summary>: chevron, name, rename, meta, amount and actions on one line.
|
|
6
|
+
.oc-name-card__title / __meta / __amount: Name (cut with an ellipsis), a quiet extra ("6 articles") and the amount (tabular numbers, pushed right).
|
|
7
|
+
.oc-name-card__actions: Buttons on the right, e.g. a soft destructive delete.
|
|
8
|
+
[data-oc-rename]: With form-extras.js: the pencil turns the name into an input; Enter or leaving the field saves (oc-namecard-rename event with the name), Escape cancels.
|
|
9
|
+
.oc-name-card__body: The content. Name cards inside it are the parts of a title (quieter surface).
|
|
10
|
+
.oc-name-card--total: The amount of this card in the primary color (a total).
|
|
11
|
+
-->
|
|
12
|
+
<div style="display:grid;gap:0.5rem;inline-size:min(100%,40rem)">
|
|
13
|
+
<details class="oc-name-card oc-name-card--total" open>
|
|
14
|
+
<summary class="oc-name-card__head">
|
|
15
|
+
<span class="oc-name-card__title">Kitchen – ground floor</span>
|
|
16
|
+
<button type="button" class="oc-btn oc-btn--plain" data-oc-rename aria-label="Rename Kitchen – ground floor" title="Rename"><iconify-icon icon="mdi:pencil-outline" aria-hidden="true"></iconify-icon></button>
|
|
17
|
+
|
|
18
|
+
<span class="oc-name-card__amount">€ 8.480,00</span>
|
|
19
|
+
<span class="oc-name-card__actions"><button type="button" class="oc-btn oc-btn--soft-destructive oc-btn--icon oc-btn--sm" aria-label="Delete Kitchen – ground floor" title="Delete"><iconify-icon icon="mdi:trash-can-outline" aria-hidden="true"></iconify-icon></button></span>
|
|
20
|
+
</summary>
|
|
21
|
+
<div class="oc-name-card__body">
|
|
22
|
+
<details class="oc-name-card">
|
|
23
|
+
<summary class="oc-name-card__head">
|
|
24
|
+
<span class="oc-name-card__title">Base cabinets</span>
|
|
25
|
+
<button type="button" class="oc-btn oc-btn--plain" data-oc-rename aria-label="Rename Base cabinets" title="Rename"><iconify-icon icon="mdi:pencil-outline" aria-hidden="true"></iconify-icon></button>
|
|
26
|
+
<span class="oc-name-card__meta">6 articles</span>
|
|
27
|
+
<span class="oc-name-card__amount">€ 4.180,00</span>
|
|
28
|
+
<span class="oc-name-card__actions"><button type="button" class="oc-btn oc-btn--soft-destructive oc-btn--icon oc-btn--sm" aria-label="Delete Base cabinets" title="Delete"><iconify-icon icon="mdi:trash-can-outline" aria-hidden="true"></iconify-icon></button></span>
|
|
29
|
+
</summary>
|
|
30
|
+
<div class="oc-name-card__body">
|
|
31
|
+
<p class="m-0 text-muted">6 articles · 2 options</p>
|
|
32
|
+
</div>
|
|
33
|
+
</details>
|
|
34
|
+
<details class="oc-name-card">
|
|
35
|
+
<summary class="oc-name-card__head">
|
|
36
|
+
<span class="oc-name-card__title">Wall cabinets</span>
|
|
37
|
+
<button type="button" class="oc-btn oc-btn--plain" data-oc-rename aria-label="Rename Wall cabinets" title="Rename"><iconify-icon icon="mdi:pencil-outline" aria-hidden="true"></iconify-icon></button>
|
|
38
|
+
<span class="oc-name-card__meta">4 articles</span>
|
|
39
|
+
<span class="oc-name-card__amount">€ 2.360,00</span>
|
|
40
|
+
<span class="oc-name-card__actions"><button type="button" class="oc-btn oc-btn--soft-destructive oc-btn--icon oc-btn--sm" aria-label="Delete Wall cabinets" title="Delete"><iconify-icon icon="mdi:trash-can-outline" aria-hidden="true"></iconify-icon></button></span>
|
|
41
|
+
</summary>
|
|
42
|
+
<div class="oc-name-card__body">
|
|
43
|
+
<p class="m-0 text-muted">4 articles</p>
|
|
44
|
+
</div>
|
|
45
|
+
</details>
|
|
46
|
+
<details class="oc-name-card">
|
|
47
|
+
<summary class="oc-name-card__head">
|
|
48
|
+
<span class="oc-name-card__title">Worktop</span>
|
|
49
|
+
<button type="button" class="oc-btn oc-btn--plain" data-oc-rename aria-label="Rename Worktop" title="Rename"><iconify-icon icon="mdi:pencil-outline" aria-hidden="true"></iconify-icon></button>
|
|
50
|
+
<span class="oc-name-card__meta">1 article</span>
|
|
51
|
+
<span class="oc-name-card__amount">€ 1.940,00</span>
|
|
52
|
+
<span class="oc-name-card__actions"><button type="button" class="oc-btn oc-btn--soft-destructive oc-btn--icon oc-btn--sm" aria-label="Delete Worktop" title="Delete"><iconify-icon icon="mdi:trash-can-outline" aria-hidden="true"></iconify-icon></button></span>
|
|
53
|
+
</summary>
|
|
54
|
+
<div class="oc-name-card__body">
|
|
55
|
+
<p class="m-0 text-muted">1 article · cut to size</p>
|
|
56
|
+
</div>
|
|
57
|
+
</details>
|
|
58
|
+
</div>
|
|
59
|
+
</details>
|
|
60
|
+
<details class="oc-name-card">
|
|
61
|
+
<summary class="oc-name-card__head">
|
|
62
|
+
<span class="oc-name-card__title">Bathroom – first floor</span>
|
|
63
|
+
<button type="button" class="oc-btn oc-btn--plain" data-oc-rename aria-label="Rename Bathroom – first floor" title="Rename"><iconify-icon icon="mdi:pencil-outline" aria-hidden="true"></iconify-icon></button>
|
|
64
|
+
|
|
65
|
+
<span class="oc-name-card__amount">€ 3.215,50</span>
|
|
66
|
+
<span class="oc-name-card__actions"><button type="button" class="oc-btn oc-btn--soft-destructive oc-btn--icon oc-btn--sm" aria-label="Delete Bathroom – first floor" title="Delete"><iconify-icon icon="mdi:trash-can-outline" aria-hidden="true"></iconify-icon></button></span>
|
|
67
|
+
</summary>
|
|
68
|
+
<div class="oc-name-card__body">
|
|
69
|
+
<p class="m-0 text-muted">Add a part with the button below.</p>
|
|
70
|
+
</div>
|
|
71
|
+
</details>
|
|
72
|
+
</div>
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
<div class="oc-page-header-text">
|
|
15
15
|
<h1 class="oc-page-header-title">Kitchen renovation <span class="oc-badge oc-badge--success">Active</span></h1>
|
|
16
16
|
<p class="oc-page-header-subtitle">Main street 12, Ghent - started 2 September 2026.</p>
|
|
17
|
-
<div class="oc-page-header-meta"><span>Owner:
|
|
17
|
+
<div class="oc-page-header-meta"><span>Owner: Contact 1</span><span>Updated 2 hours ago</span></div>
|
|
18
18
|
</div>
|
|
19
19
|
<div class="oc-page-header-actions">
|
|
20
20
|
<button class="oc-btn oc-btn--outline" type="button">Share</button>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
<!-- OmniaUI component: price - A price with old price, discount, VAT note and the amount incl. or excl. VAT. Needs @birdycom/omniaui CSS.
|
|
2
|
+
File: packages/ui/snippets/price.html | Map: prices.
|
|
3
|
+
Class API (modifiers are extra classes / attributes on the same element):
|
|
4
|
+
.oc-price: The block: __main line, then __note and __alt below.
|
|
5
|
+
.oc-price__amount: The price (bold, tabular digits, never wraps).
|
|
6
|
+
.oc-price__old: The old price, struck through. Add an .oc-badge in __main for the discount.
|
|
7
|
+
.oc-price__note / __alt: A quiet note ("excl. VAT") and the other amount ("€ 121,00 incl. VAT").
|
|
8
|
+
.oc-price--sm / --lg / --sale: Smaller or larger amount; --sale colors the amount red.
|
|
9
|
+
.oc-price--inline / --end: Amount and note on one line (lists); right aligned (also automatic in a td[data-numeric]).
|
|
10
|
+
-->
|
|
11
|
+
<div class="flex flex-wrap gap-2 align-items-start">
|
|
12
|
+
<div class="oc-price oc-price--lg">
|
|
13
|
+
<div class="oc-price__main"><span class="oc-price__amount">€ 149,00</span></div>
|
|
14
|
+
<span class="oc-price__note">excl. VAT</span>
|
|
15
|
+
<span class="oc-price__alt">€ 180,29 incl. VAT</span>
|
|
16
|
+
</div>
|
|
17
|
+
<div class="oc-price oc-price--lg oc-price--sale">
|
|
18
|
+
<div class="oc-price__main"><span class="oc-price__amount">€ 119,00</span><s class="oc-price__old">€ 149,00</s><span class="oc-badge oc-badge--destructive">-20%</span></div>
|
|
19
|
+
<span class="oc-price__note">incl. VAT · free delivery</span>
|
|
20
|
+
</div>
|
|
21
|
+
<div class="oc-price oc-price--sm">
|
|
22
|
+
<div class="oc-price__main"><span class="oc-price__amount">€ 6,40</span></div>
|
|
23
|
+
<span class="oc-price__note">per piece · from 10 pieces € 5,90</span>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
package/snippets/prose.html
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
</ul>
|
|
21
21
|
<figure>
|
|
22
22
|
<div class="oc-media-art oc-media-art--6" role="img" aria-label="Kitchen with oak fronts and a light stone worktop"></div>
|
|
23
|
-
<figcaption>
|
|
23
|
+
<figcaption>Project 1: oak fronts with a Calacatta matt worktop, finished in October 2026.</figcaption>
|
|
24
24
|
</figure>
|
|
25
25
|
<h3>From design to installation</h3>
|
|
26
26
|
<ol>
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
</ol>
|
|
32
32
|
<blockquote>
|
|
33
33
|
<p>The planning was clear from day one. We always knew who was coming and when, and the kitchen was ready a week early.</p>
|
|
34
|
-
<footer>—
|
|
34
|
+
<footer>— Customer 8, client in Ghent</footer>
|
|
35
35
|
</blockquote>
|
|
36
36
|
<h2>Worktop materials compared</h2>
|
|
37
37
|
<table>
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
</table>
|
|
46
46
|
<h3>Sharing your floor plan</h3>
|
|
47
47
|
<p>Upload a PDF or a photo in the client portal, or send it by e-mail. Press <kbd>Ctrl</kbd> + <kbd>V</kbd> in the chat to paste a screenshot. Files are stored as <code>project-id/plans/</code> and only your project team can see them.</p>
|
|
48
|
-
<pre><code>Project: 2026-114
|
|
48
|
+
<pre><code>Project: 2026-114 Project 1
|
|
49
49
|
Room: Kitchen, ground floor
|
|
50
50
|
Wall A: 412 cm (window at 160 cm)
|
|
51
51
|
Wall B: 298 cm (door at the left)</code></pre>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<!-- OmniaUI component: quantity - Number field with minus and plus buttons for amounts in carts, orders and stock. Needs @birdycom/omniaui CSS.
|
|
2
|
+
File: packages/ui/snippets/quantity.html | Map: quantity.
|
|
3
|
+
Behaviour: form-extras.js (npx omniaui copy-js form-extras); works without it.
|
|
4
|
+
Class API (modifiers are extra classes / attributes on the same element):
|
|
5
|
+
.oc-quantity: The frame. --sm for a 2rem field in tables and carts.
|
|
6
|
+
.oc-quantity__input: A native type="number" with min, max, step and name; the spinners are hidden.
|
|
7
|
+
[data-oc-step="-1"] / [data-oc-step="1"]: The minus and plus buttons (.oc-quantity__step); with form-extras.js they change the value and fire input and change.
|
|
8
|
+
-->
|
|
9
|
+
<div class="flex flex-wrap gap-2 align-items-center">
|
|
10
|
+
<div class="oc-quantity"><button class="oc-quantity__step" type="button" data-oc-step="-1" aria-label="Decrease quantity"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M19 13H5v-2h14z"/></svg></button><input class="oc-quantity__input" id="oc-qty-demo-1" type="number" inputmode="numeric" name="quantity" value="1" min="1" max="10" step="1" aria-label="Quantity"><button class="oc-quantity__step" type="button" data-oc-step="1" aria-label="Increase quantity"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z"/></svg></button></div>
|
|
11
|
+
<div class="oc-quantity oc-quantity--sm"><button class="oc-quantity__step" type="button" data-oc-step="-1" aria-label="Decrease pieces"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M19 13H5v-2h14z"/></svg></button><input class="oc-quantity__input" id="oc-qty-demo-2" type="number" inputmode="numeric" name="quantity" value="12" min="0" max="500" step="1" aria-label="Pieces"><button class="oc-quantity__step" type="button" data-oc-step="1" aria-label="Increase pieces"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z"/></svg></button></div>
|
|
12
|
+
</div>
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<!-- OmniaUI component: rating - Star rating: show a score with halves, or let people pick 1 to 5 stars. No JavaScript. Needs @birdycom/omniaui CSS.
|
|
2
|
+
File: packages/ui/snippets/rating.html | Map: score and summary -> pick a rating.
|
|
3
|
+
Class API (modifiers are extra classes / attributes on the same element):
|
|
4
|
+
.oc-rating: The stars of a score. --oc-rating is the score (decimals work), --oc-rating-max the number of stars (default 5). Give it role="img" and an aria-label ("4.5 out of 5").
|
|
5
|
+
.oc-rating--sm / --lg: Smaller or larger stars (--oc-rating-size sets any size).
|
|
6
|
+
.oc-rating-summary: Stars, the score (__score) and the number of reviews (__count, a link or text) on one line.
|
|
7
|
+
fieldset.oc-rating-input: Five <label>s with a radio inside (value 1–5) and a hidden text ("3 stars"). The checked or hovered star fills the stars before it. --sm / --lg sizes.
|
|
8
|
+
--oc-rating-color / --oc-rating-empty: Colors of the filled and empty stars (default: the warning token and a light muted tone).
|
|
9
|
+
-->
|
|
10
|
+
<div class="flex flex-column gap-1">
|
|
11
|
+
<span class="oc-rating" style="--oc-rating: 4.5" role="img" aria-label="4.5 out of 5"></span>
|
|
12
|
+
<div class="oc-rating-summary">
|
|
13
|
+
<span class="oc-rating oc-rating--sm" style="--oc-rating: 4.2" role="img" aria-label="4.2 out of 5"></span>
|
|
14
|
+
<span class="oc-rating-summary__score">4.2</span>
|
|
15
|
+
<a class="oc-rating-summary__count" href="#reviews">128 reviews</a>
|
|
16
|
+
</div>
|
|
17
|
+
<span class="oc-rating oc-rating--lg" style="--oc-rating: 3" role="img" aria-label="3 out of 5"></span>
|
|
18
|
+
</div>
|
|
19
|
+
<fieldset class="oc-rating-input oc-rating-input--lg">
|
|
20
|
+
<legend>Your rating</legend>
|
|
21
|
+
<label><input type="radio" name="oc-rating-demo" value="1"><span>1 star</span></label>
|
|
22
|
+
<label><input type="radio" name="oc-rating-demo" value="2"><span>2 stars</span></label>
|
|
23
|
+
<label><input type="radio" name="oc-rating-demo" value="3"><span>3 stars</span></label>
|
|
24
|
+
<label><input type="radio" name="oc-rating-demo" value="4" checked><span>4 stars</span></label>
|
|
25
|
+
<label><input type="radio" name="oc-rating-demo" value="5"><span>5 stars</span></label>
|
|
26
|
+
</fieldset>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
<!-- OmniaUI component: ribbon - A diagonal band across a corner of a card, image or document: Paid, New, Sale. Pick the corner and the tone. Needs @birdycom/omniaui CSS.
|
|
2
|
+
File: packages/ui/snippets/ribbon.html | Map: pick a corner -> on a document -> tones and sizes.
|
|
3
|
+
Class API (modifiers are extra classes / attributes on the same element):
|
|
4
|
+
.oc-ribbon: The band, a child of the card or image box. That box gets position: relative and clips the band automatically (:has(), zero specificity).
|
|
5
|
+
.oc-ribbon--top-start / --bottom-start / --bottom-end: The corner; without a modifier it sits top end (top right in a left-to-right page). Start and end follow the writing direction.
|
|
6
|
+
.oc-ribbon--success / --warning / --destructive / --muted: Tone; the default is the primary color.
|
|
7
|
+
.oc-ribbon--sm / --lg: A smaller band (product card) or a larger one (document, hero image).
|
|
8
|
+
--oc-ribbon-inset: Distance from the corner to the middle of the band (2.25rem); the band length follows it.
|
|
9
|
+
--oc-ribbon-bg / --oc-ribbon-fg: Your own colors, for example a brand color or a gradient.
|
|
10
|
+
-->
|
|
11
|
+
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(12rem,1fr));gap:1rem;inline-size:100%">
|
|
12
|
+
<div class="oc-card" style="min-block-size:9rem;display:grid;place-items:center;text-align:center">
|
|
13
|
+
<span class="oc-ribbon oc-ribbon--top-start">New</span>
|
|
14
|
+
<div><strong>Top start</strong><br><small class="text-muted">--top-start</small></div>
|
|
15
|
+
</div>
|
|
16
|
+
<div class="oc-card" style="min-block-size:9rem;display:grid;place-items:center;text-align:center">
|
|
17
|
+
<span class="oc-ribbon oc-ribbon--success">Paid</span>
|
|
18
|
+
<div><strong>Top end</strong><br><small class="text-muted">default</small></div>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="oc-card" style="min-block-size:9rem;display:grid;place-items:center;text-align:center">
|
|
21
|
+
<span class="oc-ribbon oc-ribbon--bottom-start oc-ribbon--warning">Due soon</span>
|
|
22
|
+
<div><strong>Bottom start</strong><br><small class="text-muted">--bottom-start</small></div>
|
|
23
|
+
</div>
|
|
24
|
+
<div class="oc-card" style="min-block-size:9rem;display:grid;place-items:center;text-align:center">
|
|
25
|
+
<span class="oc-ribbon oc-ribbon--bottom-end oc-ribbon--destructive">Overdue</span>
|
|
26
|
+
<div><strong>Bottom end</strong><br><small class="text-muted">--bottom-end</small></div>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
<article class="oc-card" style="max-inline-size:30rem;inline-size:100%;padding:1.5rem;display:grid;gap:1rem">
|
|
30
|
+
<span class="oc-ribbon oc-ribbon--success oc-ribbon--lg">Paid</span>
|
|
31
|
+
<header style="display:grid;gap:0.25rem">
|
|
32
|
+
<span class="text-muted" style="font-size:0.8125rem">Invoice</span>
|
|
33
|
+
<strong style="font-size:1.25rem">2026-0042</strong>
|
|
34
|
+
<span style="font-size:0.875rem">Customer 1 · info@company1.example</span>
|
|
35
|
+
</header>
|
|
36
|
+
<dl style="display:grid;grid-template-columns:auto 1fr;gap:0.25rem 1rem;margin:0;font-size:0.875rem">
|
|
37
|
+
<dt class="text-muted">Invoice date</dt><dd style="margin:0">2 November 2026</dd>
|
|
38
|
+
<dt class="text-muted">Paid on</dt><dd style="margin:0">9 November 2026</dd>
|
|
39
|
+
<dt class="text-muted">Total</dt><dd style="margin:0"><strong>€ 1.210,00</strong></dd>
|
|
40
|
+
</dl>
|
|
41
|
+
</article>
|
|
42
|
+
<div style="display:flex;flex-wrap:wrap;gap:1rem">
|
|
43
|
+
<div class="oc-card" style="inline-size:9rem;block-size:7rem"><span class="oc-ribbon oc-ribbon--sm">New</span></div>
|
|
44
|
+
<div class="oc-card" style="inline-size:9rem;block-size:7rem"><span class="oc-ribbon oc-ribbon--sm oc-ribbon--destructive">Sale</span></div>
|
|
45
|
+
<div class="oc-card" style="inline-size:9rem;block-size:7rem"><span class="oc-ribbon oc-ribbon--sm oc-ribbon--muted">Draft</span></div>
|
|
46
|
+
<div class="oc-card" style="inline-size:11rem;block-size:7rem"><span class="oc-ribbon oc-ribbon--warning">Beta</span></div>
|
|
47
|
+
<div class="oc-card" style="inline-size:13rem;block-size:7rem"><span class="oc-ribbon oc-ribbon--lg" style="--oc-ribbon-bg:linear-gradient(90deg,var(--oc-accent-from,var(--oc-primary)),var(--oc-accent-to,var(--oc-primary)))">Pro</span></div>
|
|
48
|
+
</div>
|
package/snippets/sidebar.html
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
<div class="oc-sidebar-header">
|
|
19
19
|
<a class="oc-sidebar-menu-button oc-sidebar-menu-button--lg" href="#">
|
|
20
20
|
<svg class="oc-sidebar-menu-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 11l9-8 9 8v10a1 1 0 0 1-1 1h-5v-6H9v6H4a1 1 0 0 1-1-1z"/></svg>
|
|
21
|
-
<span class="oc-sidebar-menu-label"><strong>
|
|
21
|
+
<span class="oc-sidebar-menu-label"><strong>Company 1</strong></span>
|
|
22
22
|
</a>
|
|
23
23
|
</div>
|
|
24
24
|
<div class="oc-sidebar-content">
|
|
@@ -48,8 +48,8 @@
|
|
|
48
48
|
</div>
|
|
49
49
|
<div class="oc-sidebar-footer">
|
|
50
50
|
<div class="oc-user">
|
|
51
|
-
<span class="oc-avatar oc-avatar--sm">
|
|
52
|
-
<span class="oc-user-text"><span class="oc-user-name">
|
|
51
|
+
<span class="oc-avatar oc-avatar--sm">U1</span>
|
|
52
|
+
<span class="oc-user-text"><span class="oc-user-name">User 1</span><span class="oc-user-email">user1@company1.example</span></span>
|
|
53
53
|
</div>
|
|
54
54
|
</div>
|
|
55
55
|
</aside>
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<!-- OmniaUI component: spec-list - Technical specifications in named groups: label and value rows, two columns when there is room. Needs @birdycom/omniaui CSS.
|
|
2
|
+
File: packages/ui/snippets/spec-list.html | Map: specifications.
|
|
3
|
+
Class API (modifiers are extra classes / attributes on the same element):
|
|
4
|
+
.oc-spec-list: The list (a container): groups side by side from 40rem wide. --stack keeps one column.
|
|
5
|
+
.oc-spec-group / __title: A group and its title (small caps, an optional icon).
|
|
6
|
+
dl.oc-spec-group__rows > .oc-spec-row: The rows: a <div> with <dt> (label) and <dd> (value; a <small> inside is a quiet unit or note).
|
|
7
|
+
-->
|
|
8
|
+
<div class="oc-spec-list">
|
|
9
|
+
<section class="oc-spec-group">
|
|
10
|
+
<h3 class="oc-spec-group__title">Dimensions</h3>
|
|
11
|
+
<dl class="oc-spec-group__rows">
|
|
12
|
+
<div class="oc-spec-row"><dt>Height</dt><dd>52 cm</dd></div>
|
|
13
|
+
<div class="oc-spec-row"><dt>Shade diameter</dt><dd>28 cm</dd></div>
|
|
14
|
+
<div class="oc-spec-row"><dt>Base</dt><dd>18 × 18 cm</dd></div>
|
|
15
|
+
<div class="oc-spec-row"><dt>Weight</dt><dd>2.4 kg</dd></div>
|
|
16
|
+
</dl>
|
|
17
|
+
</section>
|
|
18
|
+
<section class="oc-spec-group">
|
|
19
|
+
<h3 class="oc-spec-group__title">Electrical</h3>
|
|
20
|
+
<dl class="oc-spec-group__rows">
|
|
21
|
+
<div class="oc-spec-row"><dt>Lamp holder</dt><dd>E27 <small>max. 40 W</small></dd></div>
|
|
22
|
+
<div class="oc-spec-row"><dt>Cable</dt><dd>1.8 m, with switch</dd></div>
|
|
23
|
+
<div class="oc-spec-row"><dt>Energy class</dt><dd>A+</dd></div>
|
|
24
|
+
</dl>
|
|
25
|
+
</section>
|
|
26
|
+
<section class="oc-spec-group">
|
|
27
|
+
<h3 class="oc-spec-group__title">Article</h3>
|
|
28
|
+
<dl class="oc-spec-group__rows">
|
|
29
|
+
<div class="oc-spec-row"><dt>Article number</dt><dd>PRD-0001</dd></div>
|
|
30
|
+
<div class="oc-spec-row"><dt>EAN</dt><dd>5400000000010</dd></div>
|
|
31
|
+
<div class="oc-spec-row"><dt>Warranty</dt><dd>24 months</dd></div>
|
|
32
|
+
</dl>
|
|
33
|
+
</section>
|
|
34
|
+
</div>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<!-- OmniaUI component: stock - Stock status with a colored dot: in stock, low, out of stock or on order. Needs @birdycom/omniaui CSS.
|
|
2
|
+
File: packages/ui/snippets/stock.html | Map: stock.
|
|
3
|
+
Class API (modifiers are extra classes / attributes on the same element):
|
|
4
|
+
.oc-stock: A dot and the text. Without data-level the dot is green (in stock).
|
|
5
|
+
data-level="low" / "out" / "order": Orange (only a few left), red (out of stock), blue (on order).
|
|
6
|
+
.oc-stock__count / __note: A bold number ("12") and a quiet extra ("delivered in 2–3 days").
|
|
7
|
+
.oc-stock--badge: A tinted pill for tables and product cards.
|
|
8
|
+
-->
|
|
9
|
+
<div class="flex flex-column gap-1">
|
|
10
|
+
<span class="oc-stock"><span><span class="oc-stock__count">24</span> in stock</span> <span class="oc-stock__note">· delivered in 1–2 days</span></span>
|
|
11
|
+
<span class="oc-stock" data-level="low">Only <span class="oc-stock__count">3</span> left</span>
|
|
12
|
+
<span class="oc-stock" data-level="out">Out of stock</span>
|
|
13
|
+
<span class="oc-stock" data-level="order">On order <span class="oc-stock__note">· expected 14 November</span></span>
|
|
14
|
+
<div class="flex flex-wrap gap-0.5">
|
|
15
|
+
<span class="oc-stock oc-stock--badge">In stock</span>
|
|
16
|
+
<span class="oc-stock oc-stock--badge" data-level="low">Low</span>
|
|
17
|
+
<span class="oc-stock oc-stock--badge" data-level="out">Out</span>
|
|
18
|
+
<span class="oc-stock oc-stock--badge" data-level="order">On order</span>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
@@ -14,15 +14,15 @@
|
|
|
14
14
|
</thead>
|
|
15
15
|
<tbody>
|
|
16
16
|
<tr>
|
|
17
|
-
<td>
|
|
17
|
+
<td>Contact 1</td><td>info@contact1.example</td>
|
|
18
18
|
<td class="oc-table-actions oc-table-actions--icons">
|
|
19
|
-
<a class="oc-table-actions-icon oc-table-actions-icon--primary" href="#" aria-label="View
|
|
20
|
-
<a class="oc-table-actions-icon" href="#" aria-label="Edit
|
|
21
|
-
<button class="oc-table-actions-icon oc-table-actions-icon--destructive" type="button" aria-label="Delete
|
|
19
|
+
<a class="oc-table-actions-icon oc-table-actions-icon--primary" href="#" aria-label="View Contact 1" title="View"><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="M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12z"/><circle cx="12" cy="12" r="3"/></svg></a>
|
|
20
|
+
<a class="oc-table-actions-icon" href="#" aria-label="Edit Contact 1" title="Edit"><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 20h9"/><path d="M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z"/></svg></a>
|
|
21
|
+
<button class="oc-table-actions-icon oc-table-actions-icon--destructive" type="button" aria-label="Delete Contact 1" title="Delete"><svg class="" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 6h18"/><path d="M8 6V4h8v2"/><path d="M19 6l-1 14H6L5 6"/></svg></button>
|
|
22
22
|
</td>
|
|
23
23
|
</tr>
|
|
24
24
|
<tr>
|
|
25
|
-
<td>
|
|
25
|
+
<td>Contact 2</td><td>info@contact2.example</td>
|
|
26
26
|
<td class="oc-table-actions">
|
|
27
27
|
<button class="oc-table-actions-more" type="button" popovertarget="oc-table-actions-menu-alan" aria-label="Actions for Alan"></button>
|
|
28
28
|
<div class="oc-dropdown-menu" id="oc-table-actions-menu-alan" popover>
|
package/snippets/table.html
CHANGED
|
@@ -15,12 +15,12 @@
|
|
|
15
15
|
<tbody>
|
|
16
16
|
<tr aria-selected="true">
|
|
17
17
|
<td><input class="oc-checkbox" type="checkbox" checked aria-label="Select Ada"></td>
|
|
18
|
-
<td>
|
|
18
|
+
<td>Contact 1</td><td>info@contact1.example</td><td data-numeric>1,250.00</td>
|
|
19
19
|
<td class="oc-table-actions"><a class="oc-table-row-action" href="#">Edit</a><button class="oc-table-row-action oc-table-row-action--destructive" type="button">Delete</button></td>
|
|
20
20
|
</tr>
|
|
21
21
|
<tr>
|
|
22
22
|
<td><input class="oc-checkbox" type="checkbox" aria-label="Select Alan"></td>
|
|
23
|
-
<td>
|
|
23
|
+
<td>Contact 2</td><td>info@contact2.example</td><td data-numeric>0.00</td>
|
|
24
24
|
<td class="oc-table-actions"><a class="oc-table-row-action" href="#">Edit</a><button class="oc-table-row-action oc-table-row-action--destructive" type="button">Delete</button></td>
|
|
25
25
|
</tr>
|
|
26
26
|
</tbody>
|
package/snippets/titlebar.html
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
<div class="oc-titlebar-window" style="block-size: 16rem">
|
|
13
13
|
<header class="oc-titlebar">
|
|
14
14
|
<div class="oc-titlebar__main">
|
|
15
|
-
<span class="oc-titlebar__title">
|
|
15
|
+
<span class="oc-titlebar__title">App 1</span>
|
|
16
16
|
<span class="oc-titlebar__subtitle">Usage</span>
|
|
17
17
|
</div>
|
|
18
18
|
<div class="oc-titlebar__actions">
|
package/snippets/user.html
CHANGED
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
.oc-user-email: Secondary line (truncates)
|
|
8
8
|
-->
|
|
9
9
|
<div class="oc-user">
|
|
10
|
-
<span class="oc-avatar">
|
|
10
|
+
<span class="oc-avatar">U1</span>
|
|
11
11
|
<span class="oc-user-text">
|
|
12
|
-
<span class="oc-user-name">
|
|
13
|
-
<span class="oc-user-email">
|
|
12
|
+
<span class="oc-user-name">User 1</span>
|
|
13
|
+
<span class="oc-user-email">user1@company1.example</span>
|
|
14
14
|
</span>
|
|
15
15
|
</div>
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
/* File: packages/ui/src/parts/app-column-menu.css | Map: menu panel -> title + list -> item states -> footer -> CSS-only column hiding (scope) */
|
|
2
|
-
/* Column menu: a popover with one checkbox per table column (column visibility).
|
|
3
|
-
CSS-only hiding: wrap the menu and the table in .oc-column-menu-scope and give each checkbox
|
|
4
|
-
data-col="<column number>". An unchecked box hides that column (th and td) through :has(). */
|
|
5
|
-
|
|
6
|
-
/* Panel look. Without the popover attribute it is a normal block (e.g. inside a sheet or sidebar). */
|
|
7
|
-
.oc-column-menu {
|
|
8
|
-
inline-size: 14rem;
|
|
9
|
-
max-inline-size: calc(100vw - 1rem);
|
|
10
|
-
padding: 0.375rem;
|
|
11
|
-
font-size: 0.875rem;
|
|
12
|
-
color: var(--oc-popover-foreground);
|
|
13
|
-
background: var(--oc-popover);
|
|
14
|
-
border: 1px solid var(--oc-border);
|
|
15
|
-
border-radius: var(--oc-radius);
|
|
16
|
-
box-shadow: 0 8px 24px oklch(from var(--color-black-60) l c h / 0.15);
|
|
17
|
-
}
|
|
18
|
-
/* As a popover: in the top layer, tethered to its trigger like the dropdown. */
|
|
19
|
-
.oc-column-menu[popover] {
|
|
20
|
-
position: fixed;
|
|
21
|
-
inset: auto;
|
|
22
|
-
margin: 4px 0 0;
|
|
23
|
-
position-area: block-end span-inline-start;
|
|
24
|
-
position-try-fallbacks: flip-block, flip-inline;
|
|
25
|
-
transition: opacity var(--oc-transition-fast), display var(--oc-transition-fast) allow-discrete, overlay var(--oc-transition-fast) allow-discrete;
|
|
26
|
-
}
|
|
27
|
-
.oc-column-menu[popover]:popover-open {
|
|
28
|
-
display: block;
|
|
29
|
-
@starting-style { opacity: 0; }
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/* Small heading above the list ("Columns"). */
|
|
33
|
-
.oc-column-menu-title {
|
|
34
|
-
margin: 0;
|
|
35
|
-
padding: 0.375rem 0.5rem 0.25rem;
|
|
36
|
-
font-size: 0.75rem;
|
|
37
|
-
font-weight: 600;
|
|
38
|
-
color: var(--oc-muted-foreground);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/* The list is a <form>, so a native <button type="reset"> restores the default columns. */
|
|
42
|
-
.oc-column-menu-list { display: grid; gap: 1px; margin: 0; max-block-size: 18rem; overflow-y: auto; }
|
|
43
|
-
|
|
44
|
-
/* One row: label around a checkbox and the column name. */
|
|
45
|
-
.oc-column-menu-item {
|
|
46
|
-
display: flex;
|
|
47
|
-
align-items: center;
|
|
48
|
-
gap: 0.5rem;
|
|
49
|
-
padding: 0.375rem 0.5rem;
|
|
50
|
-
border-radius: calc(var(--oc-radius) - 2px);
|
|
51
|
-
cursor: pointer;
|
|
52
|
-
user-select: none;
|
|
53
|
-
}
|
|
54
|
-
.oc-column-menu-item:hover { background: var(--oc-accent); }
|
|
55
|
-
.oc-column-menu-item:has(:focus-visible) { outline: 2px solid var(--oc-ring); outline-offset: -2px; }
|
|
56
|
-
.oc-column-menu-item input { margin: 0; accent-color: var(--oc-primary); }
|
|
57
|
-
/* Locked column (always visible): <input disabled checked>. */
|
|
58
|
-
.oc-column-menu-item:has(input:disabled) { color: var(--oc-muted-foreground); cursor: default; }
|
|
59
|
-
.oc-column-menu-item:has(input:disabled):hover { background: none; }
|
|
60
|
-
|
|
61
|
-
/* Footer row with "Reset" (type="reset") or other small buttons. */
|
|
62
|
-
.oc-column-menu-footer {
|
|
63
|
-
display: flex;
|
|
64
|
-
justify-content: flex-end;
|
|
65
|
-
gap: 0.25rem;
|
|
66
|
-
margin-block-start: 0.375rem;
|
|
67
|
-
padding-block-start: 0.375rem;
|
|
68
|
-
border-block-start: 1px solid var(--oc-border);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/* ---- CSS-only column hiding (columns 1 to 10) ---- */
|
|
72
|
-
.oc-column-menu-scope:has([data-col="1"]:not(:checked)) .oc-table :is(th, td):nth-child(1),
|
|
73
|
-
.oc-column-menu-scope:has([data-col="2"]:not(:checked)) .oc-table :is(th, td):nth-child(2),
|
|
74
|
-
.oc-column-menu-scope:has([data-col="3"]:not(:checked)) .oc-table :is(th, td):nth-child(3),
|
|
75
|
-
.oc-column-menu-scope:has([data-col="4"]:not(:checked)) .oc-table :is(th, td):nth-child(4),
|
|
76
|
-
.oc-column-menu-scope:has([data-col="5"]:not(:checked)) .oc-table :is(th, td):nth-child(5),
|
|
77
|
-
.oc-column-menu-scope:has([data-col="6"]:not(:checked)) .oc-table :is(th, td):nth-child(6),
|
|
78
|
-
.oc-column-menu-scope:has([data-col="7"]:not(:checked)) .oc-table :is(th, td):nth-child(7),
|
|
79
|
-
.oc-column-menu-scope:has([data-col="8"]:not(:checked)) .oc-table :is(th, td):nth-child(8),
|
|
80
|
-
.oc-column-menu-scope:has([data-col="9"]:not(:checked)) .oc-table :is(th, td):nth-child(9),
|
|
81
|
-
.oc-column-menu-scope:has([data-col="10"]:not(:checked)) .oc-table :is(th, td):nth-child(10) { display: none; }
|
|
82
|
-
|
|
83
|
-
@media (prefers-reduced-motion: reduce) {
|
|
84
|
-
.oc-column-menu[popover] { transition: none; }
|
|
85
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
<!-- OmniaUI component: column-menu - Column visibility checklist in a popover; hides table columns with :has() - no JavaScript. Needs @birdycom/omniaui CSS.
|
|
2
|
-
File: packages/ui/snippets/column-menu.html | Map: scope -> toolbar with trigger -> popover (title, form with checkboxes, reset) -> table
|
|
3
|
-
Class API (modifiers are extra classes / attributes on the same element):
|
|
4
|
-
.oc-column-menu-scope: Wrapper around menu + table. An unchecked [data-col="n"] hides column n (1-10) of the .oc-table inside.
|
|
5
|
-
.oc-column-menu[popover]: Popover panel, opened with button[popovertarget]
|
|
6
|
-
.oc-column-menu-title: Small heading
|
|
7
|
-
form.oc-column-menu-list: The checkbox list (a form, so button type="reset" restores the defaults)
|
|
8
|
-
.oc-column-menu-item: label + input[type=checkbox][data-col]. State: input disabled = locked column.
|
|
9
|
-
.oc-column-menu-footer: Row for Reset / Done buttons
|
|
10
|
-
Slots: title, one item per column, footer buttons
|
|
11
|
-
-->
|
|
12
|
-
<div class="oc-column-menu-scope">
|
|
13
|
-
<div class="oc-table-toolbar">
|
|
14
|
-
<span class="oc-table-toolbar-spacer"></span>
|
|
15
|
-
<button class="oc-btn oc-btn--outline oc-btn--sm" type="button" popovertarget="oc-column-menu-demo">Columns</button>
|
|
16
|
-
</div>
|
|
17
|
-
<div class="oc-column-menu" id="oc-column-menu-demo" popover>
|
|
18
|
-
<p class="oc-column-menu-title">Visible columns</p>
|
|
19
|
-
<form class="oc-column-menu-list">
|
|
20
|
-
<label class="oc-column-menu-item"><input type="checkbox" data-col="1" checked disabled> Name</label>
|
|
21
|
-
<label class="oc-column-menu-item"><input type="checkbox" data-col="2" checked> E-mail</label>
|
|
22
|
-
<label class="oc-column-menu-item"><input type="checkbox" data-col="3" checked> City</label>
|
|
23
|
-
<label class="oc-column-menu-item"><input type="checkbox" data-col="4"> Phone</label>
|
|
24
|
-
<div class="oc-column-menu-footer">
|
|
25
|
-
<button class="oc-btn oc-btn--ghost oc-btn--sm" type="reset">Reset</button>
|
|
26
|
-
</div>
|
|
27
|
-
</form>
|
|
28
|
-
</div>
|
|
29
|
-
<div class="oc-table-wrap">
|
|
30
|
-
<table class="oc-table">
|
|
31
|
-
<thead><tr><th>Name</th><th>E-mail</th><th>City</th><th>Phone</th></tr></thead>
|
|
32
|
-
<tbody>
|
|
33
|
-
<tr><td>Ada Lovelace</td><td>ada@example.com</td><td>London</td><td>+44 20 7946 0001</td></tr>
|
|
34
|
-
<tr><td>Alan Turing</td><td>alan@example.com</td><td>Manchester</td><td>+44 161 496 0002</td></tr>
|
|
35
|
-
</tbody>
|
|
36
|
-
</table>
|
|
37
|
-
</div>
|
|
38
|
-
</div>
|