node-red-contrib-uibuilder
Version:
Easily create data-driven web UI's for Node-RED. Single- & Multi-page. Multiple UI's. Work with existing web development workflows or mix and match with no-code/low-code features.
1 lines • 41.3 kB
Source Map (JSON)
{"version":3,"sourceRoot":null,"mappings":"AA0CA,iwOAAA,mCAAA,sEAkWA,oCACI,8FAAA,mCAAA,2DAKJ,mCACI,6bAAA,mCAAA,2DAoBJ,ygBAAA,mCAAA,+DA0BA,wDAIA,wEAIA,8DAIA,8DAIA,8DAIA,8DAIA,8DAIA,qCAGA,0EAIA,0FAIA,gFAIA,gGAIA,sFAIA,8GAIA,+FAIA,+HAIA,oEAIA,0EASA,uCAIA,wEAIA,uCACI,kEAKJ,oHAOA,sIAOA,0EAIA,iCAGA,8IAQA,iIAMA,iFAIA,6aAAA,+XAqBA,wIAGA,sHAGA,2EAKA,gDAGA,sNAUA,8JASI,0CAIJ,yFAMA,8DAIA,gMAQA,0HAKA,+HAMA,yJAMA,gCAIA,sBAKA,sCAGA,qCAGA,uBAIA,4EAME,gCAGA,wCAKA,8DAMA,sCAQF,kIAOA,mGAQA,kFAKA,yJAQA,kDAIA,yGAMA,yCAKA,sEASA,6LAcA,2CAIA,8EAQA,iJAOA,kIAKA,wFAIA,oDAGA,6DAKA,wCAIA,+CAIA,sCAGA,uDAIA,wCAIA,0BACI,qCAIA,6CAGA,sCAQJ,uGAMA,4BAGA,wIAKA,yKASA,kEAKA,yDAOA,uJAeA,+EAQA,2EAKA,yGAQA,6CAIA,qIAWA,iEAIA,oHAOA,yBACI,+BAGA,2RAeA,8DAIA,kDAQJ,kHAKA,8FAKA,gGAKA,sFASA,mEAGA,iCAMA,+HAOA,oFAKA,yDAIA,qEAMA,yDAKA,6EAOA,sCAIA,sBAIA,8BAGA,gCAKA,oCAGA,mDAGA,2DACI,mDAGA,qCAgBJ,2GAOA,uHAQA,+BAIA,0EAMA,oCAQA,4JAeA,6WAgBA,0WAiBA,8HAOA,4BAGA,uBAsCA,oPASA,iCAGA,iEAKA,qHAUA,6BAIA,6EAKA,6EAMA,6EAKA,qHAMA,6BAIA,iDASA,qCAGA,yEAKA,gDAGA,2CAIA,gQAaA,qCACA,wCACA,wCACA,yCACA,sCACA,2CAKA,+RAgBA,qNASA,8DAMA,kCAIA,uDAKA,+KAWA","sources":["front-end/uib-brand.css"],"sourcesContent":["/** Default Styles for uibuilder - Light & Dark options ...\n *\n * TODO: Add darker/lighter shades for variant colours for headers, etc.\n * Remove shadows for dark mode.\n *\n * 1em ~= 16px\n * Recommended @media breakpoints:\n * Tablet: 48em @ 16pt = 768px\n * Tablet Wide: 62em @ 16pt = 992px\n *\n * Mobile Small: 30em @ 16pt = 480px\n * Mobile Medium: 37.5em @ 16pt = 600px\n * Mobile Large: 48em @ 16pt = 768px\n *\n * https://css-tricks.com/a-complete-guide-to-custom-properties/ for details on using custom css properties\n * https://una.im/css-color-theming/ for more on color theory calculations\n * https://web.dev/building-a-color-scheme/ is the basis for this style\n * https://unifyned.com/colors.html extends the above\n * https://chromatichq.com/insights/understanding-and-using-hsl-your-css gives calculations for the color wheel\n *\n * NB: The version is updated automatically by the build process to the current date - see gulpfile.js\n * @version: 2026-06-12\n * @author: Julian Knight (TotallyInformation)\n * @license: Apache 2.0\n * @created: 2022-05-02\n *\n * USAGE:\n * - https://totallyinformation.github.io/node-red-contrib-uibuilder/#/client-docs/uib-brand-css\n * - Reference directly or via import in own CSS\n * - Will auto pick up browser preference for light/dark if set\n * - Or manually set with `class=\"light\"` or `class=\"dark\"` on the html tag\n * - Or create a manual switcher feature - see css-test.html or brand-test.html for examples\n * - A simple CSS reset is provided to get reasonably looking HTML in any browser\n * - Some special classes are provided - see the \"Recommended surfaces\" section\n * - Lots of css variables provided for use in your own CSS or in web components\n * NOTES:\n * - Watch out for the order of loading of style sheets!\n * - uibuilder attempts to auto-load this sheet BUT you may need to do it manually to get the right order.\n * - Include in your index.css file as `@import url(\"./uib-brand.min.css\");`\n */\n\n/* :root applies to everything, :root.light is for manually selected light mode */\n:root, :root.light {\n color-scheme: light dark;\n --mode: light;\n\n /* Create a checkable var - helps web components know if this stylesheet is loaded\n * Use this from general code: \n * window.getComputedStyle(document.documentElement, null).getPropertyValue('--uib-css') === 'uib-brand'\n * Or this from within the component code:\n * window.getComputedStyle(this, null).getPropertyValue('--uib-css') === 'uib-brand'\n * NOTE: no space between : and text!\n */\n --uib-css: uib-brand;\n\n /* For nicer emoji's use this as the font-family */\n --emoji-fonts: \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\", \"Twemoji Mozilla\", \"EmojiOne Color\", \"Android Emoji\";\n\n /* Sans-serif is much easier to read on-screen */\n /* Update 2025-04-28 to use https://github.com/system-fonts/modern-font-stacks - incl better emoji's as well */\n --font-family: system-ui, sans-serif, var(--emoji-fonts);\n --code-font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace, var(--emoji-fonts);\n --cursive-font-family: 'Segoe Print', 'Bradley Hand', Chilanka, TSCu_Comic, casual, cursive, var(--emoji-fonts);\n\n --base-margin: 1rem;\n --max-width: 64rem;\n\n --border-radius: 0.5rem; /*8px;*/\n --border-pad: 0.5rem;\n --border-margin: 0;\n\n /* For the .grid-fit class, the minimum child element size */\n --grid-fit-min: 15rem;\n\n /* For the show/hide elements in PWA mode */\n --pwa-display-mode: block;\n\n /* #region Fix link colours when using dark mode in a light mode browser and visa versa */\n --a-link: blue;\n --a-visited: purple;\n --a-hover: red; /* Hover state (must be after link/visited) Hover doesn't seem to be defined in Chromium */\n --a-active: orange; /* Active state (must be after hover) This is when you hold mouse down on the link */\n /* #endregion --- Fix link colours --- */\n\n /* #region --- Colour Prep --- */\n --brand-hue: 200;\n --text-hue: var(--brand-hue);\n --surface-hue: var(--brand-hue);\n --complementary-offset: 180;\n --accent-offset: 30; /* 30=Split complementary, 60=Triadic */\n\n --saturation-bias: 0;\n --light-saturation: .66;\n --dark-saturation: calc(var(--light-saturation) * .6);\n --saturation-value: var(--light-saturation);\n --saturation: calc(var(--saturation-value) + var(--saturation-bias));\n\n --lightness-bias: 0;\n --light-lightness: .57;\n --dark-lightness: calc(var(--light-lightness) * .75);\n --lightness-value: var(--light-lightness);\n --lightness: calc(var(--lightness-value) + var(--lightness-bias));\n /* #endregion --- Colour Prep --- */\n\n /* #region --- Brand --- */\n --brand: hsl(\n var(--brand-hue)\n calc(100% * var(--saturation))\n calc(100% * var(--lightness))\n );\n /*#endregion --- Brand --- */\n\n /* #region --- Shadows https://shadows.brumm.af/ --- */\n --surface-shadow-light: var(--brand-hue) 10% 20%;\n --shadow-strength-light: .02;\n\n --surface-shadow-dark: var(--brand-hue) 30% 30%;\n --shadow-strength-dark: .1;\n\n --surface-shadow: var(--surface-shadow-light);\n --shadow-strength: var(--shadow-strength-light);\n\n --shadow1:\n 0 2.8px 2.2px hsl(var(--surface-shadow) / calc(var(--shadow-strength) + .03)),\n 0 6.7px 5.3px hsl(var(--surface-shadow) / calc(var(--shadow-strength) + .01)),\n 0 12.5px 10px hsl(var(--surface-shadow) / calc(var(--shadow-strength) + .02)),\n 0 22.3px 17.9px hsl(var(--surface-shadow) / calc(var(--shadow-strength) + .02)),\n 0 41.8px 33.4px hsl(var(--surface-shadow) / calc(var(--shadow-strength) + .03)),\n 0 100px 80px hsl(var(--surface-shadow) / var(--shadow-strength))\n ;\n\n --shadow2: \n 0.2px 0.3px 0.3px hsl(var(--surface-shadow) / calc(var(--shadow-strength) + .031)),\n 0.5px 0.7px 0.7px hsl(var(--surface-shadow) / calc(var(--shadow-strength) + .053)),\n 1px 1.3px 1.3px hsl(var(--surface-shadow) / calc(var(--shadow-strength) + .07)),\n 1.8px 2.2px 2.2px hsl(var(--surface-shadow) / calc(var(--shadow-strength) + .087)),\n 3.3px 4.2px 4.2px hsl(var(--surface-shadow) / calc(var(--shadow-strength) + .109)),\n 8px 10px 10px hsl(var(--surface-shadow) / calc(var(--shadow-strength) + .16))\n ;\n\n --shadow: var(--shadow1);\n --btn-shadow: inset 2px 2px 3px rgba(255,255,255, .3),\n inset -2px -2px 3px rgba(0,0,0, .3);\n \n /*#endregion --- --- */\n\n /* #region --- Text --- */\n --text-saturation: .2;\n --text-bias: 0;\n --light-text-lightness: .1;\n --light-text-factor: 1;\n --dark-text-lightness: .9;\n --dark-text-factor: -1;\n\n --text-factor: var(--light-text-factor);\n --text-lightness: var(--light-text-lightness);\n\n --text1: hsl(\n var(--text-hue)\n calc(100% * var(--text-saturation))\n calc(\n 100% * (var(--text-lightness)\n - (var(--text-factor) * var(--text-bias)))\n )\n );\n --text2: hsl(\n var(--text-hue)\n calc(100% * (var(--text-saturation) / 2))\n calc(\n 100% * (var(--text-lightness)\n + (1 * var(--text-factor) * .1)\n - (var(--text-factor) * var(--text-bias)))\n )\n );\n --text3: hsl(\n var(--text-hue)\n calc(100% * (var(--text-saturation) / 2))\n calc(\n 100% * (var(--text-lightness)\n + (1 * var(--text-factor) * .4)\n - (var(--text-factor) * var(--text-bias)))\n )\n );\n --text4: hsl(\n var(--text-hue) \n 10% \n calc(\n 50% \n - (100% * var(--text-factor) * var(--text-bias)))\n / calc(25% + (100% * var(--text-bias)))\n );\n /*#endregion --- --- */\n\n /* #region --- Surfaces --- */\n --surfaces-saturation: .1;\n --surfaces-bias: 0;\n --light-surfaces-lightness: .95;\n --light-surfaces-factor: 1;\n --dark-surfaces-lightness: .1;\n --dark-surfaces-factor: -1;\n\n --surfaces-factor: var(--light-surfaces-factor);\n --surfaces-lightness: var(--light-surfaces-lightness);\n \n --surface1: hsl(\n var(--surface-hue)\n calc(100% * var(--surfaces-saturation))\n calc(\n 100% * (var(--surfaces-lightness)\n - (var(--surfaces-factor) * .00)\n + (var(--surfaces-factor) * var(--surfaces-bias)))\n )\n );\n --surface2: hsl(\n var(--surface-hue)\n calc(100% * var(--surfaces-saturation))\n calc(\n 100% * (var(--surfaces-lightness)\n - (var(--surfaces-factor) * .05)\n + (var(--surfaces-factor) * var(--surfaces-bias)))\n )\n );\n --surface3: hsl(\n var(--surface-hue)\n calc(100% * var(--surfaces-saturation))\n calc(\n 100% * (var(--surfaces-lightness)\n - (var(--surfaces-factor) * .10)\n + (var(--surfaces-factor) * var(--surfaces-bias)))\n )\n );\n --surface4: hsl(\n var(--surface-hue)\n calc(100% * var(--surfaces-saturation))\n calc(\n 100% * (var(--surfaces-lightness)\n - (var(--surfaces-factor) * .15)\n + (var(--surfaces-factor) * var(--surfaces-bias)))\n )\n );\n --surface5: hsl(\n var(--surface-hue)\n calc(100% * var(--surfaces-saturation))\n calc(\n 100% * (var(--surfaces-lightness)\n - (var(--surfaces-factor) * .20)\n + (var(--surfaces-factor) * var(--surfaces-bias)))\n )\n );\n /*#endregion --- --- */\n\n /* #region === INFO === */\n --info-hue: 203;\n --info-saturation-bias: 0;\n --info-lightness-bias: 0;\n \n --info-hsl: var(--info-hue)\n calc(100% * (var(--saturation) + var(--info-saturation-bias)))\n calc(100% * (var(--lightness) + var(--info-lightness-bias)));\n\n --info: hsl( var(--info-hsl) );\n --info-intense: hsl(\n var(--info-hue) 100% 50%\n );\n /*#endregion --- --- */\n \n /* #region === SUCCESS === */\n --success-hue: 120;\n --success-saturation-bias: 0;\n --success-lightness-bias: 0;\n \n --success: hsl(\n var(--success-hue)\n calc(100% * (var(--saturation) + var(--success-saturation-bias)))\n calc(100% * (var(--lightness) + var(--success-lightness-bias)))\n );\n --success-intense: hsl(\n var(--success-hue) 100% 50%\n );\n /*#endregion --- --- */\n \n /* #region === WARNING === */\n --warning-hue: 40;\n --warning-saturation-bias: 0;\n --warning-lightness-bias: 0;\n \n --warning: hsl(\n var(--warning-hue)\n calc(100% * (var(--saturation) + var(--warning-saturation-bias)))\n calc(100% * (var(--lightness) + var(--warning-lightness-bias)))\n );\n --warning-intense: hsl(\n var(--warning-hue) 100% 50%\n );\n --warn: var(--warning);\n /*#endregion --- --- */\n \n /* #region === FAILURE === */\n --failure-hue: 2;\n --failure-saturation-bias: 0;\n --failure-lightness-bias: 0;\n \n --failure: hsl(\n var(--failure-hue)\n calc(100% * (var(--saturation) + var(--failure-saturation-bias)))\n calc(100% * (var(--lightness) + var(--failure-lightness-bias)))\n );\n --failure-intense: hsl(\n var(--failure-hue) 100% 50%\n );\n --error: var(--failure);\n --danger: var(--failure);\n /*#endregion --- --- */\n \n /* #region === Complementary ACCENT === */\n --complementary-hue: calc(var(--brand-hue) + var(--complementary-offset));\n\n --complementary-fg: hsl(\n var(--brand-hue)\n calc(100% * var(--saturation))\n calc(100% * var(--lightness))\n );\n --complementary-bg: hsl(\n var(--complementary-hue)\n calc(100% * var(--saturation))\n calc(100% * var(--lightness))\n );\n --complementary: hsl(\n calc(var(--complementary-hue))\n calc(100% * var(--saturation))\n calc(100% * var(--lightness))\n );\n /*#endregion --- --- */\n \n /* #region === PRIMARY ACCENT === */\n --primary-hue: calc(var(--brand-hue) + var(--complementary-offset) + var(--accent-offset));\n\n --primary-fg: hsl(\n calc(var(--primary-hue) + var(--complementary-offset))\n calc(100% * var(--saturation))\n calc(100% * var(--lightness))\n );\n --primary-bg: hsl(\n var(--primary-hue)\n calc(100% * var(--saturation))\n calc(100% * var(--lightness))\n );\n --primary: var(--primary-bg);\n /*#endregion --- --- */\n \n /* #region === SECONDARY ACCENT === */\n --secondary-hue: calc(var(--brand-hue) + var(--complementary-offset) - var(--accent-offset));\n \n --secondary-fg: hsl(\n calc(var(--secondary-hue) + var(--complementary-offset))\n calc(100% * var(--saturation))\n calc(100% * var(--lightness))\n );\n --secondary-bg: hsl(\n var(--secondary-hue)\n calc(100% * var(--saturation))\n calc(100% * var(--lightness))\n );\n --secondary: var(--secondary-bg);\n /*#endregion --- --- */\n\n /* #region === FORMS === */\n --form-bg: var(--surface2);\n --form-fg: var(--text2);\n --form-border: 1px solid var(--text3);\n /* #endregion --- --- */\n\n /* #region ---- Z-Indexes (since 2026-03-16 uib v7.6.0) ---- */\n --z-nav-h: 980; /* Horizontal navigation menu */\n --z-toaster: 992; /* Toast container */\n --z-toast: 990; /* Individual toast - inside toaster only if modal */\n --z-info-overlay: 10000; /* For info overlays that need to be above everything else */\n /* #endregion ---- Z-Indexes ---- */\n\n /* #region === NAVIGATION MENUS === */\n /* The main background color for the menu */\n --nav-bg: var(--surface3);\n /* The main text color for the menu */\n --nav-fg: var(--text2);\n /* Secondary background color - used when hovering over other menu items */\n --nav-2nd-bg: var(--primary-bg);\n /* More contrasting text color - used for selected menu items */\n --nav-2nd-fg: var(--text1);\n /* More contrasting background color - Used for menu pop-up background */\n --nav-3rd-bg: var(--surface2);\n /* #endregion --- --- */\n}\n\n/* If the browser reports it, we can adjust for light/dark theme preferences\n * See https://stackoverflow.com/a/57795495 for use with JavaScript\n */\n@media (prefers-color-scheme: light) {\n :root {\n color-scheme: light dark;\n --mode: light;\n }\n}\n@media (prefers-color-scheme: dark) {\n :root {\n /* ---- Active Theme (Dark) ---- */\n color-scheme: dark light;\n --mode: dark;\n\n --saturation-value: var(--dark-saturation);\n --lightness-value: var(--dark-lightness);\n \n --surface-shadow: var(--surface-shadow-dark);\n --shadow-strength: var(--shadow-strength-dark);\n \n --text-factor: var(--dark-text-factor);\n --text-lightness: var(--dark-text-lightness);\n\n --surfaces-factor: var(--dark-surfaces-factor);\n --surfaces-lightness: var(--dark-surfaces-lightness);\n }\n}\n\n/* Or if the user manually requests a dark colour theme by setting class=\"dark\" on html tag */\n:root.dark {\n color-scheme: dark light;\n --mode: dark;\n\n --saturation-value: var(--dark-saturation);\n --lightness-value: var(--dark-lightness);\n \n --surface-shadow: var(--surface-shadow-dark);\n --shadow-strength: var(--shadow-strength-dark);\n\n --text-factor: var(--dark-text-factor);\n --text-lightness: var(--dark-text-lightness);\n\n --surfaces-factor: var(--dark-surfaces-factor);\n --surfaces-lightness: var(--dark-surfaces-lightness);\n\n /* #region Fix link colours when using dark mode in a light mode browser and visa versa */\n --a-link: hsl(240, 100%, 81%);\n --a-visited: hsl(271, 69%, 81%);\n --a-hover: hsl(0, 100%, 70%); /* Hover state (must be after link/visited) Hover doesn't seem to be defined in Chromium */\n --a-active: hsl(30, 100%, 50%); /* Active state (must be after hover) This is when you hold mouse down on the link */\n /* #endregion --- Fix link colours --- */\n}\n\n/*#region --- Surface & std colour classes --- */\n\n.brand {\n color: var(--text1);\n background-color: var(--brand);\n}\n.complementary {\n color: var(--text1);\n background-color: var(--complementary);\n}\n.surface1 {\n background-color: var(--surface1);\n color: var(--text2);\n}\n.surface2 {\n background-color: var(--surface2);\n color: var(--text2);\n}\n.surface3 {\n background-color: var(--surface3);\n color: var(--text1);\n}\n.surface4 {\n background-color: var(--surface4);\n color: var(--text1);\n}\n.surface5 {\n background-color: var(--surface5);\n color: var(--text1);\n}\n.rad-shadow {\n box-shadow: var(--shadow);\n}\n.info {\n color: var(--text1) !important;\n background-color: var(--info) !important;\n}\n.info-intense {\n color: var(--text1) !important;\n background-color: var(--info-intense) !important;\n}\n.success {\n color: var(--text1) !important;\n background-color: var(--success) !important;\n}\n.success-intense {\n color: var(--text1) !important;\n background-color: var(--success-intense) !important;\n}\n.warning, .warn {\n color: var(--text1) !important;\n background-color: var(--warning) !important;\n}\n.warning-intense, .warn-intense {\n color: var(--text1) !important;\n background-color: var(--warning-intense) !important;\n}\n.failure, .error, .danger {\n color: var(--text1) !important;\n background-color: var(--failure) !important;\n}\n.failure-intense, .error-intense, .danger-intense {\n color: var(--text1) !important;\n background-color: var(--failure-intense) !important;\n}\n.primary {\n color: var(--primary-fg);\n background-color: var(--primary-bg);\n}\n.secondary {\n color: var(--secondary-fg);\n background-color: var(--secondary-bg);\n}\n\n/*#endregion --- --- --- --- */\n\n/*#region --- Basic reset --- */\n\n*, *::before, *::after {\n box-sizing: border-box;\n /* margin: 0; */\n}\n*:focus-visible {\n outline: 2px solid var(--secondary-fg);\n outline-offset: 2px;\n}\n@supports not selector(:focus-visible) {\n *:focus {\n outline: 1px solid var(--secondary-fg);\n outline-offset: -4px;\n }\n}\nhtml {\n line-height: 1.5; /* Accessible line-height */\n font-size: 100%;\n background-color: var(--surface1);\n color: var(--text2);\n accent-color: var(--primary);\n}\nbody {\n margin-left: var(--base-margin);\n margin-right: var(--base-margin);\n /* padding: 0.3rem; */\n font-family: var(--font-family);\n -webkit-font-smoothing: antialiased; /* Improve text rendering */\n}\nh1, h2, h3, h4, h5, h6, heading {\n line-height: calc(1em + 0.5rem); /* dynamic heights for headings */\n text-wrap: balance;\n}\np, li, figcaption {\n text-wrap: pretty;\n}\nimg, picture, video, canvas, svg {\n /* display: block; */\n object-fit: cover;\n vertical-align: bottom;\n max-width: 100%;\n background-color: var(--surface2);\n margin:var(--base-margin);\n}\np, h1, h2, h3, h4, h5, h6, heading, li, dl, dt, blockquote {\n overflow-wrap: break-word;\n -webkit-hyphens: auto;\n hyphens: auto;\n word-break: break-word;\n}\ndiv > p, div > article {\n margin-left: var(--base-margin);\n margin-right: var(--base-margin);\n}\nbutton, input[type=\"button\" i], input[type=\"reset\" i], input[type=\"submit\" i], ::file-selector-button {\n /* display: inline-flex; */\n align-items: center;\n justify-content: center;\n border: none;\n padding: .5rem 1rem;\n text-decoration: none;\n background-color: var(--info);\n color: var(--text1);\n font-family: inherit;\n font-size: 1rem;\n line-height: 1.1;\n cursor: pointer;\n text-align: center;\n transition: background 250ms ease-in-out, transform 150ms ease;\n -webkit-appearance: none;\n appearance: none;\n border-radius: var(--border-radius);\n /* box-shadow: 0 3px 5px rgb(var(--uib-color-fg), 0.5); */\n box-shadow: var(--btn-shadow);\n}\nbutton:hover, input[type=\"button\" i]:hover, input[type=\"reset\" i]:hover, input[type=\"submit\" i]:hover {\n background-color: hsl(var(--info-hsl) / .5);\n}\nbutton:active, input[type=\"button\" i]:active, input[type=\"reset\" i]:active, input[type=\"submit\" i]:active {\n transform: scale(0.97);\n}\ninput, button, textarea, select {\n color: var(--text2);\n font: inherit;\n min-width: 2em;\n}\ninput, textarea {\n background-color: var(--surface1);\n}\nselect {\n background-color: var(--info);\n color: var(--text2);\n padding: 0.3rem;\n box-shadow: var(--btn-shadow);\n cursor: pointer;\n transition: background 250ms ease-in-out, transform 150ms ease;\n border-radius: var(--border-radius);\n border: none;\n}\nblockquote {\n /* box-shadow: var(--shadow); */\n padding: 0.5em 1em 0.5em 1em;\n margin: 0.5em 0 1em 0;\n color: inherit;\n border: none;\n border-left: 0.25em solid var(--text3);\n background-color: var(--surface3);\n box-shadow: none;\n p, div {\n margin: 0.3em 0;\n }\n}\ncode {\n display: inline-block;\n font-size: 120%;\n background-color: var(--surface3);\n padding: 0 0.3em 0 0.3em;\n}\nheader, footer, main, section, article {\n /* default prep for container queries */\n container-type: inline-size;\n}\narticle { /* This lets us use an article like a card display */\n max-width: var(--max-width);\n border: 1px solid var(--text3);\n border-radius: var(--border-radius);\n padding: var(--border-pad);\n margin: 1rem var(--border-margin);\n background-color: var(--surface3);\n}\narticle > h1::before {\n font-size: 50%;\n color: hsl( var(--failure-hue) 100% 50% );\n content: \"⛔ Do not use H1 headings in articles. \"\n}\narticle > h2, article > h3, article > h4 {\n margin-block-start: 0;\n border-bottom: 1px solid var(--text3);\n padding-block-end: var(--border-pad);\n}\n/* HTML5 section tags - only special format top-level to reduce odd fmts */\nbody > main, body > header, body > footer, body > section {\n padding-left: var(--base-margin);\n padding-right: var(--base-margin);\n max-width: var(--max-width);\n margin: 0 auto;\n}\nbody > main {\n display: grid;\n gap: 1rem;\n}\nfooter {\n margin-top: 1em;\n}\n/* Put asides inside a main to one side\n Or, use a section or div to wrap multiple */\nmain > article, main .left {\n grid-column: 1;\n}\nmain > aside, main .right {\n grid-column: 2;\n}\nsummary {\n cursor: pointer;\n}\n/* Inline blocks in a summary tag */\nsummary > h2, summary > h3, summary > h4, summary > div, summary > p {\n display: inline-block;\n}\n\n/* #region Fix link colours when using dark mode in a light mode browser and visa versa */\n /* Default and visited states */\n a:link {\n color: var(--a-link, blue);\n }\n a:visited {\n color: var(--a-visited, purple);\n }\n /* Hover doesn't seem to be defined in Chromium */\n /* Hover state (must be after link/visited) */\n a:hover {\n color: var(--a-hover, red);\n text-decoration-style: double;\n }\n /* This is when you hold mouse down on the link */\n /* Active state (must be after hover) */\n a:active {\n color: var(--a-active, orange);\n }\n/* #endregion --- Fix link colours --- */\n\n/*#endregion --- Basic reset --- */\n\n/*#region --- Tables --- */\ntable {\n border-collapse: collapse;\n border: 1px solid var(--text3);\n margin-top: 1rem;\n margin-bottom: 1rem;\n font-variant-numeric: tabular-nums; /* OpenType: better alignment of numbers */\n}\nthead th, thead td {\n color: var(--text2);\n font-weight: bolder;\n background: var(--surface4);\n /* Make table headers stick to page when scrolling */\n position: -webkit-sticky;\n position: sticky;\n}\ntfoot th, tfoot td {\n color: var(--text2);\n font-style: italic;\n background: var(--surface4);\n}\nth[scope=row], tbody th {\n font-style: italic;\n color: var(--text2);\n font-weight:lighter;\n background: var(--surface4);\n background-blend-mode: lighten;\n text-align: left;\n}\nth, td {\n padding: .5rem;\n border: 1px solid var(--text4);\n}\ntbody tr:nth-child(even) {\n color: var(--text2);\n background-color: var(--surface3);\n background-blend-mode: lighten;\n}\n/* In case you want to use an hr in a table, reduced top/bottom margins */\ntd hr {\n margin-top:0.5em;\n margin-bottom:0.5em;\n}\n/* Extra line spacing for <br> in tables, mainly for use in markdown */\ntd br, th br {\n display:block;\n content:\"\";\n margin-top:0.8em;\n line-height:190%;\n}\n/*#endregion --- Tables --- */\n\n/*#region --- Forms --- */\nform {\n display: flex;\n gap: 1em;\n flex-direction: column;\n\n background-color: var(--form-bg);\n color: var(--form-fg);\n border: var(--form-border);\n\n margin: 0.5rem;\n padding: 0.5rem;\n border-radius: var(--border-radius);\n}\n\ninput[type=\"color\"] {\n width: 100%;\n height: 2.5rem;\n}\ninput:invalid, textarea:invalid, select:invalid {\n /* outline: 2px solid var(--failure); */\n border: 2px solid var(--failure);\n}\n/* input:valid, textarea:valid, select:valid {\n border: 3px solid var(--success);\n} */\n/* at any level of nesting */\nform input, form textarea, form select, form fieldset, form output {\n /* width: 75%; */\n flex: 2;\n border-radius: var(--border-radius);\n padding:0.3rem;\n border: var(--form-border);\n}\nform button, input[type=\"button\" i], form input[type=\"reset\" i], form input[type=\"submit\" i] {\n width:auto;\n margin-left: .2em;\n margin-right: .2em;\n}\nform input[type=\"checkbox\" i], form input[type=\"radio\" i] {\n height:1.5em;\n vertical-align: middle;\n}\nform:invalid button {\n background-color: var(--warning);\n}\nform label {\n flex: 1;\n vertical-align: middle;\n display: inline-block;\n}\nform label[required]::after {\n content: \" *\"\n}\n/* first level only */\nform > div {\n display: inherit;\n vertical-align: middle;\n}\nform > div:focus-within {\n font-weight: bold;\n}\nform > label {\n align-self: center;\n text-transform: capitalize;\n}\nform > label:focus-within {\n font-weight: bold;\n}\n/* Small screen (37.5em @ 16pt is about 600px) */\n@media all and (max-width: 37.5em) {\n form, form * {\n display:block;\n width:100%;\n }\n form > label, form > div.btn-row {\n margin-top: .8rem;\n }\n form > :not(label) {\n margin-bottom: 0.5rem;\n }\n}\n\n/*#endregion --- Forms --- */\n\n/*#region --- Menus --- */\nnav {\n /* See :root for the CSS variables used */\n background-color: var(--nav-bg);\n border-radius: var(--border-radius);\n box-shadow: var(--surface-shadow);\n}\nnav ul {\n list-style-type: none;\n}\nnav [role=\"menuitem\"]:not([aria-current=\"page\"]):hover {\n text-decoration: underline;\n color: var(--nav-2nd-fg);\n background-color: var(--nav-2nd-bg);\n}\nnav [aria-current=\"page\"] {\n background-color: hsl( /* brand but a bit darker */\n var(--brand-hue),\n calc(100% * var(--saturation)),\n calc(80% * var(--lightness))\n );\n\tfont-weight: bolder;\n color: var(--nav-2nd-fg);\n}\nnav a {\n text-decoration: none;\n color: inherit;\n background-color: inherit;\n}\nbutton.menu-toggle {\n /* Hide the toggle by default */\n display: none; \n /* display: block; */\n cursor: pointer;\n padding: 0;\n}\nbutton.menu-toggle svg {\n width: 2em;\n height: 2em;\n fill: var(--nav-fg);\n background-color: var(--nav-bg);\n transition: transform 150ms ease-in-out;\n margin:0;\n padding: 0;\n}\n\n/*#region -- Horizontal menu -- */\n/* nav.horizontal {\n display: inline-block;\n padding: 0.5rem;\n} */\nnav.horizontal {\n display: flex;\n padding: 0.5rem;\n align-items: center;\n /* background-color: var(--nav-bg); */\n /* border-radius: var(--border-radius); */\n position: relative;\n}\nnav.horizontal > h2 { /* Menu heading */\n font-size: inherit;\n font-weight: inherit;\n padding-left: 0.5rem;\n}\nnav.horizontal ul { /* [role=\"menubar\"] */\n display: flex;\n flex: 2;\n list-style-type: none;\n margin: 0;\n padding: 0;\n justify-content: flex-start;\n}\nnav.horizontal [role=\"menuitem\"] {\n padding: .5rem .5rem;\n}\n/* Search form */\nnav.horizontal form {\n flex: 1;\n display: inline-flex;\n flex-wrap: nowrap;\n flex-direction: row;\n align-items: center;\n border: none;\n margin: inherit;\n padding: inherit;\n gap: .2rem;\n}\nnav.horizontal input[type=\"search\"] {\n flex: 3;\n filter: brightness(120%);\n}\nnav.horizontal input[type=\"submit\"] {\n flex: 1;\n font-size: large;\n font-weight: bolder;\n filter: brightness(120%);\n padding: .5rem 0;\n}\n@media (max-width: 600px) {\n nav.horizontal ul {\n display: none;\n }\n nav.horizontal[aria-expanded=\"true\"] ul {\n display: flex;\n flex-direction: column;\n position: absolute;\n background: var(--nav-3rd-bg);\n box-shadow: var(--shadow);\n padding: 0.5em 0.5em;\n border-radius: var(--border-radius);\n z-index: var(--z-nav-h);\n left: 1.6em;\n top: 1em;\n width: max-content;\n min-width: 60vw;\n max-width: 90vw;\n }\n nav.horizontal[aria-expanded=\"true\"] a {\n display: block;\n width: 100%;\n }\n nav.horizontal > .menu-toggle {\n display: inline-block;\n }\n}\n/*#endregion -- ---- -- */\n/*#endregion --- Menus --- */\n\n/*#region --- Lists --- */\n.checklist {\n margin-inline-start: var(--base-margin);\n margin-inline-end: var(--base-margin);\n padding-inline-start: .2rem;\n}\nli.check, li.completed {\n list-style-type: \"✅\";\n padding-left: 0.4rem;\n font-family: var(--emoji-fonts);\n}\nli.uncheck, li.unstarted {\n list-style-type: \"❌\";\n padding-left: 0.4rem;\n font-family: var(--emoji-fonts);\n}\nli.started {\n list-style-type: \"✔️\";\n padding-left: 0.4rem;\n font-family: var(--emoji-fonts);\n}\n/*#endregion --- Lists --- */\n\n/*#region ---- Utility ---- */\n\n.animate-pulse {\n animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n}\n@keyframes pulse {\n 50% {\n opacity: .5;\n }\n}\n\n.border {\n border: 1px solid var(--text3);\n border-radius: var(--border-radius);\n padding: var(--border-pad);\n margin: var(--border-margin);\n}\n\n.box {\n border: 1px solid var(--text3);\n border-radius: var(--border-radius);\n padding: 0.5rem;\n}\n.box h2, .box h3, .box h4, .box h5, .box h6 {\n margin-top: 0.5rem;\n}\n\n.centre, .center {\n margin-left:auto;\n margin-right: auto;\n text-align: center;\n}\n\n.compact {\n margin: 0;\n padding-top: 0.2rem;\n padding-bottom: 0.2rem;\n}\nbutton.compact {\n padding: 2px 5px;\n border-radius: 0;\n background: inherit;\n margin: 2px;\n}\n\n.emoji { /* Nicer, cross-platform emoji's */\n font-family: var(--emoji-fonts);\n}\n\n.noborder {\n border: none;\n}\n\n.text-larger {\n font-size: larger;\n}\n.text-smaller {\n font-size: smaller;\n}\n\n/* Utility class to show/hide elements in PWA mode */\n.show-in-pwa {\n display: none !important;\n}\n.hide-in-pwa {\n display: var(--pwa-display-mode, block);\n}\n@media (display-mode: standalone), (display-mode: minimal-ui) {\n .show-in-pwa {\n display: var(--pwa-display-mode, block);\n }\n .hide-in-pwa {\n display: none !important;\n }\n}\n\n\n/** These are useful for things like buttons.\n * Default to 5em in size but are easily customised\n * using CSS variables.\n * @example\n * <button class=\"square\" style=\"--sq: 10em;\">Square</button>\n * <button class=\"round\" style=\"--dia: 10em;\">Round</button>\n * <button class=\"square\" style=\"--sq: 10em;--sqw: 20em;\">Rectangle</button>\n * <button class=\"round\" style=\"--dia: 10em;--roundw: 20em;\">Oval</button>\n */\n/* Make something square or rectangular. */\n.square {\n --sq: 5em;\n width: var(--sqw, var(--sq));\n height: var(--sqh, var(--sq));\n border-radius: calc(var(--sq) * 0.1);\n}\n/* Make something circular, oval or pill-shaped */\n.round {\n --dia: 5em;\n width: var(--roundw, var(--dia));\n height: var(--roundh, var(--dia));\n border-radius: var(--roundb, var(--dia));\n}\n\n/* Apply to headings where you want a sub-title */\n.with-subtitle {\n margin-bottom: 0;\n}\n/* Add the subtitle as a div with the Aria role */\n[role=\"doc-subtitle\"] {\n font-size: smaller;\n font-style: italic;\n margin-bottom: 1em;\n}\n\n.uppercase {\n text-transform: uppercase;\n}\n\n/* Visually hidden but still accessible to screen readers\n Use for skip links, form explanations, status updates\n otherwise not needed for sighted users.\n */\n.visually-hidden:not(:focus):not(:active) {\n /* Tab focusable elements will be visible when active */\n border: 0;\n clip-path: inset(100%);\n height: 1px;\n margin: 0;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n}\n/*#endregion ---- Utility ---- */\n\n/*#region -- Toasts/Notifications/Alerts - Readable pop-over notifications -- */\n\n.toaster {\n position:absolute; \n top:0; left:0;\n min-width:100vw; min-height:100vh; \n z-index: var(--z-toaster);\n -webkit-backdrop-filter: grayscale(60%) blur(10px);\n backdrop-filter: grayscale(60%) blur(10px);\n display:flex;\n flex-direction:column;\n\n --toast-x-position: center;\n --toast-y-position: center;\n\n align-items: var(--toast-x-position, center);\n justify-content: var(--toast-y-position, center);\n}\n.toast { /* Individual toast - only inside toaster if modal */\n background: var(--surface1);\n color: var(--text2);\n border: 4px solid var(--text3);\n border-radius: var(--border-radius);\n box-shadow: var(--shadow2);\n background-clip: border-box;\n box-sizing: border-box;\n min-width:50vw; max-width:50vw; max-height:50vh; overflow-y:auto;\n padding:1em; margin-bottom:.5em; margin-top:.5em;\n z-index: var(--z-toast);\n /* Allow for further positioning of the toast */\n position:relative;\n top:auto;left:auto;\n}\n/* .toast.alert {\n} */\n.toast-head > svg {\n width: 30px;\n background-color: var(--surface1);\n fill: var(--warning-intense);\n float: left;\n margin: .5em .8em 0.5em .1em;\n}\n.toast-head {\n font-weight: bold\n}\n.toast-body {\n clear: both;\n}\n\n/* Old settings\n.toaster {\n position:absolute; \n top:0; left:0; min-width:100vw; min-height:100vh; \n -webkit-backdrop-filter: grayscale(60%) blur(10px);\n backdrop-filter: grayscale(60%) blur(10px);\n display:flex; flex-direction:column; justify-content:center; align-items:center;\n z-index:998;\n}\n.toast {\n border: 4px solid var(--text3);\n border-radius: var(--border-radius);\n box-shadow: var(--shadow2);\n background-clip: border-box;\n box-sizing: border-box;\n min-width:50vw; max-width:50vw; max-height:50vh; overflow-y:auto;\n padding:1em; margin-bottom:.5em; margin-top:.5em;\n z-index:999;\n}\n.toast.alert {\n border: 4px solid var(--text3);\n border-radius: var(--border-radius);\n box-shadow: var(--shadow2);\n background-clip: border-box;\n box-sizing: border-box;\n min-width:50vw; max-width:50vw; max-height:50vh; overflow-y:auto; \n padding:1em; margin-bottom:.5em; margin-top:.5em;\n z-index:999;\n}\n.toast-head {font-weight:bold} */\n\n/*#endregion -- Toasts/Notifications/Alerts - Readable pop-over notifications -- */\n\n/*#region ---- Status Grid ---- */\n.status-grid {\n --status-grid-min: 14em;\n --status-grid-max: 1fr;\n --status-grid-gap: 0.5rem;\n display:grid;\n grid-template-columns: repeat(auto-fit, minmax(var(--status-grid-min), var(--status-grid-max)));\n gap: var(--status-grid-gap);\n list-style-position: inside;\n}\n.status-heading {\n grid-column: 1/-1;\n}\n.status-link {\n display:contents;\n color:inherit;\n text-decoration:none;\n}\n.status-side-panel {\n border-radius: 9999px;\n width: .5rem;\n height: 100%;\n background-color: var(--status-color, var(--surface1));\n}\n/*#endregion ---- ---- ---- */\n\n/*#region ---- Flex/Grid Layouts ---- */\n\n.grid {\n display:grid;\n gap:0.5rem;\n}\n.grid-2 {\n display:grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap:0.5rem;\n}\n.grid-3 {\n display:grid;\n grid-template-columns: repeat(3, minmax(0, 1fr));\n /* grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); */\n gap:0.5rem;\n}\n.grid-4 {\n display:grid;\n grid-template-columns: repeat(4, minmax(0, 1fr));\n gap:0.5rem;\n}\n.grid-fit {\n display: grid;\n gap: 0.5rem;\n grid-template-columns: repeat(auto-fit, minmax(min(var(--grid-fit-min), 100%), 1fr));\n}\n\n.flex {\n display: flex;\n gap:0.5rem;\n}\n.flex-wrap {\n display: flex;\n flex-wrap: wrap;\n gap:0.5rem;\n}\n\n/*#endregion ---- ---- ---- */\n\n/*#region for Syntax Highlighted pre's */\n#uib_last_msg_wrap {\n position:relative;\n}\n#uib_last_msg_wrap > button {\n display:none;\n position:absolute;\n color:hsl(0,0%,50%,.5);\n}\n#uib_last_msg_wrap:hover > button {\n display:initial;\n}\n#uib_last_msg_wrap > button:hover {\n color:hsl(0,0%,50%,1);\n}\n\n.syntax-highlight {\n color:white;\n display:block;\n background-color:black;\n padding:5px 10px;\n font-family: Consolas, \"ui-monospace\", \"Lucida Console\", monospace;\n font-size: smaller;\n white-space: pre;\n width: 99%;\n height: var(--syntax-highlight-height, 22em);\n overflow: auto;\n resize: both;\n}\n.syntax-highlight > .key {color:#ffbf35}\n.syntax-highlight > .string {color:#5dff39;}\n.syntax-highlight > .number {color:#70aeff;}\n.syntax-highlight > .boolean {color:#b993ff;}\n.syntax-highlight > .null {color:#93ffe4;}\n.syntax-highlight > .undefined {color:#ff93c9;}\n/*#endregion */\n\n/* #region ---- Information Overlay Panel ---- */\n\n#uib-info-overlay {\n --callout-color: var(--text2);\n --callout-bgcolor: var(--surface3);\n position: fixed;\n top: 0;\n left: 50%;\n transform: translateX(-50%);\n z-index: var(--z-info-overlay);\n max-width: 90vw;\n width: auto;\n min-width: 21em;\n padding: 0.5em;\n background-color: var(--surface5);\n border: 2px solid var(--surface5);\n}\n\n.uib-overlay-entry {\n background-color: var(--callout-bgcolor);\n border: 2px solid var(--callout-color);\n border-radius: var(--border-radius, 0.5em);\n box-shadow: 0 0 2px 2px var(--callout-color);\n padding: 1em;\n margin-bottom: 0.5rem;\n}\n\n.uib-overlay-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.uib-overlay-icon {\n font-size: 1.2em;\n}\n\n.uib-overlay-title {\n margin: 0;\n color: var(--callout-color);\n}\n\n.uib-overlay-dismiss {\n margin-left: auto;\n background: transparent;\n border: none;\n font-size: 1.5em;\n cursor: pointer;\n padding: 0.25rem;\n border-radius: 0;\n box-shadow: none;\n transition: background-color 0.2s;\n}\n.uib-overlay-dismiss:hover {\n background-color: var(--surface2) !important;\n}\n\n/* #endregion ---- Information Overlay Panel ---- */\n"],"names":[]}