domma-js 0.48.0 → 0.50.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,8 +1,8 @@
1
1
  /*!
2
- * Domma Minimal CSS Bundle v0.48.0
2
+ * Domma Minimal CSS Bundle v0.50.0
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-09-27T22:11:07.247Z
5
+ * Built: 2026-09-28T07:48:40.102Z
6
6
  */
7
7
 
8
8
  /* ============================================
@@ -11,11 +11,11 @@
11
11
  ============================================ */
12
12
 
13
13
  /*!
14
- * Domma Core CSS v0.48.0
14
+ * Domma Core CSS v0.50.0
15
15
  * Dynamic Object Manipulation & Modeling API
16
16
  * (c) 2026 Darryl Waterhouse & DCBW-IT
17
- * Built: 2026-09-27T22:11:07.093Z
18
- * Commit: cf6d8de
17
+ * Built: 2026-09-28T07:48:39.949Z
18
+ * Commit: d400172
19
19
  */
20
20
 
21
21
  /**
@@ -1216,8 +1216,9 @@ code, pre {
1216
1216
  letter-spacing: 0.025em;
1217
1217
  }
1218
1218
 
1219
- /* Truncate */
1220
- .truncate {
1219
+ /* Truncate - one line with an ellipsis. .text-truncate is the Bootstrap spelling. */
1220
+ .truncate,
1221
+ .text-truncate {
1221
1222
  overflow: hidden;
1222
1223
  text-overflow: ellipsis;
1223
1224
  white-space: nowrap;
@@ -2192,6 +2193,143 @@ code, pre {
2192
2193
  user-select: text;
2193
2194
  }
2194
2195
 
2196
+ /* ============================================
2197
+ ACCESSIBILITY & TEXT UTILITIES
2198
+ Screen-reader-only text, skip links, line clamping,
2199
+ whole-card links and a divider with a word in it.
2200
+ Tailwind names (.sr-only, .line-clamp-*) with the Bootstrap
2201
+ spellings (.visually-hidden, .text-truncate) as aliases.
2202
+ ============================================ */
2203
+
2204
+ /* Hidden on screen, still read by screen readers. The -focusable form comes
2205
+ back when it (or something inside it) takes focus - the skip link pattern. */
2206
+ .sr-only,
2207
+ .visually-hidden,
2208
+ .sr-only-focusable:not(:focus):not(:focus-within),
2209
+ .visually-hidden-focusable:not(:focus):not(:focus-within),
2210
+ .skip-link:not(:focus):not(:focus-within) {
2211
+ position: absolute !important;
2212
+ width: 1px !important;
2213
+ height: 1px !important;
2214
+ padding: 0 !important;
2215
+ margin: -1px !important;
2216
+ overflow: hidden !important;
2217
+ clip: rect(0, 0, 0, 0) !important;
2218
+ clip-path: inset(50%) !important;
2219
+ white-space: nowrap !important;
2220
+ border: 0 !important;
2221
+ }
2222
+
2223
+ /* A ready-made skip link: the first thing in <body>, hidden until Tab reaches
2224
+ it, then pinned top left above everything (popovers are 10045). */
2225
+ .skip-link:focus,
2226
+ .skip-link:focus-within {
2227
+ position: fixed;
2228
+ top: var(--dm-space-3);
2229
+ left: var(--dm-space-3);
2230
+ z-index: 10100;
2231
+ padding: var(--dm-space-2) var(--dm-space-4);
2232
+ border-radius: var(--dm-radius-md);
2233
+ background-color: var(--dm-primary);
2234
+ color: var(--dm-primary-text, var(--dm-white));
2235
+ font-weight: 600;
2236
+ text-decoration: none;
2237
+ box-shadow: var(--dm-shadow-lg);
2238
+ outline: 2px solid var(--dm-border-focus);
2239
+ outline-offset: 2px;
2240
+ }
2241
+
2242
+ /* Undo .sr-only, e.g. at a breakpoint or from a script */
2243
+ .not-sr-only {
2244
+ position: static !important;
2245
+ width: auto !important;
2246
+ height: auto !important;
2247
+ padding: 0 !important;
2248
+ margin: 0 !important;
2249
+ overflow: visible !important;
2250
+ clip: auto !important;
2251
+ clip-path: none !important;
2252
+ white-space: normal !important;
2253
+ }
2254
+
2255
+ /* Line clamp - cut text after N lines with an ellipsis */
2256
+ .line-clamp-1,
2257
+ .line-clamp-2,
2258
+ .line-clamp-3,
2259
+ .line-clamp-4,
2260
+ .line-clamp-5 {
2261
+ display: -webkit-box;
2262
+ overflow: hidden;
2263
+ -webkit-box-orient: vertical;
2264
+ }
2265
+
2266
+ .line-clamp-1 { -webkit-line-clamp: 1; }
2267
+ .line-clamp-2 { -webkit-line-clamp: 2; }
2268
+ .line-clamp-3 { -webkit-line-clamp: 3; }
2269
+ .line-clamp-4 { -webkit-line-clamp: 4; }
2270
+ .line-clamp-5 { -webkit-line-clamp: 5; }
2271
+
2272
+ .line-clamp-none {
2273
+ display: block;
2274
+ overflow: visible;
2275
+ -webkit-box-orient: horizontal;
2276
+ -webkit-line-clamp: unset;
2277
+ }
2278
+
2279
+ /* Stretched link - the link's ::after covers its nearest positioned ancestor,
2280
+ so the whole card is the link. A .card holding one is positioned for you;
2281
+ anything else needs .relative. Other links or buttons inside must sit above
2282
+ it: give them .relative .z-10. */
2283
+ .stretched-link::after {
2284
+ content: "";
2285
+ position: absolute;
2286
+ inset: 0;
2287
+ z-index: 1;
2288
+ border-radius: inherit;
2289
+ }
2290
+
2291
+ .card:has(.stretched-link),
2292
+ .list-group-item:has(.stretched-link) {
2293
+ position: relative;
2294
+ }
2295
+
2296
+ .stretched-link:focus-visible {
2297
+ outline: none;
2298
+ }
2299
+
2300
+ .stretched-link:focus-visible::after {
2301
+ outline: 2px solid var(--dm-border-focus);
2302
+ outline-offset: -2px;
2303
+ }
2304
+
2305
+ /* Divider with text - a rule either side of a word, e.g. "or" between two
2306
+ sign-in options. -start / -end push the text to one side. */
2307
+ .divider-text {
2308
+ display: flex;
2309
+ align-items: center;
2310
+ gap: var(--dm-space-3);
2311
+ margin: var(--dm-space-4) 0;
2312
+ color: var(--dm-text-secondary);
2313
+ font-size: var(--dm-font-size-sm);
2314
+ line-height: 1.4;
2315
+ }
2316
+
2317
+ .divider-text::before,
2318
+ .divider-text::after {
2319
+ content: "";
2320
+ flex: 1 1 0;
2321
+ border-top: 1px solid var(--dm-border);
2322
+ }
2323
+
2324
+ .divider-text:empty {
2325
+ gap: 0;
2326
+ }
2327
+
2328
+ .divider-text-start::before,
2329
+ .divider-text-end::after {
2330
+ flex: 0 0 var(--dm-space-6);
2331
+ }
2332
+
2195
2333
  /* ============================================
2196
2334
  OPACITY SCALE
2197
2335
  Full graduated opacity scale (0-100)
@@ -4835,11 +4973,11 @@ body.dm-cloaked.dm-ready {
4835
4973
  ============================================ */
4836
4974
 
4837
4975
  /*!
4838
- * Domma Grid CSS v0.48.0
4976
+ * Domma Grid CSS v0.50.0
4839
4977
  * Dynamic Object Manipulation & Modeling API
4840
4978
  * (c) 2026 Darryl Waterhouse & DCBW-IT
4841
- * Built: 2026-09-27T22:11:07.097Z
4842
- * Commit: cf6d8de
4979
+ * Built: 2026-09-28T07:48:39.953Z
4980
+ * Commit: d400172
4843
4981
  */
4844
4982
 
4845
4983
  /**
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Domma Flags v0.48.0
2
+ * Domma Flags v0.50.0
3
3
  * Nation flags as inline SVG (opt-in module)
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-09-27T22:10:52.098Z
6
- * Commit: cf6d8de
5
+ * Built: 2026-09-28T07:48:24.574Z
6
+ * Commit: d400172
7
7
  *
8
8
  * Requires: domma.min.js
9
9
  */
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Domma Flags v0.48.0
2
+ * Domma Flags v0.50.0
3
3
  * Nation flags as inline SVG (opt-in module)
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-09-27T22:10:52.098Z
6
- * Commit: cf6d8de
5
+ * Built: 2026-09-28T07:48:24.574Z
6
+ * Commit: d400172
7
7
  *
8
8
  * Requires: domma.min.js
9
9
  */
@@ -1,8 +1,8 @@
1
1
  /*!
2
- * Domma Syntax Highlighter v0.48.0
2
+ * Domma Syntax Highlighter v0.50.0
3
3
  * Lightweight code syntax highlighting for JavaScript, HTML, and CSS
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-09-27T22:10:52.094Z
6
- * Commit: cf6d8de
5
+ * Built: 2026-09-28T07:48:24.571Z
6
+ * Commit: d400172
7
7
  */
8
8
  !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).DommaSyntax={})}(this,function(t){"use strict";const e={javascript:[{type:"comment",pattern:/\/\*[\s\S]*?\*\//g},{type:"comment",pattern:/\/\/.*/g},{type:"template-string",pattern:/`(?:\\.|[^`\\])*`/g},{type:"string",pattern:/"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'/g},{type:"keyword",pattern:/\b(const|let|var|function|return|if|else|for|while|do|break|continue|switch|case|default|try|catch|finally|throw|async|await|class|extends|static|new|this|super|import|export|from|as|default|yield|typeof|instanceof|in|of|delete|void)\b/g},{type:"boolean",pattern:/\b(true|false|null|undefined|NaN|Infinity)\b/g},{type:"number",pattern:/\b\d+\.?\d*([eE][+-]?\d+)?\b/g},{type:"function",pattern:/\b([a-zA-Z_$][\w$]*)\s*(?=\()/g},{type:"class-name",pattern:/\b[A-Z][\w$]*\b/g},{type:"operator",pattern:/[+\-*/%=<>!&|^~?:]+|===|!==|==|!=|<=|>=|&&|\|\||<<|>>|>>>/g},{type:"punctuation",pattern:/[{}[\]();,.]/g}],html:[{type:"comment",pattern:/<!--[\s\S]*?-->/g},{type:"doctype",pattern:/<!DOCTYPE[^>]*>/gi},{type:"tag-open",pattern:/<\/?[a-zA-Z][\w-]*/g},{type:"tag-close",pattern:/\/?>/g},{type:"attr-name",pattern:/\s+[a-zA-Z:@][\w:.-]*(?=\s*=)/g},{type:"attr-value",pattern:/=\s*"[^"]*"|=\s*'[^']*'/g},{type:"entity",pattern:/&[#\w]+;/g}],css:[{type:"comment",pattern:/\/\*[\s\S]*?\*\//g},{type:"at-rule",pattern:/@[\w-]+/g},{type:"selector",pattern:/[.#]?[a-zA-Z][\w-]*(?=\s*[{,])/g},{type:"property",pattern:/\b[\w-]+(?=\s*:)/g},{type:"string",pattern:/"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'/g},{type:"function",pattern:/\b[\w-]+(?=\()/g},{type:"important",pattern:/!important\b/g},{type:"number",pattern:/\b\d+\.?\d*(px|em|rem|%|vh|vw|pt|cm|mm|in|pc|ex|ch|vmin|vmax|fr)?\b/g},{type:"color",pattern:/#[\da-fA-F]{3,8}\b/g},{type:"punctuation",pattern:/[{}:;,()]/g}]};function n(t){const e={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};return t.replace(/[&<>"']/g,t=>e[t])}class a{constructor(){this.config={autoDetect:!0,preserveOriginal:!0,selector:".code-block",showLanguageBadge:!1,languagePrefix:"language-"}}highlight(t,a=null){const r="string"==typeof t?document.querySelector(t):t;if(!r||r.hasAttribute("data-syntax-highlighted"))return!1;if(!a&&this.config.autoDetect){const t=Array.from(r.classList).find(t=>t.startsWith(this.config.languagePrefix));t&&(a=t.substring(this.config.languagePrefix.length))}if(!a||!e[a])return!1;const o=r.textContent||"";this.config.preserveOriginal&&r.setAttribute("data-original-code",o);const i=function(t,a){const r=e[a];if(!r)return n(t);const o=[];for(const{type:e,pattern:n}of r){if("html"===a&&"entity"===e)continue;let r;for(n.lastIndex=0;null!==(r=n.exec(t));)o.push({start:r.index,end:r.index+r[0].length,text:r[0],type:e})}o.sort((t,e)=>t.start-e.start);const i=[];let s=0;for(const t of o)t.start>=s&&(i.push(t),s=t.end);let c="",p=0;for(const e of i)e.start>p&&(c+=n(t.substring(p,e.start))),c+=`<span class="syntax-${e.type}">${n(e.text)}</span>`,p=e.end;return p<t.length&&(c+=n(t.substring(p))),c}(o,a);return r.innerHTML=i,r.setAttribute("data-syntax-highlighted","true"),r.setAttribute("data-language",a),this.config.showLanguageBadge&&this.addLanguageBadge(r,a),!0}scan(t={}){const e=t.selector||this.config.selector,n=document.querySelectorAll(e);let a=0;return n.forEach(e=>{this.highlight(e,t.language||null)&&(this.addCopyButton(e),a++)}),a}register(t,n){t&&Array.isArray(n)?e[t]=n:console.error("SyntaxHighlighter: Invalid language registration")}configure(t){return t?(Object.assign(this.config,t),this.config):{...this.config}}addLanguageBadge(t,e){if(t.querySelector(".syntax-language-badge"))return;const n=document.createElement("div");n.className="syntax-language-badge",n.textContent=e.toUpperCase(),t.style.position="relative",t.insertBefore(n,t.firstChild)}getLanguages(){return Object.keys(e)}isLanguageSupported(t){return t in e}addCopyButton(t){if(t.parentElement&&t.parentElement.classList.contains("code-block-wrapper"))return;const e=document.createElement("div");e.className="code-block-wrapper";const n=document.createElement("button");n.className="code-block-copy",n.setAttribute("aria-label","Copy code to clipboard"),n.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>',n.addEventListener("click",async()=>{const e=t.getAttribute("data-original-code")||t.textContent;try{if(navigator.clipboard&&navigator.clipboard.writeText)await navigator.clipboard.writeText(e);else{const t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)}n.classList.add("copied"),n.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"></polyline></svg>',setTimeout(()=>{n.classList.remove("copied"),n.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>'},2e3)}catch(t){console.error("Failed to copy code:",t)}}),t.parentNode.insertBefore(e,t),e.appendChild(t),e.appendChild(n)}}const r=new a;"undefined"!=typeof document&&("loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{r.scan()}):setTimeout(()=>r.scan(),0)),"undefined"!=typeof window&&(window.Domma&&(window.Domma.syntax=r),window.DommaSyntax=r),t.LANGUAGES=e,t.SyntaxHighlighter=a,t.default=r,t.syntax=r,Object.defineProperty(t,"__esModule",{value:!0})});
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Domma Core CSS v0.48.0
2
+ * Domma Core CSS v0.50.0
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-09-27T22:11:07.093Z
6
- * Commit: cf6d8de
5
+ * Built: 2026-09-28T07:48:39.949Z
6
+ * Commit: d400172
7
7
  */
8
8
 
9
9
  /**
@@ -1204,8 +1204,9 @@ code, pre {
1204
1204
  letter-spacing: 0.025em;
1205
1205
  }
1206
1206
 
1207
- /* Truncate */
1208
- .truncate {
1207
+ /* Truncate - one line with an ellipsis. .text-truncate is the Bootstrap spelling. */
1208
+ .truncate,
1209
+ .text-truncate {
1209
1210
  overflow: hidden;
1210
1211
  text-overflow: ellipsis;
1211
1212
  white-space: nowrap;
@@ -2180,6 +2181,143 @@ code, pre {
2180
2181
  user-select: text;
2181
2182
  }
2182
2183
 
2184
+ /* ============================================
2185
+ ACCESSIBILITY & TEXT UTILITIES
2186
+ Screen-reader-only text, skip links, line clamping,
2187
+ whole-card links and a divider with a word in it.
2188
+ Tailwind names (.sr-only, .line-clamp-*) with the Bootstrap
2189
+ spellings (.visually-hidden, .text-truncate) as aliases.
2190
+ ============================================ */
2191
+
2192
+ /* Hidden on screen, still read by screen readers. The -focusable form comes
2193
+ back when it (or something inside it) takes focus - the skip link pattern. */
2194
+ .sr-only,
2195
+ .visually-hidden,
2196
+ .sr-only-focusable:not(:focus):not(:focus-within),
2197
+ .visually-hidden-focusable:not(:focus):not(:focus-within),
2198
+ .skip-link:not(:focus):not(:focus-within) {
2199
+ position: absolute !important;
2200
+ width: 1px !important;
2201
+ height: 1px !important;
2202
+ padding: 0 !important;
2203
+ margin: -1px !important;
2204
+ overflow: hidden !important;
2205
+ clip: rect(0, 0, 0, 0) !important;
2206
+ clip-path: inset(50%) !important;
2207
+ white-space: nowrap !important;
2208
+ border: 0 !important;
2209
+ }
2210
+
2211
+ /* A ready-made skip link: the first thing in <body>, hidden until Tab reaches
2212
+ it, then pinned top left above everything (popovers are 10045). */
2213
+ .skip-link:focus,
2214
+ .skip-link:focus-within {
2215
+ position: fixed;
2216
+ top: var(--dm-space-3);
2217
+ left: var(--dm-space-3);
2218
+ z-index: 10100;
2219
+ padding: var(--dm-space-2) var(--dm-space-4);
2220
+ border-radius: var(--dm-radius-md);
2221
+ background-color: var(--dm-primary);
2222
+ color: var(--dm-primary-text, var(--dm-white));
2223
+ font-weight: 600;
2224
+ text-decoration: none;
2225
+ box-shadow: var(--dm-shadow-lg);
2226
+ outline: 2px solid var(--dm-border-focus);
2227
+ outline-offset: 2px;
2228
+ }
2229
+
2230
+ /* Undo .sr-only, e.g. at a breakpoint or from a script */
2231
+ .not-sr-only {
2232
+ position: static !important;
2233
+ width: auto !important;
2234
+ height: auto !important;
2235
+ padding: 0 !important;
2236
+ margin: 0 !important;
2237
+ overflow: visible !important;
2238
+ clip: auto !important;
2239
+ clip-path: none !important;
2240
+ white-space: normal !important;
2241
+ }
2242
+
2243
+ /* Line clamp - cut text after N lines with an ellipsis */
2244
+ .line-clamp-1,
2245
+ .line-clamp-2,
2246
+ .line-clamp-3,
2247
+ .line-clamp-4,
2248
+ .line-clamp-5 {
2249
+ display: -webkit-box;
2250
+ overflow: hidden;
2251
+ -webkit-box-orient: vertical;
2252
+ }
2253
+
2254
+ .line-clamp-1 { -webkit-line-clamp: 1; }
2255
+ .line-clamp-2 { -webkit-line-clamp: 2; }
2256
+ .line-clamp-3 { -webkit-line-clamp: 3; }
2257
+ .line-clamp-4 { -webkit-line-clamp: 4; }
2258
+ .line-clamp-5 { -webkit-line-clamp: 5; }
2259
+
2260
+ .line-clamp-none {
2261
+ display: block;
2262
+ overflow: visible;
2263
+ -webkit-box-orient: horizontal;
2264
+ -webkit-line-clamp: unset;
2265
+ }
2266
+
2267
+ /* Stretched link - the link's ::after covers its nearest positioned ancestor,
2268
+ so the whole card is the link. A .card holding one is positioned for you;
2269
+ anything else needs .relative. Other links or buttons inside must sit above
2270
+ it: give them .relative .z-10. */
2271
+ .stretched-link::after {
2272
+ content: "";
2273
+ position: absolute;
2274
+ inset: 0;
2275
+ z-index: 1;
2276
+ border-radius: inherit;
2277
+ }
2278
+
2279
+ .card:has(.stretched-link),
2280
+ .list-group-item:has(.stretched-link) {
2281
+ position: relative;
2282
+ }
2283
+
2284
+ .stretched-link:focus-visible {
2285
+ outline: none;
2286
+ }
2287
+
2288
+ .stretched-link:focus-visible::after {
2289
+ outline: 2px solid var(--dm-border-focus);
2290
+ outline-offset: -2px;
2291
+ }
2292
+
2293
+ /* Divider with text - a rule either side of a word, e.g. "or" between two
2294
+ sign-in options. -start / -end push the text to one side. */
2295
+ .divider-text {
2296
+ display: flex;
2297
+ align-items: center;
2298
+ gap: var(--dm-space-3);
2299
+ margin: var(--dm-space-4) 0;
2300
+ color: var(--dm-text-secondary);
2301
+ font-size: var(--dm-font-size-sm);
2302
+ line-height: 1.4;
2303
+ }
2304
+
2305
+ .divider-text::before,
2306
+ .divider-text::after {
2307
+ content: "";
2308
+ flex: 1 1 0;
2309
+ border-top: 1px solid var(--dm-border);
2310
+ }
2311
+
2312
+ .divider-text:empty {
2313
+ gap: 0;
2314
+ }
2315
+
2316
+ .divider-text-start::before,
2317
+ .divider-text-end::after {
2318
+ flex: 0 0 var(--dm-space-6);
2319
+ }
2320
+
2183
2321
  /* ============================================
2184
2322
  OPACITY SCALE
2185
2323
  Full graduated opacity scale (0-100)