domma-js 0.42.0 → 0.44.1

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.42.0
2
+ * Domma Elements CSS v0.44.1
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-08-22T16:17:44.114Z
6
- * Commit: 0f0475f
5
+ * Built: 2026-09-23T16:22:37.530Z
6
+ * Commit: 7c54327
7
7
  */
8
8
 
9
9
  /**
@@ -2785,11 +2785,12 @@ code {
2785
2785
  .dm-pillbox-container {
2786
2786
  display: flex;
2787
2787
  flex-wrap: wrap;
2788
+ align-items: center;
2788
2789
  gap: 0.375rem;
2789
2790
  padding: 0.375rem 0.5rem;
2790
2791
  min-height: 2.5rem;
2791
- background: var(--dm-surface, #fff);
2792
- border: 1px solid var(--dm-border, #dee2e6);
2792
+ background: var(--dm-pillbox-bg, var(--dm-surface));
2793
+ border: 1px solid var(--dm-pillbox-border, var(--dm-border));
2793
2794
  border-radius: var(--dm-radius-md);
2794
2795
  cursor: text;
2795
2796
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
@@ -2799,50 +2800,70 @@ code {
2799
2800
  border-color: var(--dm-text-disabled);
2800
2801
  }
2801
2802
 
2802
- .dm-pillbox-container.focused {
2803
+ .dm-pillbox-container:focus-within {
2803
2804
  border-color: var(--dm-primary);
2804
2805
  box-shadow: 0 0 0 3px var(--dm-focus-ring);
2805
2806
  }
2806
2807
 
2807
- .dm-pillbox-pill {
2808
+ /*
2809
+ * The pill classes are the ones the script emits (.dm-pill, .dm-pill-remove,
2810
+ * .dm-pillbox-empty) and the showcase documents. They were styled here as
2811
+ * .dm-pillbox-pill / -remove / -message, which nothing produces, so every pill
2812
+ * arrived as bare text beside a grey browser button.
2813
+ *
2814
+ * The --dm-pill-* / --dm-pillbox-* defaults are fallbacks in the rules rather
2815
+ * than :root declarations: a theme class sits on <body>, and a variable
2816
+ * declared on :root as var(--dm-surface) resolves against the root's colours,
2817
+ * so a dark theme got a white box with pale pills. A theme or a page can still
2818
+ * set any of them.
2819
+ */
2820
+ .dm-pill {
2808
2821
  display: inline-flex;
2809
2822
  align-items: center;
2810
2823
  gap: 0.25rem;
2811
- padding: 0.25rem 0.5rem;
2812
- background: var(--dm-primary-light);
2813
- color: var(--dm-text);
2824
+ max-width: 100%;
2825
+ padding: 0.2rem 0.3rem 0.2rem 0.6rem;
2826
+ background: var(--dm-pill-bg, var(--dm-primary-light));
2827
+ color: var(--dm-pill-color, var(--dm-text));
2814
2828
  border-radius: var(--dm-radius-full);
2815
2829
  font-size: var(--dm-font-size-sm);
2816
2830
  line-height: 1.2;
2831
+ overflow-wrap: anywhere;
2817
2832
  }
2818
2833
 
