domma-js 0.46.1 → 0.48.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.46.1
2
+ * Domma Elements CSS v0.48.0
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-09-27T20:40:05.319Z
6
- * Commit: 92f2ee4
5
+ * Built: 2026-09-27T22:11:07.101Z
6
+ * Commit: cf6d8de
7
7
  */
8
8
 
9
9
  /**
@@ -49,9 +49,12 @@
49
49
  box-shadow: 0 0 0 3px var(--dm-focus-ring);
50
50
  }
51
51
 
52
- .btn:disabled {
52
+ .btn:disabled,
53
+ .btn[aria-disabled="true"],
54
+ .btn.disabled {
53
55
  opacity: 0.65;
54
56
  cursor: not-allowed;
57
+ pointer-events: none;
55
58
  }
56
59
 
57
60
  .btn-primary {
@@ -501,7 +504,8 @@
501
504
  border-bottom-color: var(--dm-border);
502
505
  }
503
506
 
504
- .tab-item.active {
507
+ .tab-item.active,
508
+ .tab-item[aria-selected="true"] {
505
509
  color: var(--dm-link, color-mix(in oklab, var(--dm-primary, #0070d6), var(--dm-text, #1a1a1a) 55%));
506
510
  border-bottom-color: var(--dm-primary);
507
511
  }
@@ -533,7 +537,8 @@
533
537
  margin-bottom: 0;
534
538
  }
535
539
 
536
- .tabs-pills .tab-item.active {
540
+ .tabs-pills .tab-item.active,
541
+ .tabs-pills .tab-item[aria-selected="true"] {
537
542
  background-color: var(--dm-surface);
538
543
  box-shadow: var(--dm-shadow-sm);
539
544
  border-bottom: none;
@@ -576,7 +581,8 @@
576
581
  transition: transform var(--dm-transition-normal);
577
582
  }
578
583
 
579
- .accordion-item.active .accordion-icon {
584
+ .accordion-item.active .accordion-icon,
585
+ .accordion-header[aria-expanded="true"] .accordion-icon {
580
586
  transform: rotate(180deg);
581
587
  }
582
588
 
@@ -855,7 +861,10 @@ textarea:not([class])::placeholder {
855
861
 
856
862
  .form-input:disabled,
857
863
  .form-select:disabled,
858
- .form-textarea:disabled {
864
+ .form-textarea:disabled,
865
+ .form-input[aria-disabled="true"],
866
+ .form-select[aria-disabled="true"],
867
+ .form-textarea[aria-disabled="true"] {
859
868
  background-color: var(--dm-hover-bg);
860
869
  cursor: not-allowed;
861
870
  opacity: 0.7;
@@ -863,7 +872,10 @@ textarea:not([class])::placeholder {
863
872
 
864
873
  [data-mode="dark"].form-input:disabled,
865
874
  [data-mode="dark"].form-select:disabled,
866
- [data-mode="dark"].form-textarea:disabled {
875
+ [data-mode="dark"].form-textarea:disabled,
876
+ [data-mode="dark"].form-input[aria-disabled="true"],
877
+ [data-mode="dark"].form-select[aria-disabled="true"],
878
+ [data-mode="dark"].form-textarea[aria-disabled="true"] {
867
879
  background-color: var(--dm-surface);
868
880
  }
869
881
 
@@ -881,13 +893,25 @@ textarea:not([class])::placeholder {
881
893
 
882
894
  .form-input.error,
883
895
  .form-select.error,
884
- .form-textarea.error {
896
+ .form-textarea.error,
897
+ .form-input[aria-invalid="true"],
898
+ .form-select[aria-invalid="true"],
899
+ .form-textarea[aria-invalid="true"],
900
+ .form-input.is-invalid,
901
+ .form-select.is-invalid,
902
+ .form-textarea.is-invalid {
885
903
  border-color: var(--dm-danger);
886
904
  }
887
905
 
888
906
  .form-input.error:focus,
889
907
  .form-select.error:focus,
890
- .form-textarea.error:focus {
908
+ .form-textarea.error:focus,
909
+ .form-input[aria-invalid="true"]:focus,
910
+ .form-select[aria-invalid="true"]:focus,
911
+ .form-textarea[aria-invalid="true"]:focus,
912
+ .form-input.is-invalid:focus,
913
+ .form-select.is-invalid:focus,
914
+ .form-textarea.is-invalid:focus {
891
915
  box-shadow: 0 0 0 3px var(--dm-focus-ring-danger);
892
916
  }
893
917
 
@@ -1132,6 +1156,118 @@ textarea:not([class])::placeholder {
1132
1156
  border-color: var(--dm-danger);
1133
1157
  }
1134
1158
 
1159
+ /* Input extras (formConfig reveal / clear / stepper, E.inputGroup): real
1160
+ * buttons joined to the input like an addon, but clickable and in the tab
1161
+ * order. Buttons after the input share its right border, buttons before it
1162
+ * its left; only the outermost piece of the group keeps a rounded corner. */
1163
+ .input-group-icon > .input-group-btn {
1164
+ display: flex;
1165
+ flex: none;
1166
+ align-items: center;
1167
+ justify-content: center;
1168
+ min-width: 2.5rem;
1169
+ margin: 0;
1170
+ padding: 0 var(--dm-space-2);
1171
+ font: inherit;
1172
+ line-height: 1;
1173
+ color: var(--dm-text);
1174
+ background-color: color-mix(in srgb, var(--dm-text) 6%, var(--dm-surface, var(--dm-white)));
1175
+ border: 1px solid var(--dm-border, var(--dm-gray-300));
1176
+ border-radius: 0;
1177
+ cursor: pointer;
1178
+ user-select: none;
1179
+ touch-action: manipulation;
1180
+ transition: border-color var(--dm-transition-fast), color var(--dm-transition-fast), background-color var(--dm-transition-fast);
1181
+ }
1182
+
1183
+ .input-group-icon > .input-group-btn[hidden] {
1184
+ display: none;
1185
+ }
1186
+
1187
+ .input-group-icon > .input-group-btn svg,
1188
+ .input-group-icon > .input-group-btn [data-icon] {
1189
+ width: 1.1em;
1190
+ height: 1.1em;
1191
+ pointer-events: none;
1192
+ }
1193
+
1194
+ .input-group-icon > .input-group-btn-left {
1195
+ border-right: 0;
1196
+ }
1197
+
1198
+ .input-group-icon > .input-group-btn-right {
1199
+ border-left: 0;
1200
+ }
1201
+
1202
+ .input-group-icon > .input-group-btn:first-child {
1203
+ border-radius: var(--dm-radius-md) 0 0 var(--dm-radius-md);
1204
+ }
1205
+
1206
+ .input-group-icon > .input-group-btn:last-child {
1207
+ border-radius: 0 var(--dm-radius-md) var(--dm-radius-md) 0;
1208
+ }
1209
+
1210
+ /* Hover and "on" tint the fill with the primary colour and keep the full text
1211
+ * colour: --dm-primary as text is a mid-tone on the lemon and silver families. */
1212
+ .input-group-icon > .input-group-btn:hover:not(:disabled),
1213
+ .input-group-icon > .input-group-btn[aria-pressed="true"] {
1214
+ background-color: color-mix(in srgb, var(--dm-primary) 14%, var(--dm-surface, var(--dm-white)));
1215
+ }
1216
+
1217
+ .input-group-icon > .input-group-btn:focus-visible {
1218
+ outline: 2px solid var(--dm-primary);
1219
+ outline-offset: -3px;
1220
+ }
1221
+
1222
+ .input-group-icon > .input-group-btn:disabled {
1223
+ opacity: 0.45;
1224
+ cursor: not-allowed;
1225
+ }
1226
+
1227
+ .input-group-icon:focus-within > .input-group-btn {
1228
+ border-color: var(--dm-primary);
1229
+ }
1230
+
1231
+ .input-group-icon:has(> .error) > .input-group-btn,
1232
+ .has-error .input-group-icon > .input-group-btn {
1233
+ border-color: var(--dm-danger);
1234
+ }
1235
+
1236
+ /* A number input with a stepper hides the browser's own spinner. */
1237
+ .input-group-icon > .input-group-decrease ~ input[type="number"] {
1238
+ -moz-appearance: textfield;
1239
+ appearance: textfield;
1240
+ text-align: center;
1241
+ }
1242
+
1243
+ .input-group-icon > .input-group-decrease ~ input[type="number"]::-webkit-inner-spin-button,
1244
+ .input-group-icon > .input-group-decrease ~ input[type="number"]::-webkit-outer-spin-button {
1245
+ -webkit-appearance: none;
1246
+ margin: 0;
1247
+ }
1248
+
1249
+ /* Character counter under the control: "12 / 200", amber from 90% of the
1250
+ * limit, red past it. The two state colours are mixed toward the text colour,
1251
+ * as .text-warning / .text-danger are (further, for AA on every theme). */
1252
+ .form-counter {
1253
+ margin-top: var(--dm-space-1);
1254
+ font-size: var(--dm-font-size-sm);
1255
+ font-variant-numeric: tabular-nums;
1256
+ text-align: right;
1257
+ color: var(--dm-text-secondary);
1258
+ transition: color var(--dm-transition-fast);
1259
+ }
1260
+
1261
+ .form-counter.is-warning {
1262
+ color: color-mix(in oklab, var(--dm-warning), var(--dm-text) 60%);
1263
+ font-weight: 600;
1264
+ }
1265
+
1266
+ .form-counter.is-over {
1267
+ color: color-mix(in oklab, var(--dm-danger), var(--dm-text) 50%);
1268
+ font-weight: 600;
1269
+ }
1270
+
1135
1271
  /* Prepend/Append style (addon outside input) */
