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,8 +1,8 @@
1
1
  /*!
2
- * Domma Data-Focused CSS Bundle v0.42.0
2
+ * Domma Data-Focused CSS Bundle 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.259Z
5
+ * Built: 2026-09-23T16:22:37.656Z
6
6
  */
7
7
 
8
8
  /* ============================================
@@ -11,11 +11,11 @@
11
11
  ============================================ */
12
12
 
13
13
  /*!
14
- * Domma Core CSS v0.42.0
14
+ * Domma Core CSS v0.44.1
15
15
  * Dynamic Object Manipulation & Modeling API
16
16
  * (c) 2026 Darryl Waterhouse & DCBW-IT
17
- * Built: 2026-08-22T16:17:44.102Z
18
- * Commit: 0f0475f
17
+ * Built: 2026-09-23T16:22:37.523Z
18
+ * Commit: 7c54327
19
19
  */
20
20
 
21
21
  /**
@@ -393,12 +393,9 @@
393
393
  --dm-autocomplete-item-active: var(--dm-selected-bg);
394
394
  --dm-autocomplete-highlight: var(--dm-primary-light);
395
395
 
396
- /* Pillbox */
397
- --dm-pillbox-bg: var(--dm-surface);
398
- --dm-pillbox-border: var(--dm-border);
399
- --dm-pill-bg: var(--dm-gray-200);
400
- --dm-pill-color: var(--dm-text);
401
- --dm-pill-hover-bg: var(--dm-gray-300);
396
+ /* Pillbox: --dm-pillbox-bg, --dm-pillbox-border, --dm-pill-bg,
397
+ --dm-pill-color and --dm-pill-hover-bg are read with their defaults as
398
+ fallbacks in elements.css, so they follow the theme on <body>. */
402
399
 
403
400
  /* Tabs */
404
401
  --dm-tab-border: var(--dm-border);
