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.
@@ -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": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
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,9 @@
1
+ # templates
2
+
3
+ Example pages for **overlapui.fscss**.
4
+
5
+ | Folder | Description |
6
+ |--------|-------------|
7
+ | [stacks/](./stacks/) | Avatar, card, image, circle menu, members table |
8
+
9
+ Feel free to Add more focused demos as `templates/<name>/` with README.
@@ -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.