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.
- package/README.md +597 -143
- package/bin/domma-cli.js +5 -5
- package/bin/postinstall.js +1 -1
- package/package.json +11 -6
- package/public/dist/bundles/domma-complete.css +556 -116
- package/public/dist/bundles/domma-data-focused.css +556 -116
- package/public/dist/bundles/domma-essentials.css +556 -116
- package/public/dist/bundles/domma-full.css +556 -116
- package/public/dist/bundles/domma-minimal.css +11 -14
- package/public/dist/domma-flags.esm.js +3 -3
- package/public/dist/domma-flags.min.js +3 -3
- package/public/dist/domma-syntax.min.js +3 -3
- package/public/dist/domma.css +6 -9
- package/public/dist/domma.esm.js +5 -5
- package/public/dist/domma.min.js +5 -5
- package/public/dist/elements.css +488 -45
- package/public/dist/grid.css +3 -3
- package/public/dist/syntax.css +3 -3
- package/public/dist/themes/domma-themes.css +57 -57
- package/templates/kickstart-spa/README.md +1 -1
- package/public/dist/bundles/domma-grayve.css +0 -16852
- package/public/dist/themes/grayve.css +0 -213
package/public/dist/elements.css
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Domma Elements CSS v0.
|
|
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-
|
|
6
|
-
* Commit:
|
|
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-
|
|
2792
|
-
border: 1px solid var(--dm-border,
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
2812
|
-
|
|
2813
|
-
|
|
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-
|
|
2820
|
-
padding: 0.
|
|
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-
|
|
2825
|
-
padding: 0.
|
|
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-
|
|
2844
|
+
.dm-pill-remove {
|
|
2830
2845
|
display: inline-flex;
|
|
2831
2846
|
align-items: center;
|
|
2832
2847
|
justify-content: center;
|
|
2833
|
-
|
|
2834
|
-
|
|
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.
|
|
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-
|
|
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
|
|
2870
|
-
border: 1px solid var(--dm-border
|
|
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-
|
|
2933
|
+
.dm-pillbox-empty {
|
|
2896
2934
|
padding: 0.75rem;
|
|
2897
2935
|
text-align: center;
|
|
2898
|
-
|
|
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
|
-
/*
|
|
2926
|
-
|
|
2927
|
-
|
|
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
|
+
}
|
package/public/dist/grid.css
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Domma Grid CSS v0.
|
|
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-
|
|
6
|
-
* Commit:
|
|
5
|
+
* Built: 2026-09-23T16:22:37.526Z
|
|
6
|
+
* Commit: 7c54327
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
/**
|
package/public/dist/syntax.css
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Domma Syntax Highlighting CSS v0.
|
|
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-
|
|
6
|
-
* Commit:
|
|
5
|
+
* Built: 2026-09-23T16:22:37.533Z
|
|
6
|
+
* Commit: 7c54327
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
/**
|