@@ -4838,11 +4835,11 @@ body.dm-cloaked.dm-ready {
4838
4835
  ============================================ */
4839
4836
 
4840
4837
  /*!
4841
- * Domma Grid CSS v0.42.0
4838
+ * Domma Grid CSS v0.44.1
4842
4839
  * Dynamic Object Manipulation & Modeling API
4843
4840
  * (c) 2026 Darryl Waterhouse & DCBW-IT
4844
- * Built: 2026-08-22T16:17:44.108Z
4845
- * Commit: 0f0475f
4841
+ * Built: 2026-09-23T16:22:37.526Z
4842
+ * Commit: 7c54327
4846
4843
  */
4847
4844
 
4848
4845
  /**
@@ -5463,11 +5460,11 @@ body.dm-cloaked.dm-ready {
5463
5460
  ============================================ */
5464
5461
 
5465
5462
  /*!
5466
- * Domma Elements CSS v0.42.0
5463
+ * Domma Elements CSS v0.44.1
5467
5464
  * Dynamic Object Manipulation & Modeling API
5468
5465
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5469
- * Built: 2026-08-22T16:17:44.114Z
5470
- * Commit: 0f0475f
5466
+ * Built: 2026-09-23T16:22:37.530Z
5467
+ * Commit: 7c54327
5471
5468
  */
5472
5469
 
5473
5470
  /**
@@ -8249,11 +8246,12 @@ code {
8249
8246
  .dm-pillbox-container {
8250
8247
  display: flex;
8251
8248
  flex-wrap: wrap;
8249
+ align-items: center;
8252
8250
  gap: 0.375rem;
8253
8251
  padding: 0.375rem 0.5rem;
8254
8252
  min-height: 2.5rem;
8255
- background: var(--dm-surface, #fff);
8256
- border: 1px solid var(--dm-border, #dee2e6);
8253
+ background: var(--dm-pillbox-bg, var(--dm-surface));
8254
+ border: 1px solid var(--dm-pillbox-border, var(--dm-border));
8257
8255
  border-radius: var(--dm-radius-md);
8258
8256
  cursor: text;
8259
8257
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
@@ -8263,50 +8261,70 @@ code {
8263
8261
  border-color: var(--dm-text-disabled);
8264
8262
  }
8265
8263
 
8266
- .dm-pillbox-container.focused {
8264
+ .dm-pillbox-container:focus-within {
8267
8265
  border-color: var(--dm-primary);
8268
8266
  box-shadow: 0 0 0 3px var(--dm-focus-ring);
8269
8267
  }
8270
8268
 
8271
- .dm-pillbox-pill {
8269
+ /*
8270
+ * The pill classes are the ones the script emits (.dm-pill, .dm-pill-remove,
8271
+ * .dm-pillbox-empty) and the showcase documents. They were styled here as
8272
+ * .dm-pillbox-pill / -remove / -message, which nothing produces, so every pill
8273
+ * arrived as bare text beside a grey browser button.
8274
+ *
8275
+ * The --dm-pill-* / --dm-pillbox-* defaults are fallbacks in the rules rather
8276
+ * than :root declarations: a theme class sits on <body>, and a variable
8277
+ * declared on :root as var(--dm-surface) resolves against the root's colours,
8278
+ * so a dark theme got a white box with pale pills. A theme or a page can still
8279
+ * set any of them.
8280
+ */
8281
+ .dm-pill {
8272
8282
  display: inline-flex;
8273
8283
  align-items: center;
8274
8284
  gap: 0.25rem;
8275
- padding: 0.25rem 0.5rem;
8276
- background: var(--dm-primary-light);
8277
- color: var(--dm-text);
8285
+ max-width: 100%;
8286
+ padding: 0.2rem 0.3rem 0.2rem 0.6rem;
8287
+ background: var(--dm-pill-bg, var(--dm-primary-light));
8288
+ color: var(--dm-pill-color, var(--dm-text));
8278
8289
  border-radius: var(--dm-radius-full);
8279
8290
  font-size: var(--dm-font-size-sm);
8280
8291
  line-height: 1.2;
8292
+ overflow-wrap: anywhere;
8281
8293
  }
8282
8294
 
8283
- .dm-pillbox-pill.dm-pillbox-size-small {
8284
- padding: 0.125rem 0.375rem;
8295
+ .dm-pillbox-small .dm-pill {
8296
+ padding: 0.1rem 0.25rem 0.1rem 0.45rem;
8285
8297
  font-size: 0.75rem;
8286
8298
  }
8287
8299
 
8288
- .dm-pillbox-pill.dm-pillbox-size-large {
8289
- padding: 0.375rem 0.625rem;
8300
+ .dm-pillbox-large .dm-pill {
8301
+ padding: 0.35rem 0.4rem 0.35rem 0.75rem;
8290
8302
  font-size: 1rem;
8291
8303
  }
8292
8304
 
8293
- .dm-pillbox-remove {
8305
+ .dm-pill-remove {
8294
8306
  display: inline-flex;
8295
8307
  align-items: center;
8296
8308
  justify-content: center;
8297
- width: 1rem;
8298
- height: 1rem;
8309
+ flex: none;
8310
+ width: 1.1rem;
8311
+ height: 1.1rem;
8299
8312
  padding: 0;
8300
8313
  background: none;
8301
8314
  border: none;
8315
+ border-radius: 50%;
8302
8316
  color: inherit;
8317
+ font-size: 1rem;
8318
+ line-height: 1;
8303
8319
  cursor: pointer;
8304
- opacity: 0.7;
8305
- transition: opacity 0.15s ease;
8320
+ opacity: 0.65;
8321
+ transition: opacity 0.15s ease, background-color 0.15s ease;
8306
8322
  }
8307
8323
 
8308
- .dm-pillbox-remove:hover {
8324
+ .dm-pill-remove:hover,
8325
+ .dm-pill-remove:focus-visible {
8309
8326
  opacity: 1;
8327
+ background: var(--dm-pill-hover-bg, color-mix(in srgb, currentColor 15%, transparent));
8310
8328
  }
8311
8329
 
8312
8330
  .dm-pillbox-input {
@@ -8320,18 +8338,29 @@ code {
8320
8338
  color: var(--dm-text);
8321
8339
  }
8322
8340
 
8341
+ .dm-pillbox-small .dm-pillbox-input { font-size: var(--dm-font-size-sm); }
8342
+
8323
8343
  .dm-pillbox-input::placeholder {
8324
8344
  color: var(--dm-text-muted);
8325
8345
  }
8326
8346
 
8347
+ .dm-pillbox.disabled .dm-pillbox-container {
8348
+ opacity: 0.6;
8349
+ cursor: not-allowed;
8350
+ }
8351
+
8352
+ .dm-pillbox.disabled .dm-pill-remove {
8353
+ pointer-events: none;
8354
+ }
8355
+
8327
8356
  .dm-pillbox-dropdown {
8328
8357
  position: absolute;
8329
8358
  top: 100%;
8330
8359
  left: 0;
8331
8360
  right: 0;
8332
8361
  margin-top: 0.25rem;
8333
- background: var(--dm-surface, #fff);
8334
- border: 1px solid var(--dm-border, #dee2e6);
8362
+ background: var(--dm-surface);
8363
+ border: 1px solid var(--dm-border);
8335
8364
  border-radius: var(--dm-radius-md);
8336
8365
  box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
8337
8366
  max-height: 200px;
@@ -8339,6 +8368,12 @@ code {
8339
8368
  z-index: var(--dm-z-dropdown, 1000);
8340
8369
  }
8341
8370
 
8371
+ .dm-pillbox-options {
8372
+ list-style: none;
8373
+ margin: 0;
8374
+ padding: 0.25rem 0;
8375
+ }
8376
+
8342
8377
  .dm-pillbox-option {
8343
8378
  padding: 0.5rem 0.75rem;
8344
8379
  cursor: pointer;
@@ -8356,10 +8391,11 @@ code {
8356
8391
  color: var(--dm-text);
8357
8392
  }
8358
8393
 
8359
- .dm-pillbox-message {
8394
+ .dm-pillbox-empty {
8360
8395
  padding: 0.75rem;
8361
8396
  text-align: center;
8362
- color: var(--dm-text-muted, #6c757d);
8397
+ /* --dm-text-muted falls to 3:1 on --dm-surface in some themes. */
8398
+ color: var(--dm-text-secondary);
8363
8399
  font-size: var(--dm-font-size-sm);
8364
8400
  }
8365
8401
 
@@ -8386,27 +8422,9 @@ code {
8386
8422
  opacity: 1;
8387
8423
  }
8388
8424
 
8389
- /* Dark theme pillbox */
8390
- [data-mode="dark"].dm-pillbox-container {
8391
- background: var(--dm-surface);
8392
- border-color: var(--dm-text);
8393
- }
8394
-
8395
- [data-mode="dark"].dm-pillbox-input {
8396
- color: var(--dm-text-disabled);
8397
- }
8398
-
8399
- [data-mode="dark"].dm-pillbox-dropdown {
8400
- background: var(--dm-surface);
8401
- border-color: var(--dm-text);
8402
- }
8403
-
8404
- [data-mode="dark"].dm-pillbox-option {
8405
- color: var(--dm-text-disabled);
8406
- }
8407
-
8408
- [data-mode="dark"].dm-pillbox-option:hover {
8409
- background-color: var(--dm-text);
8425
+ /* A clearable box keeps its last pill clear of the x. */
8426
+ .dm-pillbox:has(.dm-pillbox-clear) .dm-pillbox-container {
8427
+ padding-right: 2rem;
8410
8428
  }
8411
8429
 
8412
8430
  /* ============================================
@@ -13558,6 +13576,428 @@ code {
13558
13576
  }
13559
13577
  }
13560
13578
 
13579
+ /* ============================================
13580
+ Context Menu
13581
+ Bound to a container, delegated to its children. Nested menus shadow their
13582
+ parent for the region they cover; see src/context-menu.js for resolution.
13583
+ ============================================ */
13584
+
13585
+ /*
13586
+ * Every themeable value is a custom property with the theme token as its
13587
+ * fallback, so an unstyled menu follows the active theme and only the options
13588
+ * actually passed override it. Nothing here generates per-instance rules.
13589
+ */
13590
+ .dm-context-menu {
13591
+ position: fixed;
13592
+ z-index: 10050;
13593
+ display: flex;
13594
+ flex-direction: column;
13595
+ gap: 1px;
13596
+ padding: 4px;
13597
+ overflow-y: auto;
13598
+ background: var(--dm-ctx-surface, var(--dm-surface));
13599
+ color: var(--dm-text);
13600
+ border: 1px solid var(--dm-ctx-accent, var(--dm-border));
13601
+ border-radius: var(--dm-ctx-radius, var(--dm-radius-md));
13602
+ box-shadow: var(--dm-ctx-shadow, 0 8px 24px rgba(0, 0, 0, 0.18));
13603
+ font-size: 0.875rem;
13604
+ transform-origin: top left;
13605
+ outline: none;
13606
+ transition:
13607
+ opacity var(--dm-ctx-duration, 120ms) var(--dm-ctx-easing, ease),
13608
+ transform var(--dm-ctx-duration, 120ms) var(--dm-ctx-easing, ease);
13609
+ }
13610
+
13611
+ /*
13612
+ * A translucent panel needs its own layer: mixing the surface with transparent
13613
+ * keeps the text fully opaque, which `opacity` on the element would not - that
13614
+ * would fade the labels along with the background and fail contrast outright.
13615
+ */
13616
+ .dm-context-menu[style*="--dm-ctx-opacity"] {
13617
+ background: color-mix(
13618
+ in srgb,
13619
+ var(--dm-ctx-surface, var(--dm-surface)) calc(var(--dm-ctx-opacity) * 100%),
13620
+ transparent
13621
+ );
13622
+ backdrop-filter: blur(10px);
13623
+ }
13624
+
13625
+ /* An accent tints the leading edge as well as the border. */
13626
+ .dm-context-menu[style*="--dm-ctx-accent"] {
13627
+ border-left-width: 3px;
13628
+ }
13629
+
13630
+ /* ---- transitions ---- */
13631
+
13632
+ .dm-context-menu[data-transition] {
13633
+ opacity: 0;
13634
+ }
13635
+
13636
+ .dm-context-menu[data-transition="scale"] { transform: scale(0.97); }
13637
+ .dm-context-menu[data-transition="fade"] { transform: none; }
13638
+ .dm-context-menu[data-transition="slide"] { transform: translateY(-6px); }
13639
+ .dm-context-menu[data-transition="none"] { transform: none; transition: none; }
13640
+
13641
+ .dm-context-menu.is-open {
13642
+ opacity: 1;
13643
+ transform: none;
13644
+ }
13645
+
13646
+ /* ---- density ---- */
13647
+
13648
+ .dm-context-menu[data-density="compact"] {
13649
+ font-size: 0.8125rem;
13650
+ padding: 2px;
13651
+ }
13652
+
13653
+ .dm-context-menu[data-density="compact"] .dm-context-menu-item {
13654
+ padding: 0.25rem 0.45rem;
13655
+ }
13656
+
13657
+ .dm-context-menu-item {
13658
+ display: flex;
13659
+ align-items: center;
13660
+ gap: 0.5rem;
13661
+ width: 100%;
13662
+ padding: 0.4rem 0.6rem;
13663
+ background: none;
13664
+ border: 0;
13665
+ border-radius: var(--dm-radius-sm);
13666
+ color: inherit;
13667
+ font: inherit;
13668
+ text-align: left;
13669
+ cursor: pointer;
13670
+ transition: background var(--dm-transition-fast);
13671
+ }
13672
+
13673
+ .dm-context-menu-item:hover:not(.is-disabled),
13674
+ .dm-context-menu-item:focus-visible {
13675
+ background: var(--dm-background-alt);
13676
+ outline: none;
13677
+ }
13678
+
13679
+ /*
13680
+ * The accent tints the hover wash rather than the label. A named colour cannot
13681
+ * be guaranteed readable against whatever surface the menu is on - the same
13682
+ * trap that made --dm-danger 1.02:1 on admin-smooth-steel - so the text keeps
13683
+ * the one pairing every theme guarantees and the accent carries the meaning.
13684
+ */
13685
+ .dm-context-menu[style*="--dm-ctx-accent"] .dm-context-menu-item:hover:not(.is-disabled),
13686
+ .dm-context-menu[style*="--dm-ctx-accent"] .dm-context-menu-item:focus-visible {
13687
+ background: color-mix(in srgb, var(--dm-ctx-accent) 16%, transparent);
13688
+ }
13689
+
13690
+ .dm-context-menu-item:focus-visible {
13691
+ box-shadow: inset 0 0 0 2px var(--dm-border-focus);
13692
+ }
13693
+
13694
+ .dm-context-menu-item.is-disabled {
13695
+ opacity: 0.45;
13696
+ cursor: not-allowed;
13697
+ }
13698
+
13699
+ /*
13700
+ * Destructive items carry their warning in a tinted wash rather than in red
13701
+ * text. A saturated red cannot be read on a mid-tone surface - on
13702
+ * admin-smooth-steel, --dm-danger against --dm-surface lands at 1.02:1 - and
13703
+ * no single red works across a light surface, a dark one and the mid-tone
13704
+ * themes in between. The wash is mixed FROM the surface, so it adapts, and the
13705
+ * label keeps the one colour every theme guarantees is readable on it.
13706
+ */
13707
+ .dm-context-menu-item.is-danger {
13708
+ background: color-mix(in srgb, var(--dm-danger) 10%, transparent);
13709
+ }
13710
+
13711
+ .dm-context-menu-item.is-danger:hover:not(.is-disabled) {
13712
+ background: color-mix(in srgb, var(--dm-danger) 22%, transparent);
13713
+ }
13714
+
13715
+ .dm-context-menu-icon {
13716
+ display: inline-flex;
13717
+ align-items: center;
13718
+ justify-content: center;
13719
+ flex: 0 0 16px;
13720
+ width: 16px;
13721
+ height: 16px;
13722
+ }
13723
+
13724
+ .dm-context-menu-label {
13725
+ flex: 1 1 auto;
13726
+ white-space: nowrap;
13727
+ overflow: hidden;
13728
+ text-overflow: ellipsis;
13729
+ }
13730
+
13731
+ .dm-context-menu-shortcut {
13732
+ flex: 0 0 auto;
13733
+ padding-left: 1rem;
13734
+ font-size: 0.78em;
13735
+ font-variant-numeric: tabular-nums;
13736
+ opacity: 0.8;
13737
+ }
13738
+
13739
+ .dm-context-menu-chevron {
13740
+ display: inline-flex;
13741
+ flex: 0 0 auto;
13742
+ margin-left: auto;
13743
+ padding-left: 0.4rem;
13744
+ opacity: 0.7;
13745
+ }
13746
+
13747
+ .dm-context-menu-item.has-submenu .dm-context-menu-label {
13748
+ flex: 0 1 auto;
13749
+ }
13750
+
13751
+ .dm-context-menu-item.is-checked .dm-context-menu-icon::after {
13752
+ content: "";
13753
+ width: 8px;
13754
+ height: 8px;
13755
+ border-radius: 50%;
13756
+ background: var(--dm-ctx-accent, var(--dm-primary));
13757
+ }
13758
+
13759
+ .dm-context-menu-divider {
13760
+ height: 1px;
13761
+ margin: 4px 2px;
13762
+ background: var(--dm-border);
13763
+ }
13764
+
13765
+ .dm-context-menu-header {
13766
+ padding: 0.35rem 0.6rem 0.2rem;
13767
+ font-size: 0.72rem;
13768
+ font-weight: 600;
13769
+ letter-spacing: 0.04em;
13770
+ text-transform: uppercase;
13771
+ }
13772
+
13773
+ /* The affordance that tells people a menu is there at all. */
13774
+ .dm-context-menu-host {
13775
+ cursor: context-menu;
13776
+ }
13777
+
13778
+ @media (prefers-reduced-motion: reduce) {
13779
+ .dm-context-menu,
13780
+ .dm-context-menu[data-transition] {
13781
+ transition: none !important;
13782
+ transform: none !important;
13783
+ }
13784
+ }
13785
+
13786
+ /* ============================================
13787
+ DatePicker
13788
+ --------------------------------------------
13789
+ Every colour is a --dm-* token that the theme layer defines, so the calendar
13790
+ takes whatever theme the host is wearing - including one applied to a region
13791
+ by a theme override, since the tokens are inherited rather than hard-coded.
13792
+ Nothing here invents a token: an undefined var() resolves to nothing and
13793
+ paints a blank panel.
13794
+ ============================================ */
13795
+
13796
+ .dm-datepicker {
13797
+ position: absolute;
13798
+ z-index: 1080;
13799
+ width: max-content;
13800
+ padding: 0.5rem;
13801
+
13802
+ font-family: var(--dm-font-sans);
13803
+ font-size: var(--dm-font-size-sm);
13804
+ color: var(--dm-text);
13805
+
13806
+ background: var(--dm-surface-raised, var(--dm-surface));
13807
+ border: 1px solid var(--dm-border);
13808
+ border-radius: var(--dm-radius-lg);
13809
+ box-shadow: var(--dm-shadow-lg);
13810
+ }
13811
+
13812
+ .dm-datepicker--inline {
13813
+ position: static;
13814
+ box-shadow: none;
13815
+ margin-top: 0.35rem;
13816
+ }
13817
+
13818
+ /* Header: month and year pickers between two chevrons. */
13819
+
13820
+ .dm-datepicker-head {
13821
+ display: flex;
13822
+ align-items: center;
13823
+ gap: 0.35rem;
13824
+ margin-bottom: 0.4rem;
13825
+ }
13826
+
13827
+ .dm-datepicker-pickers {
13828
+ display: flex;
13829
+ gap: 0.3rem;
13830
+ flex: 1 1 auto;
13831
+ justify-content: center;
13832
+ }
13833
+
13834
+ /*
13835
+ * Five rules below are recorded in scripts/validate-contrast-pairs.baseline.json
13836
+ * rather than fixed, and the reason is the theme system, not this component.
13837
+ *
13838
+ * The three `--dm-text-disabled` rules (.is-outside, .is-disabled and the
13839
+ * disabled action) sit below 3:1 on `--dm-surface-raised` in ALL 33 themes -
13840
+ * 1.37 at worst. That is the disabled ramp behaving as designed, and WCAG AA
13841
+ * 1.4.3 exempts inactive controls from the contrast minimum. Lifting it to 4.5
13842
+ * here would make disabled dates LIGHTER than the muted weekday header, which
13843
+ * inverts the hierarchy.
13844
+ *
13845
+ * The two `--dm-text-muted` rules (.dm-datepicker-nav, .dm-datepicker-week)
13846
+ * fail on `--dm-surface-raised` in 23 of the 33 themes, worst 3.11. No token
13847
+ * below `--dm-text` clears AA on a raised surface everywhere, so this is not
13848
+ * fixable by picking a different variable - the muted ramp itself would have to
13849
+ * be redesigned across every theme. Using `--dm-text` instead would pass, and
13850
+ * cost the weekday header and adjacent-month days the de-emphasis that makes a
13851
+ * calendar readable at a glance.
13852
+ *
13853
+ * If the muted ramp is ever revisited, `npm run validate:contrast
13854
+ * --update-baseline` should drop these two.
13855
+ */
13856
+ .dm-datepicker-nav {
13857
+ display: inline-flex;
13858
+ align-items: center;
13859
+ justify-content: center;
13860
+ width: 28px;
13861
+ height: 28px;
13862
+ padding: 0;
13863
+ flex: 0 0 auto;
13864
+
13865
+ color: var(--dm-text-muted);
13866
+ background: transparent;
13867
+ border: 1px solid transparent;
13868
+ border-radius: var(--dm-radius-md);
13869
+ cursor: pointer;
13870
+ transition: background var(--dm-transition-fast), color var(--dm-transition-fast);
13871
+ }
13872
+
13873
+ .dm-datepicker-nav:hover {
13874
+ color: var(--dm-text);
13875
+ background: var(--dm-hover-bg);
13876
+ }
13877
+
13878
+ .dm-datepicker-select {
13879
+ padding: 0.2rem 0.35rem;
13880
+ font: inherit;
13881
+ color: var(--dm-input-text, var(--dm-text));
13882
+ background: var(--dm-input-bg, var(--dm-surface));
13883
+ border: 1px solid var(--dm-input-border, var(--dm-border));
13884
+ border-radius: var(--dm-radius-md);
13885
+ cursor: pointer;
13886
+ }
13887
+
13888
+ .dm-datepicker-select:focus-visible {
13889
+ outline: none;
13890
+ border-color: var(--dm-input-focus-border, var(--dm-primary));
13891
+ box-shadow: var(--dm-focus-ring);
13892
+ }
13893
+
13894
+ /* The grid. Seven equal columns, so the weekday row and the days line up
13895
+ whatever the digits are - a table would do the same but cannot carry the
13896
+ roles this needs. */
13897
+
13898
+ .dm-datepicker-row {
13899
+ display: grid;
13900
+ grid-template-columns: repeat(7, 2rem);
13901
+ gap: 2px;
13902
+ }
13903
+
13904
+ .dm-datepicker[data-week-numbers] .dm-datepicker-row {
13905
+ grid-template-columns: 1.6rem repeat(7, 2rem);
13906
+ }
13907
+
13908
+ .dm-datepicker-weekdays { margin-bottom: 2px; }
13909
+
13910
+ .dm-datepicker-weekday,
13911
+ .dm-datepicker-week {
13912
+ display: flex;
13913
+ align-items: center;
13914
+ justify-content: center;
13915
+ height: 1.6rem;
13916
+ font-size: var(--dm-font-size-xs);
13917
+ font-weight: var(--dm-font-weight-semibold);
13918
+ color: var(--dm-text-muted);
13919
+ }
13920
+
13921
+ .dm-datepicker-week { font-weight: 400; }
13922
+
13923
+ .dm-datepicker-day {
13924
+ display: flex;
13925
+ align-items: center;
13926
+ justify-content: center;
13927
+ height: 2rem;
13928
+ padding: 0;
13929
+
13930
+ font: inherit;
13931
+ font-variant-numeric: tabular-nums;
13932
+ color: var(--dm-text);
13933
+ background: transparent;
13934
+ border: 1px solid transparent;
13935
+ border-radius: var(--dm-radius-md);
13936
+ cursor: pointer;
13937
+ transition: background var(--dm-transition-fast), color var(--dm-transition-fast);
13938
+ }
13939
+
13940
+ .dm-datepicker-day:hover:not(.is-disabled) { background: var(--dm-hover-bg); }
13941
+
13942
+ .dm-datepicker-day:focus-visible {
13943
+ outline: none;
13944
+ box-shadow: var(--dm-focus-ring);
13945
+ }
13946
+
13947
+ /* The days either side of the month are shown rather than blanked: a calendar
13948
+ with holes in it is harder to read than one that runs on. */
13949
+ .dm-datepicker-day.is-outside { color: var(--dm-text-disabled); }
13950
+
13951
+ .dm-datepicker-day.is-today {
13952
+ border-color: var(--dm-primary);
13953
+ font-weight: var(--dm-font-weight-semibold);
13954
+ }
13955
+
13956
+ .dm-datepicker-day.is-selected,
13957
+ .dm-datepicker-day.is-selected:hover {
13958
+ color: var(--dm-primary-text);
13959
+ background: var(--dm-primary);
13960
+ border-color: var(--dm-primary);
13961
+ }
13962
+
13963
+ .dm-datepicker-day.is-disabled {
13964
+ color: var(--dm-text-disabled);
13965
+ cursor: not-allowed;
13966
+ opacity: var(--dm-disabled-opacity);
13967
+ }
13968
+
13969
+ /* Footer actions. */
13970
+
13971
+ .dm-datepicker-foot {
13972
+ display: flex;
13973
+ gap: 0.35rem;
13974
+ justify-content: flex-end;
13975
+ margin-top: 0.45rem;
13976
+ padding-top: 0.45rem;
13977
+ border-top: 1px solid var(--dm-border);
13978
+ }
13979
+
13980
+ .dm-datepicker-action {
13981
+ padding: 0.2rem 0.6rem;
13982
+ font: inherit;
13983
+ font-size: var(--dm-font-size-xs);
13984
+ color: var(--dm-link);
13985
+ background: transparent;
13986
+ border: 0;
13987
+ border-radius: var(--dm-radius-md);
13988
+ cursor: pointer;
13989
+ }
13990
+
13991
+ .dm-datepicker-action:hover:not(:disabled) {
13992
+ color: var(--dm-link-hover);
13993
+ background: var(--dm-hover-bg);
13994
+ }
13995
+
13996
+ .dm-datepicker-action:disabled {
13997
+ color: var(--dm-text-disabled);
13998
+ cursor: not-allowed;
13999
+ }
14000
+
13561
14001
 
13562
14002
  /* ============================================
13563
14003
  THEME SYSTEM
@@ -13565,11 +14005,11 @@ code {
13565
14005
  ============================================ */
13566
14006
 
13567
14007
  /*!
13568
- * Domma Themes v0.42.0
14008
+ * Domma Themes v0.44.1
13569
14009
  * Dynamic Object Manipulation & Modeling API
13570
14010
  * (c) 2026 Darryl Waterhouse & DCBW-IT
13571
- * Built: 2026-08-22T16:17:44.088Z
13572
- * Commit: 0f0475f
14011
+ * Built: 2026-09-23T16:22:37.512Z
14012
+ * Commit: 7c54327
13573
14013
  */
13574
14014
 
13575
14015
  /**
@@ -19717,40 +20157,40 @@ code {
19717
20157
  .dm-theme-admin-smooth-steel {
19718
20158
  color-scheme: dark;
19719
20159
 
19720
- --dm-background: #586170;
19721
- --dm-background-alt: #4f5764;
19722
- --dm-surface: #646d7c;
19723
- --dm-surface-raised: #6c7686;
19724
- --dm-surface-overlay: #6c7686;
20160
+ --dm-background: #353a43;
20161
+ --dm-background-alt: #2f343c;
20162
+ --dm-surface: #3c414a;
20163
+ --dm-surface-raised: #414750;
20164
+ --dm-surface-overlay: #414750;
19725
20165
  --dm-text: #f7f9fb;
19726
20166
  --dm-text-secondary: #d2d8e0;
19727
20167
  --dm-text-muted: #b3bcc8;
19728
20168
  --dm-text-disabled: #8a93a1;
19729
20169
  --dm-text-inverse: #1f2733;
19730
- --dm-border: #6f7888;
19731
- --dm-border-light: #5c6573;
19732
- --dm-border-dark: #7a8494;
20170
+ --dm-border: #434852;
20171
+ --dm-border-light: #373d45;
20172
+ --dm-border-dark: #494f59;
19733
20173
  --dm-hover-bg: rgba(255, 255, 255, 0.07);
19734
20174
  --dm-active-bg: rgba(255, 255, 255, 0.10);
19735
20175
  --dm-disabled-opacity: 0.4;
19736
- --dm-sidebar-bg: #454d5a;
20176
+ --dm-sidebar-bg: #292e36;
19737
20177
  --dm-sidebar-text: #d2d8e0;
19738
- --dm-sidebar-border: #3b424d;
19739
- --dm-navbar-bg: #4f5764;
20178
+ --dm-sidebar-border: #232830;
20179
+ --dm-navbar-bg: #2f343c;
19740
20180
  --dm-navbar-text: #f7f9fb;
19741
- --dm-navbar-border: #5c6573;
19742
- --dm-table-header-bg: #535b69;
20181
+ --dm-navbar-border: #373d45;
20182
+ --dm-table-header-bg: #32373f;
19743
20183
  --dm-table-stripe-bg: rgba(255, 255, 255, 0.03);
19744
20184
  --dm-table-hover-bg: rgba(255, 255, 255, 0.07);
19745
20185
  --dm-modal-backdrop: rgba(0, 0, 0, 0.6);
19746
20186
  --dm-tooltip-bg: #1f2733;
19747
20187
  --dm-tooltip-text: #ffffff;
19748
- --dm-scrollbar-track: #4f5764;
19749
- --dm-scrollbar-thumb: #7a8494;
19750
- --dm-scrollbar-thumb-hover: #8b95a5;
19751
- --dm-code-bg: #454d5a;
20188
+ --dm-scrollbar-track: #2f343c;
20189
+ --dm-scrollbar-thumb: #494f59;
20190
+ --dm-scrollbar-thumb-hover: #5a616c;
20191
+ --dm-code-bg: #292e36;
19752
20192
  --dm-code-text: #ffd9a8;
19753
- --dm-progress-bg: #535b69;
20193
+ --dm-progress-bg: #32373f;
19754
20194
 
19755
20195
  --dm-primary: #3b76bc;
19756
20196
  --dm-primary-hover: #356bab;
@@ -19855,40 +20295,40 @@ code {
19855
20295
  .dm-theme-admin-smooth-indigo {
19856
20296
  color-scheme: dark;
19857
20297
 
19858
- --dm-background: #586170;
19859
- --dm-background-alt: #4f5764;
19860
- --dm-surface: #646d7c;
19861
- --dm-surface-raised: #6c7686;
19862
- --dm-surface-overlay: #6c7686;
20298
+ --dm-background: #353a43;
20299
+ --dm-background-alt: #2f343c;
20300
+ --dm-surface: #3c414a;
20301
+ --dm-surface-raised: #414750;
20302
+ --dm-surface-overlay: #414750;
19863
20303
  --dm-text: #f7f9fb;
19864
20304
  --dm-text-secondary: #d2d8e0;
19865
20305
  --dm-text-muted: #b3bcc8;
19866
20306
  --dm-text-disabled: #8a93a1;
19867
20307
  --dm-text-inverse: #1f2733;
19868
- --dm-border: #6f7888;
19869
- --dm-border-light: #5c6573;
19870
- --dm-border-dark: #7a8494;
20308
+ --dm-border: #434852;
20309
+ --dm-border-light: #373d45;
20310
+ --dm-border-dark: #494f59;
19871
20311
  --dm-hover-bg: rgba(255, 255, 255, 0.07);
19872
20312
  --dm-active-bg: rgba(255, 255, 255, 0.10);
19873
20313
  --dm-disabled-opacity: 0.4;
19874
- --dm-sidebar-bg: #454d5a;
20314
+ --dm-sidebar-bg: #292e36;
19875
20315
  --dm-sidebar-text: #d2d8e0;
19876
- --dm-sidebar-border: #3b424d;
19877
- --dm-navbar-bg: #4f5764;
20316
+ --dm-sidebar-border: #232830;
20317
+ --dm-navbar-bg: #2f343c;
19878
20318
  --dm-navbar-text: #f7f9fb;
19879
- --dm-navbar-border: #5c6573;
19880
- --dm-table-header-bg: #535b69;
20319
+ --dm-navbar-border: #373d45;
20320
+ --dm-table-header-bg: #32373f;
19881
20321
  --dm-table-stripe-bg: rgba(255, 255, 255, 0.03);
19882
20322
  --dm-table-hover-bg: rgba(255, 255, 255, 0.07);
19883
20323
  --dm-modal-backdrop: rgba(0, 0, 0, 0.6);
19884
20324
  --dm-tooltip-bg: #1f2733;
19885
20325
  --dm-tooltip-text: #ffffff;
19886
- --dm-scrollbar-track: #4f5764;
19887
- --dm-scrollbar-thumb: #7a8494;
19888
- --dm-scrollbar-thumb-hover: #8b95a5;
19889
- --dm-code-bg: #454d5a;
20326
+ --dm-scrollbar-track: #2f343c;
20327
+ --dm-scrollbar-thumb: #494f59;
20328
+ --dm-scrollbar-thumb-hover: #5a616c;
20329
+ --dm-code-bg: #292e36;
19890
20330
  --dm-code-text: #ffd9a8;
19891
- --dm-progress-bg: #535b69;
20331
+ --dm-progress-bg: #32373f;
19892
20332
 
19893
20333
  --dm-primary: #5b63a8;
19894
20334
  --dm-primary-hover: #4f5694;
@@ -19993,40 +20433,40 @@ code {
19993
20433
  .dm-theme-admin-smooth-teal {
19994
20434
  color-scheme: dark;
19995
20435
 
19996
- --dm-background: #586170;
19997
- --dm-background-alt: #4f5764;
19998
- --dm-surface: #646d7c;
19999
- --dm-surface-raised: #6c7686;
20000
- --dm-surface-overlay: #6c7686;
20436
+ --dm-background: #353a43;
20437
+ --dm-background-alt: #2f343c;
20438
+ --dm-surface: #3c414a;
20439
+ --dm-surface-raised: #414750;
20440
+ --dm-surface-overlay: #414750;
20001
20441
  --dm-text: #f7f9fb;
20002
20442
  --dm-text-secondary: #d2d8e0;
20003
20443
  --dm-text-muted: #b3bcc8;
20004
20444
  --dm-text-disabled: #8a93a1;
20005
20445
  --dm-text-inverse: #1f2733;
20006
- --dm-border: #6f7888;
20007
- --dm-border-light: #5c6573;
20008
- --dm-border-dark: #7a8494;
20446
+ --dm-border: #434852;
20447
+ --dm-border-light: #373d45;
20448
+ --dm-border-dark: #494f59;
20009
20449
  --dm-hover-bg: rgba(255, 255, 255, 0.07);
20010
20450
  --dm-active-bg: rgba(255, 255, 255, 0.10);
20011
20451
  --dm-disabled-opacity: 0.4;
20012
- --dm-sidebar-bg: #454d5a;
20452
+ --dm-sidebar-bg: #292e36;
20013
20453
  --dm-sidebar-text: #d2d8e0;
20014
- --dm-sidebar-border: #3b424d;
20015
- --dm-navbar-bg: #4f5764;
20454
+ --dm-sidebar-border: #232830;
20455
+ --dm-navbar-bg: #2f343c;
20016
20456
  --dm-navbar-text: #f7f9fb;
20017
- --dm-navbar-border: #5c6573;
20018
- --dm-table-header-bg: #535b69;
20457
+ --dm-navbar-border: #373d45;
20458
+ --dm-table-header-bg: #32373f;
20019
20459
  --dm-table-stripe-bg: rgba(255, 255, 255, 0.03);
20020
20460
  --dm-table-hover-bg: rgba(255, 255, 255, 0.07);
20021
20461
  --dm-modal-backdrop: rgba(0, 0, 0, 0.6);
20022
20462
  --dm-tooltip-bg: #1f2733;
20023
20463
  --dm-tooltip-text: #ffffff;
20024
- --dm-scrollbar-track: #4f5764;
20025
- --dm-scrollbar-thumb: #7a8494;
20026
- --dm-scrollbar-thumb-hover: #8b95a5;
20027
- --dm-code-bg: #454d5a;
20464
+ --dm-scrollbar-track: #2f343c;
20465
+ --dm-scrollbar-thumb: #494f59;
20466
+ --dm-scrollbar-thumb-hover: #5a616c;
20467
+ --dm-code-bg: #292e36;
20028
20468
  --dm-code-text: #ffd9a8;
20029
- --dm-progress-bg: #535b69;
20469
+ --dm-progress-bg: #32373f;
20030
20470
 
20031
20471
  --dm-primary: #2a8178;
20032
20472
  --dm-primary-hover: #287d75;