domma-js 0.39.2 → 0.41.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.39.2
2
+ * Domma Elements CSS v0.41.0
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-08-21T12:14:59.641Z
6
- * Commit: c7a693e
5
+ * Built: 2026-08-22T13:41:49.303Z
6
+ * Commit: 5d8b7e1
7
7
  */
8
8
 
9
9
  /**
@@ -265,8 +265,13 @@
265
265
  border-color: var(--dm-primary);
266
266
  }
267
267
 
268
+ /* No --dm-primary-text here. That token is the foreground for text drawn ON a
269
+ primary fill, which is what the header and footer above do. The body has no
270
+ fill - it sits on the card's own surface - so borrowing the fill foreground
271
+ put near-black text (#1a1a1a in the dark themes) on a dark surface, at 1.19
272
+ contrast. Inheriting --dm-text from the card is the correct behaviour. */
268
273
  .card-primary .card-body {
269
- color: var(--dm-primary-text, var(--dm-white));
274
+ color: var(--dm-text);
270
275
  }
271
276
 
272
277
  .card-primary .card-footer {
@@ -1291,7 +1296,7 @@ textarea:not([class])::placeholder {
1291
1296
  NUMBER BADGE
1292
1297
  ============================================ */
1293
1298
 
1294
- /* Standalone number badge — circular for single digits, pill for multi-digit */
1299
+ /* Standalone number badge - circular for single digits, pill for multi-digit */
1295
1300
  .badge-number {
1296
1301
  display: inline-flex;
1297
1302
  align-items: center;
@@ -1308,7 +1313,7 @@ textarea:not([class])::placeholder {
1308
1313
  color: var(--dm-danger-text, var(--dm-white));
1309
1314
  }
1310
1315
 
1311
- /* Dot indicator — small coloured presence circle */
1316
+ /* Dot indicator - small coloured presence circle */
1312
1317
  .badge-dot {
1313
1318
  display: inline-block;
1314
1319
  width: 0.5rem;
@@ -1323,7 +1328,7 @@ textarea:not([class])::placeholder {
1323
1328
  display: inline-flex;
1324
1329
  }
1325
1330
 
1326
- /* Counter badge — overlapping corner with border ring (classic app-notification style) */
1331
+ /* Counter badge - overlapping corner with border ring (classic app-notification style) */
1327
1332
  .badge-counter {
1328
1333
  position: absolute;
1329
1334
  top: -6px;
@@ -1345,7 +1350,7 @@ textarea:not([class])::placeholder {
1345
1350
  color: var(--dm-danger-text, var(--dm-white));
1346
1351
  }
1347
1352
 
1348
- /* Dot variant of counter — smaller, no text */
1353
+ /* Dot variant of counter - smaller, no text */
1349
1354
  .badge-counter.badge-dot {
1350
1355
  top: -2px;
1351
1356
  right: -2px;
@@ -1399,7 +1404,7 @@ textarea:not([class])::placeholder {
1399
1404
  LIST GROUP
1400
1405
  ============================================ */
1401
1406
 
1402
- /* Container — vertical flex column with rounded corners and clipped overflow */
1407
+ /* Container - vertical flex column with rounded corners and clipped overflow */
1403
1408
  .list-group {
1404
1409
  display: flex;
1405
1410
  flex-direction: column;
@@ -1409,7 +1414,7 @@ textarea:not([class])::placeholder {
1409
1414
  background-color: var(--dm-surface);
1410
1415
  }
1411
1416
 
1412
- /* Each item — flex row, vertically centred, with a bottom separator */
1417
+ /* Each item - flex row, vertically centred, with a bottom separator */
1413
1418
  .list-group-item {
1414
1419
  display: flex;
1415
1420
  align-items: center;
@@ -1427,7 +1432,7 @@ textarea:not([class])::placeholder {
1427
1432
  border-bottom: none;
1428
1433
  }
1429
1434
 
1430
- /* Flush modifier — strip outer border and radius for embedding inside cards */
1435
+ /* Flush modifier - strip outer border and radius for embedding inside cards */
1431
1436
  .list-group-flush {
1432
1437
  border: none;
1433
1438
  border-radius: 0;
@@ -1449,7 +1454,7 @@ textarea:not([class])::placeholder {
1449
1454
  font-size: var(--dm-font-size-base);
1450
1455
  }
1451
1456
 
1452
- /* Actionable items — pointer cursor and hover highlight */
1457
+ /* Actionable items - pointer cursor and hover highlight */
1453
1458
  .list-group-item-action {
1454
1459
  cursor: pointer;
1455
1460
  user-select: none;
@@ -1473,7 +1478,7 @@ textarea:not([class])::placeholder {
1473
1478
  justify-content: center;
1474
1479
  }
1475
1480
 
1476
- /* Central text wrapper — grows to fill available space */
1481
+ /* Central text wrapper - grows to fill available space */
1477
1482
  .list-group-item-content {
1478
1483
  flex-grow: 1;
1479
1484
  min-width: 0;
@@ -1501,7 +1506,7 @@ textarea:not([class])::placeholder {
1501
1506
  text-overflow: ellipsis;
1502
1507
  }
1503
1508
 
1504
- /* Right-side trailing area — badges, timestamps, actions */
1509
+ /* Right-side trailing area - badges, timestamps, actions */
1505
1510
  .list-group-item-trailing {
1506
1511
  flex-shrink: 0;
1507
1512
  margin-left: auto;
@@ -1511,7 +1516,7 @@ textarea:not([class])::placeholder {
1511
1516
  gap: var(--dm-space-2);
1512
1517
  }
1513
1518
 
1514
- /* Active/selected state — accent background takes precedence over colour variants */
1519
+ /* Active/selected state - accent background takes precedence over colour variants */
1515
1520
  .list-group-item.active {
1516
1521
  background-color: var(--dm-primary);
1517
1522
  color: var(--dm-primary-text, var(--dm-white));
@@ -1523,7 +1528,7 @@ textarea:not([class])::placeholder {
1523
1528
  color: rgba(255, 255, 255, 0.75);
1524
1529
  }
1525
1530
 
1526
- /* Disabled state — dimmed and non-interactive */
1531
+ /* Disabled state - dimmed and non-interactive */
1527
1532
  .list-group-item.disabled {
1528
1533
  opacity: 0.7;
1529
1534
  cursor: not-allowed;
@@ -1603,7 +1608,7 @@ textarea:not([class])::placeholder {
1603
1608
  border-top-color: var(--dm-border);
1604
1609
  }
1605
1610
 
1606
- /* Numbered list — CSS counter prepended to each item */
1611
+ /* Numbered list - CSS counter prepended to each item */
1607
1612
  .list-group-numbered {
1608
1613
  list-style-type: none;
1609
1614
  counter-reset: list-group-counter;
@@ -1619,7 +1624,7 @@ textarea:not([class])::placeholder {
1619
1624
  color: var(--dm-text-muted);
1620
1625
  }
1621
1626
 
1622
- /* Horizontal layout — items arranged in a row */
1627
+ /* Horizontal layout - items arranged in a row */
1623
1628
  .list-group-horizontal {
1624
1629
  flex-direction: row;
1625
1630
  }
@@ -2181,10 +2186,25 @@ code {
2181
2186
  border-radius: 0;
2182
2187
  }
2183
2188
 
2189
+ /* The active link used to take --dm-primary as its text colour. --dm-primary is
2190
+ a mid-tone in several theme families, so on the navbar surface it measured as
2191
+ low as 1.72 (lemon-light). Primary stays as the accent - the tinted pill and
2192
+ the underline - but the text itself uses the one token guaranteed to read on
2193
+ this surface. */
2194
+ /* The active link used to take --dm-primary as its text colour. --dm-primary is
2195
+ a mid-tone in several theme families, so on the navbar surface it measured as
2196
+ low as 1.72 (lemon-light).
2197
+
2198
+ The affordance is now the primary underline plus the weight, and the text
2199
+ uses the one token guaranteed to read on this surface. Deliberately no pill
2200
+ background: a tint of --dm-primary shifts the bar toward the text colour in
2201
+ the themes where primary is light, which cost ~2 points of contrast on the
2202
+ already-tightest combination (dark theme + .navbar-light). Underline only
2203
+ means the active state can never read worse than the brand beside it. */
2184
2204
  .navbar-link.active {
2185
- color: var(--dm-primary);
2205
+ color: var(--dm-navbar-text);
2186
2206
  font-weight: 500;
2187
- background-color: color-mix(in srgb, var(--dm-primary) 10%, transparent);
2207
+ box-shadow: inset 0 -2px 0 0 var(--dm-primary);
2188
2208
  }
2189
2209
 
2190
2210
  .nav-version {
@@ -2192,78 +2212,77 @@ code {
2192
2212
  color: var(--dm-text-secondary, #eee);
2193
2213
  }
2194
2214
 
2195
- /* Light navbar variant */
2196
-
2197
- .navbar-light {
2198
- background-color: var(--dm-surface);
2199
- border-bottom-color: var(--dm-border);
2200
- }
2215
+ /* ---------------------------------------------------------------------------
2216
+ Navbar variants
2201
2217
 
2202
- .navbar-light .navbar-brand,
2203
- .navbar-light .navbar-brand-text {
2204
- color: var(--dm-text);
2205
- }
2218
+ These predate the theme system and used to be written as absolute colours:
2219
+ .navbar-dark painted the bar with --dm-background and its text with
2220
+ --dm-text-inverse. Those two tokens resolve to the SAME value in every dark
2221
+ theme (both are the theme's darkest slate), so the brand rendered at 1.00
2222
+ contrast - invisible, on every dark theme, in every consumer. .navbar-light
2223
+ failed the mirror way in light themes: a white bar with white text, and an
2224
+ active link at 2.56.
2206
2225
 
2207
- .navbar-light .navbar-link {
2208
- color: var(--dm-text-secondary);
2209
- }
2226
+ Every theme already ships the pair meant for this job - --dm-navbar-bg (the
2227
+ theme's navbar surface) and --dm-navbar-text (text guaranteed to read on it).
2228
+ So the variants are now tint modifiers on that surface rather than absolute
2229
+ colours: "dark" sits a shade below the theme's navbar, "light" a shade above.
2230
+ The two stay visually distinct, both follow the theme, and neither can
2231
+ collide with its own foreground.
2210
2232
 
2211
- .navbar-light .navbar-link:hover {
2212
- color: #ffffff !important;
2213
- background-color: #1e293b !important;
2214
- border-radius: var(--dm-radius-md);
2215
- }
2233
+ Measured worst case across 21 themes x both variants: 5.78 (was 1.00).
2234
+ --------------------------------------------------------------------------- */
2216
2235
 
2217
- /* Force dark hover in light mode using data-mode attribute */
2218
- [data-mode="light"] .navbar-link:hover {
2219
- color: #ffffff !important;
2220
- background-color: #1e293b !important;
2221
- border-radius: var(--dm-radius-md);
2222
- }
2223
-
2224
- .navbar-light .navbar-toggle {
2225
- color: var(--dm-text);
2226
- }
2236
+ /* Light navbar variant */
2227
2237
 
2228
- .navbar-light .navbar-toggle:hover {
2229
- background: var(--dm-background-alt);
2230
- color: var(--dm-text);
2238
+ .navbar-light {
2239
+ background-color: color-mix(in srgb, #fff 18%, var(--dm-navbar-bg));
2240
+ border-bottom-color: var(--dm-border);
2231
2241
  }
2232
2242
 
2233
2243
  /* Dark navbar variant */
2234
2244
 
2235
2245
  .navbar-dark {
2236
- background-color: var(--dm-background);
2246
+ background-color: color-mix(in srgb, #000 18%, var(--dm-navbar-bg));
2237
2247
  border-bottom-color: var(--dm-border-dark);
2238
2248
  }
2239
2249
 
2250
+ .navbar-light .navbar-brand,
2251
+ .navbar-light .navbar-brand-text,
2252
+ .navbar-light .navbar-toggle,
2240
2253
  .navbar-dark .navbar-brand,
2241
- .navbar-dark .navbar-brand-text {
2242
- color: var(--dm-text-inverse, var(--dm-white));
2243
- }
2244
-
2254
+ .navbar-dark .navbar-brand-text,
2245
2255
  .navbar-dark .navbar-toggle {
2246
- color: var(--dm-text-disabled);
2247
- }
2248
-
2249
- .navbar-dark .navbar-toggle:hover {
2250
- background: var(--dm-surface);
2251
- color: var(--dm-text-inverse, var(--dm-white));
2256
+ color: var(--dm-navbar-text);
2252
2257
  }
2253
2258
 
2259
+ /* Slightly muted against the brand, but never below AA. 85% is the floor that
2260
+ clears 4.5 in every theme - 72% dropped grayve/wedding/christmas to 3.8-4.0. */
2261
+ .navbar-light .navbar-link,
2254
2262
  .navbar-dark .navbar-link {
2255
- color: var(--dm-gray-400, #adb5bd);
2263
+ color: color-mix(in srgb, var(--dm-navbar-text) 85%, var(--dm-navbar-bg));
2256
2264
  }
2257
2265
 
2266
+ .navbar-light .navbar-link:hover,
2258
2267
  .navbar-dark .navbar-link:hover {
2259
- background-color: rgba(255, 255, 255, 0.3);
2260
- color: var(--dm-text-inverse, var(--dm-white));
2261
- border-radius: var(--dm-radius-sm);
2268
+ color: var(--dm-navbar-text);
2269
+ background-color: color-mix(in srgb, var(--dm-navbar-text) 12%, transparent);
2270
+ border-radius: var(--dm-radius-md);
2262
2271
  }
2263
2272
 
2264
- .navbar-dark .navbar-link.active {
2265
- background-color: var(--dm-surface);
2266
- color: var(--dm-text-inverse, var(--dm-white));
2273
+ .navbar-light .navbar-toggle:hover,
2274
+ .navbar-dark .navbar-toggle:hover {
2275
+ background: color-mix(in srgb, var(--dm-navbar-text) 12%, transparent);
2276
+ color: var(--dm-navbar-text);
2277
+ }
2278
+
2279
+ /* Legacy forced hover for light mode. Kept as-is for the plain/transparent
2280
+ navbar, but excluded from the two variants above - it carries !important and
2281
+ would otherwise override their theme-derived hover. */
2282
+ [data-mode="light"] .navbar:not(.navbar-light):not(.navbar-dark) .navbar-link:hover {
2283
+ color: #ffffff !important;
2284
+ background-color: #1e293b !important;
2285
+ border-radius: var(--dm-radius-md);
2267
2286
  }
2268
2287
 
2269
2288
  /* Dark navbar collapse border color (mobile) */
@@ -2542,23 +2561,19 @@ code {
2542
2561
  list-style: none;
2543
2562
  }
2544
2563
 
2545
- /* Dark navbar dropdown styles */
2546
- .navbar-dark .navbar-dropdown-menu {
2547
- background: var(--dm-surface);
2548
- border-color: var(--dm-border-dark, var(--dm-border));
2549
- }
2550
-
2551
- .navbar-dark .navbar-dropdown-item {
2552
- color: var(--dm-gray-400, #adb5bd);
2553
- }
2564
+ /* Dark navbar dropdown styles
2554
2565
 
2555
- .navbar-dark .navbar-dropdown-item:hover {
2556
- background: rgba(255, 255, 255, 0.3);
2557
- color: var(--dm-text-inverse, var(--dm-white));
2558
- }
2566
+ The dropdown panel is painted from --dm-surface whatever the bar variant, so
2567
+ the base rules above already render it correctly in both modes. The overrides
2568
+ that used to live here only re-stated that same background while replacing
2569
+ the text with a fixed grey and the hover with --dm-text-inverse over 30%
2570
+ white - which measured 2.56 and 1.00 respectively in every light theme, and
2571
+ 3.25 on hover in the dark ones. The divider was being painted --dm-surface,
2572
+ i.e. the panel's own colour, so it was invisible.
2559
2573
 
2560
- .navbar-dark .navbar-dropdown-divider {
2561
- background: var(--dm-surface);
2574
+ Only the border tint is worth keeping. */
2575
+ .navbar-dark .navbar-dropdown-menu {
2576
+ border-color: var(--dm-border-dark, var(--dm-border));
2562
2577
  }
2563
2578
 
2564
2579
  /* ============================================
@@ -2598,14 +2613,9 @@ code {
2598
2613
  border-radius: var(--dm-radius-md);
2599
2614
  }
2600
2615
 
2601
- .navbar-dark .navbar-submenu-toggle {
2602
- color: var(--dm-gray-400, #adb5bd);
2603
- }
2604
-
2605
- .navbar-dark .navbar-submenu-toggle:hover {
2606
- background: rgba(255, 255, 255, 0.3);
2607
- color: var(--dm-text-inverse, var(--dm-white));
2608
- }
2616
+ /* Same as the dropdown items above - the submenu toggle sits on the panel, not
2617
+ on the bar, so the base --dm-text / --dm-hover-bg pairing is the correct one
2618
+ and the fixed grey plus --dm-text-inverse overrides have been removed. */
2609
2619
 
2610
2620
  /* Submenu caret points to the side to signal a fly-out */
2611
2621
  .navbar-submenu-toggle .navbar-caret {
@@ -4940,7 +4950,7 @@ code {
4940
4950
  }
4941
4951
 
4942
4952
  /* Status text utilities use color-mix with --dm-text so they auto-adapt to
4943
- light/dark modes — keeping brand identity while staying ≥4.5:1 readable. */
4953
+ light/dark modes - keeping brand identity while staying ≥4.5:1 readable. */
4944
4954
  .text-success {
4945
4955
  color: color-mix(in oklab, var(--dm-success), var(--dm-text) 30%) !important;
4946
4956
  }
@@ -5346,7 +5356,7 @@ code {
5346
5356
  /*
5347
5357
  * Hover bridge: the menu is rendered as a document.body sibling positioned with a
5348
5358
  * small offset/margin gap from its trigger. On a hover-triggered dropdown that gap
5349
- * is a dead-zone — the pointer leaves the trigger before reaching the menu, firing
5359
+ * is a dead-zone - the pointer leaves the trigger before reaching the menu, firing
5350
5360
  * the close. These transparent pseudo-elements extend the menu's hoverable area
5351
5361
  * above and below it, so the trigger→menu path is one continuous hover surface.
5352
5362
  * Only present on hover dropdowns, so click dropdowns are unaffected.
@@ -5358,7 +5368,7 @@ code {
5358
5368
  left: 0;
5359
5369
  right: 0;
5360
5370
  height: 0.75rem;
5361
- /* transparent — a hover surface only, never painted */
5371
+ /* transparent - a hover surface only, never painted */
5362
5372
  }
5363
5373
 
5364
5374
  .domma-dropdown-menu-hover::before {
@@ -7569,7 +7579,7 @@ code {
7569
7579
  }
7570
7580
 
7571
7581
  /* ============================================================
7572
- * Chooser — visual option-picker (card/chip × single/multi)
7582
+ * Chooser - visual option-picker (card/chip × single/multi)
7573
7583
  * ============================================================ */
7574
7584
  .domma-chooser {
7575
7585
  --picker-radius: var(--dm-radius);
@@ -7789,7 +7799,7 @@ code {
7789
7799
  }
7790
7800
 
7791
7801
  /* ============================================================
7792
- * Chooser — accent colour, accent style, glow, shadow extensions
7802
+ * Chooser - accent colour, accent style, glow, shadow extensions
7793
7803
  * ============================================================ */
7794
7804
 
7795
7805
  /* Default the accent variables on every chooser */
@@ -7820,7 +7830,7 @@ code {
7820
7830
  0 0 18px color-mix(in srgb, var(--picker-glow-colour) 60%, transparent);
7821
7831
  }
7822
7832
 
7823
- /* Shadow weights — applied to all options */
7833
+ /* Shadow weights - applied to all options */
7824
7834
  .domma-chooser[data-shadow="sm"] .picker-option {
7825
7835
  box-shadow: 0 1px 2px var(--picker-shadow-colour, rgba(0, 0, 0, 0.08));
7826
7836
  }
@@ -7908,7 +7918,7 @@ code {
7908
7918
  }
7909
7919
 
7910
7920
  /* ============================================================
7911
- * Page-roller chooser slideover — structured editor styling
7921
+ * Page-roller chooser slideover - structured editor styling
7912
7922
  * ============================================================ */
7913
7923
  .qr-chooser-slideover-body {
7914
7924
  padding: 1.25rem;
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Domma Grid CSS v0.39.2
2
+ * Domma Grid CSS v0.41.0
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-08-21T12:14:59.637Z
6
- * Commit: c7a693e
5
+ * Built: 2026-08-22T13:41:49.299Z
6
+ * Commit: 5d8b7e1
7
7
  */
8
8
 
9
9
  /**
@@ -337,7 +337,7 @@
337
337
  gap: var(--dm-space-6, 2rem);
338
338
  }
339
339
 
340
- /* Bootstrap 5-style g-* aliases (row gutters — both axes) */
340
+ /* Bootstrap 5-style g-* aliases (row gutters - both axes) */
341
341
  .row.g-0 { gap: 0; }
342
342
  .row.g-1 { gap: var(--dm-space-1, 0.25rem); }
343
343
  .row.g-2 { gap: var(--dm-space-2, 0.5rem); }
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Domma Syntax Highlighting CSS v0.39.2
2
+ * Domma Syntax Highlighting CSS v0.41.0
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-08-21T12:14:59.645Z
6
- * Commit: c7a693e
5
+ * Built: 2026-08-22T13:41:49.308Z
6
+ * Commit: 5d8b7e1
7
7
  */
8
8
 
9
9
  /**
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Domma Themes v0.39.2
2
+ * Domma Themes v0.41.0
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-08-21T12:14:59.620Z
6
- * Commit: c7a693e
5
+ * Built: 2026-08-22T13:41:49.280Z
6
+ * Commit: 5d8b7e1
7
7
  */
8
8
 
9
9
  /**
@@ -3223,7 +3223,7 @@
3223
3223
  --dm-info-hover-text: #1a1a1a;
3224
3224
  }
3225
3225
  /**
3226
- * Domma Christmas Light Theme — "Frosty Morning"
3226
+ * Domma Christmas Light Theme - "Frosty Morning"
3227
3227
  * Ice-blue tinted backgrounds evoking frost on windows, deep pine-green text
3228
3228
  * Classic Christmas Red primary, rich Holly Green secondary
3229
3229
  */
@@ -3467,10 +3467,10 @@
3467
3467
  }
3468
3468
 
3469
3469
  /* ============================================================
3470
- DECORATIVE CSS — "Frosty Morning" festive embellishments
3470
+ DECORATIVE CSS - "Frosty Morning" festive embellishments
3471
3471
  ============================================================ */
3472
3472
 
3473
- /* Snow-dust background — subtle radial dots on the page root */
3473
+ /* Snow-dust background - subtle radial dots on the page root */
3474
3474
  .dm-theme-christmas-light {
3475
3475
  background-image:
3476
3476
  radial-gradient(circle, rgba(168, 213, 229, 0.35) 1px, transparent 1px),
@@ -3486,7 +3486,7 @@
3486
3486
  border-image-slice: 1;
3487
3487
  }
3488
3488
 
3489
- /* Candy-stripe progress bars (default + plain variant only — variants keep their semantic colour) */
3489
+ /* Candy-stripe progress bars (default + plain variant only - variants keep their semantic colour) */
3490
3490
  .dm-theme-christmas-light .dm-progression-progress-bar,
3491
3491
  .dm-theme-christmas-light .progress > .progress-bar:not([class*="progress-bar-"]) {
3492
3492
  background-image: repeating-linear-gradient(
@@ -3500,7 +3500,7 @@
3500
3500
  color: #ffffff;
3501
3501
  }
3502
3502
 
3503
- /* Festive syntax highlighting — green keywords, red strings, gold functions */
3503
+ /* Festive syntax highlighting - green keywords, red strings, gold functions */
3504
3504
  .dm-theme-christmas-light .code-block .syntax-keyword {
3505
3505
  color: #2D6B3F;
3506
3506
  font-weight: 600;
@@ -3516,7 +3516,7 @@
3516
3516
  }
3517
3517
 
3518
3518
  /**
3519
- * Domma Christmas Dark Theme — "Christmas Eve"
3519
+ * Domma Christmas Dark Theme - "Christmas Eve"
3520
3520
  * Deep forest green backgrounds, pure moonlit-white text, green/red undertones in interaction
3521
3521
  * Bright Holly Green primary, Christmas Red secondary; firelight-ember shadows
3522
3522
  */
@@ -3535,7 +3535,7 @@
3535
3535
  --dm-surface-raised: #243A2C;
3536
3536
  --dm-surface-overlay: #243A2C;
3537
3537
 
3538
- /* Text - Pure snow white; no green tint — moonlight on fresh snow */
3538
+ /* Text - Pure snow white; no green tint - moonlight on fresh snow */
3539
3539
  --dm-text: #FFFFFF;
3540
3540
  --dm-text-secondary: #D0D0D0;
3541
3541
  --dm-text-muted: #a8a8a8;
@@ -3760,10 +3760,10 @@
3760
3760
  }
3761
3761
 
3762
3762
  /* ============================================================
3763
- DECORATIVE CSS — "Christmas Eve" festive embellishments
3763
+ DECORATIVE CSS - "Christmas Eve" festive embellishments
3764
3764
  ============================================================ */
3765
3765
 
3766
- /* Snow-dust background — three festive dot layers: white snow, green pine, red Christmas lights */
3766
+ /* Snow-dust background - three festive dot layers: white snow, green pine, red Christmas lights */
3767
3767
  .dm-theme-christmas-dark {
3768
3768
  background-image:
3769
3769
  radial-gradient(circle, rgba(255, 255, 255, 0.13) 1px, transparent 1px),
@@ -3780,7 +3780,7 @@
3780
3780
  border-image-slice: 1;
3781
3781
  }
3782
3782
 
3783
- /* Candy-stripe progress bars (default + plain variant only — variants keep their semantic colour) */
3783
+ /* Candy-stripe progress bars (default + plain variant only - variants keep their semantic colour) */
3784
3784
  .dm-theme-christmas-dark .dm-progression-progress-bar,
3785
3785
  .dm-theme-christmas-dark .progress > .progress-bar:not([class*="progress-bar-"]) {
3786
3786
  background-image: repeating-linear-gradient(
@@ -3794,7 +3794,7 @@
3794
3794
  color: #1a1a1a;
3795
3795
  }
3796
3796
 
3797
- /* Festive syntax highlighting — brighter versions for dark backgrounds */
3797
+ /* Festive syntax highlighting - brighter versions for dark backgrounds */
3798
3798
  .dm-theme-christmas-dark .code-block .syntax-keyword {
3799
3799
  color: #5CB875;
3800
3800
  font-weight: 600;
@@ -4725,7 +4725,7 @@
4725
4725
 
4726
4726
  /**
4727
4727
  * Domma Grayve Light Theme
4728
- * Slate/cyan monochrome palette — complementary light variant
4728
+ * Slate/cyan monochrome palette - complementary light variant
4729
4729
  * Light mode variant
4730
4730
  */
4731
4731
 
@@ -4959,7 +4959,7 @@
4959
4959
 
4960
4960
  /* Syntax highlighting tokens for grayve-light */
4961
4961
  .dm-theme-grayve-light .code-block .syntax-keyword {
4962
- color: #5a2dcc; /* Deep Purple — darkened for ≥4.5:1 on #f5f5f5 */
4962
+ color: #5a2dcc; /* Deep Purple - darkened for ≥4.5:1 on #f5f5f5 */
4963
4963
  font-weight: 500;
4964
4964
  }
4965
4965
 
@@ -4969,12 +4969,12 @@
4969
4969
  }
4970
4970
 
4971
4971
  .dm-theme-grayve-light .code-block .syntax-function {
4972
- color: #006873; /* Cyan — darkened for ≥4.5:1 on #f5f5f5 */
4972
+ color: #006873; /* Cyan - darkened for ≥4.5:1 on #f5f5f5 */
4973
4973
  }
4974
4974
 
4975
4975
  /**
4976
4976
  * Domma Grayve Dark Theme
4977
- * Slate/cyan monochrome palette — adapted from Bootswatch Slate
4977
+ * Slate/cyan monochrome palette - adapted from Bootswatch Slate
4978
4978
  * Dark mode variant
4979
4979
  */
4980
4980
 
@@ -5684,7 +5684,7 @@
5684
5684
 
5685
5685
  /**
5686
5686
  * Domma Wedding Light Theme
5687
- * Classic antique gold palette — warm, muted, timeless
5687
+ * Classic antique gold palette - warm, muted, timeless
5688
5688
  * Day variant - cream/ivory backgrounds with antique gold highlights
5689
5689
  */
5690
5690
 
@@ -5915,7 +5915,7 @@
5915
5915
 
5916
5916
  /**
5917
5917
  * Domma Wedding Dark Theme
5918
- * Classic antique gold palette — warm, muted, timeless
5918
+ * Classic antique gold palette - warm, muted, timeless
5919
5919
  * Evening variant - deep midnight navy with antique gold highlights
5920
5920
  */
5921
5921
 
@@ -6145,7 +6145,7 @@
6145
6145
 
6146
6146
  /**
6147
6147
  * Domma Admin Smooth · Steel Blue
6148
- * GENERATED by scripts/generate-admin-themes.js — do not edit by hand.
6148
+ * GENERATED by scripts/generate-admin-themes.js - do not edit by hand.
6149
6149
  */
6150
6150
 
6151
6151
  .dm-theme-admin-smooth-steel {
@@ -6283,7 +6283,7 @@
6283
6283
 
6284
6284
  /**
6285
6285
  * Domma Admin Smooth · Indigo
6286
- * GENERATED by scripts/generate-admin-themes.js — do not edit by hand.
6286
+ * GENERATED by scripts/generate-admin-themes.js - do not edit by hand.
6287
6287
  */
6288
6288
 
6289
6289
  .dm-theme-admin-smooth-indigo {
@@ -6421,7 +6421,7 @@
6421
6421
 
6422
6422
  /**
6423
6423
  * Domma Admin Smooth · Teal
6424
- * GENERATED by scripts/generate-admin-themes.js — do not edit by hand.
6424
+ * GENERATED by scripts/generate-admin-themes.js - do not edit by hand.
6425
6425
  */
6426
6426
 
6427
6427
  .dm-theme-admin-smooth-teal {
@@ -6559,7 +6559,7 @@
6559
6559
 
6560
6560
  /**
6561
6561
  * Domma Admin Sharp · Steel Blue
6562
- * GENERATED by scripts/generate-admin-themes.js — do not edit by hand.
6562
+ * GENERATED by scripts/generate-admin-themes.js - do not edit by hand.
6563
6563
  */
6564
6564
 
6565
6565
  .dm-theme-admin-sharp-steel {
@@ -6697,7 +6697,7 @@
6697
6697
 
6698
6698
  /**
6699
6699
  * Domma Admin Sharp · Indigo
6700
- * GENERATED by scripts/generate-admin-themes.js — do not edit by hand.
6700
+ * GENERATED by scripts/generate-admin-themes.js - do not edit by hand.
6701
6701
  */
6702
6702
 
6703
6703
  .dm-theme-admin-sharp-indigo {
@@ -6835,7 +6835,7 @@
6835
6835
 
6836
6836
  /**
6837
6837
  * Domma Admin Sharp · Teal
6838
- * GENERATED by scripts/generate-admin-themes.js — do not edit by hand.
6838
+ * GENERATED by scripts/generate-admin-themes.js - do not edit by hand.
6839
6839
  */
6840
6840
 
6841
6841
  .dm-theme-admin-sharp-teal {
@@ -21,11 +21,11 @@ Quick reference for Domma conventions - enforces best practices across sessions.
21
21
  8. **Confirm**: `await E.confirm('Sure?')` - NOT `window.confirm()`
22
22
  9. **Icons**: `<span data-icon="name">` + `I.scan()` - NOT manual SVG
23
23
  10. **Tables**: `T.create(selector, {data})` - NOT manual `<table>` HTML
24
- 11. **Modals**: `E.modal(selector, options)` — NOT custom modal code
25
- 12. **Templates**: `templateUrl: 'path.html'` — NOT large inline strings
26
- 13. **Tabs**: `E.tabs()`, `E.accordion()` — NOT custom switching code
27
- 14. **Init**: Call `I.scan()` after DOM ready — Domma starts itself when the bundle loads; there is no `Domma.init()`
28
- 15. **Events**: `.on()`, `.off()`, `.one()` — NOT `.addEventListener()`
24
+ 11. **Modals**: `E.modal(selector, options)` - NOT custom modal code
25
+ 12. **Templates**: `templateUrl: 'path.html'` - NOT large inline strings
26
+ 13. **Tabs**: `E.tabs()`, `E.accordion()` - NOT custom switching code
27
+ 14. **Init**: Call `I.scan()` after DOM ready - Domma starts itself when the bundle loads; there is no `Domma.init()`
28
+ 15. **Events**: `.on()`, `.off()`, `.one()` - NOT `.addEventListener()`
29
29
 
30
30
  ## Aliases Quick Reference
31
31
 
@@ -77,7 +77,7 @@ Always load CSS in this order:
77
77
  <script src="dist/domma.min.js"></script>
78
78
  <script src="https://cdn.jsdelivr.net/npm/dompurify@3/dist/purify.min.js"></script> <!-- For dynamic content -->
79
79
  <script>
80
- // Domma starts itself the moment the bundle loads — it registers its web
80
+ // Domma starts itself the moment the bundle loads - it registers its web
81
81
  // components, manages the anti-FOUC cloak and defines the aliases. The only
82
82
  // startup call a page needs is the icon scan, and it must run BEFORE the app
83
83
  // scripts so `data-icon` elements in the initial markup are resolved.