overlapui 0.0.0-stage → 1.0.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 +523 -2
- package/overlapui.css +456 -0
- package/overlapui.fscss +381 -0
- package/overlapui.standalone.fscss +20 -0
- package/package.json +46 -4
- package/templates/README.md +9 -0
- package/templates/stacks/Index.html +163 -0
- package/templates/stacks/README.md +56 -0
- package/templates/stacks/stacks.fscss +242 -0
package/overlapui.fscss
ADDED
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
@define ou-root(root:root){`
|
|
2
|
+
:@use(root) {
|
|
3
|
+
--ou-ring: #17203a;
|
|
4
|
+
--ou-ease: cubic-bezier(.3, 1.3, .5, 1);
|
|
5
|
+
--ou-time: .35s;
|
|
6
|
+
|
|
7
|
+
/* avatar-overlap */
|
|
8
|
+
--ou-size: 44px;
|
|
9
|
+
--ou-overlap: -14px;
|
|
10
|
+
--ou-gap: 6px;
|
|
11
|
+
--ou-c: #f59e0b;
|
|
12
|
+
--ou-letter: #fff;
|
|
13
|
+
--ou-ring-width: 3px;
|
|
14
|
+
|
|
15
|
+
/* card-overlap */
|
|
16
|
+
--ou-peek: 34px;
|
|
17
|
+
--ou-card-h: 76px;
|
|
18
|
+
--ou-card-gap: 10px;
|
|
19
|
+
--ou-card-bg: #1f2a48;
|
|
20
|
+
--ou-card-color: #cbd5ee;
|
|
21
|
+
--ou-card-title: #fff;
|
|
22
|
+
--ou-card-radius: 16px;
|
|
23
|
+
--ou-card-pad-y: 10px;
|
|
24
|
+
--ou-card-pad-x: 14px;
|
|
25
|
+
--ou-card-thumb: 48px;
|
|
26
|
+
--ou-card-thumb-radius: 12px;
|
|
27
|
+
|
|
28
|
+
/* img-overlap */
|
|
29
|
+
--ou-img: 96px;
|
|
30
|
+
--ou-img-overlap: -52px;
|
|
31
|
+
--ou-img-gap: 12px;
|
|
32
|
+
--ou-img-radius: 18px;
|
|
33
|
+
--ou-img-border: 3px;
|
|
34
|
+
--ou-img-tilt: -5deg;
|
|
35
|
+
--ou-img-tilt-even: 4deg;
|
|
36
|
+
|
|
37
|
+
/* circle-overlap */
|
|
38
|
+
--ou-item: 48px;
|
|
39
|
+
--ou-r: 86px;
|
|
40
|
+
--ou-center-bg: #ec4899;
|
|
41
|
+
--n: 6;
|
|
42
|
+
}
|
|
43
|
+
`}
|
|
44
|
+
|
|
45
|
+
@define ou-avatar-size(size:44px, overlap:-14px){
|
|
46
|
+
--ou-size: @use(size);
|
|
47
|
+
--ou-overlap: @use(overlap);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@define ou-card-size(peek:34px, height:76px){
|
|
51
|
+
--ou-peek: @use(peek);
|
|
52
|
+
--ou-card-h: @use(height);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@define ou-img-size(size:96px, overlap:-52px){
|
|
56
|
+
--ou-img: @use(size);
|
|
57
|
+
--ou-img-overlap: @use(overlap);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@define ou-circle-size(item:48px, radius:86px){
|
|
61
|
+
--ou-item: @use(item);
|
|
62
|
+
--ou-r: @use(radius);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
@define ou-avatar-colors(){`
|
|
66
|
+
@arr ou-colors[
|
|
67
|
+
#ef4444, #f97316, #f59e0b, #eab308,
|
|
68
|
+
#84cc16, #22c55e, #10b981, #14b8a6,
|
|
69
|
+
#06b6d4, #0ea5e9, #3b82f6, #6366f1,
|
|
70
|
+
#8b5cf6, #a855f7, #d946ef, #ec4899,
|
|
71
|
+
#f43f5e, #fb7185, #fda4af, #fdba74,
|
|
72
|
+
#fde047, #bef264, #86efac, #5eead4,
|
|
73
|
+
#67e8f9, #7dd3fc,
|
|
74
|
+
#94a3b8, #64748b, #475569, #334155,
|
|
75
|
+
#1e293b, #0f172a, #78716c, #57534e,
|
|
76
|
+
#44403c, #292524,
|
|
77
|
+
#9ca3af
|
|
78
|
+
]
|
|
79
|
+
|
|
80
|
+
@arr ou-idx[count(26, 1)]
|
|
81
|
+
@arr ou-num-idx[27, 28, 29, 30, 31, 32, 33, 34, 35, 36]
|
|
82
|
+
@arr ou-low-letters[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z]
|
|
83
|
+
@arr ou-letters[a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z]
|
|
84
|
+
`}
|
|
85
|
+
|
|
86
|
+
@define avatar-overlap(sel:.avatar-overlap){`
|
|
87
|
+
@ou-avatar-colors()
|
|
88
|
+
|
|
89
|
+
@use(sel) {
|
|
90
|
+
display: flex;
|
|
91
|
+
align-items: center;
|
|
92
|
+
width: max-content;
|
|
93
|
+
margin: 0;
|
|
94
|
+
padding: 0;
|
|
95
|
+
list-style: none;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
@use(sel) > li {
|
|
99
|
+
position: relative;
|
|
100
|
+
display: grid;
|
|
101
|
+
place-items: center;
|
|
102
|
+
flex: none;
|
|
103
|
+
width: var(--ou-size);
|
|
104
|
+
height: var(--ou-size);
|
|
105
|
+
margin-left: var(--ou-overlap);
|
|
106
|
+
border-radius: 50%;
|
|
107
|
+
background: var(--ou-c);
|
|
108
|
+
box-shadow: 0 0 0 var(--ou-ring-width) var(--ou-ring);
|
|
109
|
+
font-size: 0;
|
|
110
|
+
cursor: pointer;
|
|
111
|
+
transition:
|
|
112
|
+
margin var(--ou-time) var(--ou-ease),
|
|
113
|
+
transform .2s ease;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
@use(sel) > li:first-child {
|
|
117
|
+
margin-left: 0;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
@use(sel) > li::before {
|
|
121
|
+
content: attr(data-alph);
|
|
122
|
+
text-transform: uppercase;
|
|
123
|
+
font: 700 calc(var(--ou-size) * .4)/1 system-ui, sans-serif;
|
|
124
|
+
color: var(--ou-letter);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
@use(sel) > li > img {
|
|
128
|
+
position: absolute;
|
|
129
|
+
inset: 0;
|
|
130
|
+
width: 100%;
|
|
131
|
+
height: 100%;
|
|
132
|
+
border-radius: 50%;
|
|
133
|
+
object-fit: cover;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
@use(sel) > li[data-alph] {
|
|
137
|
+
--ou-c: @arr.ou-colors[37] !important;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
@use(sel) > li[data-alph="@arr.ou-letters[@arr.ou-idx[]]"] {
|
|
141
|
+
$i: @arr.ou-idx[];
|
|
142
|
+
--ou-c: @arr.ou-colors[$i!] !important;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
@use(sel) > li[data-alph="@arr.ou-low-letters[@arr.ou-idx[]]"] {
|
|
146
|
+
$i: @arr.ou-idx[];
|
|
147
|
+
--ou-c: @arr.ou-colors[$i!] !important;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
@use(sel) > li[data-alph="@arr.ou-num-idx[]"] {
|
|
151
|
+
$i: @arr.ou-num-idx[];
|
|
152
|
+
--ou-c: @arr.ou-colors[$i!] !important;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
@use(sel):hover > li + li,
|
|
156
|
+
@use(sel):focus-within > li + li {
|
|
157
|
+
margin-left: var(--ou-gap);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
@use(sel) > li:hover {
|
|
161
|
+
transform: translateY(-4px);
|
|
162
|
+
z-index: 2;
|
|
163
|
+
}
|
|
164
|
+
`}
|
|
165
|
+
|
|
166
|
+
@define card-overlap(sel:.card-overlap){`
|
|
167
|
+
@use(sel) {
|
|
168
|
+
display: flex;
|
|
169
|
+
flex-direction: column;
|
|
170
|
+
width: min(100%, 340px);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
@use(sel) > div {
|
|
174
|
+
position: relative;
|
|
175
|
+
display: grid;
|
|
176
|
+
grid-template-columns: auto 1fr;
|
|
177
|
+
column-gap: 12px;
|
|
178
|
+
align-content: center;
|
|
179
|
+
min-height: var(--ou-card-h);
|
|
180
|
+
margin-top: calc(var(--ou-peek) - var(--ou-card-h));
|
|
181
|
+
padding: var(--ou-card-pad-y) var(--ou-card-pad-x);
|
|
182
|
+
border-radius: var(--ou-card-radius);
|
|
183
|
+
background: var(--ou-card-bg);
|
|
184
|
+
color: var(--ou-card-color);
|
|
185
|
+
font: 400 13px/1.3 system-ui, sans-serif;
|
|
186
|
+
box-shadow:
|
|
187
|
+
0 -6px 16px rgba(0, 0, 0, .35),
|
|
188
|
+
0 0 0 1px rgba(255, 255, 255, .06);
|
|
189
|
+
transition:
|
|
190
|
+
margin var(--ou-time) var(--ou-ease),
|
|
191
|
+
transform .2s ease;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
@use(sel) > div:first-child {
|
|
195
|
+
margin-top: 0;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
@use(sel) > div > img {
|
|
199
|
+
grid-row: span 2;
|
|
200
|
+
width: var(--ou-card-thumb);
|
|
201
|
+
height: var(--ou-card-thumb);
|
|
202
|
+
border-radius: var(--ou-card-thumb-radius);
|
|
203
|
+
object-fit: cover;
|
|
204
|
+
background: linear-gradient(135deg, #16D89D, #015E6B);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
@use(sel) > div > h3 {
|
|
208
|
+
margin: 0;
|
|
209
|
+
align-self: end;
|
|
210
|
+
font-size: 15px;
|
|
211
|
+
color: var(--ou-card-title);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
@use(sel):hover > div + div,
|
|
215
|
+
@use(sel):focus-within > div + div {
|
|
216
|
+
margin-top: var(--ou-card-gap);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
@use(sel) > div:hover {
|
|
220
|
+
transform: translateX(6px);
|
|
221
|
+
}
|
|
222
|
+
`}
|
|
223
|
+
|
|
224
|
+
@define img-overlap(sel:.img-overlap){`
|
|
225
|
+
@use(sel) {
|
|
226
|
+
display: flex;
|
|
227
|
+
align-items: center;
|
|
228
|
+
width: max-content;
|
|
229
|
+
padding: 10px;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
@use(sel) > img {
|
|
233
|
+
flex: none;
|
|
234
|
+
width: var(--ou-img);
|
|
235
|
+
height: var(--ou-img);
|
|
236
|
+
margin-left: var(--ou-img-overlap);
|
|
237
|
+
border: var(--ou-img-border) solid var(--ou-ring);
|
|
238
|
+
border-radius: var(--ou-img-radius);
|
|
239
|
+
object-fit: cover;
|
|
240
|
+
background: linear-gradient(135deg, #16D89D, #015E6B);
|
|
241
|
+
box-shadow: 0 8px 18px rgba(0, 0, 0, .35);
|
|
242
|
+
transform: rotate(var(--ou-img-tilt));
|
|
243
|
+
transition:
|
|
244
|
+
margin var(--ou-time) var(--ou-ease),
|
|
245
|
+
transform var(--ou-time) var(--ou-ease);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
@use(sel) > img:first-child {
|
|
249
|
+
margin-left: 0;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
@use(sel) > img:nth-child(even) {
|
|
253
|
+
transform: rotate(var(--ou-img-tilt-even));
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
@use(sel):hover > img,
|
|
257
|
+
@use(sel):focus-within > img {
|
|
258
|
+
transform: rotate(0);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
@use(sel):hover > img + img,
|
|
262
|
+
@use(sel):focus-within > img + img {
|
|
263
|
+
margin-left: var(--ou-img-gap);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
@use(sel) > img:hover {
|
|
267
|
+
transform: translateY(-6px) scale(1.04);
|
|
268
|
+
z-index: 2;
|
|
269
|
+
}
|
|
270
|
+
`}
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
@define circle-overlap(sel:.circle-overlap){`
|
|
275
|
+
@use(sel) {
|
|
276
|
+
position: relative;
|
|
277
|
+
z-index: 0;
|
|
278
|
+
isolation: isolate;
|
|
279
|
+
width: var(--ou-item);
|
|
280
|
+
height: var(--ou-item);
|
|
281
|
+
margin: calc(var(--ou-r) + var(--ou-item));
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
@use(sel) > * {
|
|
285
|
+
--c: #6366f1;
|
|
286
|
+
position: absolute;
|
|
287
|
+
inset: 0;
|
|
288
|
+
display: grid;
|
|
289
|
+
place-items: center;
|
|
290
|
+
border: 0;
|
|
291
|
+
border-radius: 50%;
|
|
292
|
+
background: var(--c);
|
|
293
|
+
color: #fff;
|
|
294
|
+
font: 700 18px/1 system-ui, sans-serif;
|
|
295
|
+
text-decoration: none;
|
|
296
|
+
box-shadow: 0 0 0 var(--ou-ring-width) var(--ou-ring);
|
|
297
|
+
cursor: pointer;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
@use(sel) > :first-child {
|
|
301
|
+
z-index: 2;
|
|
302
|
+
background: var(--ou-center-bg);
|
|
303
|
+
transition: transform var(--ou-time) var(--ou-ease);
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
@use(sel) > :not(:first-child) {
|
|
307
|
+
--a: calc(360deg / var(--n) * var(--i, 0));
|
|
308
|
+
opacity: 0;
|
|
309
|
+
pointer-events: none;
|
|
310
|
+
transform: scale(.5);
|
|
311
|
+
transition:
|
|
312
|
+
transform var(--ou-time) var(--ou-ease),
|
|
313
|
+
opacity .2s ease;
|
|
314
|
+
transition-delay: calc(var(--i, 0) * 30ms);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
@use(sel):hover::before,
|
|
318
|
+
@use(sel):focus-within::before {
|
|
319
|
+
content: "";
|
|
320
|
+
position: absolute;
|
|
321
|
+
inset: calc((var(--ou-r) + var(--ou-item)) * -1);
|
|
322
|
+
border-radius: 50%;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
@use(sel):hover > :not(:first-child),
|
|
326
|
+
@use(sel):focus-within > :not(:first-child) {
|
|
327
|
+
opacity: 1;
|
|
328
|
+
pointer-events: auto;
|
|
329
|
+
transform:
|
|
330
|
+
rotate(var(--a))
|
|
331
|
+
translateY(calc(var(--ou-r) * -1))
|
|
332
|
+
rotate(calc(var(--a) * -1));
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
@use(sel):hover > :first-child,
|
|
336
|
+
@use(sel):focus-within > :first-child {
|
|
337
|
+
transform: rotate(45deg);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
@use(sel) > :not(:first-child):hover {
|
|
341
|
+
filter: brightness(1.15);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
@use(sel) > :nth-child(2) { --i: 0; }
|
|
345
|
+
@use(sel) > :nth-child(3) { --i: 1; --c: #f59e0b; }
|
|
346
|
+
@use(sel) > :nth-child(4) { --i: 2; --c: #22c55e; }
|
|
347
|
+
@use(sel) > :nth-child(5) { --i: 3; --c: #06b6d4; }
|
|
348
|
+
@use(sel) > :nth-child(6) { --i: 4; --c: #ef4444; }
|
|
349
|
+
@use(sel) > :nth-child(7) { --i: 5; --c: #8b5cf6; }
|
|
350
|
+
@use(sel) > :nth-child(8) { --i: 6; --c: #14b8a6; }
|
|
351
|
+
@use(sel) > :nth-child(9) { --i: 7; --c: #f97316; }
|
|
352
|
+
@use(sel) > :nth-child(10) { --i: 8; --c: #84cc16; }
|
|
353
|
+
@use(sel) > :nth-child(11) { --i: 9; --c: #e11d48; }
|
|
354
|
+
@use(sel) > :nth-child(12) { --i: 10; --c: #0ea5e9; }
|
|
355
|
+
@use(sel) > :nth-child(13) { --i: 11; --c: #a855f7; }
|
|
356
|
+
`}
|
|
357
|
+
|
|
358
|
+
@define ou-reduced-motion(){`
|
|
359
|
+
@media (prefers-reduced-motion: reduce) {
|
|
360
|
+
.avatar-overlap > li,
|
|
361
|
+
.card-overlap > div,
|
|
362
|
+
.img-overlap > img,
|
|
363
|
+
.circle-overlap > * {
|
|
364
|
+
transition: none;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
`}
|
|
368
|
+
|
|
369
|
+
@define overlapui(
|
|
370
|
+
avatar:.avatar-overlap,
|
|
371
|
+
card:.card-overlap,
|
|
372
|
+
img:.img-overlap,
|
|
373
|
+
circle:.circle-overlap
|
|
374
|
+
){`
|
|
375
|
+
@ou-root()
|
|
376
|
+
@avatar-overlap(@use(avatar))
|
|
377
|
+
@card-overlap(@use(card))
|
|
378
|
+
@img-overlap(@use(img))
|
|
379
|
+
@circle-overlap(@use(circle))
|
|
380
|
+
@ou-reduced-motion()
|
|
381
|
+
`}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/* overlapui.standalone.fscss
|
|
2
|
+
Full expand of overlapui for developers who link plain CSS only.
|
|
3
|
+
Selective / token-driven use: import from overlapui.fscss in your own .fscss file.
|
|
4
|
+
|
|
5
|
+
Build: npx fscss@1.2.5 overlapui.standalone.fscss overlapui.css
|
|
6
|
+
CI: .github/workflows/compile-standalone.yml
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
@import((
|
|
10
|
+
*
|
|
11
|
+
) from "./overlapui.fscss")
|
|
12
|
+
|
|
13
|
+
/* Expand every public mixin onto default selectors */
|
|
14
|
+
@ou-root()
|
|
15
|
+
@avatar-overlap(.avatar-overlap)
|
|
16
|
+
@card-overlap(.card-overlap)
|
|
17
|
+
@img-overlap(.img-overlap)
|
|
18
|
+
@circle-overlap(.circle-overlap)
|
|
19
|
+
@ou-reduced-motion()
|
|
20
|
+
|
package/package.json
CHANGED
|
@@ -1,6 +1,48 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "overlapui",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "CSS-first overlapping UI stacks for FSCSS — plus plain overlapui.css for non-FSCSS pages",
|
|
5
|
+
"main": "overlapui.fscss",
|
|
6
|
+
"style": "overlapui.css",
|
|
7
|
+
"files": [
|
|
8
|
+
"overlapui.fscss",
|
|
9
|
+
"overlapui.standalone.fscss",
|
|
10
|
+
"overlapui.css",
|
|
11
|
+
"overlapui.min.css",
|
|
12
|
+
"README.md",
|
|
13
|
+
"templates"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build:css": "fscss overlapui.standalone.fscss overlapui.css"
|
|
17
|
+
},
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/fscss-ttr/overlapui.fscss.git"
|
|
21
|
+
},
|
|
22
|
+
"homepage": "https://github.com/fscss-ttr/overlapui.fscss#readme",
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/fscss-ttr/overlapui.fscss/issues"
|
|
25
|
+
},
|
|
26
|
+
"author": "Figsh (https://github.com/Figsh)",
|
|
27
|
+
"contributors": [
|
|
28
|
+
{
|
|
29
|
+
"name": "fscss-ttr",
|
|
30
|
+
"url": "https://github.com/fscss-ttr"
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"funding": {
|
|
34
|
+
"type": "github",
|
|
35
|
+
"url": "https://github.com/sponsors/Figsh"
|
|
36
|
+
},
|
|
37
|
+
"keywords": [
|
|
38
|
+
"fscss",
|
|
39
|
+
"css",
|
|
40
|
+
"overlap",
|
|
41
|
+
"avatar",
|
|
42
|
+
"ui",
|
|
43
|
+
"circle-menu",
|
|
44
|
+
"card-stack"
|
|
45
|
+
],
|
|
46
|
+
"license": "MIT",
|
|
47
|
+
"type": "commonjs"
|
|
48
|
+
}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>overlapui stacks — template</title>
|
|
7
|
+
<meta name="description" content="Template demo for overlapui.fscss: avatar, card, image, and circle stacks.">
|
|
8
|
+
<script src="https://cdn.jsdelivr.net/npm/fscss@1.2.5/runtime.min.js" defer></script>
|
|
9
|
+
<link type="text/fscss" href="stacks.fscss">
|
|
10
|
+
<!-- Prod: npx fscss@1.2.5 stacks.fscss css/stacks.css then link css/stacks.css -->
|
|
11
|
+
</head>
|
|
12
|
+
<body>
|
|
13
|
+
<div class="page">
|
|
14
|
+
<header class="page-head">
|
|
15
|
+
<h1>overlapui stacks</h1>
|
|
16
|
+
<p>
|
|
17
|
+
Focused template for
|
|
18
|
+
<a href="https://github.com/fscss-ttr/overlapui.fscss" target="_blank" rel="noopener">overlapui.fscss</a>
|
|
19
|
+
— avatars, cards, images, and a radial circle menu. Hover or focus stacks to open them.
|
|
20
|
+
</p>
|
|
21
|
+
</header>
|
|
22
|
+
|
|
23
|
+
<div class="grid">
|
|
24
|
+
<section class="section">
|
|
25
|
+
<h2>Avatar overlap</h2>
|
|
26
|
+
<div class="center-block">
|
|
27
|
+
<ul class="avatar-overlap" tabindex="0">
|
|
28
|
+
<li data-alph="g">Gina</li>
|
|
29
|
+
<li data-alph="h"><img src="https://i.pravatar.cc/80?img=12" alt="">Hank</li>
|
|
30
|
+
<li data-alph="i">Ivy</li>
|
|
31
|
+
<li data-alph="j">Jo</li>
|
|
32
|
+
<li data-alph="5">Ops</li>
|
|
33
|
+
</ul>
|
|
34
|
+
</div>
|
|
35
|
+
<p class="hint">data-alph drives letter + color · optional img covers the face</p>
|
|
36
|
+
</section>
|
|
37
|
+
|
|
38
|
+
<div class="grid grid-2">
|
|
39
|
+
<section class="section">
|
|
40
|
+
<h2>Card overlap</h2>
|
|
41
|
+
<div class="card-overlap" tabindex="0">
|
|
42
|
+
<div>
|
|
43
|
+
<img src="https://picsum.photos/96?random=1" alt="">
|
|
44
|
+
<h3>Invoice paid</h3>
|
|
45
|
+
Acme · $2,400
|
|
46
|
+
</div>
|
|
47
|
+
<div>
|
|
48
|
+
<img src="https://picsum.photos/96?random=2" alt="">
|
|
49
|
+
<h3>Seat added</h3>
|
|
50
|
+
overlapui workspace
|
|
51
|
+
</div>
|
|
52
|
+
<div>
|
|
53
|
+
<img src="https://picsum.photos/96?random=3" alt="">
|
|
54
|
+
<h3>Comment</h3>
|
|
55
|
+
“Ship the circle menu”
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
</section>
|
|
59
|
+
|
|
60
|
+
<section class="section">
|
|
61
|
+
<h2>Image overlap</h2>
|
|
62
|
+
<div class="center-block">
|
|
63
|
+
<div class="img-overlap" tabindex="0">
|
|
64
|
+
<img src="https://picsum.photos/120?random=4" alt="">
|
|
65
|
+
<img src="https://picsum.photos/120?random=5" alt="">
|
|
66
|
+
<img src="https://picsum.photos/120?random=6" alt="">
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
69
|
+
</section>
|
|
70
|
+
</div>
|
|
71
|
+
|
|
72
|
+
<section class="section">
|
|
73
|
+
<h2>Circle overlap (settings-style)</h2>
|
|
74
|
+
<div class="circle-demo">
|
|
75
|
+
<div class="circle-overlap" style="--n:5" tabindex="0">
|
|
76
|
+
<button type="button" aria-label="Open menu">+</button>
|
|
77
|
+
<a href="#profile" aria-label="Profile">P</a>
|
|
78
|
+
<a href="#billing" aria-label="Billing">B</a>
|
|
79
|
+
<a href="#team" aria-label="Team">T</a>
|
|
80
|
+
<a href="#keys" aria-label="API keys">K</a>
|
|
81
|
+
<a href="#out" aria-label="Sign out">×</a>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
<p class="hint">First child is the center · --n is satellite count</p>
|
|
85
|
+
</section>
|
|
86
|
+
|
|
87
|
+
<section class="section">
|
|
88
|
+
<h2>Members table</h2>
|
|
89
|
+
<div class="table-wrap">
|
|
90
|
+
<table>
|
|
91
|
+
<thead>
|
|
92
|
+
<tr>
|
|
93
|
+
<th>Members</th>
|
|
94
|
+
<th>Role</th>
|
|
95
|
+
<th>Balance</th>
|
|
96
|
+
</tr>
|
|
97
|
+
</thead>
|
|
98
|
+
<tbody>
|
|
99
|
+
<tr>
|
|
100
|
+
<td>
|
|
101
|
+
<div class="member-cell">
|
|
102
|
+
<ul class="avatar-overlap" tabindex="0">
|
|
103
|
+
<li data-alph="a"><img src="https://i.pravatar.cc/72?img=11" alt="">Ada</li>
|
|
104
|
+
<li data-alph="n">Nia</li>
|
|
105
|
+
<li data-alph="k">Ken</li>
|
|
106
|
+
</ul>
|
|
107
|
+
<div class="member-meta">
|
|
108
|
+
<strong>Design pod</strong>
|
|
109
|
+
<span>3 people</span>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
</td>
|
|
113
|
+
<td>Product design</td>
|
|
114
|
+
<td class="amount pos">+$1,240</td>
|
|
115
|
+
</tr>
|
|
116
|
+
<tr>
|
|
117
|
+
<td>
|
|
118
|
+
<div class="member-cell">
|
|
119
|
+
<ul class="avatar-overlap" tabindex="0">
|
|
120
|
+
<li data-alph="m">Mo</li>
|
|
121
|
+
<li data-alph="s"><img src="https://i.pravatar.cc/72?img=15" alt="">Sam</li>
|
|
122
|
+
</ul>
|
|
123
|
+
<div class="member-meta">
|
|
124
|
+
<strong>Platform</strong>
|
|
125
|
+
<span>2 people</span>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
</td>
|
|
129
|
+
<td>Engineering</td>
|
|
130
|
+
<td class="amount pos">+$890</td>
|
|
131
|
+
</tr>
|
|
132
|
+
<tr>
|
|
133
|
+
<td>
|
|
134
|
+
<div class="member-cell">
|
|
135
|
+
<ul class="avatar-overlap" tabindex="0">
|
|
136
|
+
<li data-alph="r">Rae</li>
|
|
137
|
+
<li data-alph="j">Jo</li>
|
|
138
|
+
<li data-alph="t">Ty</li>
|
|
139
|
+
</ul>
|
|
140
|
+
<div class="member-meta">
|
|
141
|
+
<strong>Growth</strong>
|
|
142
|
+
<span>3 people</span>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
</td>
|
|
146
|
+
<td>GTM</td>
|
|
147
|
+
<td class="amount neg">−$120</td>
|
|
148
|
+
</tr>
|
|
149
|
+
</tbody>
|
|
150
|
+
</table>
|
|
151
|
+
</div>
|
|
152
|
+
</section>
|
|
153
|
+
</div>
|
|
154
|
+
|
|
155
|
+
<footer class="page-foot">
|
|
156
|
+
Module:
|
|
157
|
+
<a href="https://github.com/fscss-ttr/overlapui.fscss">overlapui.fscss</a>
|
|
158
|
+
· Lives in this repo at
|
|
159
|
+
<code>overlapui.fscss/templates/stacks</code>
|
|
160
|
+
</footer>
|
|
161
|
+
</div>
|
|
162
|
+
</body>
|
|
163
|
+
</html>
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# templates/stacks
|
|
2
|
+
|
|
3
|
+
Focused demo for **overlapui.fscss** — avatar, card, image, and circle stacks, plus a members table.
|
|
4
|
+
|
|
5
|
+
## Path in this repo
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
overlapui.fscss/
|
|
9
|
+
├── overlapui.fscss
|
|
10
|
+
├── README.md
|
|
11
|
+
└── templates/
|
|
12
|
+
└── stacks/
|
|
13
|
+
├── index.html
|
|
14
|
+
├── stacks.fscss
|
|
15
|
+
└── README.md
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Run
|
|
19
|
+
|
|
20
|
+
From `templates/stacks/`:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npx serve .
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
```html
|
|
27
|
+
<script src="https://cdn.jsdelivr.net/npm/fscss@1.2.5/runtime.min.js" defer></script>
|
|
28
|
+
<link type="text/fscss" href="stacks.fscss">
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
`stacks.fscss` imports the module via relative path:
|
|
32
|
+
|
|
33
|
+
```fscss
|
|
34
|
+
@import((*) from "../../overlapui.fscss")
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Or
|
|
38
|
+
|
|
39
|
+
```fscss
|
|
40
|
+
@import((*) from overlapui)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Compile
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npx fscss stacks.fscss stacks.css
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Requires
|
|
50
|
+
|
|
51
|
+
- FSCSS **1.2.5+** recommended
|
|
52
|
+
- Parent module: `overlapui.fscss` at repo root
|
|
53
|
+
|
|
54
|
+
## License
|
|
55
|
+
|
|
56
|
+
MIT — same as the main module.
|