mevebu 1.9.0 → 1.11.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.
@@ -13,6 +13,10 @@
13
13
  --text-lg--line-height: 1.35;
14
14
  --text-xl: 22px;
15
15
  --text-xl--line-height: 1.3;
16
+ --text-2xl: 1.5rem;
17
+ --text-2xl--line-height: calc(2 / 1.5);
18
+ --text-3xl: 1.875rem;
19
+ --text-3xl--line-height: calc(2.25 / 1.875);
16
20
  --font-weight-medium: 500;
17
21
  --font-weight-semibold: 600;
18
22
  --font-weight-bold: 700;
@@ -193,6 +197,9 @@
193
197
  .collapse {
194
198
  visibility: collapse;
195
199
  }
200
+ .invisible {
201
+ visibility: hidden;
202
+ }
196
203
  .visible {
197
204
  visibility: visible;
198
205
  }
@@ -211,6 +218,9 @@
211
218
  .inset-0 {
212
219
  inset: 0px;
213
220
  }
221
+ .start-1 {
222
+ inset-inline-start: calc(var(--spacing) * 1);
223
+ }
214
224
  .end-1 {
215
225
  inset-inline-end: calc(var(--spacing) * 1);
216
226
  }
@@ -244,6 +254,9 @@
244
254
  .z-90 {
245
255
  z-index: 90;
246
256
  }
