minora 0.1.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,463 @@
1
+ /* ============================================================
2
+ ELEGANT MINIMALIST UI KIT — Avatar & Avatar Group Components
3
+ avatar.css
4
+
5
+ ANATOMY — SINGLE AVATAR
6
+ ─────────────────────────────────────────────────────────────
7
+ Structure:
8
+ <div class="avatar avatar-md">
9
+ <img src="..." alt="..." class="avatar-img" />
10
+ <div class="avatar-status" data-status="online"></div> <!-- optional -->
11
+ </div>
12
+
13
+ <!-- Initials fallback (auto-generated via JS from data-name) -->
14
+ <div class="avatar avatar-md" data-name="Budi Santoso">
15
+ <span class="avatar-initials">BS</span>
16
+ </div>
17
+
18
+ <!-- Icon fallback -->
19
+ <div class="avatar avatar-md">
20
+ <svg class="avatar-fallback" ...></svg>
21
+ </div>
22
+
23
+ Class layers:
24
+ 1. .avatar → Base layout, shape, overflow hidden
25
+ 2. .avatar-{size} → Width, height, font-size
26
+ 3. .avatar-img → Image styling (object-fit: cover)
27
+ 4. .avatar-initials → Text initials styling
28
+ 5. .avatar-fallback → Generic person icon SVG
29
+ 6. .avatar-status → Status dot indicator
30
+ 7. .avatar-rounded → Modifier: rounded square instead of circle
31
+ ─────────────────────────────────────────────────────────────
32
+
33
+ ANATOMY — AVATAR GROUP
34
+ ─────────────────────────────────────────────────────────────
35
+ Structure:
36
+ <div class="avatar-group avatar-group-md">
37
+ <div class="avatar avatar-md">...</div>
38
+ <div class="avatar avatar-md">...</div>
39
+ <div class="avatar avatar-md">...</div>
40
+ <span class="avatar-group-counter">+12</span>
41
+ </div>
42
+
43
+ Class layers:
44
+ 1. .avatar-group → Base flex layout
45
+ 2. .avatar-group-{size} → Controls child avatar sizes
46
+ 3. .avatar-group-item → Wrapper for negative margin overlap
47
+ 4. .avatar-group-counter → "+N" overflow indicator
48
+ ─────────────────────────────────────────────────────────────
49
+ ============================================================ */
50
+
51
+ /* ═══════════════════════════════════════════════════════════
52
+ AVATAR — Base
53
+ ═══════════════════════════════════════════════════════════ */
54
+
55
+ .avatar {
56
+ position: relative;
57
+ display: inline-flex;
58
+ align-items: center;
59
+ justify-content: center;
60
+ flex-shrink: 0;
61
+ border-radius: var(--radius-pill);
62
+ overflow: hidden;
63
+ background-color: var(--color-neutral-200);
64
+ vertical-align: middle;
65
+ }
66
+
67
+ /* ── Avatar image ───────────────────────────────────────── */
68
+ .avatar-img {
69
+ width: 100%;
70
+ height: 100%;
71
+ object-fit: cover;
72
+ display: block;
73
+ }
74
+
75
+ /* ── Avatar initials ────────────────────────────────────── */
76
+ .avatar-initials {
77
+ font-family: var(--font-sans);
78
+ font-weight: var(--font-semibold);
79
+ color: var(--color-neutral-50);
80
+ text-transform: uppercase;
81
+ letter-spacing: var(--tracking-wide);
82
+ line-height: var(--leading-none);
83
+ user-select: none;
84
+ -webkit-user-select: none;
85
+ }
86
+
87
+ /* ── Avatar icon fallback ───────────────────────────────── */
88
+ .avatar-fallback {
89
+ color: var(--color-neutral-400);
90
+ line-height: 0;
91
+ }
92
+
93
+ /* ── Sizes ──────────────────────────────────────────────── */
94
+ .avatar-xs {
95
+ width: var(--space-6);
96
+ height: var(--space-6);
97
+ }
98
+
99
+ .avatar-xs .avatar-initials {
100
+ font-size: var(--text-xs);
101
+ }
102
+
103
+ .avatar-xs .avatar-fallback {
104
+ width: var(--space-3);
105
+ height: var(--space-3);
106
+ }
107
+
108
+ .avatar-sm {
109
+ width: var(--space-8);
110
+ height: var(--space-8);
111
+ }
112
+
113
+ .avatar-sm .avatar-initials {
114
+ font-size: var(--text-xs);
115
+ }
116
+
117
+ .avatar-sm .avatar-fallback {
118
+ width: var(--space-4);
119
+ height: var(--space-4);
120
+ }
121
+
122
+ .avatar-md {
123
+ width: var(--space-10);
124
+ height: var(--space-10);
125
+ }
126
+
127
+ .avatar-md .avatar-initials {
128
+ font-size: var(--text-sm);
129
+ }
130
+
131
+ .avatar-md .avatar-fallback {
132
+ width: var(--space-5);
133
+ height: var(--space-5);
134
+ }
135
+
136
+ .avatar-lg {
137
+ width: var(--space-14);
138
+ height: var(--space-14);
139
+ }
140
+
141
+ .avatar-lg .avatar-initials {
142
+ font-size: var(--text-lg);
143
+ }
144
+
145
+ .avatar-lg .avatar-fallback {
146
+ width: var(--space-7);
147
+ height: var(--space-7);
148
+ }
149
+
150
+ .avatar-xl {
151
+ width: var(--space-20);
152
+ height: var(--space-20);
153
+ }
154
+
155
+ .avatar-xl .avatar-initials {
156
+ font-size: var(--text-3xl);
157
+ }
158
+
159
+ .avatar-xl .avatar-fallback {
160
+ width: var(--space-10);
161
+ height: var(--space-10);
162
+ }
163
+
164
+ /* ── Shape: Rounded square modifier ─────────────────────── */
165
+ .avatar-rounded {
166
+ border-radius: var(--radius-md);
167
+ }
168
+
169
+ /* ═══════════════════════════════════════════════════════════
170
+ AVATAR — Status indicator
171
+ ═══════════════════════════════════════════════════════════ */
172
+
173
+ .avatar-status {
174
+ position: absolute;
175
+ bottom: 0;
176
+ right: 0;
177
+ display: block;
178
+ border-radius: var(--radius-pill);
179
+ border: var(--border-width-2) solid var(--avatar-group-border);
180
+ z-index: var(--z-raised);
181
+ line-height: 0;
182
+ }
183
+
184
+ /* Status dot — size varies by avatar size */
185
+ .avatar-status::after {
186
+ content: '';
187
+ display: block;
188
+ border-radius: var(--radius-pill);
189
+ }
190
+
191
+ /* Status colors */
192
+ .avatar-status[data-status="online"] {
193
+ background-color: var(--color-success);
194
+ }
195
+
196
+ .avatar-status[data-status="away"] {
197
+ background-color: var(--color-warning);
198
+ }
199
+
200
+ .avatar-status[data-status="busy"] {
201
+ background-color: var(--color-error);
202
+ }
203
+
204
+ .avatar-status[data-status="offline"] {
205
+ background-color: var(--color-neutral-400);
206
+ }
207
+
208
+ /* Status dot sizing per avatar size */
209
+ .avatar-xs .avatar-status {
210
+ width: var(--avatar-status-xs-size);
211
+ height: var(--avatar-status-xs-size);
212
+ border-width: var(--avatar-status-xs-border);
213
+ }
214
+
215
+ .avatar-xs .avatar-status::after {
216
+ width: var(--avatar-status-xs-dot);
217
+ height: var(--avatar-status-xs-dot);
218
+ }
219
+
220
+ .avatar-sm .avatar-status {
221
+ width: var(--avatar-status-sm-size);
222
+ height: var(--avatar-status-sm-size);
223
+ border-width: var(--avatar-status-sm-border);
224
+ }
225
+
226
+ .avatar-sm .avatar-status::after {
227
+ width: var(--avatar-status-sm-dot);
228
+ height: var(--avatar-status-sm-dot);
229
+ }
230
+
231
+ .avatar-md .avatar-status {
232
+ width: var(--avatar-status-md-size);
233
+ height: var(--avatar-status-md-size);
234
+ border-width: var(--avatar-status-md-border);
235
+ }
236
+
237
+ .avatar-md .avatar-status::after {
238
+ width: var(--avatar-status-md-dot);
239
+ height: var(--avatar-status-md-dot);
240
+ }
241
+
242
+ .avatar-lg .avatar-status {
243
+ width: var(--avatar-status-lg-size);
244
+ height: var(--avatar-status-lg-size);
245
+ border-width: var(--avatar-status-lg-border);
246
+ }
247
+
248
+ .avatar-lg .avatar-status::after {
249
+ width: var(--avatar-status-lg-dot);
250
+ height: var(--avatar-status-lg-dot);
251
+ }
252
+
253
+ .avatar-xl .avatar-status {
254
+ width: var(--avatar-status-xl-size);
255
+ height: var(--avatar-status-xl-size);
256
+ border-width: var(--avatar-status-xl-border);
257
+ }
258
+
259
+ .avatar-xl .avatar-status::after {
260
+ width: var(--avatar-status-xl-dot);
261
+ height: var(--avatar-status-xl-dot);
262
+ }
263
+
264
+ /* ═══════════════════════════════════════════════════════════
265
+ AVATAR — Accent color backgrounds
266
+ For initials avatars, different accent colors for variety.
267
+ ═══════════════════════════════════════════════════════════ */
268
+
269
+ .avatar-accent-1 { background-color: var(--color-accent-500); }
270
+ .avatar-accent-2 { background-color: var(--color-accent-600); }
271
+ .avatar-accent-3 { background-color: var(--color-accent-700); }
272
+ .avatar-accent-4 { background-color: var(--color-accent-800); }
273
+ .avatar-accent-5 { background-color: var(--color-accent-900); }
274
+ .avatar-accent-6 { background-color: var(--color-accent-400); }
275
+
276
+ /* ═══════════════════════════════════════════════════════════
277
+ AVATAR GROUP — Base
278
+ ═══════════════════════════════════════════════════════════ */
279
+
280
+ .avatar-group {
281
+ display: flex;
282
+ align-items: center;
283
+ flex-wrap: nowrap;
284
+ }
285
+
286
+ .avatar-group-item {
287
+ display: inline-flex;
288
+ position: relative;
289
+ }
290
+
291
+ /* Negative margin overlap — first item has no margin */
292
+ .avatar-group-item + .avatar-group-item {
293
+ margin-left: var(--avatar-group-md-overlap);
294
+ }
295
+
296
+ /* Border between overlapping avatars */
297
+ .avatar-group .avatar {
298
+ border: var(--border-width-2) solid var(--avatar-group-border);
299
+ transition: transform var(--duration-fast) var(--ease-out),
300
+ z-index var(--duration-fast) var(--ease-out);
301
+ }
302
+
303
+ /* Hover lifts the avatar slightly */
304
+ .avatar-group .avatar:hover {
305
+ transform: translateY(var(--avatar-group-hover-lift));
306
+ z-index: var(--z-raised);
307
+ }
308
+
309
+ /* ── Group sizes ────────────────────────────────────────── */
310
+ .avatar-group-sm .avatar {
311
+ width: var(--space-8);
312
+ height: var(--space-8);
313
+ }
314
+
315
+ .avatar-group-sm .avatar .avatar-initials {
316
+ font-size: var(--text-xs);
317
+ }
318
+
319
+ .avatar-group-sm .avatar .avatar-fallback {
320
+ width: var(--space-4);
321
+ height: var(--space-4);
322
+ }
323
+
324
+ .avatar-group-sm .avatar-group-item + .avatar-group-item {
325
+ margin-left: var(--avatar-group-sm-overlap);
326
+ }
327
+
328
+ .avatar-group-md .avatar {
329
+ width: var(--space-10);
330
+ height: var(--space-10);
331
+ }
332
+
333
+ .avatar-group-md .avatar .avatar-initials {
334
+ font-size: var(--text-sm);
335
+ }
336
+
337
+ .avatar-group-md .avatar .avatar-fallback {
338
+ width: var(--space-5);
339
+ height: var(--space-5);
340
+ }
341
+
342
+ .avatar-group-md .avatar-group-item + .avatar-group-item {
343
+ margin-left: var(--avatar-group-md-overlap);
344
+ }
345
+
346
+ .avatar-group-lg .avatar {
347
+ width: var(--space-14);
348
+ height: var(--space-14);
349
+ }
350
+
351
+ .avatar-group-lg .avatar .avatar-initials {
352
+ font-size: var(--text-lg);
353
+ }
354
+
355
+ .avatar-group-lg .avatar .avatar-fallback {
356
+ width: var(--space-7);
357
+ height: var(--space-7);
358
+ }
359
+
360
+ .avatar-group-lg .avatar-group-item + .avatar-group-item {
361
+ margin-left: var(--avatar-group-lg-overlap);
362
+ }
363
+
364
+ /* ── Group counter (+N) ─────────────────────────────────── */
365
+ .avatar-group-counter {
366
+ display: inline-flex;
367
+ align-items: center;
368
+ justify-content: center;
369
+ font-family: var(--font-sans);
370
+ font-weight: var(--font-medium);
371
+ color: var(--color-neutral-600);
372
+ background-color: var(--color-neutral-100);
373
+ border: var(--border-width-2) solid var(--avatar-group-border);
374
+ border-radius: var(--radius-pill);
375
+ line-height: var(--leading-none);
376
+ user-select: none;
377
+ -webkit-user-select: none;
378
+ }
379
+
380
+ .avatar-group-sm .avatar-group-counter {
381
+ width: var(--space-8);
382
+ height: var(--space-8);
383
+ font-size: var(--text-xs);
384
+ margin-left: var(--avatar-group-sm-overlap);
385
+ }
386
+
387
+ .avatar-group-md .avatar-group-counter {
388
+ width: var(--space-10);
389
+ height: var(--space-10);
390
+ font-size: var(--text-sm);
391
+ margin-left: var(--avatar-group-md-overlap);
392
+ }
393
+
394
+ .avatar-group-lg .avatar-group-counter {
395
+ width: var(--space-14);
396
+ height: var(--space-14);
397
+ font-size: var(--text-sm);
398
+ margin-left: var(--avatar-group-lg-overlap);
399
+ }
400
+
401
+ /* ═══════════════════════════════════════════════════════════
402
+ AVATAR — Hover tooltip (optional)
403
+ ═══════════════════════════════════════════════════════════ */
404
+
405
+ .avatar[data-tooltip] {
406
+ cursor: default;
407
+ }
408
+
409
+ .avatar[data-tooltip]::before {
410
+ content: attr(data-tooltip);
411
+ position: absolute;
412
+ bottom: calc(100% + var(--space-2));
413
+ left: 50%;
414
+ transform: translateX(-50%) translateY(var(--avatar-tooltip-offset-y));
415
+ padding: var(--space-0-5) var(--space-2);
416
+ font-size: var(--text-xs);
417
+ font-weight: var(--font-medium);
418
+ font-family: var(--font-sans);
419
+ color: var(--color-neutral-50);
420
+ background-color: var(--color-neutral-800);
421
+ border-radius: var(--radius-sm);
422
+ white-space: nowrap;
423
+ pointer-events: none;
424
+ opacity: 0;
425
+ transition: opacity var(--duration-fast) var(--ease-in-out),
426
+ transform var(--duration-fast) var(--ease-out);
427
+ z-index: var(--z-dropdown);
428
+ }
429
+
430
+ .avatar[data-tooltip]:hover::before {
431
+ opacity: 1;
432
+ transform: translateX(-50%) translateY(0);
433
+ }
434
+
435
+ /* ═══════════════════════════════════════════════════════════
436
+ CONTEXTUAL: Avatar with badge (for badge.html showcase)
437
+ ═══════════════════════════════════════════════════════════ */
438
+
439
+ .avatar-badge {
440
+ position: relative;
441
+ display: inline-block;
442
+ }
443
+
444
+ .avatar-circle {
445
+ display: inline-flex;
446
+ align-items: center;
447
+ justify-content: center;
448
+ width: var(--space-10);
449
+ height: var(--space-10);
450
+ border-radius: var(--radius-pill);
451
+ background-color: var(--color-neutral-200);
452
+ color: var(--color-neutral-600);
453
+ font-size: var(--text-sm);
454
+ font-weight: var(--font-medium);
455
+ font-family: var(--font-sans);
456
+ line-height: var(--leading-none);
457
+ }
458
+
459
+ .avatar-circle-lg {
460
+ width: var(--space-12);
461
+ height: var(--space-12);
462
+ font-size: var(--text-base);
463
+ }