@duskmoon-dev/core 1.19.3 → 1.19.4
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/README.md +1 -1
- package/dist/base.css +484 -0
- package/dist/components/accordion.css +33 -9
- package/dist/components/autocomplete.css +67 -13
- package/dist/components/avatar.css +39 -15
- package/dist/components/badge.css +15 -3
- package/dist/components/card.css +12 -0
- package/dist/components/carousel.css +28 -0
- package/dist/components/chat.css +15 -11
- package/dist/components/checkbox.css +83 -13
- package/dist/components/collapse.css +67 -16
- package/dist/components/countdown.css +22 -0
- package/dist/components/datepicker.css +76 -0
- package/dist/components/diff.css +33 -0
- package/dist/components/file-input.css +107 -0
- package/dist/components/filter-group.css +452 -0
- package/dist/components/form-group.css +95 -204
- package/dist/components/form.css +1551 -421
- package/dist/components/index.css +5991 -6060
- package/dist/components/input.css +114 -31
- package/dist/components/kbd.css +28 -0
- package/dist/components/list.css +22 -3
- package/dist/components/otp-input.css +124 -6
- package/dist/components/radio.css +70 -0
- package/dist/components/range.css +41 -0
- package/dist/components/rating.css +39 -12
- package/dist/components/select.css +74 -0
- package/dist/components/stat.css +40 -0
- package/dist/components/switch.css +70 -0
- package/dist/components/table.css +8 -0
- package/dist/components/textarea.css +74 -0
- package/dist/components/timeline.css +40 -25
- package/dist/components/toggle-switch.css +165 -0
- package/dist/components/toggle.css +198 -32
- package/dist/components/validator.css +66 -0
- package/dist/effects/aura.css +22 -0
- package/dist/effects/hover-3d.css +8 -0
- package/dist/effects/hover-gallery.css +14 -0
- package/dist/effects/index.css +65 -0
- package/dist/effects/text-rotate.css +16 -0
- package/dist/esm/components/accordion.js +33 -9
- package/dist/esm/components/autocomplete.js +67 -13
- package/dist/esm/components/avatar.js +39 -15
- package/dist/esm/components/badge.js +15 -3
- package/dist/esm/components/card.js +12 -0
- package/dist/esm/components/carousel.d.ts +5 -0
- package/dist/esm/components/carousel.js +37 -0
- package/dist/esm/components/chat.js +15 -11
- package/dist/esm/components/checkbox.js +84 -14
- package/dist/esm/components/collapse.js +67 -16
- package/dist/esm/components/countdown.d.ts +5 -0
- package/dist/esm/components/countdown.js +31 -0
- package/dist/esm/components/datepicker.js +77 -1
- package/dist/esm/components/diff.d.ts +5 -0
- package/dist/esm/components/diff.js +42 -0
- package/dist/esm/components/file-input.d.ts +5 -0
- package/dist/esm/components/file-input.js +116 -0
- package/dist/esm/components/filter-group.d.ts +5 -0
- package/dist/esm/components/filter-group.js +461 -0
- package/dist/esm/components/form-group.js +96 -205
- package/dist/esm/components/form.js +1539 -409
- package/dist/esm/components/input.js +115 -32
- package/dist/esm/components/kbd.d.ts +5 -0
- package/dist/esm/components/kbd.js +37 -0
- package/dist/esm/components/list.js +22 -3
- package/dist/esm/components/otp-input.js +125 -7
- package/dist/esm/components/radio.js +71 -1
- package/dist/esm/components/range.d.ts +5 -0
- package/dist/esm/components/range.js +50 -0
- package/dist/esm/components/rating.js +39 -12
- package/dist/esm/components/select.js +75 -1
- package/dist/esm/components/stat.d.ts +5 -0
- package/dist/esm/components/stat.js +49 -0
- package/dist/esm/components/switch.js +71 -1
- package/dist/esm/components/table.js +8 -0
- package/dist/esm/components/textarea.js +75 -1
- package/dist/esm/components/timeline.js +40 -25
- package/dist/esm/components/toggle-switch.d.ts +5 -0
- package/dist/esm/components/toggle-switch.js +174 -0
- package/dist/esm/components/toggle.js +198 -32
- package/dist/esm/components/validator.d.ts +5 -0
- package/dist/esm/components/validator.js +75 -0
- package/dist/esm/effects/aura.d.ts +5 -0
- package/dist/esm/effects/aura.js +31 -0
- package/dist/esm/effects/hover-3d.d.ts +5 -0
- package/dist/esm/effects/hover-3d.js +17 -0
- package/dist/esm/effects/hover-gallery.d.ts +5 -0
- package/dist/esm/effects/hover-gallery.js +23 -0
- package/dist/esm/effects/index.d.ts +5 -0
- package/dist/esm/effects/index.js +74 -0
- package/dist/esm/effects/text-rotate.d.ts +5 -0
- package/dist/esm/effects/text-rotate.js +25 -0
- package/dist/index.css +5977 -6047
- package/dist/index.min.css +1 -1
- package/dist/standalone/duskmoonui-themes.css +1 -1
- package/dist/standalone/duskmoonui.css +6967 -7028
- package/dist/standalone/duskmoonui.js +11 -12
- package/dist/standalone/duskmoonui.mjs +11 -12
- package/dist/types/types/plugin.d.ts +1 -1
- package/dist/types/types/plugin.d.ts.map +1 -1
- package/package.json +98 -1
|
@@ -1,3 +1,71 @@
|
|
|
1
|
+
/** Opt-in native presentation. Applications own errors, messages and announcements. */
|
|
2
|
+
@layer components {
|
|
3
|
+
/* Compatibility wrapper states are intentionally immediate. */
|
|
4
|
+
:is(.form-group-info, .form-control.info) { --dm-validation-color: var(--color-info); }
|
|
5
|
+
:is(.form-group-warning, .form-control.warning) { --dm-validation-color: var(--color-warning); }
|
|
6
|
+
:is(.form-group-success, .form-control.success) { --dm-validation-color: var(--color-success); }
|
|
7
|
+
|
|
8
|
+
:is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is(.validate :valid, .validate:valid, .validator.validator-success:user-valid):not([aria-invalid="true"]):not(:where(.form-group-error *, .form-control.error *)):not(:disabled) {
|
|
9
|
+
--dm-validation-color: var(--color-success);
|
|
10
|
+
--dm-validation-content: var(--color-success-content);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
:is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is(.validate :invalid, .validate:invalid, .validator:user-invalid):not(:disabled) {
|
|
14
|
+
--dm-validation-color: var(--color-error);
|
|
15
|
+
--dm-validation-content: var(--color-error-content);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
:is(.form-group-error, .form-control.error) {
|
|
19
|
+
--dm-validation-color: var(--color-error);
|
|
20
|
+
--dm-validation-content: var(--color-error-content);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* Higher specificity than native states, including server-invalid + user-valid. */
|
|
24
|
+
:is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .form-group-error *, .form-control.error *):not(:disabled):is(:focus, :not(:focus)) {
|
|
25
|
+
--dm-validation-color: var(--color-error);
|
|
26
|
+
--dm-validation-content: var(--color-error-content);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* This shared selector wins over filled/ghost focus and semantic modifiers. */
|
|
30
|
+
:is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .validator:user-invalid, .validator.validator-success:user-valid, .validate :invalid, .validate :valid, .validate:invalid, .validate:valid, .form-group-error *, .form-group-success *, .form-group-warning *, .form-group-info *, .form-control.error *, .form-control.success *, .form-control.warning *, .form-control.info *):not(:disabled) {
|
|
31
|
+
color: var(--dm-validation-color);
|
|
32
|
+
border-color: var(--dm-validation-color);
|
|
33
|
+
--checkbox-color: var(--dm-validation-color);
|
|
34
|
+
--radio-color: var(--dm-validation-color);
|
|
35
|
+
--switch-color: var(--dm-validation-color);
|
|
36
|
+
--switch-content-color: var(--dm-validation-content, var(--color-primary-content));
|
|
37
|
+
--toggle-color: var(--dm-validation-color);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
:is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):is([aria-invalid="true"], .validator:user-invalid, .validator.validator-success:user-valid, .validate :invalid, .validate :valid, .validate:invalid, .validate:valid, .form-group-error *, .form-group-success *, .form-group-warning *, .form-group-info *, .form-control.error *, .form-control.success *, .form-control.warning *, .form-control.info *):not(:disabled):focus {
|
|
41
|
+
border-color: var(--dm-validation-color);
|
|
42
|
+
box-shadow: 0 0 0 3px color-mix(in oklch, var(--dm-validation-color) 20%, transparent);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
:is(.form-group-error, .form-control.error) :is(.form-label, .label-text) { color: var(--color-error); }
|
|
46
|
+
:is(.form-group-success, .form-control.success) :is(.form-label, .label-text) { color: var(--color-success); }
|
|
47
|
+
:is(.form-group-warning, .form-control.warning) :is(.form-label, .label-text) { color: var(--color-warning); }
|
|
48
|
+
:is(.form-group-info, .form-control.info) :is(.form-label, .label-text) { color: var(--color-info); }
|
|
49
|
+
|
|
50
|
+
.validator-hint { font-size: 0.75rem; color: var(--color-on-surface-variant); }
|
|
51
|
+
.validator-error { display: none; font-size: 0.75rem; color: var(--color-error); }
|
|
52
|
+
/* Keep OTP actions stationary when blur reveals an error during a click. */
|
|
53
|
+
.otp-code ~ .validator-error { display: block; visibility: hidden; }
|
|
54
|
+
:is(.form-group, .form-control):has(:is([aria-invalid="true"], .validator:user-invalid, .validate :invalid, .validate:invalid):not(:disabled)) > .validator-error,
|
|
55
|
+
:is(.form-group-error, .form-control.error) > .validator-error { display: block; visibility: visible; }
|
|
56
|
+
|
|
57
|
+
@media (forced-colors: active) {
|
|
58
|
+
:is(input, select, textarea):is(.input, .select, .textarea, .checkbox, .radio, .switch, .toggle, .file-input, .otp-input-field, .otp-code, .datepicker-input):focus-visible {
|
|
59
|
+
outline: 2px solid Highlight;
|
|
60
|
+
outline-offset: 2px;
|
|
61
|
+
}
|
|
62
|
+
input:is(.checkbox, .radio, .switch, .toggle) { appearance: auto; }
|
|
63
|
+
input:is(.checkbox, .radio, .switch, .toggle)::before,
|
|
64
|
+
input:is(.checkbox, .radio, .switch, .toggle)::after { content: none; }
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
|
|
1
69
|
/**
|
|
2
70
|
* Form Group Component Styles
|
|
3
71
|
* DuskMoonUI - Form layout utilities including label, helper text, fieldset
|
|
@@ -278,224 +346,47 @@
|
|
|
278
346
|
color: var(--color-error);
|
|
279
347
|
}
|
|
280
348
|
|
|
281
|
-
/*
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
.form-group-error .textarea {
|
|
289
|
-
border-color: var(--color-error);
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
.form-group-error .input:focus-visible,
|
|
293
|
-
.form-group-error .select:focus-visible,
|
|
294
|
-
.form-group-error .textarea:focus-visible {
|
|
295
|
-
border-color: var(--color-error);
|
|
296
|
-
box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
/* Success State on Form Group */
|
|
300
|
-
.form-group-success .form-label {
|
|
301
|
-
color: var(--color-success);
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
.form-group-success .input,
|
|
305
|
-
.form-group-success .select,
|
|
306
|
-
.form-group-success .textarea {
|
|
307
|
-
border-color: var(--color-success);
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
.form-group-success .input:focus-visible,
|
|
311
|
-
.form-group-success .select:focus-visible,
|
|
312
|
-
.form-group-success .textarea:focus-visible {
|
|
313
|
-
border-color: var(--color-success);
|
|
314
|
-
box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-success) 10%, transparent);
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
/* Warning State on Form Group */
|
|
318
|
-
.form-group-warning .form-label {
|
|
319
|
-
color: var(--color-warning);
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
.form-group-warning .input,
|
|
323
|
-
.form-group-warning .select,
|
|
324
|
-
.form-group-warning .textarea {
|
|
325
|
-
border-color: var(--color-warning);
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
.form-group-warning .input:focus-visible,
|
|
329
|
-
.form-group-warning .select:focus-visible,
|
|
330
|
-
.form-group-warning .textarea:focus-visible {
|
|
331
|
-
border-color: var(--color-warning);
|
|
332
|
-
box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-warning) 10%, transparent);
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
/* Info State on Form Group */
|
|
336
|
-
.form-group-info .form-label {
|
|
337
|
-
color: var(--color-info);
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
.form-group-info .input,
|
|
341
|
-
.form-group-info .select,
|
|
342
|
-
.form-group-info .textarea {
|
|
343
|
-
border-color: var(--color-info);
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
.form-group-info .input:focus-visible,
|
|
347
|
-
.form-group-info .select:focus-visible,
|
|
348
|
-
.form-group-info .textarea:focus-visible {
|
|
349
|
-
border-color: var(--color-info);
|
|
350
|
-
box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-info) 10%, transparent);
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
/* Disabled Form Group */
|
|
354
|
-
.form-group-disabled {
|
|
355
|
-
opacity: 0.5;
|
|
356
|
-
pointer-events: none;
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
/* ARIA-based validation states — mirrors class-based states for native form validation */
|
|
360
|
-
.input[aria-invalid="true"],
|
|
361
|
-
.select[aria-invalid="true"],
|
|
362
|
-
.textarea[aria-invalid="true"] {
|
|
363
|
-
border-color: var(--color-error);
|
|
364
|
-
color: var(--color-error);
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
.input[aria-invalid="true"]:focus-visible,
|
|
368
|
-
.select[aria-invalid="true"]:focus-visible,
|
|
369
|
-
.textarea[aria-invalid="true"]:focus-visible {
|
|
370
|
-
border-color: var(--color-error);
|
|
371
|
-
box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
/* ARIA-based validation for checkbox, radio, switch, file-input
|
|
375
|
-
(frameworks like React Hook Form / Angular set aria-invalid programmatically) */
|
|
376
|
-
.checkbox[aria-invalid="true"],
|
|
377
|
-
.radio[aria-invalid="true"],
|
|
378
|
-
.file-input[aria-invalid="true"] {
|
|
379
|
-
border-color: var(--color-error);
|
|
349
|
+
/* Legacy label and helper APIs share the composition implementation. */
|
|
350
|
+
/* Label */
|
|
351
|
+
.label {
|
|
352
|
+
display: flex;
|
|
353
|
+
justify-content: space-between;
|
|
354
|
+
align-items: center;
|
|
355
|
+
padding: 0.25rem 0;
|
|
380
356
|
}
|
|
381
357
|
|
|
382
|
-
.
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
358
|
+
.label-text {
|
|
359
|
+
font-size: 0.875rem;
|
|
360
|
+
font-weight: 500;
|
|
361
|
+
color: var(--color-on-surface);
|
|
362
|
+
padding-bottom: 0.25rem;
|
|
386
363
|
}
|
|
387
364
|
|
|
388
|
-
.
|
|
389
|
-
|
|
365
|
+
.label-text-alt {
|
|
366
|
+
font-size: 0.75rem;
|
|
367
|
+
color: var(--color-on-surface-variant);
|
|
390
368
|
}
|
|
391
369
|
|
|
392
|
-
.switch[aria-invalid="true"]:focus-visible {
|
|
393
|
-
box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
|
|
394
|
-
}
|
|
395
370
|
|
|
396
|
-
|
|
371
|
+
.label-text.required::after,
|
|
397
372
|
.form-label[aria-required="true"]::after,
|
|
398
373
|
label[aria-required="true"]::after {
|
|
399
374
|
content: ' *';
|
|
400
375
|
color: var(--color-error);
|
|
401
376
|
}
|
|
402
377
|
|
|
403
|
-
|
|
404
|
-
.
|
|
405
|
-
.
|
|
406
|
-
.
|
|
407
|
-
border-color: var(--color-error);
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
.validate .input:valid,
|
|
411
|
-
.validate .select:valid,
|
|
412
|
-
.validate .textarea:valid {
|
|
413
|
-
border-color: var(--color-success);
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
/* :user-invalid — fires only after user interaction (no .validate wrapper needed) */
|
|
417
|
-
.input:user-invalid,
|
|
418
|
-
.select:user-invalid,
|
|
419
|
-
.textarea:user-invalid {
|
|
420
|
-
border-color: var(--color-error);
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
.input:user-invalid:focus-visible,
|
|
424
|
-
.select:user-invalid:focus-visible,
|
|
425
|
-
.textarea:user-invalid:focus-visible {
|
|
426
|
-
border-color: var(--color-error);
|
|
427
|
-
box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 10%, transparent);
|
|
428
|
-
}
|
|
378
|
+
.helper-text.error { color: var(--color-error); }
|
|
379
|
+
.helper-text.success { color: var(--color-success); }
|
|
380
|
+
.helper-text.warning { color: var(--color-warning); }
|
|
381
|
+
.helper-text.info { color: var(--color-info); }
|
|
429
382
|
|
|
430
|
-
.
|
|
431
|
-
.
|
|
432
|
-
.
|
|
433
|
-
|
|
434
|
-
}
|
|
383
|
+
.form-group-disabled { opacity: 0.5; pointer-events: none; }
|
|
384
|
+
.fieldset { min-inline-size: 0; }
|
|
385
|
+
.form-group, .form-control { min-inline-size: 0; }
|
|
386
|
+
.form-control { width: 100%; margin-bottom: 1rem; color: var(--color-on-surface); }
|
|
435
387
|
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
border-color: var(--color-success);
|
|
440
|
-
box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-success) 10%, transparent);
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
/* Checkbox & Radio — validation pseudo-classes */
|
|
444
|
-
.checkbox:user-invalid,
|
|
445
|
-
.radio:user-invalid {
|
|
446
|
-
border-color: var(--color-error);
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
.checkbox:user-invalid:focus-visible,
|
|
450
|
-
.radio:user-invalid:focus-visible {
|
|
451
|
-
box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
.checkbox:user-valid:checked,
|
|
455
|
-
.radio:user-valid:checked {
|
|
456
|
-
border-color: var(--color-success);
|
|
457
|
-
background-color: var(--color-success);
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
/* Switch — validation pseudo-classes (required but unchecked) */
|
|
461
|
-
.switch:user-invalid {
|
|
462
|
-
border-color: var(--color-error);
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
.switch:user-invalid:focus-visible {
|
|
466
|
-
box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
.switch:user-valid:checked {
|
|
470
|
-
background-color: var(--color-success);
|
|
471
|
-
border-color: var(--color-success);
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
/* File Input — validation pseudo-classes */
|
|
475
|
-
.file-input:user-invalid {
|
|
476
|
-
border-color: var(--color-error);
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
.file-input:user-invalid:focus-visible {
|
|
480
|
-
box-shadow: 0 0 0 3px color-mix(in oklch, var(--color-error) 20%, transparent);
|
|
481
|
-
}
|
|
482
|
-
|
|
483
|
-
/* Filled Input — validation with bottom border */
|
|
484
|
-
.input-filled:user-invalid {
|
|
485
|
-
border-bottom-color: var(--color-error);
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
.input-filled:user-invalid:focus-visible {
|
|
489
|
-
border-bottom-color: var(--color-error);
|
|
490
|
-
box-shadow: none;
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
.input-filled:user-valid {
|
|
494
|
-
border-bottom-color: var(--color-success);
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
.input-filled:user-valid:focus-visible {
|
|
498
|
-
border-bottom-color: var(--color-success);
|
|
499
|
-
box-shadow: none;
|
|
388
|
+
@media (max-width: 640px) {
|
|
389
|
+
.form-group-horizontal { flex-direction: column; }
|
|
390
|
+
.form-row > .form-group { min-width: 0; flex-basis: 100%; }
|
|
500
391
|
}
|
|
501
392
|
}
|