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,437 @@
1
+ /* ============================================================
2
+ ELEGANT MINIMALIST UI KIT — Modal & Dialog Components
3
+ modal.css
4
+
5
+ ANATOMY — MODAL
6
+ ─────────────────────────────────────────────────────────────
7
+ Structure:
8
+ <div class="modal-overlay" id="modal-id" role="dialog" aria-modal="true">
9
+ <div class="modal modal-md">
10
+ <div class="modal-header">
11
+ <h2 class="modal-title">Title</h2>
12
+ <button class="modal-close" aria-label="Close">
13
+ <svg>×</svg>
14
+ </button>
15
+ </div>
16
+ <div class="modal-body">
17
+ Content here…
18
+ </div>
19
+ <div class="modal-footer">
20
+ <button class="btn btn-secondary">Cancel</button>
21
+ <button class="btn btn-primary">Confirm</button>
22
+ </div>
23
+ </div>
24
+ </div>
25
+
26
+ Class layers:
27
+ 1. .modal-overlay → Backdrop, fixed, blur, z-index
28
+ 2. .modal → Container, shadow, animation
29
+ 3. .modal-{size} → Width (sm/md/lg/xl/fullscreen)
30
+ 4. .modal-header → Title + close button
31
+ 5. .modal-body → Scrollable content area
32
+ 6. .modal-footer → Action buttons
33
+ 7. .modal-{variant} → No-header, scrollable, multi-step
34
+ ─────────────────────────────────────────────────────────────
35
+
36
+ ANATOMY — DIALOG
37
+ ─────────────────────────────────────────────────────────────
38
+ Structure:
39
+ <div class="modal-overlay" role="alertdialog" aria-modal="true">
40
+ <div class="dialog dialog-md">
41
+ <div class="dialog-icon">
42
+ <svg>…</svg>
43
+ </div>
44
+ <h2 class="dialog-title">Are you sure?</h2>
45
+ <p class="dialog-desc">This action cannot be undone.</p>
46
+ <!-- optional: input field -->
47
+ <div class="dialog-actions">
48
+ <button class="btn btn-secondary">Cancel</button>
49
+ <button class="btn btn-destructive">Delete</button>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ ─────────────────────────────────────────────────────────────
54
+ ============================================================ */
55
+
56
+ /* ═══════════════════════════════════════════════════════════
57
+ MODAL OVERLAY — Backdrop
58
+ ═══════════════════════════════════════════════════════════ */
59
+
60
+ .modal-overlay {
61
+ display: flex;
62
+ align-items: center;
63
+ justify-content: center;
64
+ position: fixed;
65
+ inset: 0;
66
+ z-index: var(--z-modal);
67
+ background-color: var(--modal-overlay-bg);
68
+ backdrop-filter: blur(var(--modal-overlay-blur));
69
+ -webkit-backdrop-filter: blur(var(--modal-overlay-blur));
70
+ padding: var(--space-6);
71
+ opacity: 0;
72
+ visibility: hidden;
73
+ transition: opacity var(--modal-open-duration) var(--ease-in-out),
74
+ visibility var(--modal-open-duration) var(--ease-in-out);
75
+ }
76
+
77
+ .modal-overlay.is-open {
78
+ opacity: 1;
79
+ visibility: visible;
80
+ }
81
+
82
+ /* Nested modal stacking */
83
+ .modal-overlay + .modal-overlay {
84
+ z-index: calc(var(--z-modal) + 10);
85
+ }
86
+
87
+ /* ═══════════════════════════════════════════════════════════
88
+ MODAL — Container
89
+ ═══════════════════════════════════════════════════════════ */
90
+
91
+ .modal {
92
+ position: relative;
93
+ width: 100%;
94
+ max-width: var(--modal-max-w);
95
+ max-height: var(--modal-max-h);
96
+ background-color: var(--modal-bg);
97
+ border-radius: var(--modal-radius);
98
+ box-shadow: var(--modal-shadow);
99
+ display: flex;
100
+ flex-direction: column;
101
+ overflow: hidden;
102
+ transform: scale(0.95) translateY(8px);
103
+ opacity: 0;
104
+ transition: transform var(--modal-open-duration) var(--modal-open-ease),
105
+ opacity var(--modal-open-duration) var(--ease-in-out);
106
+ }
107
+
108
+ .modal-overlay.is-open .modal {
109
+ transform: scale(1) translateY(0);
110
+ opacity: 1;
111
+ }
112
+
113
+ /* ═══════════════════════════════════════════════════════════
114
+ MODAL — Sizes
115
+ ═══════════════════════════════════════════════════════════ */
116
+
117
+ .modal-sm {
118
+ max-width: min(var(--modal-sm), var(--modal-max-w));
119
+ }
120
+
121
+ .modal-md {
122
+ max-width: min(var(--modal-md), var(--modal-max-w));
123
+ }
124
+
125
+ .modal-lg {
126
+ max-width: min(var(--modal-lg), var(--modal-max-w));
127
+ }
128
+
129
+ .modal-xl {
130
+ max-width: min(var(--modal-xl), var(--modal-max-w));
131
+ }
132
+
133
+ .modal-fullscreen {
134
+ max-width: calc(100vw - var(--space-4));
135
+ max-height: calc(100vh - var(--space-4));
136
+ width: 100%;
137
+ height: 100%;
138
+ border-radius: var(--radius-md);
139
+ }
140
+
141
+ /* ═══════════════════════════════════════════════════════════
142
+ MODAL — Header
143
+ ═══════════════════════════════════════════════════════════ */
144
+
145
+ .modal-header {
146
+ display: flex;
147
+ align-items: center;
148
+ justify-content: space-between;
149
+ gap: var(--space-4);
150
+ padding: var(--modal-header-padding);
151
+ border-bottom: var(--border-width) solid var(--color-neutral-100);
152
+ flex-shrink: 0;
153
+ }
154
+
155
+ .modal-title {
156
+ font-family: var(--font-serif);
157
+ font-size: var(--text-xl);
158
+ font-weight: var(--font-semibold);
159
+ color: var(--color-neutral-900);
160
+ line-height: var(--leading-tight);
161
+ margin: 0;
162
+ }
163
+
164
+ /* ═══════════════════════════════════════════════════════════
165
+ MODAL — Close button
166
+ ═══════════════════════════════════════════════════════════ */
167
+
168
+ .modal-close {
169
+ display: inline-flex;
170
+ align-items: center;
171
+ justify-content: center;
172
+ width: var(--space-7);
173
+ height: var(--space-7);
174
+ flex-shrink: 0;
175
+ border: none;
176
+ border-radius: var(--radius-sm);
177
+ background: transparent;
178
+ color: var(--color-neutral-400);
179
+ cursor: pointer;
180
+ padding: 0;
181
+ transition: color var(--duration-fast) var(--ease-in-out),
182
+ background-color var(--duration-fast) var(--ease-in-out);
183
+ }
184
+
185
+ .modal-close:hover {
186
+ color: var(--color-neutral-700);
187
+ background-color: var(--color-neutral-100);
188
+ }
189
+
190
+ .modal-close:focus-visible {
191
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
192
+ outline-offset: var(--focus-ring-offset);
193
+ }
194
+
195
+ .modal-close svg {
196
+ width: var(--space-4);
197
+ height: var(--space-4);
198
+ }
199
+
200
+ /* ═══════════════════════════════════════════════════════════
201
+ MODAL — Body
202
+ ═══════════════════════════════════════════════════════════ */
203
+
204
+ .modal-body {
205
+ padding: var(--modal-body-padding);
206
+ overflow-y: auto;
207
+ flex: 1;
208
+ }
209
+
210
+ /* ═══════════════════════════════════════════════════════════
211
+ MODAL — Footer
212
+ ═══════════════════════════════════════════════════════════ */
213
+
214
+ .modal-footer {
215
+ display: flex;
216
+ align-items: center;
217
+ justify-content: flex-end;
218
+ gap: var(--space-3);
219
+ padding: var(--modal-footer-padding);
220
+ border-top: var(--border-width) solid var(--color-neutral-100);
221
+ flex-shrink: 0;
222
+ }
223
+
224
+ /* ═══════════════════════════════════════════════════════════
225
+ MODAL — Variant: No header
226
+ ═══════════════════════════════════════════════════════════ */
227
+
228
+ .modal-no-header .modal-header {
229
+ display: none;
230
+ }
231
+
232
+ .modal-no-header .modal-body {
233
+ padding-top: var(--modal-body-padding);
234
+ }
235
+
236
+ .modal-no-header .modal-close {
237
+ position: absolute;
238
+ top: var(--space-4);
239
+ right: var(--space-4);
240
+ z-index: var(--z-raised);
241
+ }
242
+
243
+ /* ═══════════════════════════════════════════════════════════
244
+ MODAL — Variant: Scrollable
245
+ Header and footer fixed, body scrolls.
246
+ ═══════════════════════════════════════════════════════════ */
247
+
248
+ .modal-scrollable .modal-body {
249
+ overflow-y: auto;
250
+ max-height: var(--modal-max-h);
251
+ }
252
+
253
+ /* ═══════════════════════════════════════════════════════════
254
+ MODAL — Variant: Multi-step
255
+ ═══════════════════════════════════════════════════════════ */
256
+
257
+ .modal-steps {
258
+ display: flex;
259
+ align-items: center;
260
+ gap: var(--space-1);
261
+ padding: var(--space-1-5) 0;
262
+ }
263
+
264
+ .modal-step-indicator {
265
+ flex: 1;
266
+ height: var(--space-1);
267
+ border-radius: var(--radius-pill);
268
+ background-color: var(--color-neutral-200);
269
+ transition: background-color var(--duration-normal) var(--ease-in-out);
270
+ }
271
+
272
+ .modal-step-indicator.is-active {
273
+ background-color: var(--color-accent-500);
274
+ }
275
+
276
+ .modal-step-indicator.is-complete {
277
+ background-color: var(--color-accent-300);
278
+ }
279
+
280
+ .modal-step-label {
281
+ font-family: var(--font-sans);
282
+ font-size: var(--text-xs);
283
+ color: var(--color-neutral-500);
284
+ margin-bottom: var(--space-2);
285
+ }
286
+
287
+ .modal-step-label strong {
288
+ color: var(--color-neutral-700);
289
+ font-weight: var(--font-medium);
290
+ }
291
+
292
+ /* ═══════════════════════════════════════════════════════════
293
+ DIALOG — Container
294
+ ═══════════════════════════════════════════════════════════ */
295
+
296
+ .dialog {
297
+ position: relative;
298
+ width: 100%;
299
+ max-width: min(var(--modal-sm), var(--modal-max-w));
300
+ background-color: var(--modal-bg);
301
+ border-radius: var(--modal-radius);
302
+ box-shadow: var(--modal-shadow);
303
+ padding: var(--space-6);
304
+ text-align: center;
305
+ transform: scale(0.95) translateY(8px);
306
+ opacity: 0;
307
+ transition: transform var(--modal-open-duration) var(--modal-open-ease),
308
+ opacity var(--modal-open-duration) var(--ease-in-out);
309
+ }
310
+
311
+ .modal-overlay.is-open .dialog {
312
+ transform: scale(1) translateY(0);
313
+ opacity: 1;
314
+ }
315
+
316
+ /* Dialog sizes */
317
+ .dialog-sm {
318
+ max-width: min(320px, var(--modal-max-w));
319
+ }
320
+
321
+ .dialog-md {
322
+ max-width: min(var(--modal-sm), var(--modal-max-w));
323
+ }
324
+
325
+ .dialog-lg {
326
+ max-width: min(var(--modal-md), var(--modal-max-w));
327
+ }
328
+
329
+ /* ═══════════════════════════════════════════════════════════
330
+ DIALOG — Icon
331
+ ═══════════════════════════════════════════════════════════ */
332
+
333
+ .dialog-icon {
334
+ display: inline-flex;
335
+ align-items: center;
336
+ justify-content: center;
337
+ width: var(--space-12);
338
+ height: var(--space-12);
339
+ border-radius: var(--radius-pill);
340
+ margin-bottom: var(--space-4);
341
+ background-color: var(--color-neutral-100);
342
+ }
343
+
344
+ .dialog-icon svg {
345
+ width: var(--space-6);
346
+ height: var(--space-6);
347
+ }
348
+
349
+ /* Confirm icon — accent gold */
350
+ .dialog-confirm .dialog-icon {
351
+ background-color: var(--color-accent-50);
352
+ color: var(--color-accent-500);
353
+ }
354
+
355
+ /* Destructive icon — error red */
356
+ .dialog-destructive .dialog-icon {
357
+ background-color: var(--color-error-light);
358
+ color: var(--color-error);
359
+ }
360
+
361
+ /* Info icon — info blue */
362
+ .dialog-info .dialog-icon {
363
+ background-color: var(--color-info-light);
364
+ color: var(--color-info);
365
+ }
366
+
367
+ /* ═══════════════════════════════════════════════════════════
368
+ DIALOG — Title & Description
369
+ ═══════════════════════════════════════════════════════════ */
370
+
371
+ .dialog-title {
372
+ font-family: var(--font-serif);
373
+ font-size: var(--text-xl);
374
+ font-weight: var(--font-semibold);
375
+ color: var(--color-neutral-900);
376
+ line-height: var(--leading-tight);
377
+ margin: 0 0 var(--space-2);
378
+ }
379
+
380
+ .dialog-desc {
381
+ font-size: var(--text-sm);
382
+ color: var(--color-neutral-600);
383
+ line-height: var(--leading-relaxed);
384
+ margin: 0 0 var(--space-6);
385
+ }
386
+
387
+ /* ═══════════════════════════════════════════════════════════
388
+ DIALOG — Input field
389
+ ═══════════════════════════════════════════════════════════ */
390
+
391
+ .dialog-input {
392
+ width: 100%;
393
+ margin-bottom: var(--space-5);
394
+ text-align: left;
395
+ }
396
+
397
+ .dialog-input .input-wrapper {
398
+ width: 100%;
399
+ }
400
+
401
+ .dialog-input .input {
402
+ width: 100%;
403
+ }
404
+
405
+ .dialog-hint {
406
+ font-size: var(--text-xs);
407
+ color: var(--color-neutral-500);
408
+ margin-top: var(--space-1-5);
409
+ text-align: left;
410
+ }
411
+
412
+ /* ═══════════════════════════════════════════════════════════
413
+ DIALOG — Actions
414
+ ═══════════════════════════════════════════════════════════ */
415
+
416
+ .dialog-actions {
417
+ display: flex;
418
+ align-items: center;
419
+ justify-content: center;
420
+ gap: var(--space-3);
421
+ }
422
+
423
+ .dialog-actions-full {
424
+ justify-content: stretch;
425
+ }
426
+
427
+ .dialog-actions-full .btn {
428
+ flex: 1;
429
+ }
430
+
431
+ /* ═══════════════════════════════════════════════════════════
432
+ BODY SCROLL LOCK
433
+ ═══════════════════════════════════════════════════════════ */
434
+
435
+ body.is-modal-open {
436
+ overflow: hidden;
437
+ }