2819
- .dm-pillbox-pill.dm-pillbox-size-small {
2820
- padding: 0.125rem 0.375rem;
2834
+ .dm-pillbox-small .dm-pill {
2835
+ padding: 0.1rem 0.25rem 0.1rem 0.45rem;
2821
2836
  font-size: 0.75rem;
2822
2837
  }
2823
2838
 
2824
- .dm-pillbox-pill.dm-pillbox-size-large {
2825
- padding: 0.375rem 0.625rem;
2839
+ .dm-pillbox-large .dm-pill {
2840
+ padding: 0.35rem 0.4rem 0.35rem 0.75rem;
2826
2841
  font-size: 1rem;
2827
2842
  }
2828
2843
 
2829
- .dm-pillbox-remove {
2844
+ .dm-pill-remove {
2830
2845
  display: inline-flex;
2831
2846
  align-items: center;
2832
2847
  justify-content: center;
2833
- width: 1rem;
2834
- height: 1rem;
2848
+ flex: none;
2849
+ width: 1.1rem;
2850
+ height: 1.1rem;
2835
2851
  padding: 0;
2836
2852
  background: none;
2837
2853
  border: none;
2854
+ border-radius: 50%;
2838
2855
  color: inherit;
2856
+ font-size: 1rem;
2857
+ line-height: 1;
2839
2858
  cursor: pointer;
2840
- opacity: 0.7;
2841
- transition: opacity 0.15s ease;
2859
+ opacity: 0.65;
2860
+ transition: opacity 0.15s ease, background-color 0.15s ease;
2842
2861
  }
2843
2862
 
2844
- .dm-pillbox-remove:hover {
2863
+ .dm-pill-remove:hover,
2864
+ .dm-pill-remove:focus-visible {
2845
2865
  opacity: 1;
2866
+ background: var(--dm-pill-hover-bg, color-mix(in srgb, currentColor 15%, transparent));
2846
2867
  }
2847
2868
 
2848
2869
  .dm-pillbox-input {
@@ -2856,18 +2877,29 @@ code {
2856
2877
  color: var(--dm-text);
2857
2878
  }
2858
2879
 
2880
+ .dm-pillbox-small .dm-pillbox-input { font-size: var(--dm-font-size-sm); }
2881
+
2859
2882
  .dm-pillbox-input::placeholder {
2860
2883
  color: var(--dm-text-muted);
2861
2884
  }
2862
2885
 
2886
+ .dm-pillbox.disabled .dm-pillbox-container {
2887
+ opacity: 0.6;
2888
+ cursor: not-allowed;
2889
+ }
2890
+
2891
+ .dm-pillbox.disabled .dm-pill-remove {
2892
+ pointer-events: none;
2893
+ }
2894
+
2863
2895
  .dm-pillbox-dropdown {
2864
2896
  position: absolute;
2865
2897
  top: 100%;
2866
2898
  left: 0;
2867
2899
  right: 0;
2868
2900
  margin-top: 0.25rem;
2869
- background: var(--dm-surface, #fff);
2870
- border: 1px solid var(--dm-border, #dee2e6);
2901
+ background: var(--dm-surface);
2902
+ border: 1px solid var(--dm-border);
2871
2903
  border-radius: var(--dm-radius-md);
2872
2904
  box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
2873
2905
  max-height: 200px;
@@ -2875,6 +2907,12 @@ code {
2875
2907
  z-index: var(--dm-z-dropdown, 1000);
2876
2908
  }
2877
2909
 
2910
+ .dm-pillbox-options {
2911
+ list-style: none;
2912
+ margin: 0;
2913
+ padding: 0.25rem 0;
2914
+ }
2915
+
2878
2916
  .dm-pillbox-option {
2879
2917
  padding: 0.5rem 0.75rem;
2880
2918
  cursor: pointer;
@@ -2892,10 +2930,11 @@ code {
2892
2930
  color: var(--dm-text);
2893
2931
  }
2894
2932
 
2895
- .dm-pillbox-message {
2933
+ .dm-pillbox-empty {
2896
2934
  padding: 0.75rem;
2897
2935
  text-align: center;
2898
- color: var(--dm-text-muted, #6c757d);
2936
+ /* --dm-text-muted falls to 3:1 on --dm-surface in some themes. */
2937
+ color: var(--dm-text-secondary);
2899
2938
  font-size: var(--dm-font-size-sm);
2900
2939
  }
2901
2940
 
@@ -2922,27 +2961,9 @@ code {
2922
2961
  opacity: 1;
2923
2962
  }
2924
2963
 
2925
- /* Dark theme pillbox */
2926
- [data-mode="dark"].dm-pillbox-container {
2927
- background: var(--dm-surface);
2928
- border-color: var(--dm-text);
2929
- }
2930
-
2931
- [data-mode="dark"].dm-pillbox-input {
2932
- color: var(--dm-text-disabled);
2933
- }
2934
-
2935
- [data-mode="dark"].dm-pillbox-dropdown {
2936
- background: var(--dm-surface);
2937
- border-color: var(--dm-text);
2938
- }
2939
-
2940
- [data-mode="dark"].dm-pillbox-option {
2941
- color: var(--dm-text-disabled);
2942
- }
2943
-
2944
- [data-mode="dark"].dm-pillbox-option:hover {
2945
- background-color: var(--dm-text);
2964
+ /* A clearable box keeps its last pill clear of the x. */
2965
+ .dm-pillbox:has(.dm-pillbox-clear) .dm-pillbox-container {
2966
+ padding-right: 2rem;
2946
2967
  }
2947
2968
 
2948
2969
  /* ============================================
@@ -8093,3 +8114,425 @@ code {
8093
8114
  grid-template-columns: 1fr;
8094
8115
  }
8095
8116
  }
8117
+
8118
+ /* ============================================
8119
+ Context Menu
8120
+ Bound to a container, delegated to its children. Nested menus shadow their
8121
+ parent for the region they cover; see src/context-menu.js for resolution.
8122
+ ============================================ */
8123
+
8124
+ /*
8125
+ * Every themeable value is a custom property with the theme token as its
8126
+ * fallback, so an unstyled menu follows the active theme and only the options
8127
+ * actually passed override it. Nothing here generates per-instance rules.
8128
+ */
8129
+ .dm-context-menu {
8130
+ position: fixed;
8131
+ z-index: 10050;
8132
+ display: flex;
8133
+ flex-direction: column;
8134
+ gap: 1px;
8135
+ padding: 4px;
8136
+ overflow-y: auto;
8137
+ background: var(--dm-ctx-surface, var(--dm-surface));
8138
+ color: var(--dm-text);
8139
+ border: 1px solid var(--dm-ctx-accent, var(--dm-border));
8140
+ border-radius: var(--dm-ctx-radius, var(--dm-radius-md));
8141
+ box-shadow: var(--dm-ctx-shadow, 0 8px 24px rgba(0, 0, 0, 0.18));
8142
+ font-size: 0.875rem;
8143
+ transform-origin: top left;
8144
+ outline: none;
8145
+ transition:
8146
+ opacity var(--dm-ctx-duration, 120ms) var(--dm-ctx-easing, ease),
8147
+ transform var(--dm-ctx-duration, 120ms) var(--dm-ctx-easing, ease);
8148
+ }
8149
+
8150
+ /*
8151
+ * A translucent panel needs its own layer: mixing the surface with transparent
8152
+ * keeps the text fully opaque, which `opacity` on the element would not - that
8153
+ * would fade the labels along with the background and fail contrast outright.
8154
+ */
8155
+ .dm-context-menu[style*="--dm-ctx-opacity"] {
8156
+ background: color-mix(
8157
+ in srgb,
8158
+ var(--dm-ctx-surface, var(--dm-surface)) calc(var(--dm-ctx-opacity) * 100%),
8159
+ transparent
8160
+ );
8161
+ backdrop-filter: blur(10px);
8162
+ }
8163
+
8164
+ /* An accent tints the leading edge as well as the border. */
8165
+ .dm-context-menu[style*="--dm-ctx-accent"] {
8166
+ border-left-width: 3px;
8167
+ }
8168
+
8169
+ /* ---- transitions ---- */
8170
+
8171
+ .dm-context-menu[data-transition] {
8172
+ opacity: 0;
8173
+ }
8174
+
8175
+ .dm-context-menu[data-transition="scale"] { transform: scale(0.97); }
8176
+ .dm-context-menu[data-transition="fade"] { transform: none; }
8177
+ .dm-context-menu[data-transition="slide"] { transform: translateY(-6px); }
8178
+ .dm-context-menu[data-transition="none"] { transform: none; transition: none; }
8179
+
8180
+ .dm-context-menu.is-open {
8181
+ opacity: 1;
8182
+ transform: none;
8183
+ }
8184
+
8185
+ /* ---- density ---- */
8186
+
8187
+ .dm-context-menu[data-density="compact"] {
8188
+ font-size: 0.8125rem;
8189
+ padding: 2px;
8190
+ }
8191
+
8192
+ .dm-context-menu[data-density="compact"] .dm-context-menu-item {
8193
+ padding: 0.25rem 0.45rem;
8194
+ }
8195
+
8196
+ .dm-context-menu-item {
8197
+ display: flex;
8198
+ align-items: center;
8199
+ gap: 0.5rem;
8200
+ width: 100%;
8201
+ padding: 0.4rem 0.6rem;
8202
+ background: none;
8203
+ border: 0;
8204
+ border-radius: var(--dm-radius-sm);
8205
+ color: inherit;
8206
+ font: inherit;
8207
+ text-align: left;
8208
+ cursor: pointer;
8209
+ transition: background var(--dm-transition-fast);
8210
+ }
8211
+
8212
+ .dm-context-menu-item:hover:not(.is-disabled),
8213
+ .dm-context-menu-item:focus-visible {
8214
+ background: var(--dm-background-alt);
8215
+ outline: none;
8216
+ }
8217
+
8218
+ /*
8219
+ * The accent tints the hover wash rather than the label. A named colour cannot
8220
+ * be guaranteed readable against whatever surface the menu is on - the same
8221
+ * trap that made --dm-danger 1.02:1 on admin-smooth-steel - so the text keeps
8222
+ * the one pairing every theme guarantees and the accent carries the meaning.
8223
+ */
8224
+ .dm-context-menu[style*="--dm-ctx-accent"] .dm-context-menu-item:hover:not(.is-disabled),
8225
+ .dm-context-menu[style*="--dm-ctx-accent"] .dm-context-menu-item:focus-visible {
8226
+ background: color-mix(in srgb, var(--dm-ctx-accent) 16%, transparent);
8227
+ }
8228
+
8229
+ .dm-context-menu-item:focus-visible {
8230
+ box-shadow: inset 0 0 0 2px var(--dm-border-focus);
8231
+ }
8232
+
8233
+ .dm-context-menu-item.is-disabled {
8234
+ opacity: 0.45;
8235
+ cursor: not-allowed;
8236
+ }
8237
+
8238
+ /*
8239
+ * Destructive items carry their warning in a tinted wash rather than in red
8240
+ * text. A saturated red cannot be read on a mid-tone surface - on
8241
+ * admin-smooth-steel, --dm-danger against --dm-surface lands at 1.02:1 - and
8242
+ * no single red works across a light surface, a dark one and the mid-tone
8243
+ * themes in between. The wash is mixed FROM the surface, so it adapts, and the
8244
+ * label keeps the one colour every theme guarantees is readable on it.
8245
+ */
8246
+ .dm-context-menu-item.is-danger {
8247
+ background: color-mix(in srgb, var(--dm-danger) 10%, transparent);
8248
+ }
8249
+
8250
+ .dm-context-menu-item.is-danger:hover:not(.is-disabled) {
8251
+ background: color-mix(in srgb, var(--dm-danger) 22%, transparent);
8252
+ }
8253
+
8254
+ .dm-context-menu-icon {
8255
+ display: inline-flex;
8256
+ align-items: center;
8257
+ justify-content: center;
8258
+ flex: 0 0 16px;
8259
+ width: 16px;
8260
+ height: 16px;
8261
+ }
8262
+
8263
+ .dm-context-menu-label {
8264
+ flex: 1 1 auto;
8265
+ white-space: nowrap;
8266
+ overflow: hidden;
8267
+ text-overflow: ellipsis;
8268
+ }
8269
+
8270
+ .dm-context-menu-shortcut {
8271
+ flex: 0 0 auto;
8272
+ padding-left: 1rem;
8273
+ font-size: 0.78em;
8274
+ font-variant-numeric: tabular-nums;
8275
+ opacity: 0.8;
8276
+ }
8277
+
8278
+ .dm-context-menu-chevron {
8279
+ display: inline-flex;
8280
+ flex: 0 0 auto;
8281
+ margin-left: auto;
8282
+ padding-left: 0.4rem;
8283
+ opacity: 0.7;
8284
+ }
8285
+
8286
+ .dm-context-menu-item.has-submenu .dm-context-menu-label {
8287
+ flex: 0 1 auto;
8288
+ }
8289
+
8290
+ .dm-context-menu-item.is-checked .dm-context-menu-icon::after {
8291
+ content: "";
8292
+ width: 8px;
8293
+ height: 8px;
8294
+ border-radius: 50%;
8295
+ background: var(--dm-ctx-accent, var(--dm-primary));
8296
+ }
8297
+
8298
+ .dm-context-menu-divider {
8299
+ height: 1px;
8300
+ margin: 4px 2px;
8301
+ background: var(--dm-border);
8302
+ }
8303
+
8304
+ .dm-context-menu-header {
8305
+ padding: 0.35rem 0.6rem 0.2rem;
8306
+ font-size: 0.72rem;
8307
+ font-weight: 600;
8308
+ letter-spacing: 0.04em;
8309
+ text-transform: uppercase;
8310
+ }
8311
+
8312
+ /* The affordance that tells people a menu is there at all. */
8313
+ .dm-context-menu-host {
8314
+ cursor: context-menu;
8315
+ }
8316
+
8317
+ @media (prefers-reduced-motion: reduce) {
8318
+ .dm-context-menu,
8319
+ .dm-context-menu[data-transition] {
8320
+ transition: none !important;
8321
+ transform: none !important;
8322
+ }
8323
+ }
8324
+
8325
+ /* ============================================
8326
+ DatePicker
8327
+ --------------------------------------------
8328
+ Every colour is a --dm-* token that the theme layer defines, so the calendar
8329
+ takes whatever theme the host is wearing - including one applied to a region
8330
+ by a theme override, since the tokens are inherited rather than hard-coded.
8331
+ Nothing here invents a token: an undefined var() resolves to nothing and
8332
+ paints a blank panel.
8333
+ ============================================ */
8334
+
8335
+ .dm-datepicker {
8336
+ position: absolute;
8337
+ z-index: 1080;
8338
+ width: max-content;
8339
+ padding: 0.5rem;
8340
+
8341
+ font-family: var(--dm-font-sans);
8342
+ font-size: var(--dm-font-size-sm);
8343
+ color: var(--dm-text);
8344
+
8345
+ background: var(--dm-surface-raised, var(--dm-surface));
8346
+ border: 1px solid var(--dm-border);
8347
+ border-radius: var(--dm-radius-lg);
8348
+ box-shadow: var(--dm-shadow-lg);
8349
+ }
8350
+
8351
+ .dm-datepicker--inline {
8352
+ position: static;
8353
+ box-shadow: none;
8354
+ margin-top: 0.35rem;
8355
+ }
8356
+
8357
+ /* Header: month and year pickers between two chevrons. */
8358
+
8359
+ .dm-datepicker-head {
8360
+ display: flex;
8361
+ align-items: center;
8362
+ gap: 0.35rem;
8363
+ margin-bottom: 0.4rem;
8364
+ }
8365
+
8366
+ .dm-datepicker-pickers {
8367
+ display: flex;
8368
+ gap: 0.3rem;
8369
+ flex: 1 1 auto;
8370
+ justify-content: center;
8371
+ }
8372
+
8373
+ /*
8374
+ * Five rules below are recorded in scripts/validate-contrast-pairs.baseline.json
8375
+ * rather than fixed, and the reason is the theme system, not this component.
8376
+ *
8377
+ * The three `--dm-text-disabled` rules (.is-outside, .is-disabled and the
8378
+ * disabled action) sit below 3:1 on `--dm-surface-raised` in ALL 33 themes -
8379
+ * 1.37 at worst. That is the disabled ramp behaving as designed, and WCAG AA
8380
+ * 1.4.3 exempts inactive controls from the contrast minimum. Lifting it to 4.5
8381
+ * here would make disabled dates LIGHTER than the muted weekday header, which
8382
+ * inverts the hierarchy.
8383
+ *
8384
+ * The two `--dm-text-muted` rules (.dm-datepicker-nav, .dm-datepicker-week)
8385
+ * fail on `--dm-surface-raised` in 23 of the 33 themes, worst 3.11. No token
8386
+ * below `--dm-text` clears AA on a raised surface everywhere, so this is not
8387
+ * fixable by picking a different variable - the muted ramp itself would have to
8388
+ * be redesigned across every theme. Using `--dm-text` instead would pass, and
8389
+ * cost the weekday header and adjacent-month days the de-emphasis that makes a
8390
+ * calendar readable at a glance.
8391
+ *
8392
+ * If the muted ramp is ever revisited, `npm run validate:contrast
8393
+ * --update-baseline` should drop these two.
8394
+ */
8395
+ .dm-datepicker-nav {
8396
+ display: inline-flex;
8397
+ align-items: center;
8398
+ justify-content: center;
8399
+ width: 28px;
8400
+ height: 28px;
8401
+ padding: 0;
8402
+ flex: 0 0 auto;
8403
+
8404
+ color: var(--dm-text-muted);
8405
+ background: transparent;
8406
+ border: 1px solid transparent;
8407
+ border-radius: var(--dm-radius-md);
8408
+ cursor: pointer;
8409
+ transition: background var(--dm-transition-fast), color var(--dm-transition-fast);
8410
+ }
8411
+
8412
+ .dm-datepicker-nav:hover {
8413
+ color: var(--dm-text);
8414
+ background: var(--dm-hover-bg);
8415
+ }
8416
+
8417
+ .dm-datepicker-select {
8418
+ padding: 0.2rem 0.35rem;
8419
+ font: inherit;
8420
+ color: var(--dm-input-text, var(--dm-text));
8421
+ background: var(--dm-input-bg, var(--dm-surface));
8422
+ border: 1px solid var(--dm-input-border, var(--dm-border));
8423
+ border-radius: var(--dm-radius-md);
8424
+ cursor: pointer;
8425
+ }
8426
+
8427
+ .dm-datepicker-select:focus-visible {
8428
+ outline: none;
8429
+ border-color: var(--dm-input-focus-border, var(--dm-primary));
8430
+ box-shadow: var(--dm-focus-ring);
8431
+ }
8432
+
8433
+ /* The grid. Seven equal columns, so the weekday row and the days line up
8434
+ whatever the digits are - a table would do the same but cannot carry the
8435
+ roles this needs. */
8436
+
8437
+ .dm-datepicker-row {
8438
+ display: grid;
8439
+ grid-template-columns: repeat(7, 2rem);
8440
+ gap: 2px;
8441
+ }
8442
+
8443
+ .dm-datepicker[data-week-numbers] .dm-datepicker-row {
8444
+ grid-template-columns: 1.6rem repeat(7, 2rem);
8445
+ }
8446
+
8447
+ .dm-datepicker-weekdays { margin-bottom: 2px; }
8448
+
8449
+ .dm-datepicker-weekday,
8450
+ .dm-datepicker-week {
8451
+ display: flex;
8452
+ align-items: center;
8453
+ justify-content: center;
8454
+ height: 1.6rem;
8455
+ font-size: var(--dm-font-size-xs);
8456
+ font-weight: var(--dm-font-weight-semibold);
8457
+ color: var(--dm-text-muted);
8458
+ }
8459
+
8460
+ .dm-datepicker-week { font-weight: 400; }
8461
+
8462
+ .dm-datepicker-day {
8463
+ display: flex;
8464
+ align-items: center;
8465
+ justify-content: center;
8466
+ height: 2rem;
8467
+ padding: 0;
8468
+
8469
+ font: inherit;
8470
+ font-variant-numeric: tabular-nums;
8471
+ color: var(--dm-text);
8472
+ background: transparent;
8473
+ border: 1px solid transparent;
8474
+ border-radius: var(--dm-radius-md);
8475
+ cursor: pointer;
8476
+ transition: background var(--dm-transition-fast), color var(--dm-transition-fast);
8477
+ }
8478
+
8479
+ .dm-datepicker-day:hover:not(.is-disabled) { background: var(--dm-hover-bg); }
8480
+
8481
+ .dm-datepicker-day:focus-visible {
8482
+ outline: none;
8483
+ box-shadow: var(--dm-focus-ring);
8484
+ }
8485
+
8486
+ /* The days either side of the month are shown rather than blanked: a calendar
8487
+ with holes in it is harder to read than one that runs on. */
8488
+ .dm-datepicker-day.is-outside { color: var(--dm-text-disabled); }
8489
+
8490
+ .dm-datepicker-day.is-today {
8491
+ border-color: var(--dm-primary);
8492
+ font-weight: var(--dm-font-weight-semibold);
8493
+ }
8494
+
8495
+ .dm-datepicker-day.is-selected,
8496
+ .dm-datepicker-day.is-selected:hover {
8497
+ color: var(--dm-primary-text);
8498
+ background: var(--dm-primary);
8499
+ border-color: var(--dm-primary);
8500
+ }
8501
+
8502
+ .dm-datepicker-day.is-disabled {
8503
+ color: var(--dm-text-disabled);
8504
+ cursor: not-allowed;
8505
+ opacity: var(--dm-disabled-opacity);
8506
+ }
8507
+
8508
+ /* Footer actions. */
8509
+
8510
+ .dm-datepicker-foot {
8511
+ display: flex;
8512
+ gap: 0.35rem;
8513
+ justify-content: flex-end;
8514
+ margin-top: 0.45rem;
8515
+ padding-top: 0.45rem;
8516
+ border-top: 1px solid var(--dm-border);
8517
+ }
8518
+
8519
+ .dm-datepicker-action {
8520
+ padding: 0.2rem 0.6rem;
8521
+ font: inherit;
8522
+ font-size: var(--dm-font-size-xs);
8523
+ color: var(--dm-link);
8524
+ background: transparent;
8525
+ border: 0;
8526
+ border-radius: var(--dm-radius-md);
8527
+ cursor: pointer;
8528
+ }
8529
+
8530
+ .dm-datepicker-action:hover:not(:disabled) {
8531
+ color: var(--dm-link-hover);
8532
+ background: var(--dm-hover-bg);
8533
+ }
8534
+
8535
+ .dm-datepicker-action:disabled {
8536
+ color: var(--dm-text-disabled);
8537
+ cursor: not-allowed;
8538
+ }
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Domma Grid CSS v0.42.0
2
+ * Domma Grid CSS v0.44.1
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-08-22T16:17:44.108Z
6
- * Commit: 0f0475f
5
+ * Built: 2026-09-23T16:22:37.526Z
6
+ * Commit: 7c54327
7
7
  */
8
8
 
9
9
  /**
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Domma Syntax Highlighting CSS v0.42.0
2
+ * Domma Syntax Highlighting CSS v0.44.1
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-08-22T16:17:44.119Z
6
- * Commit: 0f0475f
5
+ * Built: 2026-09-23T16:22:37.533Z
6
+ * Commit: 7c54327
7
7
  */
8
8
 
9
9
  /**