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 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
- # Temporary Holding Version
1
+ # overlapui.fscss
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
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/)