1136
1272
  .input-group-prepend,
1137
1273
  .input-group-append {
@@ -1551,19 +1687,22 @@ textarea:not([class])::placeholder {
1551
1687
  }
1552
1688
 
1553
1689
  /* Active/selected state - accent background takes precedence over colour variants */
1554
- .list-group-item.active {
1690
+ .list-group-item.active,
1691
+ .list-group-item[aria-selected="true"] {
1555
1692
  background-color: var(--dm-primary);
1556
1693
  color: var(--dm-primary-text, var(--dm-white));
1557
1694
  border-bottom-color: var(--dm-primary-hover);
1558
1695
  z-index: 1;
1559
1696
  }
1560
1697
 
1561
- .list-group-item.active .list-group-item-text {
1698
+ .list-group-item.active .list-group-item-text,
1699
+ .list-group-item[aria-selected="true"] .list-group-item-text {
1562
1700
  color: rgba(255, 255, 255, 0.75);
1563
1701
  }
1564
1702
 
1565
1703
  /* Disabled state - dimmed and non-interactive */
1566
- .list-group-item.disabled {
1704
+ .list-group-item.disabled,
1705
+ .list-group-item[aria-disabled="true"] {
1567
1706
  opacity: 0.7;
1568
1707
  cursor: not-allowed;
1569
1708
  pointer-events: none;
@@ -2014,14 +2153,16 @@ code {
2014
2153
  text-decoration: none;
2015
2154
  }
2016
2155
 
2017
- .pagination-link.active {
2156
+ .pagination-link.active,
2157
+ .pagination-link[aria-current="page"] {
2018
2158
  background-color: var(--dm-primary);
2019
2159
  border-color: var(--dm-primary);
2020
2160
  color: var(--dm-primary-text, var(--dm-white));
2021
2161
  }
2022
2162
 
2023
2163
  .pagination-link:disabled,
2024
- .pagination-link.disabled {
2164
+ .pagination-link.disabled,
2165
+ .pagination-link[aria-disabled="true"] {
2025
2166
  opacity: 0.5;
2026
2167
  cursor: not-allowed;
2027
2168
  pointer-events: none;
@@ -5886,7 +6027,8 @@ code {
5886
6027
  color: var(--dm-primary, #6495ED);
5887
6028
  }
5888
6029
 
5889
- .dm-breadcrumbs-item.active {
6030
+ .dm-breadcrumbs-item.active,
6031
+ .dm-breadcrumbs-item[aria-current="page"] {
5890
6032
  color: var(--dm-text);
5891
6033
  font-weight: 500;
5892
6034
  }
@@ -5904,7 +6046,8 @@ code {
5904
6046
  color: var(--dm-text-muted);
5905
6047
  }
5906
6048
 
5907
- [data-mode="dark"] .dm-breadcrumbs-item.active {
6049
+ [data-mode="dark"] .dm-breadcrumbs-item.active,
6050
+ [data-mode="dark"] .dm-breadcrumbs-item[aria-current="page"] {
5908
6051
  color: var(--dm-text);
5909
6052
  }
5910
6053
 
@@ -8682,3 +8825,234 @@ code {
8682
8825
  transition: none;
8683
8826
  }
8684
8827
  }
8828
+
8829
+ /* ============================================
8830
+ SKELETON LOADERS
8831
+ Shimmering placeholders shaped like the content on its way. The tint is the
8832
+ theme's text colour mixed into its surface, so it reads as a quiet grey on
8833
+ light themes and a quiet lift on dark ones. Written by E.skeleton() or by
8834
+ hand. Override hooks: --dm-skeleton-bg, --dm-skeleton-shine,
8835
+ --dm-skeleton-duration, --dm-skeleton-columns (table).
8836
+ ============================================ */
8837
+ .skeleton {
8838
+ position: relative;
8839
+ display: block;
8840
+ overflow: hidden;
8841
+ background-color: var(--dm-skeleton-bg, color-mix(in srgb, var(--dm-text) 10%, var(--dm-surface)));
8842
+ border-radius: var(--dm-radius-md);
8843
+ user-select: none;
8844
+ pointer-events: none;
8845
+ }
8846
+
8847
+ /* The sweep: a soft band that crosses each shape. Towards the surface on light
8848
+ themes, towards the text on dark ones - lighter in both cases. */
8849
+ .skeleton::after {
8850
+ content: '';
8851
+ position: absolute;
8852
+ inset: 0;
8853
+ transform: translateX(-100%);
8854
+ background-image: linear-gradient(90deg,
8855
+ transparent 0%,
8856
+ var(--dm-skeleton-shine, color-mix(in srgb, var(--dm-surface) 70%, transparent)) 50%,
8857
+ transparent 100%);
8858
+ animation: dm-skeleton-sweep var(--dm-skeleton-duration, 1.6s) ease-in-out infinite;
8859
+ }
8860
+
8861
+ [data-mode="dark"] .skeleton::after {
8862
+ background-image: linear-gradient(90deg,
8863
+ transparent 0%,
8864
+ var(--dm-skeleton-shine, color-mix(in srgb, var(--dm-text) 8%, transparent)) 50%,
8865
+ transparent 100%);
8866
+ }
8867
+
8868
+ @keyframes dm-skeleton-sweep {
8869
+ 100% {
8870
+ transform: translateX(100%);
8871
+ }
8872
+ }
8873
+
8874
+ /* animate: false, or by hand on a shape or a group of shapes */
8875
+ .skeleton-static::after,
8876
+ .skeleton-static .skeleton::after {
8877
+ display: none;
8878
+ }
8879
+
8880
+ /* Lines of text: 0.875em bars on a 1.5em rhythm, like body copy */
8881
+ .skeleton-text {
8882
+ width: 100%;
8883
+ height: 0.875em;
8884
+ border-radius: var(--dm-radius-sm);
8885
+ }
8886
+
8887
+ .skeleton-text + .skeleton-text {
8888
+ margin-top: 0.625em;
8889
+ }
8890
+
8891
+ .skeleton-text-sm {
8892
+ height: 0.75em;
8893
+ }
8894
+
8895
+ /* The last line of a paragraph runs short */
8896
+ .skeleton-lines > .skeleton-text:last-child:not(:first-child) {
8897
+ width: 60%;
8898
+ }
8899
+
8900
+ .skeleton-lines + .skeleton-lines {
8901
+ margin-top: var(--dm-space-6);
8902
+ }
8903
+
8904
+ .skeleton-heading {
8905
+ width: 50%;
8906
+ height: 1.25rem;
8907
+ margin-bottom: var(--dm-space-4);
8908
+ border-radius: var(--dm-radius-sm);
8909
+ }
8910
+
8911
+ .skeleton-w-25 { width: 25%; }
8912
+ .skeleton-w-50 { width: 50%; }
8913
+ .skeleton-w-75 { width: 75%; }
8914
+ .skeleton-w-100 { width: 100%; }
8915
+
8916
+ .skeleton-lines > .skeleton-w-25:last-child:not(:first-child) { width: 25%; }
8917
+ .skeleton-lines > .skeleton-w-50:last-child:not(:first-child) { width: 50%; }
8918
+ .skeleton-lines > .skeleton-w-75:last-child:not(:first-child) { width: 75%; }
8919
+ .skeleton-lines > .skeleton-w-100:last-child:not(:first-child) { width: 100%; }
8920
+
8921
+ /* Circles - avatars, icons. 2.5rem by default */
8922
+ .skeleton-circle,
8923
+ .skeleton-avatar {
8924
+ flex-shrink: 0;
8925
+ width: 2.5rem;
8926
+ height: 2.5rem;
8927
+ border-radius: var(--dm-radius-full);
8928
+ }
8929
+
8930
+ .skeleton-circle.skeleton-sm,
8931
+ .skeleton-avatar.skeleton-sm { width: 2rem; height: 2rem; }
8932
+ .skeleton-circle.skeleton-lg,
8933
+ .skeleton-avatar.skeleton-lg { width: 3.5rem; height: 3.5rem; }
8934
+ .skeleton-circle.skeleton-xl,
8935
+ .skeleton-avatar.skeleton-xl { width: 5rem; height: 5rem; }
8936
+
8937
+ /* Blocks and images - 16:9 unless told otherwise */
8938
+ .skeleton-rect,
8939
+ .skeleton-image {
8940
+ width: 100%;
8941
+ aspect-ratio: 16 / 9;
8942
+ }
8943
+
8944
+ .skeleton-ratio-1x1 { aspect-ratio: 1 / 1; }
8945
+ .skeleton-ratio-4x3 { aspect-ratio: 4 / 3; }
8946
+ .skeleton-ratio-16x9 { aspect-ratio: 16 / 9; }
8947
+ .skeleton-ratio-21x9 { aspect-ratio: 21 / 9; }
8948
+
8949
+ /* The size of a .btn: small text on a 1.5 line, space-2 padding, 1px border */
8950
+ .skeleton-button {
8951
+ display: inline-block;
8952
+ width: 6rem;
8953
+ height: calc(var(--dm-font-size-sm) * 1.5 + var(--dm-space-2) * 2 + 2px);
8954
+ vertical-align: middle;
8955
+ border-radius: var(--dm-radius-md);
8956
+ }
8957
+
8958
+ /* Card: the .card frame, an image with square corners, a .card-body's padding */
8959
+ .skeleton-card {
8960
+ overflow: hidden;
8961
+ color: var(--dm-text);
8962
+ background-color: var(--dm-card-bg, var(--dm-surface));
8963
+ border: 1px solid var(--dm-card-border, var(--dm-border));
8964
+ border-radius: var(--dm-radius-lg);
8965
+ }
8966
+
8967
+ .skeleton-card > .skeleton-image {
8968
+ border-radius: 0;
8969
+ }
8970
+
8971
+ .skeleton-card-body {
8972
+ padding: var(--dm-space-6);
8973
+ }
8974
+
8975
+ /* List: the .list-group frame and item padding, circle then two lines */
8976
+ .skeleton-list {
8977
+ overflow: hidden;
8978
+ color: var(--dm-text);
8979
+ background-color: var(--dm-surface);
8980
+ border: 1px solid var(--dm-border);
8981
+ border-radius: var(--dm-radius-md);
8982
+ }
8983
+
8984
+ .skeleton-list-item {
8985
+ display: flex;
8986
+ align-items: center;
8987
+ gap: var(--dm-space-3);
8988
+ padding: var(--dm-space-3) var(--dm-space-4);
8989
+ font-size: var(--dm-font-size-sm);
8990
+ border-bottom: 1px solid var(--dm-border-light);
8991
+ }
8992
+
8993
+ .skeleton-list-item:last-child {
8994
+ border-bottom: none;
8995
+ }
8996
+
8997
+ .skeleton-list-item-content {
8998
+ flex: 1 1 auto;
8999
+ min-width: 0;
9000
+ }
9001
+
9002
+ /* Table: rows of cells with .table's padding and rule */
9003
+ .skeleton-table {
9004
+ overflow: hidden;
9005
+ color: var(--dm-text);
9006
+ font-size: var(--dm-font-size-sm);
9007
+ border: 1px solid var(--dm-table-border, var(--dm-border));
9008
+ border-radius: var(--dm-radius-md);
9009
+ }
9010
+
9011
+ .skeleton-table-row {
9012
+ display: grid;
9013
+ grid-template-columns: repeat(var(--dm-skeleton-columns, 4), minmax(0, 1fr));
9014
+ align-items: center;
9015
+ gap: var(--dm-space-4);
9016
+ padding: var(--dm-space-3) var(--dm-space-4);
9017
+ border-bottom: 1px solid var(--dm-table-border, var(--dm-border));
9018
+ }
9019
+
9020
+ .skeleton-table-row:last-child {
9021
+ border-bottom: none;
9022
+ }
9023
+
9024
+ /* Cells sit side by side: no line spacing between them */
9025
+ .skeleton-table-row > .skeleton-text + .skeleton-text {
9026
+ margin-top: 0;
9027
+ }
9028
+
9029
+ .skeleton-table-head {
9030
+ color: var(--dm-table-header-text, var(--dm-text));
9031
+ background-color: var(--dm-table-header-bg, var(--dm-background-alt));
9032
+ }
9033
+
9034
+ /* Inside a real table cell (the DataTable's loading rows) */
9035
+ td > .skeleton-text {
9036
+ min-width: 3rem;
9037
+ }
9038
+
9039
+ /* The "Loading..." announcement: read out, not shown */
9040
+ .skeleton-status {
9041
+ position: absolute;
9042
+ width: 1px;
9043
+ height: 1px;
9044
+ margin: -1px;
9045
+ padding: 0;
9046
+ overflow: hidden;
9047
+ clip: rect(0 0 0 0);
9048
+ white-space: nowrap;
9049
+ border: 0;
9050
+ }
9051
+
9052
+ /* Reduced motion: no sweep, just the still tint */
9053
+ @media (prefers-reduced-motion: reduce) {
9054
+ .skeleton::after {
9055
+ display: none;
9056
+ animation: none;
9057
+ }
9058
+ }
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Domma Grid CSS v0.46.1
2
+ * Domma Grid CSS v0.48.0
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-09-27T20:40:05.315Z
6
- * Commit: 92f2ee4
5
+ * Built: 2026-09-27T22:11:07.097Z
6
+ * Commit: cf6d8de
7
7
  */
8
8
 
9
9
  /**
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Domma Syntax Highlighting CSS v0.46.1
2
+ * Domma Syntax Highlighting CSS v0.48.0
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-09-27T20:40:05.322Z
6
- * Commit: 92f2ee4
5
+ * Built: 2026-09-27T22:11:07.105Z
6
+ * Commit: cf6d8de
7
7
  */
8
8
 
9
9
  /**
@@ -18,6 +18,11 @@
18
18
  --dm-warning: var(--dm-core-warning);
19
19
  --dm-danger: var(--dm-core-danger);
20
20
  --dm-info: var(--dm-core-info);
21
+ --dm-info-text: #055160;
22
+ --dm-warning-text: #000000;
23
+ --dm-primary-text: #ffffff;
24
+ --dm-danger-text: #ffffff;
25
+ --dm-success-text: #ffffff;
21
26
 
22
27
  /* Component specific overrides can go here */
23
28
  }