domma-js 0.54.0 → 0.56.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.
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Domma Elements CSS v0.54.0
2
+ * Domma Elements CSS v0.56.0
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-10-24T13:16:34.341Z
6
- * Commit: 8d2b9ea
5
+ * Built: 2026-10-24T16:12:49.159Z
6
+ * Commit: f768320
7
7
  */
8
8
 
9
9
  /**
@@ -366,6 +366,54 @@
366
366
  padding-bottom: 0;
367
367
  }
368
368
 
369
+ /* E.card options (src/components/card.js) */
370
+ .card-collapsible .card-body,
371
+ .card-collapse-icon {
372
+ transition-duration: var(--dm-card-duration, 200ms);
373
+ }
374
+
375
+ .card-no-animation,
376
+ .card-no-animation .card-body,
377
+ .card-no-animation .card-collapse-icon {
378
+ transition: none;
379
+ }
380
+
381
+ .card-collapse-icon {
382
+ display: inline-flex;
383
+ align-items: center;
384
+ }
385
+
386
+ .card-primary .card-collapse-icon,
387
+ .card-primary.card-collapsible .card-header:hover .card-collapse-icon {
388
+ color: inherit;
389
+ }
390
+
391
+ .card-title-icon {
392
+ display: inline-flex;
393
+ vertical-align: -0.125em;
394
+ margin-right: var(--dm-space-2);
395
+ }
396
+
397
+ .card-clickable {
398
+ cursor: pointer;
399
+ }
400
+
401
+ .card-shadow-none {
402
+ box-shadow: none;
403
+ }
404
+
405
+ .card-shadow-sm {
406
+ box-shadow: var(--dm-shadow-sm);
407
+ }
408
+
409
+ .card-shadow-lg {
410
+ box-shadow: var(--dm-shadow-lg);
411
+ }
412
+
413
+ .card-square {
414
+ border-radius: 0;
415
+ }
416
+
369
417
 
370
418
  /* ============================================
371
419
  MODAL
@@ -468,6 +516,50 @@
468
516
  max-width: 1200px !important;
469
517
  }
470
518
 
519
+ /* E.modal (src/components/modal.js): the caller's element becomes the full-screen layer
520
+ that holds the dialog drawn in its shadow root. The class is doubled so it outranks
521
+ .modal / .modal-sm / .modal.active, which describe the hand-written, JS-free modal
522
+ box and would otherwise hide or shrink the layer. z-index stays settable inline. */
523
+ .dm-modal-host.dm-modal-host {
524
+ display: none;
525
+ position: fixed;
526
+ inset: 0;
527
+ top: 0;
528
+ left: 0;
529
+ right: 0;
530
+ bottom: 0;
531
+ width: auto;
532
+ max-width: none;
533
+ height: auto;
534
+ max-height: none;
535
+ margin: 0;
536
+ padding: 0;
537
+ border: 0;
538
+ border-radius: 0;
539
+ background: none;
540
+ box-shadow: none;
541
+ overflow: visible;
542
+ opacity: 1;
543
+ transform: none;
544
+ transition: none;
545
+ pointer-events: auto;
546
+ align-items: center;
547
+ justify-content: center;
548
+ }
549
+
550
+ .dm-modal-host.dm-modal-host.dm-modal-visible {
551
+ display: flex;
552
+ }
553
+
554
+ .dm-modal-host.dm-modal-host.dm-modal-no-backdrop {
555
+ pointer-events: none;
556
+ }
557
+
558
+ .dm-modal-host.dm-modal-host.dm-modal-top {
559
+ align-items: flex-start;
560
+ padding-top: 5vh;
561
+ }
562
+
471
563
 
472
564
  /* ============================================
473
565
  TABS
@@ -1446,6 +1538,57 @@ textarea:not([class])::placeholder {
1446
1538
  color: var(--dm-info-text, var(--dm-white));
1447
1539
  }
1448
1540
 
1541
+ .badge-light {
1542
+ background-color: var(--dm-background-alt);
1543
+ color: var(--dm-text);
1544
+ }
1545
+
1546
+ .badge-dark {
1547
+ background-color: var(--dm-text);
1548
+ color: var(--dm-background);
1549
+ }
1550
+
1551
+ /* E.badge options (src/components/badge.js) */
1552
+ .badge {
1553
+ gap: 0.25rem;
1554
+ }
1555
+
1556
+ .badge-sm {
1557
+ padding: 2px 6px;
1558
+ font-size: 0.625rem;
1559
+ }
1560
+
1561
+ .badge-lg {
1562
+ padding: var(--dm-space-1) var(--dm-space-3);
1563
+ font-size: var(--dm-font-size-sm);
1564
+ }
1565
+
1566
+ .badge-rounded {
1567
+ border-radius: var(--dm-radius-sm);
1568
+ }
1569
+
1570
+ .badge-pill {
1571
+ border-radius: var(--dm-radius-full);
1572
+ }
1573
+
1574
+ /* Outline badges carry .badge-outline-<variant> instead of the filled .badge-<variant>:
1575
+ the page's text on its surface, ringed in the variant colour - legible in every theme
1576
+ (variant-coloured text is not: warning on a light surface is under 2:1) */
1577
+ .badge-outline {
1578
+ background-color: var(--dm-surface);
1579
+ color: var(--dm-text);
1580
+ box-shadow: inset 0 0 0 1px var(--dm-border);
1581
+ }
1582
+
1583
+ .badge-outline-primary { box-shadow: inset 0 0 0 1px var(--dm-primary); }
1584
+ .badge-outline-secondary { box-shadow: inset 0 0 0 1px var(--dm-text-secondary); }
1585
+ .badge-outline-success { box-shadow: inset 0 0 0 1px var(--dm-success); }
1586
+ .badge-outline-danger { box-shadow: inset 0 0 0 1px var(--dm-danger); }
1587
+ .badge-outline-warning { box-shadow: inset 0 0 0 1px var(--dm-warning); }
1588
+ .badge-outline-info { box-shadow: inset 0 0 0 1px var(--dm-info); }
1589
+ .badge-outline-light { box-shadow: inset 0 0 0 1px var(--dm-border); }
1590
+ .badge-outline-dark { box-shadow: inset 0 0 0 1px var(--dm-text); }
1591
+
1449
1592
  /* Pulse animation for new content indicators */
