domma-js 0.49.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,9 +1,9 @@
1
1
  /*!
2
- * Domma Flags v0.49.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:28:30.905Z
6
- * Commit: 5bc521e
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.49.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:28:30.901Z
6
- * Commit: 5bc521e
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.49.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:28:45.940Z
6
- * Commit: 5bc521e
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)