domma-js 0.55.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.55.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-24T15:07:57.510Z
6
- * Commit: 253e259
5
+ * Built: 2026-10-24T16:12:49.159Z
6
+ * Commit: f768320
7
7
  */
8
8
 
9
9
  /**
@@ -9938,3 +9938,1067 @@ a.avatar-tone-7:hover {
9938
9938
  a.avatar-more-person:hover .avatar-more-name {
9939
9939
  text-decoration: underline;
9940
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
+ }