1450
1593
  .badge-pulse {
1451
1594
  animation: badge-pulse 2s ease-in-out infinite;
@@ -1491,6 +1634,15 @@ textarea:not([class])::placeholder {
1491
1634
  background-color: var(--dm-danger);
1492
1635
  }
1493
1636
 
1637
+ /* E.numberBadge puts the counter inside its target; a target already positioned keeps its own */
1638
+ :where(.badge-counter-host) {
1639
+ position: relative;
1640
+ }
1641
+
1642
+ domma-number-badge {
1643
+ display: inline-flex;
1644
+ }
1645
+
1494
1646
  /* Wrapper for positioned counter badges */
1495
1647
  .badge-counter-wrapper {
1496
1648
  position: relative;
@@ -5491,17 +5643,22 @@ code {
5491
5643
  TOOLTIP
5492
5644
  ============================================ */
5493
5645
 
5646
+ /* E.tooltip's bubble (src/components/tooltip.js): on document.body, placed at the target.
5647
+ Inverted against the page - the text colour as its fill - in light and dark themes. */
5494
5648
  .domma-tooltip {
5495
- position: absolute;
5496
- z-index: 9999;
5497
- background-color: var(--dm-background);
5498
- color: var(--dm-text);
5649
+ --dm-tooltip-bg: var(--dm-text);
5650
+ position: fixed;
5651
+ top: 0;
5652
+ left: 0;
5653
+ z-index: 10050;
5654
+ background-color: var(--dm-text);
5655
+ color: var(--dm-background);
5499
5656
  padding: 0.5rem 0.75rem;
5500
5657
  border-radius: var(--dm-radius-md);
5501
5658
  font-size: 0.875rem;
5502
5659
  line-height: 1.4;
5503
- max-width: 200px;
5504
- word-wrap: break-word;
5660
+ max-width: 250px;
5661
+ overflow-wrap: break-word;
5505
5662
  pointer-events: none;
5506
5663
  opacity: 0;
5507
5664
  transition: opacity var(--dm-transition-fast);
@@ -5512,9 +5669,42 @@ code {
5512
5669
  opacity: 1;
5513
5670
  }
5514
5671
 
5515
- [data-mode="dark"] .domma-tooltip {
5516
- background-color: var(--dm-text);
5517
- color: var(--dm-text-inverse);
5672
+ .domma-tooltip::before {
5673
+ content: '';
5674
+ position: absolute;
5675
+ border: 5px solid transparent;
5676
+ }
5677
+
5678
+ .domma-tooltip[data-position="top"]::before {
5679
+ top: 100%;
5680
+ left: 50%;
5681
+ transform: translateX(-50%);
5682
+ border-top-color: var(--dm-tooltip-bg);
5683
+ }
5684
+
5685
+ .domma-tooltip[data-position="bottom"]::before {
5686
+ bottom: 100%;
5687
+ left: 50%;
5688
+ transform: translateX(-50%);
5689
+ border-bottom-color: var(--dm-tooltip-bg);
5690
+ }
5691
+
5692
+ .domma-tooltip[data-position="left"]::before {
5693
+ left: 100%;
5694
+ top: 50%;
5695
+ transform: translateY(-50%);
5696
+ border-left-color: var(--dm-tooltip-bg);
5697
+ }
5698
+
5699
+ .domma-tooltip[data-position="right"]::before {
5700
+ right: 100%;
5701
+ top: 50%;
5702
+ transform: translateY(-50%);
5703
+ border-right-color: var(--dm-tooltip-bg);
5704
+ }
5705
+
5706
+ domma-tooltip {
5707
+ display: inline-block;
5518
5708
  }
5519
5709
 
5520
5710
 
@@ -5736,21 +5926,36 @@ code {
5736
5926
  }
5737
5927
 
5738
5928
  /* Toast variants */
5929
+ .domma-toast {
5930
+ position: relative;
5931
+ overflow: hidden;
5932
+ align-items: flex-start;
5933
+ border: 1px solid var(--dm-border);
5934
+ transition-duration: var(--dm-toast-duration, 300ms);
5935
+ }
5936
+
5739
5937
  .domma-toast.domma-toast-success {
5740
5938
  background-color: var(--dm-success);
5939
+ color: var(--dm-success-text, var(--dm-white));
5940
+ border-color: transparent;
5741
5941
  }
5742
5942
 
5743
5943
  .domma-toast.domma-toast-error {
5744
5944
  background-color: var(--dm-danger);
5945
+ color: var(--dm-danger-text, var(--dm-white));
5946
+ border-color: transparent;
5745
5947
  }
5746
5948
 
5747
5949
  .domma-toast.domma-toast-warning {
5748
5950
  background-color: var(--dm-warning);
5749
5951
  color: var(--dm-warning-text, var(--dm-text));
5952
+ border-color: transparent;
5750
5953
  }
5751
5954
 
5752
5955
  .domma-toast.domma-toast-info {
5753
5956
  background-color: var(--dm-info);
5957
+ color: var(--dm-info-text, var(--dm-white));
5958
+ border-color: transparent;
5754
5959
  }
5755
5960
 
5756
5961
  /* Toast internal structure */
@@ -5794,6 +5999,72 @@ code {
5794
5999
  display: block;
5795
6000
  }
5796
6001
 
6002
+ .domma-toast-close {
6003
+ font-size: 1.25rem;
6004
+ line-height: 1;
6005
+ }
6006
+
6007
+ .domma-toast-icon {
6008
+ display: flex;
6009
+ align-items: center;
6010
+ }
6011
+
6012
+ .domma-toast-title[hidden],
6013
+ .domma-toast-actions[hidden] {
6014
+ display: none;
6015
+ }
6016
+
6017
+ .domma-toast-message {
6018
+ overflow-wrap: anywhere;
6019
+ }
6020
+
6021
+ .domma-toast-actions {
6022
+ display: flex;
6023
+ gap: 0.5rem;
6024
+ margin-top: 0.5rem;
6025
+ }
6026
+
6027
+ .domma-toast-action {
6028
+ padding: 0.25rem 0.75rem;
6029
+ border: 1px solid currentColor;
6030
+ border-radius: var(--dm-radius-sm);
6031
+ background: transparent;
6032
+ color: inherit;
6033
+ font: inherit;
6034
+ font-size: 0.8rem;
6035
+ font-weight: 500;
6036
+ cursor: pointer;
6037
+ }
6038
+
6039
+ .domma-toast-action.is-primary {
6040
+ background-color: var(--dm-primary);
6041
+ color: var(--dm-primary-text, var(--dm-white));
6042
+ border-color: var(--dm-primary);
6043
+ }
6044
+
6045
+ .domma-toast-progress {
6046
+ position: absolute;
6047
+ left: 0;
6048
+ right: 0;
6049
+ bottom: 0;
6050
+ height: 3px;
6051
+ background: color-mix(in srgb, currentColor 15%, transparent);
6052
+ }
6053
+
6054
+ .domma-toast-progress-bar {
6055
+ width: 100%;
6056
+ height: 100%;
6057
+ background: currentColor;
6058
+ opacity: 0.6;
6059
+ }
6060
+
6061
+ @media (prefers-reduced-motion: reduce) {
6062
+ .domma-toast,
6063
+ .domma-toast-progress-bar {
6064
+ transition: none !important;
6065
+ }
6066
+ }
6067
+
5797
6068
 
5798
6069
  /* ============================================
5799
6070
  BACK TO TOP BUTTON
@@ -5842,6 +6113,20 @@ code {
5842
6113
  box-shadow: 0 0 0 3px var(--dm-focus-ring);
5843
6114
  }
5844
6115
 
6116
+ /* E.backToTop on a button inside the container it watches: it sticks to that
6117
+ container's bottom corner instead of the viewport's */
6118
+ .dm-back-to-top.dm-back-to-top-contained {
6119
+ position: sticky;
6120
+ right: auto;
6121
+ left: auto;
6122
+ margin-left: auto;
6123
+ }
6124
+
6125
+ .dm-back-to-top.dm-back-to-top-contained.dm-back-to-top-left {
6126
+ margin-left: 0;
6127
+ margin-right: auto;
6128
+ }
6129
+
5845
6130
  /* Desktop (≥577px) - Back to Top enhancements */
5846
6131
  @media (min-width: 577px) {
5847
6132
  .dm-back-to-top {
@@ -5865,54 +6150,151 @@ code {
5865
6150
  gap: 0.75rem;
5866
6151
  }
5867
6152
 
5868
- .dm-loader.dm-loader-overlay {
5869
- position: absolute;
5870
- top: 0;
5871
- left: 0;
5872
- right: 0;
5873
- bottom: 0;
5874
- z-index: 1000;
5875
- background-color: var(--dm-loader-overlay-bg, rgba(255, 255, 255, 0.9));
6153
+ .dm-loader[hidden] {
6154
+ display: none !important;
5876
6155
  }
5877
6156
 
5878
- [data-mode="dark"] .dm-loader.dm-loader-overlay {
5879
- background-color: var(--dm-loader-overlay-bg, rgba(0, 0, 0, 0.8));
6157
+ /* E.loader's indicator (src/components/loader.js); size and colour come from
6158
+ --dm-loader-size / --dm-loader-color, set from the options */
6159
+ .dm-loader-js {
6160
+ --dm-loader-size: 40px;
6161
+ --dm-loader-color: var(--dm-primary);
5880
6162
  }
5881
6163
 
5882
- /* Spinner type */
5883
- .dm-loader-spinner {
5884
- width: 2rem;
5885
- height: 2rem;
5886
- border: 3px solid var(--dm-border);
5887
- border-top-color: var(--dm-primary);
5888
- border-radius: 50%;
5889
- animation: dm-loader-spin 0.8s linear infinite;
6164
+ /* Centred over the nearest positioned ancestor, as <domma-loader> always drew it - the
6165
+ container's own content stays where it is and the loader sits on top of it. */
6166
+ .dm-loader-js.dm-loader-centered {
6167
+ position: absolute;
6168
+ top: 50%;
6169
+ left: 50%;
6170
+ transform: translate(-50%, -50%);
5890
6171
  }
5891
6172
 
5892
- [data-mode="dark"] .dm-loader-spinner {
5893
- border-color: var(--dm-text);
5894
- border-top-color: var(--dm-primary);
6173
+ :where(.dm-loader-host) {
6174
+ position: relative;
5895
6175
  }
5896
6176
 
5897
- /* Dots type */
5898
- .dm-loader-dots {
5899
- display: flex;
5900
- gap: 0.5rem;
6177
+ .dm-loader-anim {
6178
+ flex-shrink: 0;
5901
6179
  }
5902
6180
 
5903
- .dm-loader-dots::before,
5904
- .dm-loader-dots::after {
5905
- content: '';
5906
- width: 0.75rem;
5907
- height: 0.75rem;
5908
- background-color: var(--dm-primary);
6181
+ .dm-loader-anim-spinner {
6182
+ width: var(--dm-loader-size);
6183
+ height: var(--dm-loader-size);
6184
+ border: max(2px, calc(var(--dm-loader-size) / 10)) solid var(--dm-loader-color);
6185
+ border-top-color: transparent;
5909
6186
  border-radius: 50%;
5910
- animation: dm-loader-bounce 1.4s infinite ease-in-out both;
6187
+ animation: dm-loader-spin 0.8s linear infinite;
5911
6188
  }
5912
6189
 
5913
- .dm-loader-dots::before {
5914
- animation-delay: -0.32s;
5915
- }
6190
+ .dm-loader-anim-dots,
6191
+ .dm-loader-anim-bars {
6192
+ display: flex;
6193
+ align-items: center;
6194
+ gap: calc(var(--dm-loader-size) / 8);
6195
+ height: var(--dm-loader-size);
6196
+ }
6197
+
6198
+ .dm-loader-anim-dots span {
6199
+ /* Shapes are drawn with borders, not backgrounds: they hold no text */
6200
+ width: 0;
6201
+ height: 0;
6202
+ border: calc(var(--dm-loader-size) / 8) solid var(--dm-loader-color);
6203
+ border-radius: 50%;
6204
+ animation: dm-loader-bounce 1.4s ease-in-out infinite both;
6205
+ }
6206
+
6207
+ .dm-loader-anim-dots span:nth-child(2) { animation-delay: 0.16s; }
6208
+ .dm-loader-anim-dots span:nth-child(3) { animation-delay: 0.32s; }
6209
+
6210
+ .dm-loader-anim-pulse {
6211
+ width: 0;
6212
+ height: 0;
6213
+ border: calc(var(--dm-loader-size) / 2) solid var(--dm-loader-color);
6214
+ border-radius: 50%;
6215
+ animation: dm-loader-pulse 1.2s ease-in-out infinite;
6216
+ }
6217
+
6218
+ .dm-loader-anim-bars span {
6219
+ width: 0;
6220
+ height: 100%;
6221
+ border-left: calc(var(--dm-loader-size) / 6) solid var(--dm-loader-color);
6222
+ border-radius: 2px;
6223
+ animation: dm-loader-bars 1s ease-in-out infinite;
6224
+ }
6225
+
6226
+ .dm-loader-anim-bars span:nth-child(2) { animation-delay: 0.1s; }
6227
+ .dm-loader-anim-bars span:nth-child(3) { animation-delay: 0.2s; }
6228
+ .dm-loader-anim-bars span:nth-child(4) { animation-delay: 0.3s; }
6229
+
6230
+ .dm-loader-fullscreen {
6231
+ position: fixed;
6232
+ inset: 0;
6233
+ z-index: 9999;
6234
+ display: flex;
6235
+ align-items: center;
6236
+ justify-content: center;
6237
+ background-color: rgba(0, 0, 0, 0.7);
6238
+ }
6239
+
6240
+ .dm-loader-fullscreen .dm-loader-text {
6241
+ color: #fff;
6242
+ }
6243
+
6244
+ domma-loader,
6245
+ domma-card,
6246
+ domma-back-to-top {
6247
+ display: block;
6248
+ }
6249
+
6250
+ .dm-loader.dm-loader-overlay {
6251
+ position: absolute;
6252
+ top: 0;
6253
+ left: 0;
6254
+ right: 0;
6255
+ bottom: 0;
6256
+ z-index: 1000;
6257
+ background-color: var(--dm-loader-overlay-bg, rgba(255, 255, 255, 0.9));
6258
+ }
6259
+
6260
+ [data-mode="dark"] .dm-loader.dm-loader-overlay {
6261
+ background-color: var(--dm-loader-overlay-bg, rgba(0, 0, 0, 0.8));
6262
+ }
6263
+
6264
+ /* Spinner type */
6265
+ .dm-loader-spinner {
6266
+ width: 2rem;
6267
+ height: 2rem;
6268
+ border: 3px solid var(--dm-border);
6269
+ border-top-color: var(--dm-primary);
6270
+ border-radius: 50%;
6271
+ animation: dm-loader-spin 0.8s linear infinite;
6272
+ }
6273
+
6274
+ [data-mode="dark"] .dm-loader-spinner {
6275
+ border-color: var(--dm-text);
6276
+ border-top-color: var(--dm-primary);
6277
+ }
6278
+
6279
+ /* Dots type */
6280
+ .dm-loader-dots {
6281
+ display: flex;
6282
+ gap: 0.5rem;
6283
+ }
6284
+
6285
+ .dm-loader-dots::before,
6286
+ .dm-loader-dots::after {
6287
+ content: '';
6288
+ width: 0.75rem;
6289
+ height: 0.75rem;
6290
+ background-color: var(--dm-primary);
6291
+ border-radius: 50%;
6292
+ animation: dm-loader-bounce 1.4s infinite ease-in-out both;
6293
+ }
6294
+
6295
+ .dm-loader-dots::before {
6296
+ animation-delay: -0.32s;
6297
+ }
5916
6298
 
5917
6299
  .dm-loader-dots::after {
5918
6300
  animation-delay: 0s;
@@ -9556,3 +9938,1067 @@ a.avatar-tone-7:hover {
9556
9938
  a.avatar-more-person:hover .avatar-more-name {
9557
9939
  text-decoration: underline;
9558
9940
  }
9941
+
9942
+ /* ===== Command Palette ===== */
9943
+ /*
9944
+ * E.commandPalette(options) - src/components/command-palette.js
9945
+ *
9946
+ * The overlay covers the viewport: a backdrop and a panel near the top, the way the
9947
+ * modal looks (--dm-modal-* tokens), so it sits with the site's dialogs in every theme.
9948
+ * Above modals and slideovers, which it is often opened over; below popovers (10045)
9949
+ * and the context menu (10050).
9950
+ */
9951
+ .dm-command-palette {
9952
+ position: fixed;
9953
+ inset: 0;
9954
+ z-index: 10040;
9955
+ display: flex;
9956
+ justify-content: center;
9957
+ align-items: flex-start;
9958
+ padding: 12vh 1rem 1rem;
9959
+ box-sizing: border-box;
9960
+ --dm-command-palette-duration: 150ms;
9961
+ }
9962
+
9963
+ .dm-command-palette[hidden] {
9964
+ display: none;
9965
+ }
9966
+
9967
+ .dm-command-palette *,
9968
+ .dm-command-palette *::before,
9969
+ .dm-command-palette *::after {
9970
+ box-sizing: border-box;
9971
+ }
9972
+
9973
+ .dm-command-palette-backdrop {
9974
+ position: fixed;
9975
+ inset: 0;
9976
+ background: var(--dm-modal-backdrop);
9977
+ opacity: 0;
9978
+ transition: opacity var(--dm-command-palette-duration) ease;
9979
+ }
9980
+
9981
+ .dm-command-palette-panel {
9982
+ position: relative;
9983
+ display: flex;
9984
+ flex-direction: column;
9985
+ width: min(40rem, 100%);
9986
+ max-height: min(32rem, 76vh);
9987
+ background: var(--dm-modal-bg);
9988
+ color: var(--dm-text);
9989
+ border: 1px solid var(--dm-modal-border);
9990
+ border-radius: var(--dm-radius-lg);
9991
+ box-shadow: var(--dm-modal-shadow);
9992
+ overflow: hidden;
9993
+ opacity: 0;
9994
+ transform: scale(0.97) translateY(-6px);
9995
+ transition:
9996
+ opacity var(--dm-command-palette-duration) ease,
9997
+ transform var(--dm-command-palette-duration) cubic-bezier(0.16, 1, 0.3, 1);
9998
+ }
9999
+
10000
+ .dm-command-palette.is-open .dm-command-palette-backdrop { opacity: 1; }
10001
+ .dm-command-palette.is-open .dm-command-palette-panel { opacity: 1; transform: none; }
10002
+
10003
+ @media (prefers-reduced-motion: reduce) {
10004
+ .dm-command-palette-backdrop,
10005
+ .dm-command-palette-panel {
10006
+ transition: none;
10007
+ }
10008
+ }
10009
+
10010
+ /* Where you are in nested pages, with a way back up. */
10011
+ .dm-command-palette-crumbs {
10012
+ display: flex;
10013
+ align-items: center;
10014
+ gap: 0.5rem;
10015
+ padding: 0.625rem 0.875rem 0;
10016
+ font-size: 0.8125rem;
10017
+ color: var(--dm-text-muted);
10018
+ }
10019
+
10020
+ .dm-command-palette-crumbs[hidden] { display: none; }
10021
+
10022
+ .dm-command-palette-back {
10023
+ display: inline-flex;
10024
+ align-items: center;
10025
+ justify-content: center;
10026
+ width: 1.75rem;
10027
+ height: 1.75rem;
10028
+ padding: 0;
10029
+ border: 1px solid var(--dm-border);
10030
+ border-radius: var(--dm-radius-sm);
10031
+ background: transparent;
10032
+ color: var(--dm-text);
10033
+ cursor: pointer;
10034
+ }
10035
+
10036
+ .dm-command-palette-back:hover { background: var(--dm-hover-bg); }
10037
+
10038
+ .dm-command-palette-back:focus-visible {
10039
+ outline: 2px solid var(--dm-border-focus);
10040
+ outline-offset: 1px;
10041
+ }
10042
+
10043
+ .dm-command-palette-trail {
10044
+ display: flex;
10045
+ flex-wrap: wrap;
10046
+ gap: 0.25rem;
10047
+ margin: 0;
10048
+ padding: 0;
10049
+ list-style: none;
10050
+ }
10051
+
10052
+ .dm-command-palette-trail li + li::before {
10053
+ content: "/";
10054
+ margin-right: 0.25rem;
10055
+ opacity: 0.6;
10056
+ }
10057
+
10058
+ .dm-command-palette-trail [aria-current] { color: var(--dm-text); font-weight: 500; }
10059
+
10060
+ .dm-command-palette-search {
10061
+ display: flex;
10062
+ align-items: center;
10063
+ gap: 0.625rem;
10064
+ padding: 0.75rem 0.875rem;
10065
+ border-bottom: 1px solid var(--dm-border);
10066
+ }
10067
+
10068
+ .dm-command-palette-search-icon {
10069
+ display: inline-flex;
10070
+ color: var(--dm-text-muted);
10071
+ }
10072
+
10073
+ .dm-command-palette-input {
10074
+ flex: 1;
10075
+ min-width: 0;
10076
+ padding: 0.25rem 0;
10077
+ border: 0;
10078
+ background: transparent;
10079
+ color: var(--dm-text);
10080
+ font: inherit;
10081
+ font-size: 1rem;
10082
+ outline: none;
10083
+ }
10084
+
10085
+ .dm-command-palette-input::placeholder { color: var(--dm-input-placeholder); opacity: 1; }
10086
+
10087
+ /* The box is the focus; the panel shows it rather than a ring round a borderless input. */
10088
+ .dm-command-palette-search:focus-within {
10089
+ border-bottom-color: var(--dm-border-focus);
10090
+ }
10091
+
10092
+ .dm-command-palette-spinner {
10093
+ width: 1rem;
10094
+ height: 1rem;
10095
+ border: 2px solid var(--dm-border);
10096
+ border-top-color: var(--dm-primary);
10097
+ border-radius: 50%;
10098
+ animation: dm-command-palette-spin 0.7s linear infinite;
10099
+ }
10100
+
10101
+ .dm-command-palette-spinner[hidden] { display: none; }
10102
+
10103
+ @keyframes dm-command-palette-spin {
10104
+ to { transform: rotate(360deg); }
10105
+ }
10106
+
10107
+ @media (prefers-reduced-motion: reduce) {
10108
+ .dm-command-palette-spinner { animation-duration: 2.4s; }
10109
+ }
10110
+
10111
+ .dm-command-palette-list {
10112
+ flex: 1 1 auto;
10113
+ min-height: 0;
10114
+ overflow-y: auto;
10115
+ overscroll-behavior: contain;
10116
+ padding: 0.375rem;
10117
+ }
10118
+
10119
+ .dm-command-palette-list[hidden] { display: none; }
10120
+
10121
+ .dm-command-palette-group + .dm-command-palette-group,
10122
+ .dm-command-palette-group + .dm-command-palette-item,
10123
+ .dm-command-palette-item + .dm-command-palette-group {
10124
+ margin-top: 0.375rem;
10125
+ }
10126
+
10127
+ .dm-command-palette-group-heading {
10128
+ padding: 0.375rem 0.625rem 0.25rem;
10129
+ font-size: 0.75rem;
10130
+ font-weight: 600;
10131
+ letter-spacing: 0.02em;
10132
+ color: var(--dm-text-muted);
10133
+ }
10134
+
10135
+ .dm-command-palette-item {
10136
+ display: flex;
10137
+ align-items: center;
10138
+ gap: 0.625rem;
10139
+ min-height: 2.5rem;
10140
+ padding: 0.375rem 0.625rem;
10141
+ border-radius: var(--dm-radius-md);
10142
+ color: var(--dm-text);
10143
+ cursor: pointer;
10144
+ user-select: none;
10145
+ }
10146
+
10147
+ .dm-command-palette-item.is-active {
10148
+ background: var(--dm-selected-bg);
10149
+ }
10150
+
10151
+ /* Forced colours drop backgrounds: the active row keeps an outline instead. */
10152
+ @media (forced-colors: active) {
10153
+ .dm-command-palette-item.is-active { outline: 2px solid Highlight; }
10154
+ }
10155
+
10156
+ .dm-command-palette-item[aria-disabled="true"] {
10157
+ cursor: default;
10158
+ opacity: var(--dm-disabled-opacity);
10159
+ }
10160
+
10161
+ .dm-command-palette-icon {
10162
+ flex: 0 0 1rem;
10163
+ display: inline-flex;
10164
+ justify-content: center;
10165
+ color: var(--dm-text-muted);
10166
+ }
10167
+
10168
+ .dm-command-palette-item.is-active .dm-command-palette-icon { color: var(--dm-text); }
10169
+
10170
+ .dm-command-palette-text {
10171
+ flex: 1;
10172
+ min-width: 0;
10173
+ display: flex;
10174
+ flex-direction: column;
10175
+ line-height: 1.3;
10176
+ }
10177
+
10178
+ .dm-command-palette-title,
10179
+ .dm-command-palette-subtitle {
10180
+ overflow: hidden;
10181
+ text-overflow: ellipsis;
10182
+ white-space: nowrap;
10183
+ }
10184
+
10185
+ .dm-command-palette-subtitle {
10186
+ font-size: 0.8125rem;
10187
+ color: var(--dm-text-muted);
10188
+ }
10189
+
10190
+ .dm-command-palette-match {
10191
+ color: var(--dm-primary);
10192
+ font-weight: 600;
10193
+ }
10194
+
10195
+ .dm-command-palette-shortcut,
10196
+ .dm-command-palette-hint {
10197
+ display: inline-flex;
10198
+ align-items: center;
10199
+ gap: 0.25rem;
10200
+ }
10201
+
10202
+ .dm-command-palette kbd {
10203
+ display: inline-flex;
10204
+ align-items: center;
10205
+ justify-content: center;
10206
+ min-width: 1.375rem;
10207
+ height: 1.375rem;
10208
+ padding: 0 0.3rem;
10209
+ border: 1px solid var(--dm-border);
10210
+ border-bottom-width: 2px;
10211
+ border-radius: var(--dm-radius-sm);
10212
+ background: var(--dm-background-alt);
10213
+ color: var(--dm-text-secondary);
10214
+ font-family: inherit;
10215
+ font-size: 0.6875rem;
10216
+ line-height: 1;
10217
+ }
10218
+
10219
+ .dm-command-palette-more {
10220
+ display: inline-flex;
10221
+ color: var(--dm-text-muted);
10222
+ }
10223
+
10224
+ .dm-command-palette-status {
10225
+ padding: 1.5rem 1rem;
10226
+ text-align: center;
10227
+ font-size: 0.875rem;
10228
+ color: var(--dm-text-muted);
10229
+ }
10230
+
10231
+ .dm-command-palette-status[hidden] { display: none; }
10232
+ .dm-command-palette-status[data-state="error"] { color: var(--dm-danger); }
10233
+
10234
+ .dm-command-palette-footer {
10235
+ display: flex;
10236
+ flex-wrap: wrap;
10237
+ gap: 0.5rem 1rem;
10238
+ padding: 0.5rem 0.875rem;
10239
+ border-top: 1px solid var(--dm-border);
10240
+ background: var(--dm-background-alt);
10241
+ color: var(--dm-text-secondary);
10242
+ font-size: 0.75rem;
10243
+ }
10244
+
10245
+ /* Phones: the whole width, from the top. */
10246
+ @media (max-width: 640px) {
10247
+ .dm-command-palette {
10248
+ padding: 0;
10249
+ }
10250
+
10251
+ .dm-command-palette-panel {
10252
+ width: 100%;
10253
+ max-height: 85vh;
10254
+ border-width: 0 0 1px;
10255
+ border-radius: 0 0 var(--dm-radius-lg) var(--dm-radius-lg);
10256
+ }
10257
+
10258
+ .dm-command-palette-footer { display: none; }
10259
+ }
10260
+
10261
+ /* ===== Split Pane ===== */
10262
+ /* E.splitPane(container): flexbox panes with a fixed flex-basis each, gutters between. */
10263
+ .dm-split {
10264
+ display: flex;
10265
+ min-width: 0;
10266
+ min-height: 0;
10267
+ }
10268
+
10269
+ .dm-split-horizontal {
10270
+ flex-direction: row;
10271
+ }
10272
+
10273
+ .dm-split-vertical {
10274
+ flex-direction: column;
10275
+ }
10276
+
10277
+ .dm-split > .dm-split-pane {
10278
+ min-width: 0;
10279
+ min-height: 0;
10280
+ overflow: auto;
10281
+ }
10282
+
10283
+ .dm-split-collapsed {
10284
+ overflow: hidden;
10285
+ }
10286
+
10287
+ .dm-split > .dm-split-gutter {
10288
+ position: relative;
10289
+ display: flex;
10290
+ align-items: center;
10291
+ justify-content: center;
10292
+ background: var(--dm-border);
10293
+ touch-action: none;
10294
+ user-select: none;
10295
+ transition: background-color var(--dm-transition-fast);
10296
+ }
10297
+
10298
+ /* A thin grip line drawn inside the gutter. */
10299
+ .dm-split > .dm-split-gutter::before {
10300
+ content: "";
10301
+ border-radius: var(--dm-radius-full);
10302
+ background: var(--dm-text-muted);
10303
+ opacity: 0.6;
10304
+ }
10305
+
10306
+ .dm-split-horizontal > .dm-split-gutter::before {
10307
+ width: 2px;
10308
+ height: 1.5rem;
10309
+ }
10310
+
10311
+ .dm-split-vertical > .dm-split-gutter::before {
10312
+ width: 1.5rem;
10313
+ height: 2px;
10314
+ }
10315
+
10316
+ .dm-split > .dm-split-gutter:hover,
10317
+ .dm-split > .dm-split-gutter.is-dragging {
10318
+ background: var(--dm-primary);
10319
+ }
10320
+
10321
+ .dm-split > .dm-split-gutter:hover::before,
10322
+ .dm-split > .dm-split-gutter.is-dragging::before {
10323
+ background: var(--dm-primary-text);
10324
+ }
10325
+
10326
+ .dm-split > .dm-split-gutter:focus-visible {
10327
+ outline: 2px solid var(--dm-primary);
10328
+ outline-offset: 1px;
10329
+ z-index: 1;
10330
+ }
10331
+
10332
+ .dm-split-disabled > .dm-split-gutter,
10333
+ .dm-split-disabled > .dm-split-gutter:hover {
10334
+ background: var(--dm-border);
10335
+ cursor: default;
10336
+ }
10337
+
10338
+ /* While dragging, the panes (and any iframe in them) take no pointer events, so the
10339
+ gutter's captured pointer keeps every move, and text does not get selected. */
10340
+ .dm-split-dragging > .dm-split-pane {
10341
+ pointer-events: none;
10342
+ user-select: none;
10343
+ }
10344
+
10345
+ .dm-split-horizontal.dm-split-dragging {
10346
+ cursor: col-resize;
10347
+ }
10348
+
10349
+ .dm-split-vertical.dm-split-dragging {
10350
+ cursor: row-resize;
10351
+ }
10352
+
10353
+ .dm-split-toggle {
10354
+ position: absolute;
10355
+ z-index: 1;
10356
+ display: inline-flex;
10357
+ align-items: center;
10358
+ justify-content: center;
10359
+ width: 1.25rem;
10360
+ height: 1.25rem;
10361
+ padding: 0;
10362
+ border: 1px solid var(--dm-border);
10363
+ border-radius: var(--dm-radius-full);
10364
+ background: var(--dm-surface);
10365
+ color: var(--dm-text);
10366
+ cursor: pointer;
10367
+ font: inherit;
10368
+ line-height: 1;
10369
+ }
10370
+
10371
+ .dm-split-horizontal > .dm-split-gutter > .dm-split-toggle {
10372
+ top: 0.5rem;
10373
+ }
10374
+
10375
+ .dm-split-vertical > .dm-split-gutter > .dm-split-toggle {
10376
+ left: 0.5rem;
10377
+ }
10378
+
10379
+ .dm-split-toggle::before {
10380
+ content: "";
10381
+ width: 0;
10382
+ height: 0;
10383
+ border: 4px solid transparent;
10384
+ }
10385
+
10386
+ .dm-split-horizontal > .dm-split-gutter > .dm-split-toggle::before {
10387
+ border-right-color: currentColor;
10388
+ margin-right: 4px;
10389
+ }
10390
+
10391
+ .dm-split-vertical > .dm-split-gutter > .dm-split-toggle::before {
10392
+ border-bottom-color: currentColor;
10393
+ margin-bottom: 4px;
10394
+ }
10395
+
10396
+ .dm-split-toggle:hover {
10397
+ background: var(--dm-hover-bg);
10398
+ }
10399
+
10400
+ @media (prefers-reduced-motion: reduce) {
10401
+ .dm-split > .dm-split-gutter {
10402
+ transition: none;
10403
+ }
10404
+ }
10405
+
10406
+ /* ===== Virtual List ===== */
10407
+ /* E.virtualList(container): the container scrolls; a spacer gives it its height and the
10408
+ rendered rows are placed by transform. The container needs a height from your CSS. */
10409
+ .dm-vlist {
10410
+ position: relative;
10411
+ overflow: auto;
10412
+ overflow-anchor: none;
10413
+ contain: content;
10414
+ background: var(--dm-surface);
10415
+ color: var(--dm-text);
10416
+ }
10417
+
10418
+ .dm-vlist-spacer {
10419
+ width: 1px;
10420
+ pointer-events: none;
10421
+ }
10422
+
10423
+ .dm-vlist-items {
10424
+ position: absolute;
10425
+ top: 0;
10426
+ left: 0;
10427
+ right: 0;
10428
+ height: 0;
10429
+ outline: none;
10430
+ }
10431
+
10432
+ .dm-vlist-row {
10433
+ position: absolute;
10434
+ top: 0;
10435
+ left: 0;
10436
+ right: 0;
10437
+ box-sizing: border-box;
10438
+ will-change: transform;
10439
+ }
10440
+
10441
+ .dm-vlist-fixed .dm-vlist-row {
10442
+ overflow: hidden;
10443
+ }
10444
+
10445
+ .dm-vlist-row:focus-visible {
10446
+ outline: 2px solid var(--dm-primary);
10447
+ outline-offset: -2px;
10448
+ }
10449
+
10450
+ .dm-vlist-status {
10451
+ position: absolute;
10452
+ top: 0;
10453
+ left: 0;
10454
+ right: 0;
10455
+ display: flex;
10456
+ align-items: center;
10457
+ justify-content: center;
10458
+ gap: var(--dm-space-2);
10459
+ padding: var(--dm-space-3);
10460
+ color: var(--dm-text-muted);
10461
+ box-sizing: border-box;
10462
+ }
10463
+
10464
+ .dm-vlist-status[hidden] {
10465
+ display: none;
10466
+ }
10467
+
10468
+ .dm-vlist-loading,
10469
+ .dm-vlist-error {
10470
+ display: inline-flex;
10471
+ align-items: center;
10472
+ gap: var(--dm-space-2);
10473
+ }
10474
+
10475
+ /* Plain text colour: --dm-danger is not readable on --dm-surface in every theme. */
10476
+ .dm-vlist-error {
10477
+ color: var(--dm-text);
10478
+ }
10479
+
10480
+ .dm-vlist-spinner {
10481
+ width: 1rem;
10482
+ height: 1rem;
10483
+ border: 2px solid var(--dm-border);
10484
+ border-top-color: var(--dm-primary);
10485
+ border-radius: var(--dm-radius-full);
10486
+ animation: dm-loader-spin 0.8s linear infinite;
10487
+ }
10488
+
10489
+ @media (prefers-reduced-motion: reduce) {
10490
+ .dm-vlist-spinner {
10491
+ animation-duration: 2.4s;
10492
+ }
10493
+ }
10494
+
10495
+ /* ===== Dropzone ===== */
10496
+ /*
10497
+ * E.dropzone(target, options) - src/components/dropzone.js
10498
+ *
10499
+ * The caller's element is the area (.dm-dropzone, role="button"); the file list
10500
+ * (.dm-dropzone-files) is drawn after it, because a button cannot hold buttons.
10501
+ * Theme tokens only, so every theme and its dark variant colour it.
10502
+ */
10503
+ .dm-dropzone {
10504
+ display: flex;
10505
+ flex-direction: column;
10506
+ align-items: center;
10507
+ justify-content: center;
10508
+ gap: var(--dm-space-2);
10509
+ min-height: 8rem;
10510
+ padding: var(--dm-space-6) var(--dm-space-4);
10511
+ border: 2px dashed var(--dm-border);
10512
+ border-radius: var(--dm-radius-md);
10513
+ background: var(--dm-surface);
10514
+ color: var(--dm-text);
10515
+ text-align: center;
10516
+ cursor: pointer;
10517
+ transition: border-color var(--dm-transition-fast), background-color var(--dm-transition-fast);
10518
+ }
10519
+
10520
+ .dm-dropzone:hover {
10521
+ border-color: var(--dm-primary);
10522
+ }
10523
+
10524
+ .dm-dropzone:focus-visible {
10525
+ outline: 2px solid var(--dm-border-focus);
10526
+ outline-offset: 2px;
10527
+ border-color: var(--dm-primary);
10528
+ }
10529
+
10530
+ .dm-dropzone.is-dragover {
10531
+ border-color: var(--dm-primary);
10532
+ border-style: solid;
10533
+ background: color-mix(in srgb, var(--dm-primary) 10%, var(--dm-surface));
10534
+ }
10535
+
10536
+ .dm-dropzone.is-invalid {
10537
+ border-color: var(--dm-danger);
10538
+ }
10539
+
10540
+ .dm-dropzone.is-disabled {
10541
+ opacity: var(--dm-disabled-opacity, 0.6);
10542
+ cursor: not-allowed;
10543
+ }
10544
+
10545
+ .dm-dropzone.is-disabled:hover {
10546
+ border-color: var(--dm-border);
10547
+ }
10548
+
10549
+ .dm-dropzone-prompt {
10550
+ display: flex;
10551
+ flex-direction: column;
10552
+ align-items: center;
10553
+ gap: var(--dm-space-1);
10554
+ pointer-events: none;
10555
+ }
10556
+
10557
+ .dm-dropzone-icon {
10558
+ color: var(--dm-text-secondary);
10559
+ }
10560
+
10561
+ .dm-dropzone:hover .dm-dropzone-icon,
10562
+ .dm-dropzone.is-dragover .dm-dropzone-icon {
10563
+ color: var(--dm-text);
10564
+ }
10565
+
10566
+ .dm-dropzone-text {
10567
+ font-weight: 500;
10568
+ }
10569
+
10570
+ .dm-dropzone-hint {
10571
+ color: var(--dm-text-muted);
10572
+ font-size: var(--dm-font-size-sm);
10573
+ }
10574
+
10575
+ .dm-dropzone-files {
10576
+ display: flex;
10577
+ flex-direction: column;
10578
+ gap: var(--dm-space-2);
10579
+ margin: var(--dm-space-3) 0;
10580
+ padding: 0;
10581
+ list-style: none;
10582
+ }
10583
+
10584
+ .dm-dropzone-files[hidden] {
10585
+ display: none;
10586
+ }
10587
+
10588
+ .dm-dropzone-file {
10589
+ display: grid;
10590
+ grid-template-columns: 2.75rem minmax(0, 1fr) auto auto;
10591
+ grid-template-areas: "thumb meta retry remove" "thumb bar bar bar";
10592
+ align-items: center;
10593
+ column-gap: var(--dm-space-3);
10594
+ row-gap: var(--dm-space-1);
10595
+ padding: var(--dm-space-2) var(--dm-space-3);
10596
+ border: 1px solid var(--dm-border);
10597
+ border-radius: var(--dm-radius-md);
10598
+ background: var(--dm-surface);
10599
+ color: var(--dm-text);
10600
+ }
10601
+
10602
+ .dm-dropzone-file[data-status="error"] {
10603
+ border-color: var(--dm-danger);
10604
+ }
10605
+
10606
+ .dm-dropzone-thumb {
10607
+ grid-area: thumb;
10608
+ display: flex;
10609
+ align-items: center;
10610
+ justify-content: center;
10611
+ width: 2.75rem;
10612
+ height: 2.75rem;
10613
+ overflow: hidden;
10614
+ border-radius: var(--dm-radius-sm);
10615
+ background: color-mix(in srgb, var(--dm-text) 8%, var(--dm-surface));
10616
+ color: var(--dm-text-secondary);
10617
+ font-size: var(--dm-font-size-xs);
10618
+ font-weight: 600;
10619
+ }
10620
+
10621
+ .dm-dropzone-thumb img {
10622
+ display: block;
10623
+ width: 100%;
10624
+ height: 100%;
10625
+ object-fit: cover;
10626
+ }
10627
+
10628
+ .dm-dropzone-meta {
10629
+ grid-area: meta;
10630
+ display: flex;
10631
+ flex-wrap: wrap;
10632
+ align-items: baseline;
10633
+ column-gap: var(--dm-space-2);
10634
+ min-width: 0;
10635
+ }
10636
+
10637
+ .dm-dropzone-name {
10638
+ flex: 1 1 auto;
10639
+ min-width: 0;
10640
+ overflow: hidden;
10641
+ text-overflow: ellipsis;
10642
+ white-space: nowrap;
10643
+ }
10644
+
10645
+ .dm-dropzone-size,
10646
+ .dm-dropzone-status {
10647
+ color: var(--dm-text-muted);
10648
+ font-size: var(--dm-font-size-sm);
10649
+ }
10650
+
10651
+ /* State colours stay on borders and bars (--dm-danger / --dm-success as text on a
10652
+ surface fail AA in several themes); the words carry the state */
10653
+ .dm-dropzone-file[data-status="error"] .dm-dropzone-status {
10654
+ color: var(--dm-text);
10655
+ font-weight: 600;
10656
+ }
10657
+
10658
+ .dm-dropzone-progress {
10659
+ grid-area: bar;
10660
+ display: block;
10661
+ height: 0.375rem;
10662
+ overflow: hidden;
10663
+ border-radius: var(--dm-radius-full);
10664
+ background: color-mix(in srgb, var(--dm-text) 10%, var(--dm-surface));
10665
+ }
10666
+
10667
+ .dm-dropzone-progress[hidden] {
10668
+ display: none;
10669
+ }
10670
+
10671
+ .dm-dropzone-progress-bar {
10672
+ display: block;
10673
+ width: 0;
10674
+ height: 100%;
10675
+ border-radius: inherit;
10676
+ background: var(--dm-primary);
10677
+ }
10678
+
10679
+ .dm-dropzone-file[data-status="done"] .dm-dropzone-progress-bar {
10680
+ background: var(--dm-success);
10681
+ }
10682
+
10683
+ .dm-dropzone-retry {
10684
+ grid-area: retry;
10685
+ }
10686
+
10687
+ .dm-dropzone-retry[hidden] {
10688
+ display: none;
10689
+ }
10690
+
10691
+ .dm-dropzone-remove {
10692
+ grid-area: remove;
10693
+ display: inline-flex;
10694
+ align-items: center;
10695
+ justify-content: center;
10696
+ width: 2rem;
10697
+ height: 2rem;
10698
+ padding: 0;
10699
+ border: 0;
10700
+ border-radius: var(--dm-radius-full);
10701
+ background: transparent;
10702
+ color: var(--dm-text-muted);
10703
+ font-size: 1.25rem;
10704
+ line-height: 1;
10705
+ cursor: pointer;
10706
+ }
10707
+
10708
+ .dm-dropzone-remove:hover:not(:disabled) {
10709
+ background: var(--dm-hover-bg);
10710
+ color: var(--dm-text);
10711
+ }
10712
+
10713
+ .dm-dropzone-remove:focus-visible {
10714
+ outline: 2px solid var(--dm-border-focus);
10715
+ outline-offset: 1px;
10716
+ }
10717
+
10718
+ @media (prefers-reduced-motion: no-preference) {
10719
+ .dm-dropzone-progress-bar {
10720
+ transition: width var(--dm-transition-fast);
10721
+ }
10722
+ }
10723
+
10724
+ @media (prefers-reduced-motion: reduce) {
10725
+ .dm-dropzone {
10726
+ transition: none;
10727
+ }
10728
+ }
10729
+
10730
+ /* ===== Range Slider ===== */
10731
+ /*
10732
+ * E.rangeSlider(target, options) / E.slider - src/components/range-slider.js
10733
+ *
10734
+ * The real <input type="range"> elements are hidden; this is the drawn slider in
10735
+ * front of them. The root is the hit area (2.75rem tall - a comfortable touch
10736
+ * target) with a thin track through its middle. Thumbs are positioned by JS
10737
+ * with left / right / bottom as a percentage and centred with a transform.
10738
+ */
10739
+ .dm-range-slider {
10740
+ position: relative;
10741
+ display: block;
10742
+ height: 2.75rem;
10743
+ margin: 0 0.625rem;
10744
+ color: var(--dm-text);
10745
+ cursor: pointer;
10746
+ user-select: none;
10747
+ -webkit-user-select: none;
10748
+ /* A horizontal slider still lets the page scroll vertically on touch */
10749
+ touch-action: pan-y;
10750
+ -webkit-tap-highlight-color: transparent;
10751
+ }
10752
+
10753
+ .dm-range-slider.has-tick-labels,
10754
+ .dm-range-slider.has-marks {
10755
+ margin-bottom: 1.5rem;
10756
+ }
10757
+
10758
+ /* A tooltip that is always shown needs room above the track */
10759
+ .dm-range-slider[data-tooltip="always"]:not([data-orientation="vertical"]) {
10760
+ margin-top: 1.75rem;
10761
+ }
10762
+
10763
+ .dm-range-slider[data-orientation="vertical"] {
10764
+ display: inline-block;
10765
+ width: 2.75rem;
10766
+ height: 12rem;
10767
+ margin: 0.625rem 0;
10768
+ touch-action: pan-x;
10769
+ vertical-align: top;
10770
+ }
10771
+
10772
+ .dm-range-slider[data-orientation="vertical"].has-tick-labels,
10773
+ .dm-range-slider[data-orientation="vertical"].has-marks {
10774
+ margin-bottom: 0.625rem;
10775
+ margin-right: 3rem;
10776
+ }
10777
+
10778
+ .dm-range-track {
10779
+ position: absolute;
10780
+ left: 0;
10781
+ right: 0;
10782
+ top: 50%;
10783
+ height: 0.375rem;
10784
+ transform: translateY(-50%);
10785
+ border-radius: var(--dm-radius-full);
10786
+ background: color-mix(in srgb, var(--dm-text) 16%, var(--dm-surface));
10787
+ }
10788
+
10789
+ .dm-range-slider[data-orientation="vertical"] .dm-range-track {
10790
+ left: 50%;
10791
+ right: auto;
10792
+ top: 0;
10793
+ bottom: 0;
10794
+ width: 0.375rem;
10795
+ height: auto;
10796
+ transform: translateX(-50%);
10797
+ }
10798
+
10799
+ .dm-range-fill {
10800
+ position: absolute;
10801
+ top: 0;
10802
+ bottom: 0;
10803
+ border-radius: inherit;
10804
+ background: var(--dm-primary);
10805
+ }
10806
+
10807
+ .dm-range-slider[data-orientation="vertical"] .dm-range-fill {
10808
+ left: 0;
10809
+ right: 0;
10810
+ top: auto;
10811
+ }
10812
+
10813
+ .dm-range-thumb {
10814
+ position: absolute;
10815
+ top: 50%;
10816
+ z-index: 2;
10817
+ width: 1.25rem;
10818
+ height: 1.25rem;
10819
+ border: 2px solid var(--dm-primary);
10820
+ border-radius: var(--dm-radius-full);
10821
+ background: var(--dm-surface);
10822
+ box-shadow: var(--dm-shadow-md);
10823
+ transform: translate(-50%, -50%);
10824
+ cursor: grab;
10825
+ touch-action: none;
10826
+ }
10827
+
10828
+ .dm-range-slider[dir="rtl"] .dm-range-thumb {
10829
+ transform: translate(50%, -50%);
10830
+ }
10831
+
10832
+ .dm-range-slider[data-orientation="vertical"] .dm-range-thumb {
10833
+ top: auto;
10834
+ left: 50%;
10835
+ transform: translate(-50%, 50%);
10836
+ }
10837
+
10838
+ .dm-range-thumb:hover {
10839
+ box-shadow: 0 0 0 0.375rem var(--dm-focus-ring);
10840
+ }
10841
+
10842
+ .dm-range-thumb:focus-visible {
10843
+ outline: 2px solid var(--dm-border-focus);
10844
+ outline-offset: 2px;
10845
+ box-shadow: 0 0 0 0.375rem var(--dm-focus-ring);
10846
+ }
10847
+
10848
+ /* The thumb being moved sits above the other when they meet */
10849
+ .dm-range-thumb.is-active,
10850
+ .dm-range-thumb:focus-visible {
10851
+ z-index: 3;
10852
+ }
10853
+
10854
+ .dm-range-slider.is-dragging,
10855
+ .dm-range-slider.is-dragging .dm-range-thumb {
10856
+ cursor: grabbing;
10857
+ }
10858
+
10859
+ .dm-range-tooltip {
10860
+ position: absolute;
10861
+ bottom: calc(100% + 0.5rem);
10862
+ left: 50%;
10863
+ padding: 0.125rem 0.5rem;
10864
+ border-radius: var(--dm-radius-sm);
10865
+ background: var(--dm-text);
10866
+ color: var(--dm-surface);
10867
+ font-size: var(--dm-font-size-xs);
10868
+ line-height: 1.5;
10869
+ white-space: nowrap;
10870
+ pointer-events: none;
10871
+ transform: translateX(-50%);
10872
+ opacity: 0;
10873
+ visibility: hidden;
10874
+ }
10875
+
10876
+ .dm-range-slider[data-orientation="vertical"] .dm-range-tooltip {
10877
+ bottom: auto;
10878
+ left: calc(100% + 0.5rem);
10879
+ top: 50%;
10880
+ transform: translateY(-50%);
10881
+ }
10882
+
10883
+ .dm-range-slider[data-tooltip="always"] .dm-range-tooltip,
10884
+ .dm-range-slider[data-tooltip="hover"] .dm-range-thumb:hover .dm-range-tooltip,
10885
+ .dm-range-slider[data-tooltip="hover"] .dm-range-thumb:focus-visible .dm-range-tooltip,
10886
+ .dm-range-slider[data-tooltip="hover"] .dm-range-thumb.is-active .dm-range-tooltip {
10887
+ opacity: 1;
10888
+ visibility: visible;
10889
+ }
10890
+
10891
+ .dm-range-ticks,
10892
+ .dm-range-marks {
10893
+ position: absolute;
10894
+ inset: 0;
10895
+ pointer-events: none;
10896
+ }
10897
+
10898
+ .dm-range-tick,
10899
+ .dm-range-mark {
10900
+ position: absolute;
10901
+ top: calc(50% + 0.375rem);
10902
+ width: 1px;
10903
+ height: 0.375rem;
10904
+ background: var(--dm-border-dark);
10905
+ transform: translateX(-50%);
10906
+ }
10907
+
10908
+ .dm-range-slider[dir="rtl"] .dm-range-tick,
10909
+ .dm-range-slider[dir="rtl"] .dm-range-mark {
10910
+ transform: translateX(50%);
10911
+ }
10912
+
10913
+ .dm-range-tick.is-in-range {
10914
+ background: var(--dm-primary);
10915
+ }
10916
+
10917
+ .dm-range-slider[data-orientation="vertical"] .dm-range-tick,
10918
+ .dm-range-slider[data-orientation="vertical"] .dm-range-mark {
10919
+ top: auto;
10920
+ left: calc(50% + 0.375rem);
10921
+ width: 0.375rem;
10922
+ height: 1px;
10923
+ transform: translateY(50%);
10924
+ }
10925
+
10926
+ .dm-range-mark {
10927
+ width: 0.375rem;
10928
+ height: 0.375rem;
10929
+ top: 50%;
10930
+ border-radius: var(--dm-radius-full);
10931
+ background: var(--dm-surface);
10932
+ border: 1px solid var(--dm-border-dark);
10933
+ transform: translate(-50%, -50%);
10934
+ pointer-events: auto;
10935
+ z-index: 1;
10936
+ }
10937
+
10938
+ .dm-range-slider[dir="rtl"] .dm-range-mark {
10939
+ transform: translate(50%, -50%);
10940
+ }
10941
+
10942
+ .dm-range-slider[data-orientation="vertical"] .dm-range-mark {
10943
+ left: 50%;
10944
+ width: 0.375rem;
10945
+ height: 0.375rem;
10946
+ transform: translate(-50%, 50%);
10947
+ }
10948
+
10949
+ .dm-range-tick-label,
10950
+ .dm-range-mark-label {
10951
+ position: absolute;
10952
+ top: calc(100% + 0.25rem);
10953
+ left: 50%;
10954
+ color: var(--dm-text-muted);
10955
+ font-size: var(--dm-font-size-xs);
10956
+ line-height: 1.2;
10957
+ white-space: nowrap;
10958
+ transform: translateX(-50%);
10959
+ }
10960
+
10961
+ .dm-range-mark-label {
10962
+ top: calc(100% + 0.625rem);
10963
+ color: var(--dm-text-secondary);
10964
+ cursor: pointer;
10965
+ }
10966
+
10967
+ .dm-range-slider[data-orientation="vertical"] .dm-range-tick-label,
10968
+ .dm-range-slider[data-orientation="vertical"] .dm-range-mark-label {
10969
+ top: 50%;
10970
+ left: calc(100% + 0.5rem);
10971
+ transform: translateY(-50%);
10972
+ }
10973
+
10974
+ .dm-range-slider.is-disabled {
10975
+ opacity: var(--dm-disabled-opacity, 0.6);
10976
+ cursor: not-allowed;
10977
+ }
10978
+
10979
+ .dm-range-slider.is-disabled .dm-range-thumb {
10980
+ cursor: not-allowed;
10981
+ box-shadow: none;
10982
+ }
10983
+
10984
+ @media (prefers-reduced-motion: no-preference) {
10985
+ .dm-range-thumb {
10986
+ transition: box-shadow var(--dm-transition-fast);
10987
+ }
10988
+
10989
+ .dm-range-tooltip {
10990
+ transition: opacity var(--dm-transition-fast), visibility var(--dm-transition-fast);
10991
+ }
10992
+ }
10993
+
10994
+ @media (forced-colors: active) {
10995
+ .dm-range-fill,
10996
+ .dm-dropzone-progress-bar {
10997
+ background: Highlight;
10998
+ }
10999
+
11000
+ .dm-range-thumb {
11001
+ background: ButtonFace;
11002
+ border-color: ButtonText;
11003
+ }
11004
+ }