@birdycom/omniaui 0.12.5 → 0.13.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/README.md +1 -1
- package/bin/lib/copy-js.mjs +12 -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 +2237 -256
- package/dist/components.min.css +1 -1
- package/dist/contact-form.d.ts +5 -0
- package/dist/contact-form.js +138 -0
- package/dist/data-table.js +135 -98
- package/dist/fly.d.ts +4 -0
- package/dist/fly.js +80 -0
- 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 +3 -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-result.css +39 -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-form.css +76 -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-lightbox.css +4 -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-base.css +33 -0
- package/dist/parts/site-brand-mark.css +56 -0
- package/dist/parts/site-cards.css +183 -0
- package/dist/parts/site-fly.css +40 -0
- package/dist/parts/site-header-variants.css +70 -0
- package/dist/parts/site-layout.css +69 -0
- package/dist/parts/site-panel.css +29 -0
- package/dist/parts/site-prose.css +13 -1
- package/dist/parts/utility-hover.css +44 -0
- package/dist/showcase.css +114 -22
- package/manifest.json +193 -9
- package/package.json +7 -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/brand-mark.html +41 -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/feature-card.html +52 -0
- package/snippets/fly-in.html +30 -0
- package/snippets/form-density.html +25 -0
- package/snippets/form-section.html +47 -0
- package/snippets/gallery.html +25 -0
- package/snippets/hover-effects.html +19 -0
- package/snippets/icon-list.html +28 -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/page-sections.html +50 -0
- package/snippets/panel.html +18 -0
- 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/result.html +31 -0
- package/snippets/ribbon.html +48 -0
- package/snippets/shot-grid.html +27 -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,44 @@
|
|
|
1
|
+
/* File: packages/ui/src/parts/utility-hover.css */
|
|
2
|
+
/* Map: smooth timing -> lift / grow / glow / none -> steady hover area -> reduced motion */
|
|
3
|
+
/* Hover effect of a card, chosen with one class on the card (any card: .oc-card, product, feature, link, price, project …):
|
|
4
|
+
.oc-hover-lift moves up (--oc-hover-lift, 6px) with a soft shadow; what a product card does by default
|
|
5
|
+
.oc-hover-grow grows a little in place (--oc-hover-scale, 1.02)
|
|
6
|
+
.oc-hover-glow stays in place, with a glow in the accent color
|
|
7
|
+
.oc-hover-none no movement (also turns off the default lift of a product or price card)
|
|
8
|
+
They share one smooth curve: --oc-hover-duration (0.45s) and --oc-hover-ease. This file loads after the cards, so the class wins. */
|
|
9
|
+
|
|
10
|
+
:is(.oc-hover-lift, .oc-hover-grow, .oc-hover-glow, .oc-product-card) {
|
|
11
|
+
transition:
|
|
12
|
+
translate var(--oc-hover-duration, 0.45s) var(--oc-hover-ease, cubic-bezier(0.22, 1, 0.36, 1)),
|
|
13
|
+
scale var(--oc-hover-duration, 0.45s) var(--oc-hover-ease, cubic-bezier(0.22, 1, 0.36, 1)),
|
|
14
|
+
box-shadow var(--oc-hover-duration, 0.45s) var(--oc-hover-ease, cubic-bezier(0.22, 1, 0.36, 1)),
|
|
15
|
+
border-color 0.35s,
|
|
16
|
+
background-color 0.35s,
|
|
17
|
+
--oc-glow 0.35s;
|
|
18
|
+
}
|
|
19
|
+
.oc-product-card:hover { translate: 0 calc(-1 * var(--oc-hover-lift, 6px)); }
|
|
20
|
+
.oc-hover-lift:hover {
|
|
21
|
+
translate: 0 calc(-1 * var(--oc-hover-lift, 6px));
|
|
22
|
+
box-shadow: 0 1.25rem 2.5rem -1.25rem oklch(from var(--color-black-60) l c h / 0.35);
|
|
23
|
+
}
|
|
24
|
+
.oc-hover-grow:hover { translate: none; scale: var(--oc-hover-scale, 1.02); }
|
|
25
|
+
.oc-hover-glow:hover {
|
|
26
|
+
translate: none;
|
|
27
|
+
box-shadow:
|
|
28
|
+
0 0 0 1px oklch(from var(--oc-accent-from, var(--oc-primary)) l c h / 0.4),
|
|
29
|
+
0 0.75rem 2.5rem -0.75rem oklch(from var(--oc-accent-from, var(--oc-primary)) l c h / 0.5);
|
|
30
|
+
}
|
|
31
|
+
.oc-hover-none:hover { translate: none; scale: none; }
|
|
32
|
+
|
|
33
|
+
/* While a card moves up, the strip it leaves keeps the hover, so a mouse at the bottom edge does not make it bounce. */
|
|
34
|
+
:where(.oc-hover-lift) { position: relative; }
|
|
35
|
+
:is(.oc-hover-lift, .oc-product-card:not([class*="oc-hover-"])):hover::before {
|
|
36
|
+
content: "";
|
|
37
|
+
position: absolute;
|
|
38
|
+
inset: 0 0 calc(-1 * var(--oc-hover-lift, 6px) - 2px);
|
|
39
|
+
z-index: -1;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@media (prefers-reduced-motion: reduce) {
|
|
43
|
+
:is(.oc-hover-lift, .oc-hover-grow, .oc-product-card):hover { translate: none; scale: none; }
|
|
44
|
+
}
|
package/dist/showcase.css
CHANGED
|
@@ -30,6 +30,9 @@
|
|
|
30
30
|
background: var(--oc-gradient-brand);
|
|
31
31
|
-webkit-background-clip: text;
|
|
32
32
|
background-clip: text;
|
|
33
|
+
/* The gradient only paints the box: keep italic or tight last letters inside it without moving the text. */
|
|
34
|
+
padding-inline-end: 0.08em;
|
|
35
|
+
margin-inline-end: -0.08em;
|
|
33
36
|
color: transparent;
|
|
34
37
|
}
|
|
35
38
|
.oc-text-accent { background-image: linear-gradient(100deg, var(--oc-accent-from), var(--oc-accent-to)); }
|
|
@@ -51,7 +54,8 @@
|
|
|
51
54
|
/* border-box: the gradient also runs under the transparent 1px border of .oc-btn; from the padding box it would
|
|
52
55
|
repeat in that border and show a thin stripe of the other end's color on both sides. */
|
|
53
56
|
background: linear-gradient(100deg, var(--oc-accent-from), var(--oc-accent-to)) border-box;
|
|
54
|
-
|
|
57
|
+
/* --oc-btn-gradient-ink: dark text on a light accent (set it with the accent). */
|
|
58
|
+
color: var(--oc-btn-gradient-ink, var(--color-white-50));
|
|
55
59
|
box-shadow: 0 10px 30px -10px var(--oc-accent-to);
|
|
56
60
|
transition: transform 0.2s var(--oc-ease-out), box-shadow 0.2s;
|
|
57
61
|
}
|
|
@@ -78,7 +82,8 @@
|
|
|
78
82
|
|
|
79
83
|
/* Backdrop: slowly drifting color blobs + fine grid behind the page.
|
|
80
84
|
<div class="oc-backdrop" aria-hidden="true"><i class="oc-backdrop__blob"></i><i class="oc-backdrop__grid"></i></div>
|
|
81
|
-
.oc-backdrop--local keeps it inside a positioned section instead of the viewport.
|
|
85
|
+
.oc-backdrop--local keeps it inside a positioned section instead of the viewport.
|
|
86
|
+
A theme sets the colors: --oc-backdrop-1, -2, -3 (the blobs), --oc-backdrop-3-opacity and --oc-backdrop-grid (the lines). */
|
|
82
87
|
.oc-backdrop {
|
|
83
88
|
position: fixed;
|
|
84
89
|
inset: 0;
|
|
@@ -99,24 +104,27 @@
|
|
|
99
104
|
opacity: var(--oc-backdrop-opacity, 0.35);
|
|
100
105
|
animation: oc-drift 24s ease-in-out infinite alternate;
|
|
101
106
|
}
|
|
102
|
-
.oc-backdrop::before { background: var(--color-blue-40); inset-block-start: -18rem; inset-inline-start: -12rem; }
|
|
103
|
-
.oc-backdrop::after { background: var(--color-purple-30); inset-block-start: 10rem; inset-inline-end: -16rem; animation-delay: -8s; }
|
|
104
|
-
.oc-backdrop > .oc-backdrop__blob { background: var(--color-teal-40); inset-block-end: -20rem; inset-inline-start: 30%; animation-delay: -16s; opacity: calc(var(--oc-backdrop-opacity, 0.35) * 0.6); }
|
|
107
|
+
.oc-backdrop::before { background: var(--oc-backdrop-1, var(--color-blue-40)); inset-block-start: -18rem; inset-inline-start: -12rem; }
|
|
108
|
+
.oc-backdrop::after { background: var(--oc-backdrop-2, var(--color-purple-30)); inset-block-start: 10rem; inset-inline-end: -16rem; animation-delay: -8s; }
|
|
109
|
+
.oc-backdrop > .oc-backdrop__blob { background: var(--oc-backdrop-3, var(--color-teal-40)); inset-block-end: -20rem; inset-inline-start: 30%; animation-delay: -16s; opacity: var(--oc-backdrop-3-opacity, calc(var(--oc-backdrop-opacity, 0.35) * 0.6)); }
|
|
105
110
|
.oc-backdrop > .oc-backdrop__grid {
|
|
106
111
|
position: absolute;
|
|
107
112
|
inset: 0;
|
|
108
113
|
background-image:
|
|
109
|
-
linear-gradient(oklch(from var(--oc-foreground) l c h / 0.05) 1px, transparent 1px),
|
|
110
|
-
linear-gradient(90deg, oklch(from var(--oc-foreground) l c h / 0.05) 1px, transparent 1px);
|
|
114
|
+
linear-gradient(var(--oc-backdrop-grid, oklch(from var(--oc-foreground) l c h / 0.05)) 1px, transparent 1px),
|
|
115
|
+
linear-gradient(90deg, var(--oc-backdrop-grid, oklch(from var(--oc-foreground) l c h / 0.05)) 1px, transparent 1px);
|
|
111
116
|
background-size: 64px 64px;
|
|
112
117
|
mask-image: radial-gradient(ellipse at 50% 0%, black 20%, transparent 70%);
|
|
113
118
|
}
|
|
114
119
|
@keyframes oc-drift { to { transform: translate(6rem, 4rem) scale(1.15); } }
|
|
115
120
|
|
|
116
121
|
/* Container, section spacing and display headings */
|
|
117
|
-
|
|
122
|
+
/* --oc-container is the width, --oc-container-gutter the room on each side on a narrower screen (1.25rem). */
|
|
123
|
+
.oc-container { inline-size: min(100% - 2 * var(--oc-container-gutter, 1.25rem), var(--oc-container, 1200px)); margin-inline: auto; }
|
|
118
124
|
.oc-section-pad { padding-block: clamp(4rem, 9vw, 7rem); }
|
|
119
125
|
.oc-section-pad--tight { padding-block: clamp(2rem, 5vw, 3.5rem); }
|
|
126
|
+
/* The hero of a home page: a little less room on top and below than a section. */
|
|
127
|
+
.oc-section-pad--hero { padding-block: clamp(3.5rem, 9vw, 7rem) clamp(3rem, 6vw, 5rem); }
|
|
120
128
|
.oc-display {
|
|
121
129
|
margin: 0 0 1.5rem;
|
|
122
130
|
font-size: clamp(2.6rem, 5.6vw, 4.6rem);
|
|
@@ -126,20 +134,67 @@
|
|
|
126
134
|
text-wrap: balance;
|
|
127
135
|
}
|
|
128
136
|
.oc-display--md { font-size: clamp(1.9rem, 4vw, 3rem); }
|
|
137
|
+
.oc-display--sm { font-size: clamp(1.5rem, 3vw, 2.1rem); }
|
|
129
138
|
.oc-lead { margin: 0 0 1rem; color: var(--oc-muted-foreground); font-size: 1.15rem; line-height: 1.65; max-inline-size: 42rem; text-wrap: pretty; }
|
|
130
|
-
|
|
139
|
+
/* Larger and narrower, for a home hero. */
|
|
140
|
+
.oc-lead--lg { font-size: 1.2rem; max-inline-size: 36rem; }
|
|
141
|
+
.oc-split { display: grid; grid-template-columns: var(--oc-split-cols, repeat(auto-fit, minmax(min(100%, 24rem), 1fr))); gap: var(--oc-split-gap, 3rem); align-items: center; }
|
|
142
|
+
/* Ratio presets (one column up to 960px): --lead makes the text column wider, --media the image column.
|
|
143
|
+
Your own ratio: set --oc-split-cols in a class (and to 1fr in a media query for small screens). */
|
|
144
|
+
.oc-split--lead { --oc-split-cols: 1.25fr 1fr; }
|
|
145
|
+
.oc-split--media { --oc-split-cols: 1fr 1.15fr; }
|
|
146
|
+
.oc-split__media { display: grid; place-items: center; }
|
|
147
|
+
/* Columns aligned at the top (a fact list next to a long text). */
|
|
148
|
+
.oc-split--top { align-items: start; }
|
|
149
|
+
/* --oc-split-cols-wide: your own ratio that only applies above 960px, so the split still stacks on a phone. */
|
|
150
|
+
@media (min-width: 961px) {
|
|
151
|
+
.oc-split { grid-template-columns: var(--oc-split-cols-wide, var(--oc-split-cols, repeat(auto-fit, minmax(min(100%, 24rem), 1fr)))); }
|
|
152
|
+
}
|
|
153
|
+
@media (max-width: 960px) {
|
|
154
|
+
.oc-split--lead, .oc-split--media { --oc-split-cols: 1fr; }
|
|
155
|
+
/* The image (a product mark, a screenshot) comes first on a small screen, aligned at the start, and an xl tile shrinks. */
|
|
156
|
+
.oc-split__media { order: -1; justify-items: start; }
|
|
157
|
+
.oc-split__media .oc-icon-tile--xl { --oc-tile-size: 7rem; }
|
|
158
|
+
}
|
|
131
159
|
|
|
132
|
-
/* Code window: editor frame with traffic lights and a file name
|
|
160
|
+
/* Code window: editor frame with traffic lights and a file name. It follows the page theme: a light frame and light
|
|
161
|
+
syntax colors in light mode, the Omnia Dark editor colors in dark mode. --dark keeps it dark on a light page (the
|
|
162
|
+
hero blocks, where it reads as an editor screenshot). */
|
|
133
163
|
.oc-code-window {
|
|
134
164
|
position: relative;
|
|
135
165
|
border: 1px solid var(--oc-border-strong);
|
|
136
166
|
border-radius: var(--oc-radius-lg);
|
|
137
|
-
background: oklch(from var(--color-shallowblue-60) l c h / 0.9);
|
|
167
|
+
background: light-dark(var(--oc-card), oklch(from var(--color-shallowblue-60) l c h / 0.9));
|
|
138
168
|
box-shadow: 0 40px 80px -30px oklch(from var(--color-black-50) l c h / 0.6);
|
|
139
169
|
backdrop-filter: blur(12px);
|
|
140
170
|
overflow: hidden;
|
|
141
|
-
|
|
171
|
+
/* Syntax colors (oc-code-syntax.css) for both themes; the code sits on the window surface. */
|
|
172
|
+
--oc-syntax-bg: transparent;
|
|
173
|
+
--oc-syntax-bg-preview: transparent;
|
|
174
|
+
--oc-syntax-fg: light-dark(var(--color-shallowblue-60), var(--color-silver-60));
|
|
175
|
+
--oc-syntax-comment: light-dark(var(--color-gray-60), var(--color-purple-2));
|
|
176
|
+
--oc-syntax-string: light-dark(var(--color-green-80), var(--color-green-2));
|
|
177
|
+
--oc-syntax-keyword: light-dark(var(--color-purple-70), var(--color-purple-2));
|
|
178
|
+
--oc-syntax-variable: light-dark(var(--color-skycyan-90), var(--color-skycyan-30));
|
|
179
|
+
--oc-syntax-function: light-dark(var(--color-skycyan-90), var(--color-skycyan-60));
|
|
180
|
+
--oc-syntax-number: light-dark(var(--color-peru-80), var(--color-peru-40));
|
|
181
|
+
--oc-syntax-operator: light-dark(var(--color-red-70), var(--color-red-50));
|
|
182
|
+
--oc-syntax-constant: light-dark(var(--color-skycyan-90), var(--color-skycyan-70));
|
|
183
|
+
--oc-syntax-storage: light-dark(var(--color-green-80), var(--color-green-2));
|
|
184
|
+
--oc-syntax-tag: light-dark(var(--color-brown-70), var(--color-brown-10));
|
|
185
|
+
--oc-syntax-attr: light-dark(var(--color-skycyan-90), var(--color-skycyan-70));
|
|
186
|
+
--oc-syntax-prop: light-dark(var(--color-green-80), var(--color-green-2));
|
|
187
|
+
--oc-syntax-value: light-dark(var(--color-teal-80), var(--color-teal-10));
|
|
188
|
+
--oc-syntax-cls: light-dark(var(--color-darkgoldenrod-80), var(--color-wheat-70));
|
|
189
|
+
--oc-syntax-id: light-dark(var(--color-skycyan-90), var(--color-skycyan-70));
|
|
190
|
+
--oc-syntax-unit: light-dark(var(--color-peru-80), var(--color-peru-40));
|
|
191
|
+
--oc-syntax-key: light-dark(var(--color-brown-70), var(--color-brown-10));
|
|
192
|
+
--oc-code-block-line-number-color: light-dark(var(--color-gray-40), oklch(from var(--color-white-2) l c h / 0.25));
|
|
142
193
|
}
|
|
194
|
+
.oc-code-window--dark { color-scheme: dark; box-shadow: 0 40px 80px -30px oklch(from var(--color-black-50) l c h / 0.6); }
|
|
195
|
+
.oc-code-window:not(.oc-code-window--dark) { box-shadow: 0 24px 60px -30px oklch(from var(--color-black-50) l c h / 0.25); }
|
|
196
|
+
/* The code block inside follows the window instead of its own always-dark theme. */
|
|
197
|
+
.oc-code-window :is(.oc-code-block, pre.code-preview) { color-scheme: inherit; }
|
|
143
198
|
.oc-code-window__bar { display: flex; align-items: center; gap: 0.45rem; padding: 0.8rem 1rem; border-block-end: 1px solid var(--oc-border); }
|
|
144
199
|
.oc-code-window__bar > i { inline-size: 0.7rem; aspect-ratio: 1; border-radius: 50%; background: var(--color-red-50); }
|
|
145
200
|
.oc-code-window__bar > i:nth-child(2) { background: var(--color-orange-60); }
|
|
@@ -188,7 +243,12 @@
|
|
|
188
243
|
@keyframes oc-float { 50% { translate: 0 -12px; } }
|
|
189
244
|
|
|
190
245
|
/* Product / feature card with hover lift and accent glow */
|
|
191
|
-
.oc-card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, var(--oc-card-min, 17rem)), 1fr)); gap: 1.25rem; }
|
|
246
|
+
.oc-card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, var(--oc-card-min, 17rem)), 1fr)); gap: var(--oc-card-gap, 1.25rem); }
|
|
247
|
+
/* Wide cards (projects, case studies): from 32rem, three in a row on a wide screen. */
|
|
248
|
+
.oc-card-grid--wide { --oc-card-min: 32rem; --oc-card-gap: 1.5rem; }
|
|
249
|
+
/* --fit: the cards stretch over the full width when there are fewer than fit in a row (auto-fit instead of auto-fill). */
|
|
250
|
+
.oc-card-grid--fit { grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--oc-card-min, 17rem)), 1fr)); }
|
|
251
|
+
@media (min-width: 1280px) { .oc-card-grid--wide { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
|
|
192
252
|
.oc-product-card {
|
|
193
253
|
position: relative;
|
|
194
254
|
display: flex;
|
|
@@ -202,7 +262,7 @@
|
|
|
202
262
|
var(--oc-surface);
|
|
203
263
|
color: var(--oc-foreground);
|
|
204
264
|
text-decoration: none;
|
|
205
|
-
transition:
|
|
265
|
+
transition: translate 0.35s var(--oc-ease-out), border-color 0.35s, --oc-glow 0.35s;
|
|
206
266
|
}
|
|
207
267
|
@property --oc-glow {
|
|
208
268
|
syntax: "<number>";
|
|
@@ -211,7 +271,8 @@
|
|
|
211
271
|
}
|
|
212
272
|
.oc-product-card:hover {
|
|
213
273
|
--oc-glow: 0.22;
|
|
214
|
-
|
|
274
|
+
/* The lift uses translate; a fly-in (.oc-reveal--fly) animates the transform, so both keep working. */
|
|
275
|
+
translate: 0 calc(-1 * var(--oc-hover-lift, 6px));
|
|
215
276
|
border-color: oklch(from var(--oc-accent-from) l c h / 0.55);
|
|
216
277
|
}
|
|
217
278
|
.oc-product-card__top { display: flex; justify-content: space-between; align-items: flex-start; margin-block-end: 0.75rem; }
|
|
@@ -267,9 +328,17 @@
|
|
|
267
328
|
}
|
|
268
329
|
.oc-stat-strip__item { padding: 2rem 1.5rem; border-inline-start: 1px solid var(--oc-border); }
|
|
269
330
|
.oc-stat-strip__item:first-child { border-inline-start: 0; }
|
|
270
|
-
.oc-stat-strip__value { font-size: clamp(2.2rem, 4vw, 3rem); font-weight: 700; line-height: 1.1; }
|
|
331
|
+
.oc-stat-strip__value { font-family: var(--oc-font-display, inherit); font-size: clamp(2.2rem, 4vw, 3rem); font-weight: 700; line-height: 1.1; }
|
|
271
332
|
.oc-stat-strip__suffix { color: var(--oc-brand-1); }
|
|
272
333
|
.oc-stat-strip__label { display: block; color: var(--oc-muted-foreground); font-size: 0.92rem; }
|
|
334
|
+
/* Plain: no lines and no background of its own, for a strip inside an .oc-band (full width) or a card. */
|
|
335
|
+
.oc-stat-strip--plain { border-block: 0; background: none; }
|
|
336
|
+
/* Four figures on a narrower screen: two rows of two instead of three and one. */
|
|
337
|
+
@media (max-width: 960px) {
|
|
338
|
+
.oc-stat-strip:has(> .oc-stat-strip__item:nth-child(4):last-child) { grid-template-columns: 1fr 1fr; }
|
|
339
|
+
.oc-stat-strip:has(> .oc-stat-strip__item:nth-child(4):last-child) > .oc-stat-strip__item:nth-child(3) { border-inline-start: 0; }
|
|
340
|
+
.oc-stat-strip:has(> .oc-stat-strip__item:nth-child(4):last-child) > .oc-stat-strip__item:nth-child(n + 3) { border-block-start: 1px solid var(--oc-border); }
|
|
341
|
+
}
|
|
273
342
|
|
|
274
343
|
/* Spotlight: large highlighted panel with copy + module list */
|
|
275
344
|
.oc-spotlight {
|
|
@@ -287,8 +356,12 @@
|
|
|
287
356
|
}
|
|
288
357
|
.oc-spotlight__title { display: flex; align-items: center; gap: 1rem; margin: 1.25rem 0 0.5rem; font-size: clamp(2.2rem, 5vw, 3.5rem); line-height: 1.1; }
|
|
289
358
|
.oc-spotlight__tagline { color: light-dark(var(--oc-accent-from), oklch(from var(--oc-accent-from) max(l, 0.72) c h)); font-size: 1.2rem; font-weight: 600; }
|
|
359
|
+
/* --oc-spotlight-cols: your own ratio above 960px (copy | modules); on a smaller screen the spotlight stacks. */
|
|
360
|
+
@media (min-width: 961px) {
|
|
361
|
+
.oc-spotlight { grid-template-columns: var(--oc-spotlight-cols, repeat(auto-fit, minmax(min(100%, 22rem), 1fr))); }
|
|
362
|
+
}
|
|
290
363
|
.oc-spotlight__modules { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 12rem), 1fr)); gap: 0.75rem; margin: 0; padding: 0; list-style: none; }
|
|
291
|
-
.oc-spotlight__modules > li { display: flex; align-items: center; gap: 0.75rem; padding: 0.9rem; border: 1px solid var(--oc-border); border-radius: var(--oc-radius-md); background: var(--oc-surface); font-size: 0.95rem; }
|
|
364
|
+
.oc-spotlight__modules > li { display: flex; align-items: center; gap: 0.75rem; padding: 0.9rem; border: 1px solid var(--oc-border); border-radius: var(--oc-radius-md); background: var(--oc-spotlight-module-bg, var(--oc-surface)); font-size: 0.95rem; }
|
|
292
365
|
|
|
293
366
|
/* Steps: numbered process with a gradient tick (numbers come from a CSS counter) */
|
|
294
367
|
.oc-steps { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 14rem), 1fr)); gap: 1.25rem; margin: 0; padding: 0; list-style: none; counter-reset: oc-step; }
|
|
@@ -321,6 +394,9 @@
|
|
|
321
394
|
/* Tag list (tech stack) and check list */
|
|
322
395
|
.oc-tag-list { display: flex; flex-wrap: wrap; gap: 0.6rem; margin: 0; padding: 0; list-style: none; }
|
|
323
396
|
.oc-tag-list > li { padding: 0.55rem 1.1rem; border: 1px solid oklch(from var(--oc-accent-from) l c h / 0.35); border-radius: 999px; background: oklch(from var(--oc-accent-from) l c h / 0.1); font-family: var(--oc-font-mono); font-size: 0.88rem; }
|
|
397
|
+
/* Neutral chips (no accent color) and large chips in the display font, e.g. a strip of brand names. */
|
|
398
|
+
.oc-tag-list--neutral > li { border-color: var(--oc-border); background: var(--oc-surface); color: var(--oc-foreground); }
|
|
399
|
+
.oc-tag-list--lg > li { padding: 0.45rem 1rem; font-family: var(--oc-font-display, inherit); font-size: 1rem; font-weight: 700; letter-spacing: 0.02em; }
|
|
324
400
|
.oc-check-list { display: grid; gap: 0.5rem; margin: 1.1rem 0 0; padding: 0; list-style: none; font-size: 0.93rem; }
|
|
325
401
|
.oc-check-list > li { display: flex; gap: 0.5rem; align-items: baseline; }
|
|
326
402
|
.oc-check-list > li::before { content: "✓"; color: var(--oc-brand-1); font-weight: 700; }
|
|
@@ -355,6 +431,8 @@
|
|
|
355
431
|
.oc-site-header__nav a:not(.oc-btn):hover,
|
|
356
432
|
.oc-site-header__nav a[aria-current="page"] { color: var(--oc-foreground); }
|
|
357
433
|
.oc-site-header__toggle { display: none; padding: 0.5rem 0.7rem; border: 1px solid var(--oc-border); border-radius: var(--oc-radius-md); background: var(--oc-surface); color: var(--oc-foreground); cursor: pointer; }
|
|
434
|
+
/* The icon in the menu button is a block, so the button is as tall as a line of text (no inline gap under it). */
|
|
435
|
+
.oc-site-header__toggle :is(svg, img, iconify-icon, .oc-icon) { display: block; }
|
|
358
436
|
@media (min-width: 861px) {
|
|
359
437
|
/* Desktop: the popover nav is always visible in the header bar. */
|
|
360
438
|
.oc-site-header__nav[popover] { display: flex; }
|
|
@@ -379,6 +457,8 @@
|
|
|
379
457
|
backdrop-filter: blur(16px);
|
|
380
458
|
}
|
|
381
459
|
.oc-site-header__nav[popover] a:not(.oc-btn) { padding: 0.75rem 0; font-size: 1.1rem; }
|
|
460
|
+
/* The call to action (.oc-site-header__cta, a button) gets room above it in the open menu. */
|
|
461
|
+
.oc-site-header__cta { margin-block-start: 0.75rem; }
|
|
382
462
|
}
|
|
383
463
|
|
|
384
464
|
/* Site footer: brand column + link columns + bottom bar */
|
|
@@ -386,21 +466,33 @@
|
|
|
386
466
|
margin-block-start: 4rem;
|
|
387
467
|
padding-block-start: 4rem;
|
|
388
468
|
border-block-start: 1px solid var(--oc-border);
|
|
389
|
-
background: linear-gradient(to bottom, transparent, var(--oc-surface-strong));
|
|
469
|
+
background: var(--oc-footer-bg, linear-gradient(to bottom, transparent, var(--oc-surface-strong)));
|
|
390
470
|
color: var(--oc-muted-foreground);
|
|
391
471
|
font-size: 0.95rem;
|
|
472
|
+
container-type: inline-size;
|
|
392
473
|
}
|
|
393
|
-
|
|
474
|
+
/* Columns: --oc-footer-cols (about + 3 link columns). Footer narrower than 66rem (about a 1060px screen):
|
|
475
|
+
--oc-footer-cols-md columns (3) with the about column over the full width; narrower than 54rem: two columns.
|
|
476
|
+
Container queries on the footer, so a footer in a narrow column or a preview follows its own width. */
|
|
477
|
+
.oc-site-footer__grid { display: grid; grid-template-columns: var(--oc-footer-cols, 1.6fr repeat(3, 1fr)); gap: 2.5rem; }
|
|
394
478
|
.oc-site-footer__about p { margin-block: 1rem 0; max-inline-size: 22rem; }
|
|
395
479
|
.oc-site-footer__title { margin: 0 0 1rem; color: var(--oc-foreground); font-size: 0.95rem; font-weight: 700; }
|
|
396
480
|
.oc-site-footer__list { display: flex; flex-direction: column; gap: 0.5rem; margin: 0; padding: 0; list-style: none; font-style: normal; }
|
|
397
481
|
.oc-site-footer a { color: inherit; text-decoration: none; }
|
|
398
482
|
.oc-site-footer a:hover { color: var(--oc-foreground); }
|
|
399
|
-
.oc-site-footer__bottom { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 1rem; margin-block-start: 3rem; padding-block: 1.5rem; border-block-start: 1px solid var(--oc-border); font-size: 0.85rem; }
|
|
400
|
-
|
|
401
|
-
|
|
483
|
+
.oc-site-footer__bottom { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 1rem; margin-block-start: 3rem; padding-block: 1.5rem; border-block-start: 1px solid var(--oc-border); color: var(--oc-footer-bottom-color, inherit); font-size: 0.85rem; }
|
|
484
|
+
/* A second title further down in a column (e.g. "Tools" under the projects). */
|
|
485
|
+
.oc-site-footer__subtitle { margin-block-start: 1.75rem; }
|
|
486
|
+
/* Legal links in the bottom bar (Terms · Privacy · Cookies) and the build number after them. */
|
|
487
|
+
.oc-site-footer__legal { display: flex; flex-wrap: wrap; gap: 0.5rem 1.25rem; margin: 0; padding: 0; list-style: none; }
|
|
488
|
+
.oc-site-footer__build { opacity: 0.7; font-variant-numeric: tabular-nums; }
|
|
489
|
+
@container (max-width: 66rem) {
|
|
490
|
+
.oc-site-footer__grid { grid-template-columns: repeat(var(--oc-footer-cols-md, 3), minmax(0, 1fr)); }
|
|
402
491
|
.oc-site-footer__about { grid-column: 1 / -1; }
|
|
403
492
|
}
|
|
493
|
+
@container (max-width: 54rem) {
|
|
494
|
+
.oc-site-footer__grid { grid-template-columns: 1fr 1fr; }
|
|
495
|
+
}
|
|
404
496
|
|
|
405
497
|
/* Reveal on scroll: elements slide in when they enter the viewport (scroll-driven, no JS; visible without support) */
|
|
406
498
|
@supports (animation-timeline: view()) {
|
package/manifest.json
CHANGED
|
@@ -688,14 +688,6 @@
|
|
|
688
688
|
"@birdycom/omniaui"
|
|
689
689
|
]
|
|
690
690
|
},
|
|
691
|
-
{
|
|
692
|
-
"name": "column-menu",
|
|
693
|
-
"file": "snippets/column-menu.html",
|
|
694
|
-
"description": "Column visibility checklist in a popover; hides table columns with :has() - no JavaScript",
|
|
695
|
-
"requires": [
|
|
696
|
-
"@birdycom/omniaui"
|
|
697
|
-
]
|
|
698
|
-
},
|
|
699
691
|
{
|
|
700
692
|
"name": "confirm-dialog",
|
|
701
693
|
"file": "snippets/confirm-dialog.html",
|
|
@@ -1035,7 +1027,7 @@
|
|
|
1035
1027
|
{
|
|
1036
1028
|
"name": "data-table",
|
|
1037
1029
|
"file": "snippets/data-table.html",
|
|
1038
|
-
"description": "List table
|
|
1030
|
+
"description": "List table for business apps: search, sort, pages, trash filter and bulk actions",
|
|
1039
1031
|
"requires": [
|
|
1040
1032
|
"@birdycom/omniaui"
|
|
1041
1033
|
]
|
|
@@ -1159,6 +1151,198 @@
|
|
|
1159
1151
|
"requires": [
|
|
1160
1152
|
"@birdycom/omniaui"
|
|
1161
1153
|
]
|
|
1154
|
+
},
|
|
1155
|
+
{
|
|
1156
|
+
"name": "avatar-picker",
|
|
1157
|
+
"file": "snippets/avatar-picker.html",
|
|
1158
|
+
"description": "Avatar or company logo with a preview, Upload and Remove, and drag and drop",
|
|
1159
|
+
"requires": [
|
|
1160
|
+
"@birdycom/omniaui"
|
|
1161
|
+
]
|
|
1162
|
+
},
|
|
1163
|
+
{
|
|
1164
|
+
"name": "barcode",
|
|
1165
|
+
"file": "snippets/barcode.html",
|
|
1166
|
+
"description": "EAN-13, EAN-8, UPC-A or Code 128 drawn as SVG from a value, no dependency",
|
|
1167
|
+
"requires": [
|
|
1168
|
+
"@birdycom/omniaui"
|
|
1169
|
+
]
|
|
1170
|
+
},
|
|
1171
|
+
{
|
|
1172
|
+
"name": "date-field",
|
|
1173
|
+
"file": "snippets/date-field.html",
|
|
1174
|
+
"description": "Native date input with a calendar icon zone and the ISO week (Week 45) next to it",
|
|
1175
|
+
"requires": [
|
|
1176
|
+
"@birdycom/omniaui"
|
|
1177
|
+
]
|
|
1178
|
+
},
|
|
1179
|
+
{
|
|
1180
|
+
"name": "form-density",
|
|
1181
|
+
"file": "snippets/form-density.html",
|
|
1182
|
+
"description": "Compact forms: .oc-density-compact makes every control in it 2rem high instead of 2.5rem",
|
|
1183
|
+
"requires": [
|
|
1184
|
+
"@birdycom/omniaui"
|
|
1185
|
+
]
|
|
1186
|
+
},
|
|
1187
|
+
{
|
|
1188
|
+
"name": "form-section",
|
|
1189
|
+
"file": "snippets/form-section.html",
|
|
1190
|
+
"description": "Collapsible part of a long form with an icon, title, hint and status; red edge while a field inside is invalid",
|
|
1191
|
+
"requires": [
|
|
1192
|
+
"@birdycom/omniaui"
|
|
1193
|
+
]
|
|
1194
|
+
},
|
|
1195
|
+
{
|
|
1196
|
+
"name": "meter-row",
|
|
1197
|
+
"file": "snippets/meter-row.html",
|
|
1198
|
+
"description": "Usage line with a label, the amount as text, a colored bar and when it resets",
|
|
1199
|
+
"requires": [
|
|
1200
|
+
"@birdycom/omniaui"
|
|
1201
|
+
]
|
|
1202
|
+
},
|
|
1203
|
+
{
|
|
1204
|
+
"name": "name-card",
|
|
1205
|
+
"file": "snippets/name-card.html",
|
|
1206
|
+
"description": "Collapsible card with a name, rename pencil, amount and delete button; nests for titles and parts",
|
|
1207
|
+
"requires": [
|
|
1208
|
+
"@birdycom/omniaui"
|
|
1209
|
+
]
|
|
1210
|
+
},
|
|
1211
|
+
{
|
|
1212
|
+
"name": "gallery",
|
|
1213
|
+
"file": "snippets/gallery.html",
|
|
1214
|
+
"description": "Product photos with thumbnails: one large photo and a row (or column) of thumbnails. No JavaScript",
|
|
1215
|
+
"requires": [
|
|
1216
|
+
"@birdycom/omniaui"
|
|
1217
|
+
]
|
|
1218
|
+
},
|
|
1219
|
+
{
|
|
1220
|
+
"name": "price",
|
|
1221
|
+
"file": "snippets/price.html",
|
|
1222
|
+
"description": "A price with old price, discount, VAT note and the amount incl. or excl. VAT",
|
|
1223
|
+
"requires": [
|
|
1224
|
+
"@birdycom/omniaui"
|
|
1225
|
+
]
|
|
1226
|
+
},
|
|
1227
|
+
{
|
|
1228
|
+
"name": "quantity",
|
|
1229
|
+
"file": "snippets/quantity.html",
|
|
1230
|
+
"description": "Number field with minus and plus buttons for amounts in carts, orders and stock",
|
|
1231
|
+
"requires": [
|
|
1232
|
+
"@birdycom/omniaui"
|
|
1233
|
+
]
|
|
1234
|
+
},
|
|
1235
|
+
{
|
|
1236
|
+
"name": "rating",
|
|
1237
|
+
"file": "snippets/rating.html",
|
|
1238
|
+
"description": "Star rating: show a score with halves, or let people pick 1 to 5 stars. No JavaScript",
|
|
1239
|
+
"requires": [
|
|
1240
|
+
"@birdycom/omniaui"
|
|
1241
|
+
]
|
|
1242
|
+
},
|
|
1243
|
+
{
|
|
1244
|
+
"name": "spec-list",
|
|
1245
|
+
"file": "snippets/spec-list.html",
|
|
1246
|
+
"description": "Technical specifications in named groups: label and value rows, two columns when there is room",
|
|
1247
|
+
"requires": [
|
|
1248
|
+
"@birdycom/omniaui"
|
|
1249
|
+
]
|
|
1250
|
+
},
|
|
1251
|
+
{
|
|
1252
|
+
"name": "stock",
|
|
1253
|
+
"file": "snippets/stock.html",
|
|
1254
|
+
"description": "Stock status with a colored dot: in stock, low, out of stock or on order",
|
|
1255
|
+
"requires": [
|
|
1256
|
+
"@birdycom/omniaui"
|
|
1257
|
+
]
|
|
1258
|
+
},
|
|
1259
|
+
{
|
|
1260
|
+
"name": "ribbon",
|
|
1261
|
+
"file": "snippets/ribbon.html",
|
|
1262
|
+
"description": "A diagonal band across a corner of a card, image or document: Paid, New, Sale. Pick the corner and the tone",
|
|
1263
|
+
"requires": [
|
|
1264
|
+
"@birdycom/omniaui"
|
|
1265
|
+
]
|
|
1266
|
+
},
|
|
1267
|
+
{
|
|
1268
|
+
"name": "lazy",
|
|
1269
|
+
"file": "snippets/lazy.html",
|
|
1270
|
+
"description": "Images that load when they come near the screen, with a shimmer or a blurred preview until they are there, and sections drawn only when needed",
|
|
1271
|
+
"requires": [
|
|
1272
|
+
"@birdycom/omniaui"
|
|
1273
|
+
]
|
|
1274
|
+
},
|
|
1275
|
+
{
|
|
1276
|
+
"name": "panel",
|
|
1277
|
+
"file": "snippets/panel.html",
|
|
1278
|
+
"description": "A framed panel on the page for a form, a call to action or a feature: card background, strong border, large radius and an optional soft glow in a corner",
|
|
1279
|
+
"requires": [
|
|
1280
|
+
"@birdycom/omniaui"
|
|
1281
|
+
]
|
|
1282
|
+
},
|
|
1283
|
+
{
|
|
1284
|
+
"name": "result",
|
|
1285
|
+
"file": "snippets/result.html",
|
|
1286
|
+
"description": "The outcome of an action in the place where the form was: an icon tile, a title, a short text and a button such as Send another message",
|
|
1287
|
+
"requires": [
|
|
1288
|
+
"@birdycom/omniaui"
|
|
1289
|
+
]
|
|
1290
|
+
},
|
|
1291
|
+
{
|
|
1292
|
+
"name": "brand-mark",
|
|
1293
|
+
"file": "snippets/brand-mark.html",
|
|
1294
|
+
"description": "A logo from an icon and text: the mark with a glow in the brand color, a word mark with one part in the brand gradient and a small tagline",
|
|
1295
|
+
"requires": [
|
|
1296
|
+
"@birdycom/omniaui"
|
|
1297
|
+
]
|
|
1298
|
+
},
|
|
1299
|
+
{
|
|
1300
|
+
"name": "page-sections",
|
|
1301
|
+
"file": "snippets/page-sections.html",
|
|
1302
|
+
"description": "Building blocks for the pages of a company site: the header of an inner page, a section head, a row of buttons, a group title with a count, a full-width band and a meta line",
|
|
1303
|
+
"requires": [
|
|
1304
|
+
"@birdycom/omniaui"
|
|
1305
|
+
]
|
|
1306
|
+
},
|
|
1307
|
+
{
|
|
1308
|
+
"name": "feature-card",
|
|
1309
|
+
"file": "snippets/feature-card.html",
|
|
1310
|
+
"description": "Cards for services and features (icon tile, title, text) and cards that are links, in a grid whose column width you set",
|
|
1311
|
+
"requires": [
|
|
1312
|
+
"@birdycom/omniaui"
|
|
1313
|
+
]
|
|
1314
|
+
},
|
|
1315
|
+
{
|
|
1316
|
+
"name": "icon-list",
|
|
1317
|
+
"file": "snippets/icon-list.html",
|
|
1318
|
+
"description": "Lists for a company site: rows with an icon in a frame, points with an icon tile, a title and a text, and a list with markers in the accent color",
|
|
1319
|
+
"requires": [
|
|
1320
|
+
"@birdycom/omniaui"
|
|
1321
|
+
]
|
|
1322
|
+
},
|
|
1323
|
+
{
|
|
1324
|
+
"name": "shot-grid",
|
|
1325
|
+
"file": "snippets/shot-grid.html",
|
|
1326
|
+
"description": "A grid of screenshots with a caption that open in the lightbox, and a browser frame with a glow in the accent color and a product mark on it",
|
|
1327
|
+
"requires": [
|
|
1328
|
+
"@birdycom/omniaui"
|
|
1329
|
+
]
|
|
1330
|
+
},
|
|
1331
|
+
{
|
|
1332
|
+
"name": "fly-in",
|
|
1333
|
+
"file": "snippets/fly-in.html",
|
|
1334
|
+
"description": "Cards that fly in from the middle of their row when they scroll into view, with a hover lift that keeps working, and a New badge in a product card",
|
|
1335
|
+
"requires": [
|
|
1336
|
+
"@birdycom/omniaui"
|
|
1337
|
+
]
|
|
1338
|
+
},
|
|
1339
|
+
{
|
|
1340
|
+
"name": "hover-effects",
|
|
1341
|
+
"file": "snippets/hover-effects.html",
|
|
1342
|
+
"description": "Choose how a card reacts to the mouse: lift, grow, glow or stay still, with one smooth curve for all of them",
|
|
1343
|
+
"requires": [
|
|
1344
|
+
"@birdycom/omniaui"
|
|
1345
|
+
]
|
|
1162
1346
|
}
|
|
1163
1347
|
]
|
|
1164
1348
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@birdycom/omniaui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0",
|
|
4
4
|
"description": "OmniaUI components: CSS-first UI built on native HTML (dialog, popover, details) with light-dark() theming — no JavaScript required. Includes the omniaui CLI (add/list).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -30,6 +30,11 @@
|
|
|
30
30
|
"./snippets/*": "./snippets/*",
|
|
31
31
|
"./data-table.js": "./dist/data-table.js",
|
|
32
32
|
"./carousel.js": "./dist/carousel.js",
|
|
33
|
+
"./barcode.js": "./dist/barcode.js",
|
|
34
|
+
"./form-extras.js": "./dist/form-extras.js",
|
|
35
|
+
"./lazy.js": "./dist/lazy.js",
|
|
36
|
+
"./contact-form.js": "./dist/contact-form.js",
|
|
37
|
+
"./fly.js": "./dist/fly.js",
|
|
33
38
|
"./manifest.json": "./manifest.json",
|
|
34
39
|
"./package.json": "./package.json"
|
|
35
40
|
},
|
|
@@ -57,7 +62,7 @@
|
|
|
57
62
|
"omniaui": "./bin/omniaui.mjs"
|
|
58
63
|
},
|
|
59
64
|
"peerDependencies": {
|
|
60
|
-
"@birdycom/omniacss": "^0.
|
|
65
|
+
"@birdycom/omniacss": "^0.13.0"
|
|
61
66
|
},
|
|
62
67
|
"peerDependenciesMeta": {
|
|
63
68
|
"@birdycom/omniacss": {
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
<div class="oc-accordion oc-accordion--accent">
|
|
12
12
|
<details class="oc-accordion-item" name="oc-accent-demo" open>
|
|
13
13
|
<summary class="oc-accordion-trigger">Customer details <span class="oc-accordion-accent-meta">Complete</span></summary>
|
|
14
|
-
<div class="oc-accordion-content">
|
|
14
|
+
<div class="oc-accordion-content">Contact 1, Main street 12, Ghent.</div>
|
|
15
15
|
</details>
|
|
16
16
|
<details class="oc-accordion-item oc-accent--violet" name="oc-accent-demo">
|
|
17
17
|
<summary class="oc-accordion-trigger">Materials <span class="oc-accordion-accent-meta">4 items</span></summary>
|
package/snippets/attachment.html
CHANGED
|
@@ -13,10 +13,10 @@
|
|
|
13
13
|
-->
|
|
14
14
|
<div style="display:grid;gap:1.25rem;inline-size:100%;max-inline-size:40rem">
|
|
15
15
|
<ul class="oc-attachment-list" aria-label="Files in this message">
|
|
16
|
-
<li><a class="oc-attachment oc-attachment--pdf" href="#quote.pdf"
|
|
17
|
-
<li><a class="oc-attachment oc-attachment--sheet" href="#measurements.xlsx"
|
|
18
|
-
<li><a class="oc-attachment oc-attachment--doc" href="#contract.docx"
|
|
19
|
-
<li><a class="oc-attachment oc-attachment--zip" href="#plans.zip"
|
|
16
|
+
<li><a class="oc-attachment oc-attachment--pdf" href="#quote.pdf"><span class="oc-attachment__icon" aria-hidden="true">PDF</span><span class="oc-attachment__body"><span class="oc-attachment__name">Quote kitchen Project 1 v2.pdf</span><span class="oc-attachment__size">1.2 MB</span></span></a></li>
|
|
17
|
+
<li><a class="oc-attachment oc-attachment--sheet" href="#measurements.xlsx"><span class="oc-attachment__icon" aria-hidden="true">XLS</span><span class="oc-attachment__body"><span class="oc-attachment__name">Measurements ground floor.xlsx</span><span class="oc-attachment__size">86 KB</span></span></a></li>
|
|
18
|
+
<li><a class="oc-attachment oc-attachment--doc" href="#contract.docx"><span class="oc-attachment__icon" aria-hidden="true">DOC</span><span class="oc-attachment__body"><span class="oc-attachment__name">Contract addendum.docx</span><span class="oc-attachment__size">240 KB</span></span></a></li>
|
|
19
|
+
<li><a class="oc-attachment oc-attachment--zip" href="#plans.zip"><span class="oc-attachment__icon" aria-hidden="true">ZIP</span><span class="oc-attachment__body"><span class="oc-attachment__name">Plans architect.zip</span><span class="oc-attachment__size">14.8 MB</span></span></a></li>
|
|
20
20
|
</ul>
|
|
21
21
|
|
|
22
22
|
<a class="oc-attachment-image" href="#worktop-sample.jpg">
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<!-- OmniaUI component: avatar-picker - Avatar or company logo with a preview, Upload and Remove, and drag and drop. Needs @birdycom/omniaui CSS.
|
|
2
|
+
File: packages/ui/snippets/avatar-picker.html | Map: avatar picker demo markup. Behaviour: form-extras.js.
|
|
3
|
+
Class API (modifiers are extra classes / attributes on the same element):
|
|
4
|
+
.oc-avatar-picker: Preview and text side by side.
|
|
5
|
+
label.oc-avatar-picker__preview: The preview; clicking it opens the file dialog (the file input fills it, invisible).
|
|
6
|
+
[data-oc-initials]: Shown until an image is picked.
|
|
7
|
+
[data-oc-avatar-upload] / [data-oc-avatar-remove]: Open the dialog / go back to the initials. Remove only shows while there is an image.
|
|
8
|
+
.oc-avatar-picker--square / --logo: Rounded square; --logo fits the whole image on white (no crop).
|
|
9
|
+
oc-avatar-change: Event with detail.file (the File, or null after Remove).
|
|
10
|
+
-->
|
|
11
|
+
<div style="display:grid;gap:1.5rem">
|
|
12
|
+
<div class="oc-avatar-picker">
|
|
13
|
+
<label class="oc-avatar-picker__preview" for="oc-avatar-me" title="Choose an image">
|
|
14
|
+
<span data-oc-initials>C1</span>
|
|
15
|
+
<input class="oc-avatar-picker__file" id="oc-avatar-me" type="file" accept="image/*">
|
|
16
|
+
</label>
|
|
17
|
+
<div class="oc-avatar-picker__text">
|
|
18
|
+
<span class="oc-avatar-picker__label">Profile picture</span>
|
|
19
|
+
<span class="oc-avatar-picker__hint">PNG or JPG, at least 256 × 256 px. Drop an image on the circle.</span>
|
|
20
|
+
<div class="oc-avatar-picker__actions">
|
|
21
|
+
<button type="button" class="oc-btn oc-btn--outline oc-btn--sm" data-oc-avatar-upload><iconify-icon icon="mdi:upload" aria-hidden="true"></iconify-icon>Upload</button>
|
|
22
|
+
<button type="button" class="oc-btn oc-btn--ghost oc-btn--sm" data-oc-avatar-remove><iconify-icon icon="mdi:close" aria-hidden="true"></iconify-icon>Remove</button>
|
|
23
|
+
</div>
|
|
24
|
+
</div>
|
|
25
|
+
</div>
|
|
26
|
+
<div class="oc-avatar-picker oc-avatar-picker--square oc-avatar-picker--logo">
|
|
27
|
+
<label class="oc-avatar-picker__preview" for="oc-logo-company" title="Choose an image">
|
|
28
|
+
<span data-oc-initials>CO</span>
|
|
29
|
+
<input class="oc-avatar-picker__file" id="oc-logo-company" type="file" accept="image/*">
|
|
30
|
+
</label>
|
|
31
|
+
<div class="oc-avatar-picker__text">
|
|
32
|
+
<span class="oc-avatar-picker__label">Company logo</span>
|
|
33
|
+
<span class="oc-avatar-picker__hint">SVG or PNG on a transparent background.</span>
|
|
34
|
+
<div class="oc-avatar-picker__actions">
|
|
35
|
+
<button type="button" class="oc-btn oc-btn--outline oc-btn--sm" data-oc-avatar-upload><iconify-icon icon="mdi:upload" aria-hidden="true"></iconify-icon>Upload</button>
|
|
36
|
+
<button type="button" class="oc-btn oc-btn--ghost oc-btn--sm" data-oc-avatar-remove><iconify-icon icon="mdi:close" aria-hidden="true"></iconify-icon>Remove</button>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|