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.
- package/package.json +1 -1
- package/public/dist/bundles/domma-complete.css +603 -16
- package/public/dist/bundles/domma-data-focused.css +603 -16
- package/public/dist/bundles/domma-essentials.css +603 -16
- package/public/dist/bundles/domma-full.css +603 -16
- package/public/dist/bundles/domma-minimal.css +148 -10
- 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 +143 -5
- package/public/dist/domma.esm.js +5 -5
- package/public/dist/domma.min.js +5 -5
- package/public/dist/elements.css +452 -3
- package/public/dist/grid.css +3 -3
- package/public/dist/syntax.css +3 -3
- package/public/dist/themes/domma-themes.css +3 -3
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Domma Minimal CSS Bundle v0.
|
|
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-
|
|
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.
|
|
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-
|
|
18
|
-
* Commit:
|
|
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.
|
|
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-
|
|
4842
|
-
* Commit:
|
|
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.
|
|
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-
|
|
6
|
-
* Commit:
|
|
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.
|
|
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-
|
|
6
|
-
* Commit:
|
|
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.
|
|
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-
|
|
6
|
-
* Commit:
|
|
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={"&":"&","<":"<",">":">",'"':""","'":"'"};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})});
|
package/public/dist/domma.css
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Domma Core CSS v0.
|
|
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-
|
|
6
|
-
* Commit:
|
|
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)
|