257
+ .col-span-2 {
258
+ grid-column: span 2 / span 2;
259
+ }
247
260
  .container {
248
261
  width: 100%;
249
262
  @media (width >= 40rem) {
@@ -316,6 +329,9 @@
316
329
  .mt-5 {
317
330
  margin-top: calc(var(--spacing) * 5);
318
331
  }
332
+ .mt-7 {
333
+ margin-top: calc(var(--spacing) * 7);
334
+ }
319
335
  .mt-8 {
320
336
  margin-top: calc(var(--spacing) * 8);
321
337
  }
@@ -361,6 +377,9 @@
361
377
  .block {
362
378
  display: block;
363
379
  }
380
+ .contents {
381
+ display: contents;
382
+ }
364
383
  .flex {
365
384
  display: flex;
366
385
  }
@@ -379,17 +398,36 @@
379
398
  .table {
380
399
  display: table;
381
400
  }
401
+ .table-cell {
402
+ display: table-cell;
403
+ }
382
404
  .aspect-\[4\/3\] {
383
405
  aspect-ratio: 4/3;
384
406
  }
407
+ .size-3 {
408
+ width: calc(var(--spacing) * 3);
409
+ height: calc(var(--spacing) * 3);
410
+ }
411
+ .size-3\.5 {
412
+ width: calc(var(--spacing) * 3.5);
413
+ height: calc(var(--spacing) * 3.5);
414
+ }
385
415
  .size-4 {
386
416
  width: calc(var(--spacing) * 4);
387
417
  height: calc(var(--spacing) * 4);
388
418
  }
419
+ .size-5 {
420
+ width: calc(var(--spacing) * 5);
421
+ height: calc(var(--spacing) * 5);
422
+ }
389
423
  .size-6 {
390
424
  width: calc(var(--spacing) * 6);
391
425
  height: calc(var(--spacing) * 6);
392
426
  }
427
+ .size-7 {
428
+ width: calc(var(--spacing) * 7);
429
+ height: calc(var(--spacing) * 7);
430
+ }
393
431
  .size-8 {
394
432
  width: calc(var(--spacing) * 8);
395
433
  height: calc(var(--spacing) * 8);
@@ -402,6 +440,14 @@
402
440
  width: calc(var(--spacing) * 11);
403
441
  height: calc(var(--spacing) * 11);
404
442
  }
443
+ .size-12 {
444
+ width: calc(var(--spacing) * 12);
445
+ height: calc(var(--spacing) * 12);
446
+ }
447
+ .size-14 {
448
+ width: calc(var(--spacing) * 14);
449
+ height: calc(var(--spacing) * 14);
450
+ }
405
451
  .size-16 {
406
452
  width: calc(var(--spacing) * 16);
407
453
  height: calc(var(--spacing) * 16);
@@ -414,6 +460,10 @@
414
460
  width: 15px;
415
461
  height: 15px;
416
462
  }
463
+ .size-\[17px\] {
464
+ width: 17px;
465
+ height: 17px;
466
+ }
417
467
  .size-\[18px\] {
418
468
  width: 18px;
419
469
  height: 18px;
@@ -456,6 +506,9 @@
456
506
  .h-14 {
457
507
  height: calc(var(--spacing) * 14);
458
508
  }
509
+ .h-24 {
510
+ height: calc(var(--spacing) * 24);
511
+ }
459
512
  .h-\[22px\] {
460
513
  height: 22px;
461
514
  }
@@ -480,9 +533,15 @@
480
533
  .h-full {
481
534
  height: 100%;
482
535
  }
536
+ .h-px {
537
+ height: 1px;
538
+ }
483
539
  .max-h-80 {
484
540
  max-height: calc(var(--spacing) * 80);
485
541
  }
542
+ .max-h-\[320px\] {
543
+ max-height: 320px;
544
+ }
486
545
  .max-h-\[340px\] {
487
546
  max-height: 340px;
488
547
  }
@@ -498,6 +557,9 @@
498
557
  .min-h-7 {
499
558
  min-height: calc(var(--spacing) * 7);
500
559
  }
560
+ .min-h-8 {
561
+ min-height: calc(var(--spacing) * 8);
562
+ }
501
563
  .min-h-11 {
502
564
  min-height: calc(var(--spacing) * 11);
503
565
  }
@@ -507,9 +569,15 @@
507
569
  .min-h-40 {
508
570
  min-height: calc(var(--spacing) * 40);
509
571
  }
572
+ .min-h-\[1\.2em\] {
573
+ min-height: 1.2em;
574
+ }
510
575
  .min-h-\[22px\] {
511
576
  min-height: 22px;
512
577
  }
578
+ .min-h-\[56px\] {
579
+ min-height: 56px;
580
+ }
513
581
  .min-h-\[120px\] {
514
582
  min-height: 120px;
515
583
  }
@@ -552,6 +620,9 @@
552
620
  .w-\[min\(640px\,100\%\)\] {
553
621
  width: min(640px, 100%);
554
622
  }
623
+ .w-auto {
624
+ width: auto;
625
+ }
555
626
  .w-full {
556
627
  width: 100%;
557
628
  }
@@ -579,6 +650,9 @@
579
650
  .max-w-\[62ch\] {
580
651
  max-width: 62ch;
581
652
  }
653
+ .max-w-\[64ch\] {
654
+ max-width: 64ch;
655
+ }
582
656
  .max-w-\[340px\] {
583
657
  max-width: 340px;
584
658
  }
@@ -588,6 +662,9 @@
588
662
  .max-w-\[var\(--bench\)\] {
589
663
  max-width: var(--bench);
590
664
  }
665
+ .max-w-full {
666
+ max-width: 100%;
667
+ }
591
668
  .min-w-0 {
592
669
  min-width: 0px;
593
670
  }
@@ -603,6 +680,9 @@
603
680
  .shrink {
604
681
  flex-shrink: 1;
605
682
  }
683
+ .grow {
684
+ flex-grow: 1;
685
+ }
606
686
  .border-collapse {
607
687
  border-collapse: collapse;
608
688
  }
@@ -621,6 +701,15 @@
621
701
  .scale-\[0\.97\] {
622
702
  scale: 0.97;
623
703
  }
704
+ .-rotate-90 {
705
+ rotate: calc(90deg * -1);
706
+ }
707
+ .rotate-90 {
708
+ rotate: 90deg;
709
+ }
710
+ .rotate-180 {
711
+ rotate: 180deg;
712
+ }
624
713
  .transform {
625
714
  transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,);
626
715
  }
@@ -645,15 +734,27 @@
645
734
  .\[grid-template-columns\:88px_minmax\(0\,1fr\)_62px\] {
646
735
  grid-template-columns: 88px minmax(0,1fr) 62px;
647
736
  }
737
+ .\[grid-template-columns\:minmax\(0\,1fr\)_auto\] {
738
+ grid-template-columns: minmax(0,1fr) auto;
739
+ }
648
740
  .\[grid-template-columns\:minmax\(90px\,34\%\)_minmax\(0\,1fr\)\] {
649
741
  grid-template-columns: minmax(90px,34%) minmax(0,1fr);
650
742
  }
743
+ .\[grid-template-columns\:repeat\(96\,minmax\(0\,1fr\)\)\] {
744
+ grid-template-columns: repeat(96,minmax(0,1fr));
745
+ }
651
746
  .\[grid-template-columns\:repeat\(auto-fill\,minmax\(92px\,1fr\)\)\] {
652
747
  grid-template-columns: repeat(auto-fill,minmax(92px,1fr));
653
748
  }
749
+ .\[grid-template-columns\:repeat\(auto-fill\,minmax\(150px\,1fr\)\)\] {
750
+ grid-template-columns: repeat(auto-fill,minmax(150px,1fr));
751
+ }
654
752
  .\[grid-template-columns\:repeat\(auto-fill\,minmax\(160px\,1fr\)\)\] {
655
753
  grid-template-columns: repeat(auto-fill,minmax(160px,1fr));
656
754
  }
755
+ .\[grid-template-columns\:repeat\(auto-fill\,minmax\(170px\,1fr\)\)\] {
756
+ grid-template-columns: repeat(auto-fill,minmax(170px,1fr));
757
+ }
657
758
  .\[grid-template-columns\:repeat\(auto-fit\,minmax\(96px\,1fr\)\)\] {
658
759
  grid-template-columns: repeat(auto-fit,minmax(96px,1fr));
659
760
  }
@@ -666,6 +767,9 @@
666
767
  .grid-cols-2 {
667
768
  grid-template-columns: repeat(2, minmax(0, 1fr));
668
769
  }
770
+ .grid-cols-4 {
771
+ grid-template-columns: repeat(4, minmax(0, 1fr));
772
+ }
669
773
  .grid-cols-\[minmax\(0\,1fr\)_auto\] {
670
774
  grid-template-columns: minmax(0,1fr) auto;
671
775
  }
@@ -690,6 +794,9 @@
690
794
  .items-center {
691
795
  align-items: center;
692
796
  }
797
+ .items-end {
798
+ align-items: flex-end;
799
+ }
693
800
  .items-start {
694
801
  align-items: flex-start;
695
802
  }
@@ -791,6 +898,9 @@
791
898
  .rounded {
792
899
  border-radius: 0.25rem;
793
900
  }
901
+ .rounded-\[1px\] {
902
+ border-radius: 1px;
903
+ }
794
904
  .rounded-\[3px\] {
795
905
  border-radius: 3px;
796
906
  }
@@ -913,6 +1023,12 @@
913
1023
  .bg-jade-soft {
914
1024
  background-color: var(--jade-soft);
915
1025
  }
1026
+ .bg-jade\/70 {
1027
+ background-color: var(--jade);
1028
+ @supports (color: color-mix(in lab, red, red)) {
1029
+ background-color: color-mix(in oklab, var(--jade) 70%, transparent);
1030
+ }
1031
+ }
916
1032
  .bg-orbit {
917
1033
  background-color: var(--orbit);
918
1034
  }
@@ -937,9 +1053,15 @@
937
1053
  .bg-\[image\:var\(--caret\)\] {
938
1054
  background-image: var(--caret);
939
1055
  }
1056
+ .bg-\[repeating-conic-gradient\(\#0000_0\%_25\%\,var\(--deck-2\)_0\%_50\%\)\] {
1057
+ background-image: repeating-conic-gradient(#0000 0% 25%,var(--deck-2) 0% 50%);
1058
+ }
940
1059
  .bg-\[length\:14px\] {
941
1060
  background-size: 14px;
942
1061
  }
1062
+ .bg-\[length\:16px_16px\] {
1063
+ background-size: 16px 16px;
1064
+ }
943
1065
  .bg-\[position\:right_12px_center\] {
944
1066
  background-position: right 12px center;
945
1067
  }
@@ -949,6 +1071,9 @@
949
1071
  .object-contain {
950
1072
  object-fit: contain;
951
1073
  }
1074
+ .object-cover {
1075
+ object-fit: cover;
1076
+ }
952
1077
  .p-0 {
953
1078
  padding: 0px;
954
1079
  }
@@ -964,9 +1089,18 @@
964
1089
  .p-2 {
965
1090
  padding: calc(var(--spacing) * 2);
966
1091
  }
1092
+ .p-2\.5 {
1093
+ padding: calc(var(--spacing) * 2.5);
1094
+ }
1095
+ .p-3 {
1096
+ padding: calc(var(--spacing) * 3);
1097
+ }
967
1098
  .p-3\.5 {
968
1099
  padding: calc(var(--spacing) * 3.5);
969
1100
  }
1101
+ .p-4 {
1102
+ padding: calc(var(--spacing) * 4);
1103
+ }
970
1104
  .p-5 {
971
1105
  padding: calc(var(--spacing) * 5);
972
1106
  }
@@ -988,6 +1122,15 @@
988
1122
  .p-\[var\(--card-pad\)\] {
989
1123
  padding: var(--card-pad);
990
1124
  }
1125
+ .px-0 {
1126
+ padding-inline: 0px;
1127
+ }
1128
+ .px-1 {
1129
+ padding-inline: var(--spacing);
1130
+ }
1131
+ .px-1\.5 {
1132
+ padding-inline: calc(var(--spacing) * 1.5);
1133
+ }
991
1134
  .px-2 {
992
1135
  padding-inline: calc(var(--spacing) * 2);
993
1136
  }
@@ -1024,6 +1167,9 @@
1024
1167
  .px-\[var\(--margin\)\] {
1025
1168
  padding-inline: var(--margin);
1026
1169
  }
1170
+ .py-0\.5 {
1171
+ padding-block: calc(var(--spacing) * 0.5);
1172
+ }
1027
1173
  .py-1 {
1028
1174
  padding-block: var(--spacing);
1029
1175
  }
@@ -1156,10 +1302,18 @@
1156
1302
  .font-sans {
1157
1303
  font-family: var(--sans);
1158
1304
  }
1305
+ .text-2xl {
1306
+ font-size: var(--text-2xl);
1307
+ line-height: var(--tw-leading, var(--text-2xl--line-height));
1308
+ }
1159
1309
  .text-2xs {
1160
1310
  font-size: var(--text-2xs);
1161
1311
  line-height: var(--tw-leading, var(--text-2xs--line-height));
1162
1312
  }
1313
+ .text-3xl {
1314
+ font-size: var(--text-3xl);
1315
+ line-height: var(--tw-leading, var(--text-3xl--line-height));
1316
+ }
1163
1317
  .text-base {
1164
1318
  font-size: var(--text-base);
1165
1319
  line-height: var(--tw-leading, var(--text-base--line-height));
@@ -1199,14 +1353,29 @@
1199
1353
  .text-\[0\.92em\] {
1200
1354
  font-size: 0.92em;
1201
1355
  }
1356
+ .text-\[clamp\(34px\,6vw\,52px\)\] {
1357
+ font-size: clamp(34px, 6vw, 52px);
1358
+ }
1202
1359
  .leading-\[1\.5\] {
1203
1360
  --tw-leading: 1.5;
1204
1361
  line-height: 1.5;
1205
1362
  }
1363
+ .leading-\[1\.6\] {
1364
+ --tw-leading: 1.6;
1365
+ line-height: 1.6;
1366
+ }
1206
1367
  .leading-\[1\.45\] {
1207
1368
  --tw-leading: 1.45;
1208
1369
  line-height: 1.45;
1209
1370
  }
1371
+ .leading-\[1\.55\] {
1372
+ --tw-leading: 1.55;
1373
+ line-height: 1.55;
1374
+ }
1375
+ .leading-\[1\.65\] {
1376
+ --tw-leading: 1.65;
1377
+ line-height: 1.65;
1378
+ }
1210
1379
  .leading-normal {
1211
1380
  --tw-leading: var(--leading-normal);
1212
1381
  line-height: var(--leading-normal);
@@ -1231,6 +1400,10 @@
1231
1400
  --tw-tracking: -0.02em;
1232
1401
  letter-spacing: -0.02em;
1233
1402
  }
1403
+ .tracking-\[-0\.03em\] {
1404
+ --tw-tracking: -0.03em;
1405
+ letter-spacing: -0.03em;
1406
+ }
1234
1407
  .tracking-\[-0\.025em\] {
1235
1408
  --tw-tracking: -0.025em;
1236
1409
  letter-spacing: -0.025em;
@@ -1239,6 +1412,10 @@
1239
1412
  --tw-tracking: -0.035em;
1240
1413
  letter-spacing: -0.035em;
1241
1414
  }
1415
+ .tracking-\[0\.06em\] {
1416
+ --tw-tracking: 0.06em;
1417
+ letter-spacing: 0.06em;
1418
+ }
1242
1419
  .tracking-\[0\.08em\] {
1243
1420
  --tw-tracking: 0.08em;
1244
1421
  letter-spacing: 0.08em;
@@ -1297,13 +1474,25 @@
1297
1474
  .uppercase {
1298
1475
  text-transform: uppercase;
1299
1476
  }
1477
+ .italic {
1478
+ font-style: italic;
1479
+ }
1300
1480
  .tabular-nums {
1301
1481
  --tw-numeric-spacing: tabular-nums;
1302
1482
  font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,);
1303
1483
  }
1484
+ .line-through {
1485
+ text-decoration-line: line-through;
1486
+ }
1304
1487
  .no-underline {
1305
1488
  text-decoration-line: none;
1306
1489
  }
1490
+ .overline {
1491
+ text-decoration-line: overline;
1492
+ }
1493
+ .underline {
1494
+ text-decoration-line: underline;
1495
+ }
1307
1496
  .underline-offset-\[3px\] {
1308
1497
  text-underline-offset: 3px;
1309
1498
  }
@@ -1360,6 +1549,10 @@
1360
1549
  --tw-blur: blur(8px);
1361
1550
  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
1362
1551
  }
1552
+ .grayscale {
1553
+ --tw-grayscale: grayscale(100%);
1554
+ filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
1555
+ }
1363
1556
  .invert {
1364
1557
  --tw-invert: invert(100%);
1365
1558
  filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
@@ -1397,6 +1590,11 @@
1397
1590
  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
1398
1591
  transition-duration: var(--tw-duration, var(--default-transition-duration));
1399
1592
  }
1593
+ .transition-\[width\] {
1594
+ transition-property: width;
1595
+ transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
1596
+ transition-duration: var(--tw-duration, var(--default-transition-duration));
1597
+ }
1400
1598
  .transition-colors {
1401
1599
  transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to;
1402
1600
  transition-timing-function: var(--tw-ease, var(--default-transition-timing-function));
@@ -1438,6 +1636,9 @@
1438
1636
  .\[image-rendering\:pixelated\] {
1439
1637
  image-rendering: pixelated;
1440
1638
  }
1639
+ .\[start\:end\] {
1640
+ start: end;
1641
+ }
1441
1642
  .group-data-\[on\]\:text-ink:is(:where(.group)[data-on] *) {
1442
1643
  color: var(--ink);
1443
1644
  }
@@ -1474,6 +1675,13 @@
1474
1675
  .focus-within\:border-jade:focus-within {
1475
1676
  border-color: var(--jade);
1476
1677
  }
1678
+ .focus-within\:ring-3:focus-within {
1679
+ --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
1680
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1681
+ }
1682
+ .focus-within\:ring-jade-soft:focus-within {
1683
+ --tw-ring-color: var(--jade-soft);
1684
+ }
1477
1685
  @media (hover: hover) {
1478
1686
  .hover\:border-danger:hover {
1479
1687
  border-color: var(--danger);
@@ -1532,6 +1740,10 @@
1532
1740
  .focus\:border-jade:focus {
1533
1741
  border-color: var(--jade);
1534
1742
  }
1743
+ .focus\:ring-0:focus {
1744
+ --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
1745
+ box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1746
+ }
1535
1747
  .focus\:ring-3:focus {
1536
1748
  --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
1537
1749
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
@@ -1571,9 +1783,15 @@
1571
1783
  .disabled\:cursor-not-allowed:disabled {
1572
1784
  cursor: not-allowed;
1573
1785
  }
1786
+ .disabled\:opacity-40:disabled {
1787
+ opacity: 40%;
1788
+ }
1574
1789
  .disabled\:opacity-45:disabled {
1575
1790
  opacity: 45%;
1576
1791
  }
1792
+ .disabled\:opacity-50:disabled {
1793
+ opacity: 50%;
1794
+ }
1577
1795
  .has-checked\:border-jade:has(:checked) {
1578
1796
  border-color: var(--jade);
1579
1797
  }
@@ -1703,6 +1921,9 @@
1703
1921
  .sm\:grid-cols-2 {
1704
1922
  grid-template-columns: repeat(2, minmax(0, 1fr));
1705
1923
  }
1924
+ .sm\:grid-cols-4 {
1925
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1926
+ }
1706
1927
  }
1707
1928
  @media (width >= 45rem) {
1708
1929
  .min-\[45rem\]\:flex {
@@ -750,7 +750,7 @@ export function blank(iconName, text) {
750
750
  // ---------- version ----------
751
751
 
752
752
  // Kept in one place. The CLI reads the same value from package.json.
753
- export const VERSION = "1.9.0";
753
+ export const VERSION = "1.11.0";
754
754
  export const PACKAGE_NAME = "mevebu";
755
755
  export const REPO_SLUG = "mevebu/mevebu";
756
756
 
@@ -0,0 +1,125 @@
1
+ // File plumbing shared by the converter tools: a drop target, a size label, a
2
+ // name without its extension, and an image decoder. Kept here so ten tools do
3
+ // not each grow their own copy.
4
+ import { el, icon } from "./core.js";
5
+
6
+ export function formatBytes(bytes) {
7
+ if (!bytes) return "0 B";
8
+ if (bytes < 1024) return `${bytes} B`;
9
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(bytes < 10240 ? 1 : 0)} KB`;
10
+ return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
11
+ }
12
+
13
+ export function baseName(name) {
14
+ return (name || "file").replace(/\.[^.]+$/, "") || "file";
15
+ }
16
+
17
+ export function extension(name) {
18
+ const match = /\.([^.]+)$/.exec(name || "");
19
+ return match ? match[1].toLowerCase() : "";
20
+ }
21
+
22
+ /** A dashed drop zone. Calls `onFiles` with a FileList or an array of files. */
23
+ export function dropzone({ label, hint = "or choose a file", accept = "", multiple = false, iconName = "image-up" }) {
24
+ const picker = el("input", { type: "file", accept, multiple, class: "hidden" });
25
+ const node = el(
26
+ "div",
27
+ {
28
+ class:
29
+ "grid cursor-pointer justify-items-center gap-1.5 rounded-r2 border border-dashed border-orbit-hard bg-deck-2 px-4 py-7 text-center transition-[border-color,background-color] duration-150 hover:border-jade focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-jade data-[drag]:border-jade data-[drag]:bg-jade-soft",
30
+ role: "button",
31
+ tabindex: "0",
32
+ "aria-label": label,
33
+ },
34
+ icon(iconName, "size-6 text-ink-3"),
35
+ el("p", { class: "text-sm font-semibold" }, label),
36
+ el("p", { class: "text-2xs text-ink-3" }, hint),
37
+ picker
38
+ );
39
+
40
+ let handler = () => {};
41
+ let depth = 0;
42
+
43
+ node.addEventListener("click", () => picker.click());
44
+ node.addEventListener("keydown", (event) => {
45
+ if (event.key === "Enter" || event.key === " ") {
46
+ event.preventDefault();
47
+ picker.click();
48
+ }
49
+ });
50
+ picker.addEventListener("change", () => {
51
+ if (picker.files?.length) handler(picker.files);
52
+ picker.value = "";
53
+ });
54
+ node.addEventListener("dragenter", (event) => {
55
+ event.preventDefault();
56
+ depth++;
57
+ node.dataset.drag = "";
58
+ });
59
+ node.addEventListener("dragover", (event) => event.preventDefault());
60
+ node.addEventListener("dragleave", () => {
61
+ depth = Math.max(0, depth - 1);
62
+ if (!depth) delete node.dataset.drag;
63
+ });
64
+ node.addEventListener("drop", (event) => {
65
+ event.preventDefault();
66
+ depth = 0;
67
+ delete node.dataset.drag;
68
+ const files = Array.from(event.dataTransfer?.files ?? []);
69
+ if (files.length) handler(files);
70
+ });
71
+
72
+ node.onFiles = (fn) => {
73
+ handler = fn;
74
+ };
75
+ node.picker = picker;
76
+ return node;
77
+ }
78
+
79
+ /** Decodes an image file, preferring createImageBitmap and falling back to <img>. */
80
+ export async function decodeImage(file) {
81
+ if (typeof createImageBitmap === "function") {
82
+ try {
83
+ return await createImageBitmap(file, { imageOrientation: "from-image" });
84
+ } catch {
85
+ // SVG and a few odd files only decode through an <img>.
86
+ }
87
+ }
88
+ const url = URL.createObjectURL(file);
89
+ try {
90
+ const image = new Image();
91
+ image.decoding = "sync";
92
+ await new Promise((resolve, reject) => {
93
+ image.onload = resolve;
94
+ image.onerror = () => reject(new Error("This file is not an image the browser can read."));
95
+ image.src = url;
96
+ });
97
+ return image;
98
+ } finally {
99
+ setTimeout(() => URL.revokeObjectURL(url), 1000);
100
+ }
101
+ }
102
+
103
+ export function imageSize(source) {
104
+ return {
105
+ width: source.width || source.naturalWidth || 0,
106
+ height: source.height || source.naturalHeight || 0,
107
+ };
108
+ }
109
+
110
+ export function canvasToBlob(canvas, type = "image/png", quality) {
111
+ return new Promise((resolve, reject) => {
112
+ canvas.toBlob(
113
+ (blob) => (blob ? resolve(blob) : reject(new Error("The browser could not write this file."))),
114
+ type,
115
+ quality
116
+ );
117
+ });
118
+ }
119
+
120
+ /** Sorts files by name with numbers read as numbers, so page-2 comes before page-10. */
121
+ export function naturalSort(files) {
122
+ return [...files].sort((a, b) =>
123
+ a.name.localeCompare(b.name, undefined, { numeric: true, sensitivity: "base" })
124
+ );
125
+ }
@@ -1,5 +1,5 @@
1
1
  // GENERATED FILE, DO NOT EDIT.
2
- // Source: lucide v1.59.0 (ISC), icons/174 names from scripts/vendor-icons.mjs
2
+ // Source: lucide v1.57.0 (ISC), icons/175 names from scripts/vendor-icons.mjs
3
3
  // Regenerate with: npm run icons
4
4
 
5
5
  const D = {
@@ -44,6 +44,8 @@ const D = {
44
44
  "rotate-cw": [ ["path", { d: "M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8" }], ["path", { d: "M21 3v5h-5" }] ],
45
45
  "download": [ ["path", { d: "M12 15V3" }], ["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }], ["path", { d: "m7 10 5 5 5-5" }] ],
46
46
  "upload": [ ["path", { d: "M12 3v12" }], ["path", { d: "m17 8-5-5-5 5" }], ["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }] ],
47
+ "delete": [ [ "path", { d: "M10 5a2 2 0 0 0-1.344.519l-6.328 5.74a1 1 0 0 0 0 1.481l6.328 5.741A2 2 0 0 0 10 19h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2z" } ], ["path", { d: "m12 9 6 6" }], ["path", { d: "m18 9-6 6" }] ],
48
+ "scissors": [ ["circle", { cx: "6", cy: "6", r: "3" }], ["path", { d: "M8.12 8.12 12 12" }], ["path", { d: "M20 4 8.12 15.88" }], ["circle", { cx: "6", cy: "18", r: "3" }], ["path", { d: "M14.8 14.8 20 20" }] ],
47
49
  "arrow-left-right": [ ["path", { d: "M8 3 4 7l4 4" }], ["path", { d: "M4 7h16" }], ["path", { d: "m16 21 4-4-4-4" }], ["path", { d: "M20 17H4" }] ],
48
50
  "trash": [ ["path", { d: "M10 11v6" }], ["path", { d: "M14 11v6" }], ["path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6" }], ["path", { d: "M3 6h18" }], ["path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" }] ],
49
51
  "plus": [ ["path", { d: "M5 12h14" }], ["path", { d: "M12 5v14" }] ],
@@ -166,7 +168,6 @@ const D = {
166
168
  "receipt": [ ["path", { d: "M12 17V7" }], ["path", { d: "M16 8h-6a2 2 0 0 0 0 4h4a2 2 0 0 1 0 4H8" }], [ "path", { d: "M4 3a1 1 0 0 1 1-1 1.3 1.3 0 0 1 .7.2l.933.6a1.3 1.3 0 0 0 1.4 0l.934-.6a1.3 1.3 0 0 1 1.4 0l.933.6a1.3 1.3 0 0 0 1.4 0l.933-.6a1.3 1.3 0 0 1 1.4 0l.934.6a1.3 1.3 0 0 0 1.4 0l.933-.6A1.3 1.3 0 0 1 19 2a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1 1.3 1.3 0 0 1-.7-.2l-.933-.6a1.3 1.3 0 0 0-1.4 0l-.934.6a1.3 1.3 0 0 1-1.4 0l-.933-.6a1.3 1.3 0 0 0-1.4 0l-.933.6a1.3 1.3 0 0 1-1.4 0l-.934-.6a1.3 1.3 0 0 0-1.4 0l-.933.6a1.3 1.3 0 0 1-.7.2 1 1 0 0 1-1-1z" } ] ],
167
169
  "banknote": [ ["rect", { width: "20", height: "12", x: "2", y: "6", rx: "2" }], ["circle", { cx: "12", cy: "12", r: "2" }], ["path", { d: "M6 12h.01M18 12h.01" }] ],
168
170
  "package": [ [ "path", { d: "M11 21.73a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73z" } ], ["path", { d: "M12 22V12" }], ["polyline", { points: "3.29 7 12 12 20.71 7" }], ["path", { d: "m7.5 4.27 9 5.15" }] ],
169
- "film": [ ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2" }], ["path", { d: "M7 3v18" }], ["path", { d: "M3 7.5h4" }], ["path", { d: "M3 12h18" }], ["path", { d: "M3 16.5h4" }], ["path", { d: "M17 3v18" }], ["path", { d: "M17 7.5h4" }], ["path", { d: "M17 16.5h4" }] ],
170
171
  "video": [ ["path", { d: "m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5" }], ["rect", { x: "2", y: "6", width: "14", height: "12", rx: "2" }] ],
171
172
  "git-pull-request": [ ["circle", { cx: "18", cy: "18", r: "3" }], ["circle", { cx: "6", cy: "6", r: "3" }], ["path", { d: "M13 6h3a2 2 0 0 1 2 2v7" }], ["line", { x1: "6", x2: "6", y1: "9", y2: "21" }] ],
172
173
  "weight": [ ["circle", { cx: "12", cy: "5", r: "3" }], [ "path", { d: "M6.5 8a2 2 0 0 0-1.905 1.46L2.1 18.5A2 2 0 0 0 4 21h16a2 2 0 0 0 1.925-2.54L19.4 9.5A2 2 0 0 0 17.48 8Z" } ] ],