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/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 FSCSS Transition Team & Remote Authors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,524 @@
|
|
|
1
|
-
#
|
|
1
|
+
# overlapui.fscss
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
> CSS-first overlapping UI stacks for the FSCSS ecosystem —
|
|
4
|
+
> **plus plain `overlapui.css` for pages that never touch FSCSS.**
|
|
5
|
+
|
|
6
|
+
Avatars, cards, images, and **radial circle menus** that overlap at rest and open on hover/focus. No JavaScript for the interaction.
|
|
7
|
+
|
|
8
|
+
**MIT** · **v1.0.0** · [github.com/fscss-ttr/overlapui.fscss](https://github.com/fscss-ttr/overlapui.fscss)
|
|
9
|
+
|
|
10
|
+
| Channel | Use |
|
|
11
|
+
|--------|-----|
|
|
12
|
+
| **npm** | `npm install overlapui` |
|
|
13
|
+
| **Plain CSS** | Link `overlapui.css` (no FSCSS) |
|
|
14
|
+
| **FSCSS module** | `@import((…) from overlapui)` — selective, token-driven, smaller output |
|
|
15
|
+
|
|
16
|
+
Requires **FSCSS v1.2.3+** only when you compile or run `.fscss` source. **Recommended: 1.2.5+**.
|
|
17
|
+
CSS-only consumers need **no** FSCSS install.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Table of Contents
|
|
22
|
+
|
|
23
|
+
1. [What is overlapui?](#1-what-is-overlapui)
|
|
24
|
+
2. [Choose a delivery mode](#2-choose-a-delivery-mode)
|
|
25
|
+
3. [Plain CSS (standalone)](#3-plain-css-standalone)
|
|
26
|
+
4. [FSCSS module (customizable)](#4-fscss-module-customizable)
|
|
27
|
+
5. [Default classes (standalone expand)](#5-default-classes-standalone-expand)
|
|
28
|
+
6. [Design tokens — `--ou-*`](#6-design-tokens----ou-)
|
|
29
|
+
7. [Mixins (FSCSS)](#7-mixins-fscss)
|
|
30
|
+
8. [Markup patterns](#8-markup-patterns)
|
|
31
|
+
9. [Full examples](#9-full-examples)
|
|
32
|
+
10. [Token reference](#10-token-reference)
|
|
33
|
+
11. [Accessibility & motion](#11-accessibility--motion)
|
|
34
|
+
12. [Repo layout & build](#12-repo-layout--build)
|
|
35
|
+
13. [License](#13-license)
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 1. What is overlapui?
|
|
40
|
+
|
|
41
|
+
| Component | Behavior |
|
|
42
|
+
|-----------|----------|
|
|
43
|
+
| **Avatar overlap** | Faces pull together; hover/focus spreads them; `data-alph` → letter + color |
|
|
44
|
+
| **Card overlap** | Cards peek under each other; expand on hover/focus |
|
|
45
|
+
| **Image overlap** | Tilted photos; straighten and gap on hover/focus |
|
|
46
|
+
| **Circle overlap** | Center control; satellites fan on a ring (`--n` = count) |
|
|
47
|
+
|
|
48
|
+
Everything is driven by **`--ou-*`** custom properties.
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## 2. Choose a delivery mode
|
|
53
|
+
|
|
54
|
+
```text
|
|
55
|
+
Need only default class names (.avatar-overlap, …)?
|
|
56
|
+
→ Plain CSS: overlapui.css
|
|
57
|
+
|
|
58
|
+
Need custom selectors, fewer rules, or @define helpers?
|
|
59
|
+
→ FSCSS: import overlapui.fscss (selective)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
| Mode | Install | Output size | Selectors |
|
|
63
|
+
|------|---------|-------------|-----------|
|
|
64
|
+
| **Standalone CSS** | `<link>` or npm `style` | Full default expand | Fixed classes below |
|
|
65
|
+
| **FSCSS selective** | CLI / runtime + `@import` | Only what you call | Any selector you pass |
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 3. Plain CSS (standalone)
|
|
70
|
+
|
|
71
|
+
Compiled from `overlapui.standalone.fscss` (CI keeps `overlapui.css` on `main`).
|
|
72
|
+
|
|
73
|
+
### npm
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
npm install overlapui
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
```html
|
|
80
|
+
<link rel="stylesheet" href="node_modules/overlapui/overlapui.css">
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### jsDelivr CDN
|
|
84
|
+
|
|
85
|
+
```html
|
|
86
|
+
<link rel="stylesheet"
|
|
87
|
+
href="https://cdn.jsdelivr.net/npm/overlapui@1.0.0/overlapui.css">
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Minified:
|
|
91
|
+
|
|
92
|
+
```html
|
|
93
|
+
<link rel="stylesheet"
|
|
94
|
+
href="https://cdn.jsdelivr.net/npm/overlapui@1.0.0/overlapui.min.css">
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
From GitHub `main`:
|
|
98
|
+
|
|
99
|
+
```html
|
|
100
|
+
<link rel="stylesheet"
|
|
101
|
+
href="https://cdn.jsdelivr.net/gh/fscss-ttr/overlapui.fscss@main/overlapui.css">
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### CSS `@import`
|
|
105
|
+
|
|
106
|
+
```css
|
|
107
|
+
@import url("https://cdn.jsdelivr.net/npm/overlapui@1.0.0/overlapui.css");
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Theme without FSCSS
|
|
111
|
+
|
|
112
|
+
```css
|
|
113
|
+
:root {
|
|
114
|
+
--ou-size: 40px;
|
|
115
|
+
--ou-overlap: -12px;
|
|
116
|
+
--ou-center-bg: #6366f1;
|
|
117
|
+
--ou-ring: #0f172a;
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Markup uses the **default classes** in [§5](#5-default-classes-standalone-expand).
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 4. FSCSS module (customizable)
|
|
126
|
+
|
|
127
|
+
### Runtime prototype
|
|
128
|
+
|
|
129
|
+
```html
|
|
130
|
+
<script src="https://cdn.jsdelivr.net/npm/fscss@1.2.5/runtime.min.js" defer></script>
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
```css
|
|
134
|
+
@import((*) from overlapui)
|
|
135
|
+
@overlapui()
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### npm package as source
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
npm install overlapui
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
```css
|
|
145
|
+
@import((*) from "overlapui/overlapui.fscss")
|
|
146
|
+
/* or, if your resolver maps the package name: */
|
|
147
|
+
@import((*) from overlapui)
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Selective import (recommended for production FSCSS)
|
|
151
|
+
|
|
152
|
+
```css
|
|
153
|
+
@import((
|
|
154
|
+
ou-root,
|
|
155
|
+
ou-avatar-colors,
|
|
156
|
+
avatar-overlap,
|
|
157
|
+
circle-overlap,
|
|
158
|
+
ou-reduced-motion
|
|
159
|
+
) from overlapui)
|
|
160
|
+
|
|
161
|
+
@ou-root()
|
|
162
|
+
@avatar-overlap(.team-faces)
|
|
163
|
+
@circle-overlap(.fab-menu)
|
|
164
|
+
@ou-reduced-motion()
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Remote source (fork / pinned commit)
|
|
168
|
+
|
|
169
|
+
```css
|
|
170
|
+
@import((*) from "https://cdn.jsdelivr.net/gh/fscss-ttr/overlapui.fscss@main/overlapui.fscss")
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### CLI
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
npm install -g fscss@1.2.5
|
|
177
|
+
fscss app.fscss app.css
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**Why FSCSS:** custom class names, only the components you call, size helpers (`@ou-avatar-size`, …), same tokens as the CSS build.
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 5. Default classes (standalone expand)
|
|
185
|
+
|
|
186
|
+
These selectors are what **`overlapui.css`** contains after compile. Use them as-is with the plain CSS file, or pass different names via FSCSS mixins.
|
|
187
|
+
|
|
188
|
+
### Roots & motion
|
|
189
|
+
|
|
190
|
+
| Class / target | Role |
|
|
191
|
+
|----------------|------|
|
|
192
|
+
| `:root` (tokens) | `--ou-*` design tokens from `@ou-root()` |
|
|
193
|
+
| *(media)* `prefers-reduced-motion` | Transitions off via `@ou-reduced-motion()` |
|
|
194
|
+
|
|
195
|
+
### Avatar
|
|
196
|
+
|
|
197
|
+
| Class | Role |
|
|
198
|
+
|-------|------|
|
|
199
|
+
| `.avatar-overlap` | Stack root (`display: flex`, …) |
|
|
200
|
+
| `.avatar-overlap > li` | Face cell |
|
|
201
|
+
| `.avatar-overlap > li:first-child` | No pull-in margin |
|
|
202
|
+
| `.avatar-overlap > li::before` | Letter from `data-alph` |
|
|
203
|
+
| `.avatar-overlap > li > img` | Optional photo cover |
|
|
204
|
+
| `.avatar-overlap:hover` / `:focus-within` | Spread siblings |
|
|
205
|
+
|
|
206
|
+
### Card
|
|
207
|
+
|
|
208
|
+
| Class | Role |
|
|
209
|
+
|-------|------|
|
|
210
|
+
| `.card-overlap` | Stack root |
|
|
211
|
+
| `.card-overlap > div` | Card panel |
|
|
212
|
+
| `.card-overlap > div img` / `h3` | Media + title |
|
|
213
|
+
| `.card-overlap:hover` / `:focus-within` | Expand stack |
|
|
214
|
+
|
|
215
|
+
### Image
|
|
216
|
+
|
|
217
|
+
| Class | Role |
|
|
218
|
+
|-------|------|
|
|
219
|
+
| `.img-overlap` | Stack root |
|
|
220
|
+
| `.img-overlap > img` | Tilted / overlapping images |
|
|
221
|
+
| `.img-overlap:hover` / `:focus-within` | Align + gap |
|
|
222
|
+
|
|
223
|
+
### Circle
|
|
224
|
+
|
|
225
|
+
| Class | Role |
|
|
226
|
+
|-------|------|
|
|
227
|
+
| `.circle-overlap` | Radial root; set `--n` on element |
|
|
228
|
+
| `.circle-overlap > :first-child` | Center control |
|
|
229
|
+
| `.circle-overlap > :not(:first-child)` | Satellites |
|
|
230
|
+
| `.circle-overlap:hover` / `:focus-within` | Fan-out |
|
|
231
|
+
|
|
232
|
+
FSCSS custom example (not in standalone CSS unless you compile it yourself):
|
|
233
|
+
|
|
234
|
+
```css
|
|
235
|
+
@avatar-overlap(.members)
|
|
236
|
+
@circle-overlap(.settings-orbit)
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
→ emits `.members`, `.settings-orbit`, … instead of the defaults.
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
## 6. Design tokens — `--ou-*`
|
|
244
|
+
|
|
245
|
+
Works the same for **CSS link** and **FSCSS**.
|
|
246
|
+
|
|
247
|
+
```css
|
|
248
|
+
:root {
|
|
249
|
+
--ou-ring: #0f172a;
|
|
250
|
+
--ou-time: 0.4s;
|
|
251
|
+
--ou-size: 40px;
|
|
252
|
+
--ou-center-bg: #6366f1;
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
FSCSS helpers:
|
|
257
|
+
|
|
258
|
+
```css
|
|
259
|
+
@ou-root()
|
|
260
|
+
|
|
261
|
+
:root {
|
|
262
|
+
@ou-avatar-size(48px, -16px)
|
|
263
|
+
@ou-card-size(40px, 80px)
|
|
264
|
+
@ou-img-size(112px, -60px)
|
|
265
|
+
@ou-circle-size(48px, 80px)
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## 7. Mixins (FSCSS)
|
|
272
|
+
|
|
273
|
+
| Define | Purpose |
|
|
274
|
+
|--------|---------|
|
|
275
|
+
| `@ou-root(root)` | Inject `--ou-*` |
|
|
276
|
+
| `@ou-avatar-size(size, overlap)` | Avatar diameter + pull-in |
|
|
277
|
+
| `@ou-card-size(peek, height)` | Card peek / min-height |
|
|
278
|
+
| `@ou-img-size(size, overlap)` | Image size + overlap |
|
|
279
|
+
| `@ou-circle-size(item, radius)` | Circle size + orbit |
|
|
280
|
+
| `@ou-avatar-colors()` | Internal A–Z / 0–9 maps |
|
|
281
|
+
| `@avatar-overlap(sel)` | Avatar stack |
|
|
282
|
+
| `@card-overlap(sel)` | Card stack |
|
|
283
|
+
| `@img-overlap(sel)` | Image stack |
|
|
284
|
+
| `@circle-overlap(sel)` | Radial menu |
|
|
285
|
+
| `@ou-reduced-motion()` | Reduced motion |
|
|
286
|
+
| `@overlapui(…)` | Install all defaults |
|
|
287
|
+
|
|
288
|
+
```css
|
|
289
|
+
@overlapui()
|
|
290
|
+
/* ou-root + avatar + card + img + circle + reduced-motion */
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## 8. Markup patterns
|
|
296
|
+
|
|
297
|
+
### Avatars
|
|
298
|
+
|
|
299
|
+
```html
|
|
300
|
+
<ul class="avatar-overlap" tabindex="0">
|
|
301
|
+
<li data-alph="g">Gina Park</li>
|
|
302
|
+
<li data-alph="h"><img src="https://i.pravatar.cc/80?img=2" alt="">Hank Lee</li>
|
|
303
|
+
<li data-alph="5">5001</li>
|
|
304
|
+
</ul>
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Cards
|
|
308
|
+
|
|
309
|
+
```html
|
|
310
|
+
<div class="card-overlap" tabindex="0">
|
|
311
|
+
<div>
|
|
312
|
+
<img src="https://picsum.photos/96?random=1" alt="">
|
|
313
|
+
<h3>Deploy succeeded</h3>
|
|
314
|
+
production · 2m ago
|
|
315
|
+
</div>
|
|
316
|
+
<div>
|
|
317
|
+
<img src="https://picsum.photos/96?random=2" alt="">
|
|
318
|
+
<h3>New comment</h3>
|
|
319
|
+
on overlapui README
|
|
320
|
+
</div>
|
|
321
|
+
</div>
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### Images
|
|
325
|
+
|
|
326
|
+
```html
|
|
327
|
+
<div class="img-overlap" tabindex="0">
|
|
328
|
+
<img src="https://picsum.photos/96?random=4" alt="">
|
|
329
|
+
<img src="https://picsum.photos/96?random=5" alt="">
|
|
330
|
+
<img src="https://picsum.photos/96?random=6" alt="">
|
|
331
|
+
</div>
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### Circle
|
|
335
|
+
|
|
336
|
+
First child = center; `--n` = satellite count.
|
|
337
|
+
|
|
338
|
+
```html
|
|
339
|
+
<div class="circle-overlap" style="--n:5" tabindex="0">
|
|
340
|
+
<button type="button" aria-label="Menu">+</button>
|
|
341
|
+
<a href="#">H</a>
|
|
342
|
+
<a href="#">S</a>
|
|
343
|
+
<a href="#">C</a>
|
|
344
|
+
<a href="#">G</a>
|
|
345
|
+
<a href="#">P</a>
|
|
346
|
+
</div>
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
Use **`tabindex="0"`** so `:focus-within` matches hover.
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## 9. Full examples
|
|
354
|
+
|
|
355
|
+
### CSS-only (no FSCSS)
|
|
356
|
+
|
|
357
|
+
```html
|
|
358
|
+
<!DOCTYPE html>
|
|
359
|
+
<html lang="en">
|
|
360
|
+
<head>
|
|
361
|
+
<meta charset="UTF-8">
|
|
362
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
363
|
+
<title>overlapui CSS-only</title>
|
|
364
|
+
<link rel="stylesheet"
|
|
365
|
+
href="https://cdn.jsdelivr.net/npm/overlapui@1.0.0/overlapui.min.css">
|
|
366
|
+
<style>
|
|
367
|
+
:root {
|
|
368
|
+
--ou-center-bg: #6366f1;
|
|
369
|
+
--ou-ring: #0f172a;
|
|
370
|
+
}
|
|
371
|
+
body {
|
|
372
|
+
margin: 0;
|
|
373
|
+
min-height: 100vh;
|
|
374
|
+
display: grid;
|
|
375
|
+
place-items: center;
|
|
376
|
+
gap: 48px;
|
|
377
|
+
background: #0b1220;
|
|
378
|
+
}
|
|
379
|
+
</style>
|
|
380
|
+
</head>
|
|
381
|
+
<body>
|
|
382
|
+
<ul class="avatar-overlap" tabindex="0">
|
|
383
|
+
<li data-alph="g">G</li>
|
|
384
|
+
<li data-alph="h">H</li>
|
|
385
|
+
<li data-alph="i">I</li>
|
|
386
|
+
<li data-alph="j">J</li>
|
|
387
|
+
</ul>
|
|
388
|
+
|
|
389
|
+
<div class="circle-overlap" style="--n:5" tabindex="0">
|
|
390
|
+
<button type="button" aria-label="Menu">+</button>
|
|
391
|
+
<a href="#" aria-label="Home">H</a>
|
|
392
|
+
<a href="#" aria-label="Search">S</a>
|
|
393
|
+
<a href="#" aria-label="Chat">C</a>
|
|
394
|
+
<a href="#" aria-label="Groups">G</a>
|
|
395
|
+
<a href="#" aria-label="Profile">P</a>
|
|
396
|
+
</div>
|
|
397
|
+
</body>
|
|
398
|
+
</html>
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### FSCSS one-shot
|
|
402
|
+
|
|
403
|
+
```html
|
|
404
|
+
<script src="https://cdn.jsdelivr.net/npm/fscss@1.2.5/runtime.min.js" defer></script>
|
|
405
|
+
<style>
|
|
406
|
+
@import((*) from overlapui)
|
|
407
|
+
@overlapui()
|
|
408
|
+
|
|
409
|
+
body {
|
|
410
|
+
margin: 0;
|
|
411
|
+
min-height: 100vh;
|
|
412
|
+
display: grid;
|
|
413
|
+
place-items: center;
|
|
414
|
+
background: #0b1220;
|
|
415
|
+
}
|
|
416
|
+
</style>
|
|
417
|
+
|
|
418
|
+
<ul class="avatar-overlap" tabindex="0">
|
|
419
|
+
<li data-alph="g">G</li>
|
|
420
|
+
<li data-alph="h">H</li>
|
|
421
|
+
<li data-alph="i">I</li>
|
|
422
|
+
<li data-alph="j">J</li>
|
|
423
|
+
</ul>
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
### FSCSS selective + custom class
|
|
427
|
+
|
|
428
|
+
```css
|
|
429
|
+
@import((
|
|
430
|
+
ou-root,
|
|
431
|
+
ou-avatar-colors,
|
|
432
|
+
avatar-overlap,
|
|
433
|
+
ou-reduced-motion
|
|
434
|
+
) from overlapui)
|
|
435
|
+
|
|
436
|
+
@ou-root()
|
|
437
|
+
@avatar-overlap(.members)
|
|
438
|
+
@ou-reduced-motion()
|
|
439
|
+
|
|
440
|
+
:root {
|
|
441
|
+
--ou-size: 36px;
|
|
442
|
+
--ou-overlap: -12px;
|
|
443
|
+
}
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
```html
|
|
447
|
+
<ul class="members" tabindex="0">
|
|
448
|
+
<li data-alph="a">Ada</li>
|
|
449
|
+
<li data-alph="n">Nia</li>
|
|
450
|
+
</ul>
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
---
|
|
454
|
+
|
|
455
|
+
## 10. Token reference
|
|
456
|
+
|
|
457
|
+
| Variable | Default (approx.) | Usage |
|
|
458
|
+
|----------|-------------------|--------|
|
|
459
|
+
| `--ou-ring` | `#17203a` | Ring color |
|
|
460
|
+
| `--ou-ease` | `cubic-bezier(.3, 1.3, .5, 1)` | Easing |
|
|
461
|
+
| `--ou-time` | `.35s` | Duration |
|
|
462
|
+
| `--ou-size` | `44px` | Avatar diameter |
|
|
463
|
+
| `--ou-overlap` | `-14px` | Avatar pull-in |
|
|
464
|
+
| `--ou-gap` | `6px` | Avatar spread gap |
|
|
465
|
+
| `--ou-c` | `#f59e0b` | Fallback face color |
|
|
466
|
+
| `--ou-letter` | `#fff` | Letter color |
|
|
467
|
+
| `--ou-ring-width` | `3px` | Ring thickness |
|
|
468
|
+
| `--ou-peek` | `34px` | Card peek |
|
|
469
|
+
| `--ou-card-h` | `76px` | Card min-height |
|
|
470
|
+
| `--ou-card-gap` | `10px` | Card gap when open |
|
|
471
|
+
| `--ou-card-bg` | `#1f2a48` | Card background |
|
|
472
|
+
| `--ou-card-color` | `#cbd5ee` | Card body text |
|
|
473
|
+
| `--ou-card-title` | `#fff` | Card title |
|
|
474
|
+
| `--ou-img` | `96px` | Image size |
|
|
475
|
+
| `--ou-img-overlap` | `-52px` | Image pull-in |
|
|
476
|
+
| `--ou-img-gap` | `12px` | Image gap when open |
|
|
477
|
+
| `--ou-img-tilt` / `--ou-img-tilt-even` | `-5deg` / `4deg` | Rest tilt |
|
|
478
|
+
| `--ou-item` | `48px` | Circle control size |
|
|
479
|
+
| `--ou-r` | `86px` | Orbit radius |
|
|
480
|
+
| `--ou-center-bg` | `#ec4899` | Center button |
|
|
481
|
+
| `--n` | `6` | Satellite count (on element) |
|
|
482
|
+
|
|
483
|
+
---
|
|
484
|
+
|
|
485
|
+
## 11. Accessibility & motion
|
|
486
|
+
|
|
487
|
+
- Keep **real names** in the DOM for avatars; faces may use `font-size: 0` for the decorative letter.
|
|
488
|
+
- Meaningful **`alt`** when the image matters; otherwise name text beside the stack.
|
|
489
|
+
- **`tabindex="0"`** on stack roots for keyboard `:focus-within`.
|
|
490
|
+
- **`aria-label`** on circle center and each action.
|
|
491
|
+
- Standalone CSS includes reduced-motion rules; under FSCSS call `@ou-reduced-motion()`.
|
|
492
|
+
|
|
493
|
+
---
|
|
494
|
+
|
|
495
|
+
## 12. Repo layout & build
|
|
496
|
+
|
|
497
|
+
```text
|
|
498
|
+
overlapui.fscss # FSCSS source (selective)
|
|
499
|
+
overlapui.standalone.fscss # expands defaults → CSS
|
|
500
|
+
overlapui.css # compiled (CI / npm)
|
|
501
|
+
package.json # "style": "overlapui.css"
|
|
502
|
+
templates/stacks/ # demo page
|
|
503
|
+
.github/workflows/ # compile standalone on change
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
Local compile:
|
|
507
|
+
|
|
508
|
+
```bash
|
|
509
|
+
npm install -g fscss@1.2.5
|
|
510
|
+
fscss overlapui.standalone.fscss overlapui.css
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
---
|
|
514
|
+
|
|
515
|
+
## 13. License
|
|
516
|
+
|
|
517
|
+
MIT · [FSCSS](https://fscss.devtem.org) · [fscss-ttr](https://github.com/fscss-ttr)
|
|
518
|
+
|
|
519
|
+
```bash
|
|
520
|
+
npm install overlapui
|
|
521
|
+
npm install -g fscss@1.2.5 # only if you use the .fscss source
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
[Issues](https://github.com/fscss-ttr/overlapui.fscss/issues) · [FSCSS](https://fscss.devtem.org/)
|