diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f3c9331..a4a1b1b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,14 +3,14 @@ repos: rev: "0.0.2" hooks: - id: stylelint - files: assets/sass/.*\.scss$ + files: assets/css/.*\.css$ additional_dependencies: - - "stylelint@16.25.0" - - "stylelint-config-standard-scss@16.0.0" + - "stylelint@17.4.0" + - "stylelint-config-standard@40.0.0" - repo: https://github.com/biomejs/pre-commit - rev: "v2.3.5" + rev: "v2.4.6" hooks: - id: biome-check files: assets/js/.*\.js$ additional_dependencies: - - "@biomejs/biome@1.9.4" + - "@biomejs/biome@2.4.6" diff --git a/.stylelintrc.yaml b/.stylelintrc.yaml index 68b7d31..f21a46b 100644 --- a/.stylelintrc.yaml +++ b/.stylelintrc.yaml @@ -1,5 +1,5 @@ extends: - - stylelint-config-standard-scss + - stylelint-config-standard rules: alpha-value-notation: number block-no-empty: null @@ -19,17 +19,5 @@ rules: media-feature-range-notation: prefix no-descending-specificity: null selector-class-pattern: - - "^[a-z0-9\\-]+$" - - message: Selector should be written in lowercase with hyphens (selector-class-pattern) - scss/at-mixin-argumentless-call-parentheses: null - scss/comment-no-empty: null - scss/double-slash-comment-empty-line-before: - - always - - except: - - first-nested - ignore: - - between-comments - - stylelint-commands - - inside-block - scss/no-global-function-names: null - scss/percent-placeholder-pattern: null + - "^[a-z0-9\\-\\_]+$" + - message: Selector should be written in lowercase with hyphens or underscore (selector-class-pattern) diff --git a/README.md b/README.md index 7d73d8b..9abddb4 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ Quickstart a new site with the Zen theme by using the [Zen demo repo as a templa ## Table of contents +* [Version 6.x](#version-6x) * [Version 5.x](#version-5x) * [Version 4.x](#version-4x) * [Version 3.x](#version-3x) @@ -41,14 +42,19 @@ Quickstart a new site with the Zen theme by using the [Zen demo repo as a templa * [Podcast](#podcast) * [Shortcodes](#shortcodes) * [Content security policy headers](#Content-security-policy-headers) -* [Use npm to lint Sass and JavaScript](#use-npm-to-lint-sass-and-javascript) +* [Use npm to lint CSS and JavaScript](#use-npm-to-lint-css-and-javascript) * [Repository links](#repository-links) * [Math typesetting with KaTeX](#math-typesetting-with-katex) * [Getting help](#getting-help) * [Credits](#credits) -## Version 5.x +## Version 6.x 2026-03-10 + +* Converted from sass to modern vanilla css with nesting and layers. Please check [CSS Nesting | Can I use](https://caniuse.com/css-nesting) to see if you are comfortable with css nesting support in browsers before updating to v6. +* No changes to styles or templates so sites should look identical, if the browser support nesting. + +## Version 5.x 2025-03-26 * Minimum Hugo version is now v0.146.0. This plus the rearranged variables are the reasons for making this v5. * Rearranged a lot of variables. This will require some work to upgrade if you have customisations. I'm working towards using vanilla css only. @@ -69,14 +75,15 @@ Quickstart a new site with the Zen theme by using the [Zen demo repo as a templa 4. Update/remove/convert variables you overridden in projects `_extra.scss` so they match changes in themes `_variables.scss` and `_sass_variables.scss`. 5. If you have overridden templates you will need to use the new template structure in your root layout directory. -## Version 4.x + +## Version 4.x 2024-08-14 * Minimum Hugo version is now v0.124.0. This is the reason for making this v4. * Updated a number of things to remove all "WARN deprecated". * No other significant changes. -## Version 3.x +## Version 3.x 2023-04-04 * Implement modern CSS like flex, grid and variables throughout. * All sass variables now have a css variable version. All styles use the css variable version. @@ -113,7 +120,7 @@ Quickstart a new site with the Zen theme by using the [Zen demo repo as a templa 5. Replace sass variables with css variables, e.g. `$zen-gutters` with `var(--gutters)`. -## Version 2.x +## Version 2.x 2022-03-11 * Replaced "normalize" with slimmer and updated "reset". Removed everything for old IE versions. * Use of css4 variables. Colours are now used like this `var(--color-brand)`. @@ -136,7 +143,7 @@ Quickstart a new site with the Zen theme by using the [Zen demo repo as a templa * Contact form (PHP) * CSS grid and flex throughout * HTML5 -* Hugo Pipes for images, js and sass +* Hugo Pipes for images, js and css * Math typesetting with KaTeX * Micro.blog * Meta tags and JSON-LD @@ -150,7 +157,7 @@ Quickstart a new site with the Zen theme by using the [Zen demo repo as a templa ## Minimum Hugo version -Hugo Extended version 0.146.0 or higher is required. +Hugo version 0.146.0 or higher is required. ## Installation @@ -311,7 +318,6 @@ params: poweredby: true # Show powered by hugo in footer privacyPolicyUrl: "" # If set will add link to cookie consent form. relatedposts: true # Show related posts under a "See also" section, default false. - sassTranspiler: "dartsass"# The Sass transpiler to use, default "libsass". searchLimit: 20 # Max number of search hits, default 20. sidebar: true # Show a sidebar to the right, default false. siteName: false # Hide the site name (visually-hidden), default true. @@ -358,13 +364,11 @@ If you do not specify any sections in the "mainSections" param (see configuratio This is another part that almost everyone will like to customise. -They are found in the theme `assets/sass/_colors.scss`, `assets/sass/_variables.scss` and `assets/sass/_sass_variables.scss` files. You can copy them to the root `assets/sass/` directory to set your own values. +They are found in the theme `assets/css/_colors.css` and `assets/css/_variables.css` files. You can copy them to the root `assets/css/` directory to set your own values. -In most cases you likely only need to override a few values and then it is easier to set these in the extra and custom sass files. +In most cases you likely only need to override a few values and then it is easier to set these in the custom css files. -Root `assets/sass/_extra.scss`: Loaded first so use to override sass variables only. - -Root `assets/sass/_custom.scss`: Loaded last so use to override css variables and add any custom styles you need. +Root `assets/css/_custom.css`: Loaded last so use to override css variables and add any custom styles you need. ### Logo @@ -409,20 +413,20 @@ They are set up in `layouts/partials/menu.html`, `layouts/partials/mobilmenu.htm Modern CSS grid is the easiest and cleanest way to layout your pages. -The CSS grid layout are in `assets/sass/layouts/_layouts.scss`. A lot can be done by just reordering "grid-template-rows". +The CSS grid layout are in `assets/css/layouts/_layouts.css`. A lot can be done by just reordering "grid-template-rows". ### Other styles and scripts Styles and scripts are processed with Hugo pipes that was added in Hugo 0.46. -To customise a js or sass file, copy it to the root assets directory and edit it there. Make sure to maintain the directory structure inside the assets/sass directory. +To customise a js or css file, copy it to the root assets directory and edit it there. Make sure to maintain the directory structure inside the assets/css directory. -There is an `assets/sass/_custom.scss` file meant for your custom styles. Copy it to the root `assets/sass/_custom.scss` to use it. +There is an `assets/css/_custom.css` file meant for your custom styles. Copy it to the root `assets/css/_custom.css` to use it. -The default styles in `assets/sass/_zen.scss` are boring but functional. You can easily override them completely by placing an empty file named "_zen.scss" in root assets/sass directory. +The default styles in `assets/css/_zen.css` are boring but functional. You can easily override them completely by placing an empty file named "_zen.css" in root assets/css directory. -The sass files are by default built for production, compressed with fingerprint. +The css files are by default built for production, compressed with fingerprint. By setting the Hugo environment variable to "development" (default when running `hugo server`) they will instead be nested with sourcemaps. @@ -825,9 +829,9 @@ The **content** that should be wrapped. Some more content. Includes tracking code for Matomo or Google in a way that supports Content security policy headers. Read more in my blog post [Content security policy headers when using Matomo or Google analytics](https://xdeb.org/post/2020/01/14/content-security-policy-headers-when-using-matomo-or-google-analytics/). -## Use npm to lint Sass and JavaScript +## Use npm to lint CSS and JavaScript -* Lint your Sass using stylelint. +* Lint your CSS using stylelint. * Lint your JavaScript using biome. * Can lint files in the theme as well as the project assets directory. @@ -839,7 +843,7 @@ Node.js software you need. To install them run: npm install -3. Run the following commands to lint your theme and projects Sass and JavaScript code. +3. Run the following commands to lint your theme and projects CSS and JavaScript code. npm run lint-theme npm run lint-project diff --git a/assets/css/_colors.css b/assets/css/_colors.css new file mode 100644 index 0000000..8a8836b --- /dev/null +++ b/assets/css/_colors.css @@ -0,0 +1,99 @@ +/* Theme colours. */ + +/* Override css variables in "assets/css/_custom.css" */ + +@layer vars { + :root { + /* Base colours. */ + --color-black: oklch(1% 0.01 0); + --color-nearblack: oklch(25% 0.01 0); + --color-grey-700: oklch(38% 0 0); + --color-grey-600: oklch(49% 0 0); + --color-grey-500: oklch(60% 0 0); + --color-grey-400: oklch(71% 0 0); + --color-grey-300: oklch(80% 0 0); + --color-grey-200: oklch(89% 0 0); + --color-grey-100: oklch(95% 0 0); + --color-nearwhite: oklch(98% 0 0); + --color-white: oklch(100% 0 0); + --color-red: oklch(65% 0.2 24); + --color-yellow: oklch(65% 0.12 80); + --color-green: oklch(65% 0.19 138); + --color-blue: oklch(65% 0.16 247); + + /* Transparent colours. */ + --color-black-60: oklch(0% 0 0 / 0.6); + --color-black-40: oklch(0% 0 0 / 0.4); + --color-black-20: oklch(0% 0 0 / 0.2); + --color-black-10: oklch(0% 0 0 / 0.1); + --color-white-20: oklch(100% 0 0 / 0.2); + --color-white-10: oklch(100% 0 0 / 0.1); + + /* Brand colours. */ + --color-brand: var(--color-nearblack); + --color-brand-alt: var(--color-grey-500); + --color-brand-light: var(--color-grey-300); + --color-brand-dark: var(--color-grey-700); + + /* Text colours. */ + --color-text: var(--color-black); + --color-text-bg: var(--color-white); + --color-text-meta: var(--color-grey-600); + --color-headings: var(--color-nearblack); + --color-code: var(--color-nearblack); + + /* Link colours. */ + --color-link: var(--color-brand); + --color-link-visited: var(--color-brand); + --color-link-hover: var(--color-brand-alt); + --color-link-active: var(--color-red); + --color-link-inverted: var(--color-white); + --color-link-visited-inverted: var(--color-white); + --color-link-hover-inverted: var(--color-white); + --color-link-active-inverted: var(--color-red); + + /* Button colours. */ + --color-button: var(--color-brand); + --color-button-hover: var(--color-brand-alt); + --color-button-text: var(--color-white); + --color-button-text-hover: var(--color-white); + --color-button-disabled: var(--color-grey-400); + + /* Border colours. */ + --color-border: var(--color-brand); + --color-border-light: var(--color-brand-light); + --color-border-dark: var(--color-brand-dark); + + /* Background colours. */ + --color-header-bg: var(--color-white); + --color-body-bg: var(--color-white); + --color-footer-bg: var(--color-white); + --color-backdrop: var(--color-grey-100); + + /* Mobil menu colours. */ + --color-mobile-menu: var(--color-brand); + --color-mobile-menu-cover: var(--color-black-20); + + /* Form colours. */ + --color-accent: var(--color-brand); + + /* Row (e.g. in table) colours. */ + --color-row-header: transparent; + --color-row-odd: var(--color-nearwhite); + --color-row-even: transparent; + + /* Status colours. */ + --color-info: var(--color-blue); + --color-info-bg: oklch(from var(--color-blue) 100% 0.03 h); + --color-success: var(--color-green); + --color-success-bg: oklch(from var(--color-green) 100% 0.03 h); + --color-warning: var(--color-yellow); + --color-warning-bg: oklch(from var(--color-yellow) 100% 0.03 h); + --color-error: var(--color-red); + --color-error-bg: oklch(from var(--color-red) 100% 0.03 h); + + /* Highlight colours. */ + --color-highlight: var(--color-brand-alt); + --color-mark-highlight: var(--color-red); + } +} diff --git a/assets/sass/_custom.scss b/assets/css/_custom.css similarity index 100% rename from assets/sass/_custom.scss rename to assets/css/_custom.css diff --git a/assets/sass/_fonts.scss b/assets/css/_fonts.css similarity index 89% rename from assets/sass/_fonts.scss rename to assets/css/_fonts.css index 72a5712..e8dd1fa 100644 --- a/assets/sass/_fonts.scss +++ b/assets/css/_fonts.css @@ -25,4 +25,10 @@ used in any ruleset using a property like this: font-family: Example, serif; font-style: normal; font-display: swap; } + +The fonts layer is loaded early to minimize front-end performance impact. */ + +@layer fonts { +/* Add your fonts here. */ +} diff --git a/assets/css/_variables.css b/assets/css/_variables.css new file mode 100644 index 0000000..5b7b4c2 --- /dev/null +++ b/assets/css/_variables.css @@ -0,0 +1,125 @@ +@layer vars { + :root { + /* Set theme css variables. + Override css variables in "assets/css/_custom.css" */ + + /* The max content width. (Consider using one of the breakpoints.) */ + --max-content-width: 1111px; + + /* The max page width. Defaults to max-content-width. + Setting this to a larger value than max-content-width allows + content with class "stretch" to stretch out to the page edge. */ + --max-page-width: var(--max-content-width); + + /* Base line height, unitless. */ + --base-line-height: 1.5; + + /* Heading line height, unitless. */ + --heading-line-height: 1.3; + + /* The font size set on the root html element. + Specify unitless, it will be recalculated as %. */ + --base-font-size: 18; + + /* Font sizes. */ + --fs-xxxxl: clamp(2.4881rem, calc(1.8896rem + 2.9924vw), 4.2088rem); + --fs-xxxl: clamp(2.0738rem, calc(1.6968rem + 1.8848vw), 3.1575rem); + --fs-xxl: clamp(1.7281rem, calc(1.5053rem + 1.1141vw), 2.3688rem); + --fs-xl: clamp(1.44rem, calc(1.3228rem + 0.5859vw), 1.7769rem); + --fs-l: clamp(1.2rem, calc(1.1537rem + 0.2315vw), 1.3331rem); + --fs-m: 1rem; + --fs-s: 0.889rem; + --fs-xs: 0.778rem; + + /* Modern font stacks. See how they look at https://modernfontstacks.com/. + + The following font family declarations use widely available fonts. + A user's web browser will look at the comma-separated list and will + attempt to use each font in turn until it finds one that is available + on the user's computer. The final "generic" font (sans-serif, serif or + monospace) hints at what type of font to use if the web browser doesn't + find any of the fonts in the list. */ + + /* stylelint-disable value-keyword-case */ + + /* Emojis font stack. Add to end of other stacks when needed. */ + --emojis: 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + + /* System-ui font stack. */ + --system-ui: system-ui, sans-serif; + + /* Serif font stacks. */ + --ui-serif: ui-serif, Charter, 'Bitstream Charter', 'Sitka Text', Cambria, serif; + --transitional: Charter, 'Bitstream Charter', 'Sitka Text', Cambria, serif; + --old: 'Iowan Old Style', 'Palatino Linotype', 'URW Palladio L', P052, serif; + --slab: Rockwell, 'Rockwell Nova', 'Roboto Slab', 'DejaVu Serif', 'Sitka Small', serif; + --antique: Superclarendon, 'Bookman Old Style', 'URW Bookman', 'URW Bookman L', 'Georgia Pro', Georgia, serif; + --didone: Didot, 'Bodoni MT', 'Noto Serif Display', 'URW Palladio L', P052, Sylfaen, serif; + + /* Sans-serif font stacks. */ + --ui-sans-serif: ui-sans-serif, system-ui, sans-serif; + --humanist: Seravek, 'Gill Sans Nova', Ubuntu, Calibri, 'DejaVu Sans', source-sans-pro, sans-serif; + --geometric: Avenir, Montserrat, Corbel, 'URW Gothic', source-sans-pro, sans-serif; + --classical: Optima, Candara, 'Noto Sans', source-sans-pro, sans-serif; + --neo: Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Nimbus Sans', Arial, sans-serif; + --industrial: Bahnschrift, 'DIN Alternate', 'Franklin Gothic Medium', 'Nimbus Sans Narrow', sans-serif-condensed, sans-serif; + --futura: Futura, Montserrat, Corbel, 'URW Gothic', source-sans-pro, sans-serif; + + /* Rounded Sans-serif font stacks. */ + --ui-rounded: ui-rounded, 'Hiragino Maru Gothic ProN', Quicksand, Comfortaa, Manjari, 'Arial Rounded MT', 'Arial Rounded MT Bold', Calibri, source-sans-pro, sans-serif; + + /* Monospace font stacks. */ + --ui-monospace: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace; + /* stylelint-enable value-keyword-case */ + + /* Font family. */ + --ff-body: var(--ui-serif); + --ff-headings: var(--ui-sans-serif); + --ff-alt: var(--system-ui); + --ff-monospace: var(--ui-monospace); + + /* Font weights. */ + --fw-headings: 700; + --fw-bolder: 900; + --fw-bold: 700; + --fw-medium: 500; + --fw-normal: 400; + --fw-light: 300; + --fw-lighter: 200; + + /* Spacing. + Generates mt--m (mt = margin-top), mb--m (mb = margin-bottom) and + mx--m (mx = margin-block) classes. */ + --spacing-xxl: calc(3rem * var(--base-line-height)); + --spacing-xl: calc(2rem * var(--base-line-height)); + --spacing-l: calc(1.5rem * var(--base-line-height)); + --spacing-m: calc(1rem * var(--base-line-height)); + --spacing-s: calc(0.75rem * var(--base-line-height)); + --spacing-xs: calc(0.5rem * var(--base-line-height)); + --spacing-xxs: calc(0.3rem * var(--base-line-height)); + + /* Border radius. */ + --radius-xl: 1rem; + --radius-l: 0.75rem; + --radius-m: 0.5rem; + --radius-s: 0.3rem; + --radius-xs: 0.125rem; + + /* Breakout amount. + How much should the "breakout" be. Defaults to same as gutters value. */ + --breakout: calc(5px + 1.5625vw); + + /* The left/right gutter/padding. */ + --gutters: calc(5px + 1.5625vw); + --gutters-reverse: calc(0px - (5px + 1.5625vw)); + + /* The amount lists, blockquotes and comments are indented. */ + --indent-amount: 2rem; + + /* The max line width for readability. */ + --max-line-width: 70ch; + + /* The pt font-size to be used for printing. */ + --print-font-size: 12pt; + } +} diff --git a/assets/css/_zen.css b/assets/css/_zen.css new file mode 100644 index 0000000..6945f17 --- /dev/null +++ b/assets/css/_zen.css @@ -0,0 +1,207 @@ +/* Zen custom styles */ + +@layer zen { + /* Page */ + + body { + background-color: var(--color-backdrop); + } + + .page { + background-color: var(--color-body-bg); + } + + .footer { + border-block-start: 2px solid var(--color-border); + } + + /* Apply smaller text to blocks, footer etc. */ + + th, + label, + legend, + figcaption { + font-size: var(--fs-s); + } + + .language-selector, + .footer { + font-size: var(--fs-xs); + } + + /* Apply heading font stack and colour to labels etc. */ + + th, + label, + legend, + .main-menu, + .header, + .footer { + color: var(--color-headings); + font-family: var(--ff-headings); + } + + th, + label { + font-weight: var(--fw-headings); + } + + /* Article and content. */ + + article, + aside { + & > ul { + display: table; + list-style: none; + padding: 0; + + & > li { + display: table-row; + + &::before { + padding-inline-end: var(--spacing-xs); + display: table-cell; + content: '\2981'; + font-size: var(--fs-s); + } + } + } + + & > ol { + display: table; + list-style: none; + padding: 0; + + & > li { + display: table-row; + counter-increment: table-ol; + + &::before { + padding-inline-end: var(--spacing-xs); + display: table-cell; + content: counter(table-ol) '.'; + font-size: var(--fs-s); + text-align: end; + } + } + } + } + + article { + .submitted, + .tags { + @media (min-width: 666px) { + display: inline-block; + padding-inline-end: 1rem; + } + } + + code { + font-size: var(--fs-xs); + overflow-wrap: break-word; + } + + pre { + border-radius: var(--radius-xs); + padding: 5px; + border: 1px solid var(--color-border-light); + background-color: var(--color-text-bg); + overflow: auto; + max-height: 300px; + + &.chroma { + max-height: initial; + overflow-x: scroll; + } + + & > code { + display: inline-block; + white-space: pre; + } + } + } + + .content-dates { + text-align: end; + } + + .repository-links { + justify-content: end; + align-items: center; + + svg { + order: 1; + } + } + + /* Navigation */ + + .main-menu { + a { + display: block; + background-color: var(--color-button); + color: var(--color-button-text); + padding: 2px 8px; + text-decoration: none; + + &:hover, + &:focus { + background-color: var(--color-button-hover); + } + + &:active, + &[aria-current] { + text-decoration: underline; + } + } + } + + /* Search */ + + .search-text { + font-size: var(--fs-l); + } + + /* Copy code */ + + [data-codeblock] { + position: relative; + + & > pre { + padding-block-start: 1lh; + } + } + + .codebutton { + position: absolute; + inset-inline-end: 1rem; + background: unset; + border: unset; + text-shadow: unset; + font-size: var(--fs-l); + color: var(--color-border); + rotate: 90deg; + cursor: pointer; + + & > span { + pointer-events: none; + } + + &:hover, + &:focus-visible, + &:active { + scale: 1.15; + } + } + + .flash-item { + animation: --flash 500ms ease-in-out 1ms; + } + + @keyframes --flash { + 50% { + border-color: var(--color-warning); + background-color: var(--color-warning-bg); + } + } +} diff --git a/assets/css/base/_document.css b/assets/css/base/_document.css new file mode 100644 index 0000000..6a8726d --- /dev/null +++ b/assets/css/base/_document.css @@ -0,0 +1,22 @@ +/* Document */ + +@layer base { + html { + /* Change the default font family in all browsers. */ + font-family: var(--ff-body); + + /* Set base font size in percent. */ + font-size: calc(var(--base-font-size) / 16 * 100%); + + /* Set text colour. */ + color: var(--color-text); + } + + body { + /* Correct the line height in all browsers. */ + line-height: var(--base-line-height); + + /* Accent colour for forms. */ + accent-color: var(--color-accent); + } +} diff --git a/assets/css/base/_forms.css b/assets/css/base/_forms.css new file mode 100644 index 0000000..ae3b2e1 --- /dev/null +++ b/assets/css/base/_forms.css @@ -0,0 +1,89 @@ +/* Form defaults. */ + +@layer base { + form { + /* Add vertical rhythm margins. */ + margin-block: 0 var(--spacing-m); + } + + input, + textarea, + select { + margin-block: 0 var(--spacing-m); + } + + label { + font-weight: var(--fw-bold); + + /* Display as block if before input. */ + &:has(+ input), + &:has(+ textarea){ + display: block; + } + + /* Mark field as required if needed. */ + &:has(+ :required) { + &::after { + content: '*'; + color: var(--color-mark-highlight); + } + } + } + + /* Valid and invalid state. */ + input, + textarea { + &:user-valid { + border-color: var(--color-success); + border-style: solid; + background-color: var(--color-success-bg); + } + + &:focus:user-valid { + border-color: transparent; + } + + &:user-invalid { + border-color: var(--color-error); + border-style: solid; + background-color: var(--color-error-bg); + } + + &:focus:user-invalid { + border-color: transparent; + background-color: var(--color-warning-bg); + } + } + + /* Set max text line width for readability. */ + input, + label, + textarea, + select { + max-width: var(--max-line-width); + } + + fieldset { + border: 1px solid var(--color-border); + } + + /* Make field where you enter more info a bit wider. */ + [type='email'], + [type='password'], + [type='range'], + [type='search'], + [type='url'] { + width: min(20em, 100%); + } + + /* Make field where you enter more info a bit wider. */ + [type='text'], + textarea { + width: min(30em, 100%); + } + + /* Make sure textareas without a rows attribute are not tiny. */ + textarea:not([rows]) { + min-height: 7lh; + } +} diff --git a/assets/css/base/_grouping.css b/assets/css/base/_grouping.css new file mode 100644 index 0000000..2a4f24a --- /dev/null +++ b/assets/css/base/_grouping.css @@ -0,0 +1,107 @@ +/* Grouping content */ + +@layer base { + /* Block quotes */ + + blockquote { + /* Add vertical rhythm margins. */ + margin-block: 0 var(--spacing-m); + + /* Nicer text wrap, e.g. no lone word on last line. */ + text-wrap: pretty; + + /* Also indent the quote on both sides. */ + margin-inline: var(--indent-amount); + + /* Set max text line width in main for readability. */ + max-width: var(--max-line-width); + } + + /* Lists */ + + dl, + ol, + ul, + menu { + /* Add vertical rhythm margins. */ + margin-block: 0 var(--spacing-m); + } + + dt { + font-weight: var(--fw-bold); + } + + dd { + margin: 0; + margin-inline-start: var(--indent-amount); + + /* Nicer text wrap, e.g. no lone word on last line. */ + text-wrap: pretty; + } + + ol, + ul, + menu { + padding: 0; + padding-inline-start: var(--indent-amount); + + /* Turn off margins on nested lists. */ + ol, + ul, + menu { + margin: 0; + } + } + + li { + /* Nicer text wrap, e.g. no lone word on last line. */ + text-wrap: pretty; + + /* Set max text line width in main for readability. */ + .main & { + max-width: var(--max-line-width); + } + } + + /* Horizontal rule */ + + hr { + /* Add vertical rhythm margins. */ + margin-block: var(--spacing-m); + border: 0; + border-block-start: 1px solid var(--color-border); + height: 0; + } + + /* Paragraphs */ + + p { + /* Add vertical rhythm margins. */ + margin-block: 0 var(--spacing-m); + + /* Nicer text wrap, e.g. no lone word on last line. */ + text-wrap: pretty; + + /* Set max text line width in main for readability. */ + .main & { + max-width: var(--max-line-width); + } + } + + /* Preformatted text */ + + pre { + /* Add vertical rhythm margins. */ + margin-block: 0 var(--spacing-m); + font-family: var(--ff-monospace); + } + + /* Code */ + + /* Do not set colour for code with syntax highlighting. */ + code:not([data-lang]), + kbd, + samp { + color: var(--color-code); + } +} diff --git a/assets/css/base/_headings.css b/assets/css/base/_headings.css new file mode 100644 index 0000000..c52b09a --- /dev/null +++ b/assets/css/base/_headings.css @@ -0,0 +1,59 @@ +/* Headings + +All HTML headings, `

` through `

`, are available. */ + +@layer base { + h1, + h2, + h3, + h4, + h5, + h6 { + margin-block: 1.5em .5em; + color: var(--color-headings); + font-family: var(--ff-headings); + font-weight: var(--fw-headings); + line-height: var(--heading-line-height); + text-wrap: balance; + + /* Smaller margin when a headeing is right after another heading. */ + & + & { + margin-block-start: .75em; + } + + /* Set max text line width in main for readability. */ + .main & { + max-width: var(--max-line-width); + } + } + + h1 { + /* h1 only on top of page so different margins. */ + margin-block-start: var(--spacing-m); + margin-block-end: var(--spacing-xs); + font-size: var(--fs-xxl); + letter-spacing: -.01em; + } + + h2 { + font-size: var(--fs-xl); + letter-spacing: -.01em; + } + + h3 { + font-size: var(--fs-l); + letter-spacing: -.01em; + } + + h4 { + font-size: var(--fs-m); + } + + h5 { + font-size: var(--fs-s); + } + + h6 { + font-size: var(--fs-xs); + } +} diff --git a/assets/css/base/_images.css b/assets/css/base/_images.css new file mode 100644 index 0000000..aea8e6b --- /dev/null +++ b/assets/css/base/_images.css @@ -0,0 +1,89 @@ +/* Figure and image. */ + +@layer base { + figure, + img { + &.image { + --image-padding: .75rem; + + @media (min-width: 666px) { + &.center { + margin-inline: auto; + } + + &.left { + padding-inline-end: var(--image-padding); + padding-block-end: var(--image-padding); + margin: 0; + float: left; + clear: both; + } + + &.right { + padding-inline-start: var(--image-padding); + padding-block-end: var(--image-padding); + margin: 0; + float: right; + clear: both; + } + } + } + } + + figure { + /* Add vertical rhythm margins. */ + margin-block: 0 var(--spacing-m); + + &.image { + figcaption { + padding-block-start: var(--image-padding); + contain: inline-size; + + /* Set max text line width in main for readability. */ + max-width: var(--max-line-width); + + /* Nicer text wrap, e.g. no lone word on last line. */ + text-wrap: pretty; + + @media (min-width: 666px) { + padding-block-start: 0; + } + + p { + margin: 0; + } + } + + @media (min-width: 666px) { + inline-size: fit-content; + + &.left { + figcaption { + padding-inline-end: var(--image-padding); + padding-block-end: var(--image-padding); + } + } + + &.right { + figcaption { + padding-inline-start: var(--image-padding); + padding-block-end: var(--image-padding); + } + } + } + } + + &.podcast { + audio { + width: 95%; + } + } + } + + img { + &.image { + /* Add vertical rhythm margins. */ + margin-block: 0 var(--spacing-m); + } + } +} diff --git a/assets/css/base/_links.css b/assets/css/base/_links.css new file mode 100644 index 0000000..db60d7b --- /dev/null +++ b/assets/css/base/_links.css @@ -0,0 +1,81 @@ +/* Links + +Hyperlinks are used to allow the user to navigate to other resources or to +download a resource. + +The order of link states are based on Eric Meyer's article: +http://meyerweb.com/eric/thoughts/2007/06/11/who-ordered-the-link-states + +:visited - A link that has already been visited. +:hover - A link that is being hovered over. +:focus - A link that has been given keyboard focus. +:active - A link that is being actively clicked. */ + +@layer base { + a { + color: var(--color-link); + } + + /* Any element can receive focus, but only links can be visited, so we can + safely lower this selector's specificity. This also ensures visited links + with additional styles won't have their styles overridden. */ + :visited { + color: var(--color-link-visited); + } + + a:hover, + a:focus { + color: var(--color-link-hover); + } + + a:active { + color: var(--color-link-active); + } + + /* Remove underline from links to current page to */ + /* indicate that there is no need to click on it. */ + [aria-current] { + text-decoration: none; + } + + /* Use smooth scrolling unless user prefer less motion. */ + @media (prefers-reduced-motion: no-preference) { + :has(:target) { + scroll-behavior: smooth; + scroll-padding-block-start: var(--gutters); + } + } + + .link-nav { + a { + text-decoration: none; + + &:hover, + &:focus { + text-decoration: underline; + } + } + } + + /* Inverted links, for dark backgrounds. */ + .link-inverted { + a { + &:link { + color: var(--color-link-inverted); + } + + &:visited { + color: var(--color-link-visited-inverted); + } + + &:hover, + &:focus { + color: var(--color-link-hover-inverted); + } + + &:active { + color: var(--color-link-active-inverted); + } + } + } +} diff --git a/assets/css/base/_tables.css b/assets/css/base/_tables.css new file mode 100644 index 0000000..7c3bc29 --- /dev/null +++ b/assets/css/base/_tables.css @@ -0,0 +1,34 @@ +/* Tables */ + +@layer base { + table { + /* Add vertical rhythm margins. */ + margin-block: 0 var(--spacing-m); + + /* Remove default spacing between table cells. */ + border-collapse: collapse; + + /* Prevent cramped-looking tables */ + width: 100%; + } + + td, + th { + /* Remove most spacing between table cells. */ + padding: 0; + + /* Align content to top of cells. */ + vertical-align: text-top; + } + + th { + /* Align content to bottom of headers. */ + vertical-align: bottom; + } + + caption, + th { + /* Align all text the same. */ + text-align: start; + } +} diff --git a/assets/css/components/_anchor.css b/assets/css/components/_anchor.css new file mode 100644 index 0000000..d0209d6 --- /dev/null +++ b/assets/css/components/_anchor.css @@ -0,0 +1,36 @@ +/* Anchor */ + +@layer components { + .anchor { + --anchor-gap: .5rem; + --anchor-opacity: .4; + + display: grid; + grid-template-columns: auto auto; + justify-content: start; + align-items: baseline; + gap: var(--anchor-gap); + + a { + opacity: 0; + text-decoration: none; + width: fit-content; + } + + &:has(:focus-visible), + &:hover { + a { + opacity: var(--anchor-opacity); + + &:focus-visible, + &:hover { + opacity: 1; + } + } + } + } + + p:has(+ .anchor) { + margin-block-end: 0; + } +} diff --git a/assets/css/components/_box.css b/assets/css/components/_box.css new file mode 100644 index 0000000..8303bbb --- /dev/null +++ b/assets/css/components/_box.css @@ -0,0 +1,66 @@ +/* Box */ + +@layer components { + .box { + /* Add vertical rhythm margins. */ + margin-block: var(--spacing-m); + padding: var(--spacing-xs); + border: 5px solid var(--color-border); + + .box__title, + .title { + margin-block-start: 0; + } + + & > * { + &:first-child { + margin-block-start: 0; + } + + &:last-child { + margin-block-end: 0; + } + } + } + + .box--highlight { + border-color: var(--color-highlight); + } + + .box--fit { + width: fit-content; + } + + .box--gutter { + padding-inline: var(--gutters); + } + + .box--inverted { + background: var(--color-border); + color: var(--color-text-bg); + + /* Make sure headings etc. also gets inverted. */ + * { + color: var(--color-text-bg); + } + + a { + &:link { + color: var(--color-link-inverted); + } + + &:visited { + color: var(--color-link-visited-inverted); + } + + &:hover, + &:focus { + color: var(--color-link-hover-inverted); + } + + &:active { + color: var(--color-link-active-inverted); + } + } + } +} diff --git a/assets/css/components/_button.css b/assets/css/components/_button.css new file mode 100644 index 0000000..f042297 --- /dev/null +++ b/assets/css/components/_button.css @@ -0,0 +1,109 @@ +/* stylelint-disable no-duplicate-selectors */ + +/* Button */ + +@layer components { + .button, + [type='button'], + [type='submit'] { + /* Some styles don't apply to links since they are inline elements by default. */ + display: inline-block; + font-family: var(--ff-headings); + text-decoration: none; + text-align: center; + width: fit-content; + padding: .2rem 1rem; + + /* Improve usability and consistency of cursor style between image-type `input` and others. */ + cursor: pointer; + color: var(--color-button-text); + text-shadow: var(--color-button) 0 1px 0; + background: linear-gradient(var(--color-button), var(--color-button-hover)); + border: 1px solid var(--color-button-hover); + border-radius: var(--radius-s); + + &:hover, + &:focus-visible, + &:active { + /* Override any link underlines and color changes. */ + text-decoration: none; + color: var(--color-button-text-hover); + text-shadow: var(--color-button-hover) 0 1px 0; + background: linear-gradient(var(--color-button-hover), var(--color-button)); + } + + &:active { + box-shadow: inset 2px 2px 5px var(--color-black-40); + } + } + + .button--small { + font-size: var(--fs-xs); + padding: .2rem .75rem; + } + + .button--alt { + color: var(--color-button-text-hover); + background: var(--color-button-hover); + + &:hover, + &:focus-visible, + &:active { + color: var(--color-button-text); + background: var(--color-button); + } + } + + .button--outline { + color: var(--color-button); + background: var(--color-button-text); + } + + .button--accept { + border-color: var(--color-success); + } + + .button--decline { + border-color: var(--color-warning); + } + + /* The disabled variation should always go last, so that it overrides any + other variations. */ + .button, + [type='button'], + [type='submit'] { + &:disabled { + background-color: var(--color-grey-200); + border: 1px solid var(--color-button-disabled); + background-image: none; + text-shadow: none; + cursor: default; + color: var(--color-button-disabled); + + &:hover, + &:focus, + &:active { + /* Override any link underlines and color changes. */ + color: var(--color-button-disabled); + text-decoration: none; + } + } + } + + /* For forms with multiple fields show submit button below the form. */ + input:not(:only-of-type), + textarea { + & + [type='submit'] { + display: block; + } + } + + /* For forms on mobile with single field add space between it and the submit button. */ + @media (min-width: 666px) { + input:only-of-type { + &:has(+ [type='submit']) { + margin-inline-end: .5rem; + } + } + } +} diff --git a/assets/css/components/_cards.css b/assets/css/components/_cards.css new file mode 100644 index 0000000..0b4982d --- /dev/null +++ b/assets/css/components/_cards.css @@ -0,0 +1,70 @@ +/* Cards + +A simple cards style. */ + +@layer components { + .cards { + --grid-group-column-min: 200px; + --grid-group-gap: 1.5rem; + + display: grid; + gap: var(--grid-group-gap); + + grid-template-columns: repeat(auto-fit, minmax(min(var(--grid-group-column-min), 100%), 1fr)); + + /* Add vertical rhythm margins. */ + margin-block: var(--spacing-m); + } + + .card { + padding: var(--spacing-xs); + border: 1px solid var(--color-border); + + & > * { + &:first-child { + margin-block-start: 0; + } + + &:last-child { + margin-block-end: 0; + } + } + } + + .card--highlight { + border-color: var(--color-highlight); + } + + .card--featured { + grid-row: span 2; + grid-column: span 2; + } + + .card--gutter { + padding-inline: var(--gutters); + } + + .card--inverted { + background: var(--color-border); + color: var(--color-text-bg); + + a { + &:link { + color: var(--color-link-inverted); + } + + &:visited { + color: var(--color-link-visited-inverted); + } + + &:hover, + &:focus { + color: var(--color-link-hover-inverted); + } + + &:active { + color: var(--color-link-active-inverted); + } + } + } +} diff --git a/assets/css/components/_center.css b/assets/css/components/_center.css new file mode 100644 index 0000000..555904d --- /dev/null +++ b/assets/css/components/_center.css @@ -0,0 +1,14 @@ +@layer components { + .grid-center { + display: grid; + place-items: center; + } + + .text-center { + text-align: center; + } + + .margin-center { + margin-inline: auto; + } +} diff --git a/assets/css/components/_clearfix.css b/assets/css/components/_clearfix.css new file mode 100644 index 0000000..bfd86b4 --- /dev/null +++ b/assets/css/components/_clearfix.css @@ -0,0 +1,19 @@ +/* Clearfix + +Allows the bottom of an element to extend to the bottom of all floated child +elements. See http://nicolasgallagher.com/micro-clearfix-hack/ */ + +@layer components { + .clearfix { + &::before { + content: ''; + display: table; + } + + &::after { + content: ''; + display: table; + clear: both; + } + } +} diff --git a/assets/css/components/_cookieconsent.css b/assets/css/components/_cookieconsent.css new file mode 100644 index 0000000..249fa09 --- /dev/null +++ b/assets/css/components/_cookieconsent.css @@ -0,0 +1,34 @@ +/* Cookieconsent */ + +@layer components { + .cookieconsent { + display: flex; + flex-flow: wrap; + justify-content: center; + gap: .5rem; + position: sticky; + bottom: 0; + width: 100%; + padding: var(--spacing-xs); + color: var(--color-warning); + background-color: var(--color-warning-bg); + border-block-start: 4px solid var(--color-warning); + font-size: var(--fs-s); + transform: translateY(100vh); + transition: all 130ms ease-out; + z-index: 99; + + .cookieconsent__actions { + display: flex; + gap: .5rem; + } + + &[hidden] { + display: none; + } + } + + [data-cookieconsentopen] { + transform: translateY(0); + } +} diff --git a/assets/css/components/_disabled.css b/assets/css/components/_disabled.css new file mode 100644 index 0000000..8c25ab9 --- /dev/null +++ b/assets/css/components/_disabled.css @@ -0,0 +1,15 @@ +@layer components { + .disabled { + /* Re-set default cursor for disabled elements. */ + cursor: default; + color: var(--color-button-disabled); + + &:hover, + &:focus, + &:active { + /* Override any link underlines and color changes. */ + color: var(--color-button-disabled); + text-decoration: none; + } + } +} diff --git a/assets/sass/components/flex-group/_flex-group.scss b/assets/css/components/_flex-group.css similarity index 57% rename from assets/sass/components/flex-group/_flex-group.scss rename to assets/css/components/_flex-group.css index 3737e28..68175f1 100644 --- a/assets/sass/components/flex-group/_flex-group.scss +++ b/assets/css/components/_flex-group.css @@ -1,42 +1,43 @@ -.flex-group, -%flex-group { - --flex-gap: calc(var(--base-line-height) * 1rem); +@layer components { + .flex-group { + --flex-gap: calc(var(--base-line-height) * 1rem); - display: flex; - gap: var(--flex-gap); - flex-wrap: wrap; + display: flex; + gap: var(--flex-gap); + flex-wrap: wrap; - & > * { - flex: 1; + & > * { + flex: 1; + } } @media (min-width: 666px) { - &--2 > * { + .flex-group--2 > * { flex-basis: calc(100% / 2 - var(--flex-gap)); flex-grow: 0; } - &--3 > * { + .flex-group--3 > * { flex-basis: calc(100% / 3 - var(--flex-gap)); flex-grow: 0; } - &--4 > * { + .flex-group--4 > * { flex-basis: calc(100% / 4 - var(--flex-gap)); flex-grow: 0; } - &--5 > * { + .flex-group--5 > * { flex-basis: calc(100% / 5 - var(--flex-gap)); flex-grow: 0; } - &--6 > * { + .flex-group--6 > * { flex-basis: calc(100% / 6 - var(--flex-gap)); flex-grow: 0; } - &--grow > * { + .flex-group--grow > * { flex-grow: 1; } } diff --git a/assets/css/components/_flex-inline.css b/assets/css/components/_flex-inline.css new file mode 100644 index 0000000..f6de006 --- /dev/null +++ b/assets/css/components/_flex-inline.css @@ -0,0 +1,20 @@ +@layer components { + .flex-inline { + --flex-inline-gap: .5rem; + + display: flex; + flex-wrap: wrap; + gap: var(--flex-inline-gap); + padding: 0; + text-align: start; + + .flex-inline__item, + li { + list-style: none; + } + } + + .flex-inline--inline { + display: inline-flex; + } +} diff --git a/assets/css/components/_footer.css b/assets/css/components/_footer.css new file mode 100644 index 0000000..996ecfe --- /dev/null +++ b/assets/css/components/_footer.css @@ -0,0 +1,13 @@ +/* Branding footer */ + +@layer components { + .footer { + padding-block: var(--gutters); + background-color: var(--color-footer-bg); + text-align: center; + + p { + margin: 0; + } + } +} diff --git a/assets/css/components/_grid-group.css b/assets/css/components/_grid-group.css new file mode 100644 index 0000000..654d3b5 --- /dev/null +++ b/assets/css/components/_grid-group.css @@ -0,0 +1,51 @@ +@layer components { + .grid-group { + --grid-group-column-min: 200px; + --grid-group-gap: 1.5rem; + + display: grid; + gap: var(--grid-group-gap); + + grid-template-columns: repeat(auto-fit, minmax(min(var(--grid-group-column-min), 100%), 1fr)); + } + + .grid-group--fill { + grid-template-columns: repeat(auto-fill, minmax(min(var(--grid-group-column-min), 100%), 1fr)); + } + + .grid-group--100 { + --grid-group-column-min: 100px; + } + + .grid-group--150 { + --grid-group-column-min: 150px; + } + + .grid-group--200 { + --grid-group-column-min: 200px; + } + + .grid-group--250 { + --grid-group-column-min: 250px; + } + + .grid-group--300 { + --grid-group-column-min: 300px; + } + + .grid-group--350 { + --grid-group-column-min: 350px; + } + + .grid-group--400 { + --grid-group-column-min: 400px; + } + + .grid-group--500 { + --grid-group-column-min: 500px; + } + + .grid-group--600 { + --grid-group-column-min: 600px; + } +} diff --git a/assets/css/components/_grid-stack.css b/assets/css/components/_grid-stack.css new file mode 100644 index 0000000..509a477 --- /dev/null +++ b/assets/css/components/_grid-stack.css @@ -0,0 +1,10 @@ +@layer components { + .grid-stack { + display: grid; + + & > * { + grid-column: 1 / 2; + grid-row: 1 / 2; + } + } +} diff --git a/assets/css/components/_header.css b/assets/css/components/_header.css new file mode 100644 index 0000000..398f02c --- /dev/null +++ b/assets/css/components/_header.css @@ -0,0 +1,55 @@ +/* Branding header */ + +@layer components { + .header { + --header-gap: var(--spacing-s); + + padding-block: min(var(--gutters), var(--spacing-m)); + display: flex; + flex-direction: column; + gap: var(--header-gap); + background-color: var(--color-header-bg); + + @media (min-width: 666px) { + flex-direction: row; + align-items: center; + } + + /* Wrapping link for logo. */ + .header__logo { + width: fit-content; + } + + /* Logo image. */ + .header__logo-image { + vertical-align: bottom; + } + + /* The name of the website. */ + .header__site-name { + margin: 0; + line-height: 1; + } + + /* The link around the name of the website. */ + .header__site-link { + &:link, + &:visited { + color: var(--color-text); + text-decoration: none; + } + + &:hover, + &:focus { + text-decoration: underline; + } + } + + /* Wrapper for any blocks placed in the header region. */ + .header__region { + @media (min-width: 666px) { + margin-inline-start: auto; + } + } + } +} diff --git a/assets/sass/components/hidden/_hidden.scss b/assets/css/components/_hidden.css similarity index 71% rename from assets/sass/components/hidden/_hidden.scss rename to assets/css/components/_hidden.css index c693bff..2f720b1 100644 --- a/assets/sass/components/hidden/_hidden.scss +++ b/assets/css/components/_hidden.css @@ -9,21 +9,20 @@ from a user. For anything you want to hide on page load when JavaScript is enabled, use the `.js-hidden` class. */ -.hidden, -%hidden { - display: none; -} - -.js-hidden, -%js-hidden { - html.js & { +@layer components { + .hidden { display: none; } -} -.nojs-hidden, -%nojs-hidden { - html.nojs & { - display: none; + .js-hidden { + html.js & { + display: none; + } + } + + .nojs-hidden { + html.nojs & { + display: none; + } } } diff --git a/assets/css/components/_icon-inline.css b/assets/css/components/_icon-inline.css new file mode 100644 index 0000000..26b0b2b --- /dev/null +++ b/assets/css/components/_icon-inline.css @@ -0,0 +1,28 @@ +/* Inline icons. */ + +@layer components { + .icon-inline { + .icon-link { + opacity: 0; + transition: all 130ms ease-in; + text-decoration: none; + } + + &:focus-visible, + &:hover { + .icon-link { + opacity: .3; + + &:focus-visible, + &:hover { + opacity: 1; + } + } + } + + svg { + display: inline; + vertical-align: middle; + } + } +} diff --git a/assets/css/components/_language-selector.css b/assets/css/components/_language-selector.css new file mode 100644 index 0000000..b647aa2 --- /dev/null +++ b/assets/css/components/_language-selector.css @@ -0,0 +1,12 @@ +/* Language selector */ + +@layer components { + .language-selector { + display: flex; + } + + .language-icon { + margin-inline-end: var(--spacing-xs); + fill: var(--color-text); + } +} diff --git a/assets/css/components/_list-straight-left.css b/assets/css/components/_list-straight-left.css new file mode 100644 index 0000000..d05948a --- /dev/null +++ b/assets/css/components/_list-straight-left.css @@ -0,0 +1,54 @@ +/* Lists with a straight left margin. */ + +@layer components { + .ul-straight-left { + display: table; + list-style: none; + padding: 0; + + & > li { + display: table-row; + + &::before { + padding-inline-end: var(--spacing-xs); + display: table-cell; + content: '\2981'; + font-size: var(--fs-s); + } + } + } + + .ol-straight-left { + display: table; + list-style: none; + padding: 0; + + & > li { + display: table-row; + counter-increment: table-ol; + + &::before { + padding-inline-end: var(--spacing-xs); + display: table-cell; + content: counter(table-ol) '.'; + font-size: var(--fs-s); + text-align: end; + } + } + } + + .ul-straight-left--off { + display: block; + list-style: inherit; + + & > li { + display: list-item; + + &::before { + content: ''; + display: inline; + padding: inherit; + } + } + } +} diff --git a/assets/css/components/_messages.css b/assets/css/components/_messages.css new file mode 100644 index 0000000..30d91a9 --- /dev/null +++ b/assets/css/components/_messages.css @@ -0,0 +1,44 @@ +/* Messages */ + +@layer components { + .message { + padding: .5rem; + outline-width: 2px; + outline-style: solid; + width: 95%; + + &.success { + background-color: var(--color-success-bg); + color: var(--color-success); + outline-color: var(--color-success); + } + + &.info { + background-color: var(--color-info-bg); + color: var(--color-info); + outline-color: var(--color-info); + } + + &.warning { + background-color: var(--color-warning-bg); + color: var(--color-warning); + outline-color: var(--color-warning); + } + + &.error { + background-color: var(--color-error-bg); + color: var(--color-error); + outline-color: var(--color-error); + } + } + + .message--highlight { + animation: 2s ease-in-out infinite --outline-highlight; + } + + @keyframes --outline-highlight { + 50% { + outline-width: .3rem; + } + } +} diff --git a/assets/css/components/_meta.css b/assets/css/components/_meta.css new file mode 100644 index 0000000..19a3137 --- /dev/null +++ b/assets/css/components/_meta.css @@ -0,0 +1,9 @@ +/* Style for meta content. */ + +@layer components { + .meta { + font-family: var(--ff-headings); + font-size: var(--fs-xs); + color: var(--color-text-meta); + } +} diff --git a/assets/css/components/_overlay.css b/assets/css/components/_overlay.css new file mode 100644 index 0000000..f83a972 --- /dev/null +++ b/assets/css/components/_overlay.css @@ -0,0 +1,7 @@ +@layer components { + .overlay { + --color-overlay: var(--color-black-20); + --color-overlay2: var(--color-black-10); + border-image: linear-gradient(var(--color-overlay), var(--color-overlay2)) fill 1; + } +} diff --git a/assets/css/components/_pager.css b/assets/css/components/_pager.css new file mode 100644 index 0000000..e173a71 --- /dev/null +++ b/assets/css/components/_pager.css @@ -0,0 +1,58 @@ +/* Pager + +Paged navigation is a list of page numbers when more than 1 page of content +is available. */ + +@layer components { + .pagination, + .pager { + --flex-inline-gap: .5rem; + + display: flex; + flex-wrap: wrap; + gap: var(--flex-inline-gap); + padding: 0; + text-align: start; + + /* Add vertical rhythm margins. */ + margin-block: var(--spacing-m); + justify-content: center; + + a { + text-decoration: none; + + &:hover, + &:focus { + text-decoration: underline; + } + } + + .pager__item, + .page-link { + padding-inline: 2px; + } + + .page-item { + } + + .active { + font-weight: var(--fw-bold); + } + + .disabled { + .page-link { + /* Re-set default cursor for disabled elements. */ + cursor: default; + color: var(--color-button-disabled); + + &:hover, + &:focus, + &:active { + /* Override any link underlines and color changes. */ + color: var(--color-button-disabled); + text-decoration: none; + } + } + } + } +} diff --git a/assets/css/components/_responsive-video.css b/assets/css/components/_responsive-video.css new file mode 100644 index 0000000..0d95d07 --- /dev/null +++ b/assets/css/components/_responsive-video.css @@ -0,0 +1,32 @@ +/* Responsive video + +Using a wrapper div, embedded videos can be made responsive so that their +intrinsic aspect ratio is preserved at any screen width. The +`responsive-video__embed` class is optional if the embed is an `iframe`. + +.responsive-video--4-3 - A video with a 4:3 aspect ratio instead of the +default 16:9 one. */ + +@layer components { + .responsive-video { + --aspect-ratio: 9 / 16; /* 16:9 aspect ratio */ + + position: relative; + padding-block-end: calc(var(--aspect-ratio) * 100%); /* 16:9 aspect ratio */ + padding-block-start: 25px; /* Height of video controls */ + height: 0; + + iframe, + .responsive-video__embed { + position: absolute; + inset-block-start: 0; + inset-inline-start: 0; + width: 100%; + height: 100%; + } + } + + .responsive-video--4-3 { + --aspect-ratio: 3 / 4; /* 4:3 aspect ratio */ + } +} diff --git a/assets/css/components/_spacing.css b/assets/css/components/_spacing.css new file mode 100644 index 0000000..bdf6f6e --- /dev/null +++ b/assets/css/components/_spacing.css @@ -0,0 +1,97 @@ +@layer components { + .mt--xxl { + margin-block-start: var(--spacing-xxl); + } + + .mt--xl { + margin-block-start: var(--spacing-xl); + } + + .mt--l { + margin-block-start: var(--spacing-l); + } + + .mt--m { + margin-block-start: var(--spacing-m); + } + + .mt--s { + margin-block-start: var(--spacing-s); + } + + .mt--xs { + margin-block-start: var(--spacing-xs); + } + + .mt--xxs { + margin-block-start: var(--spacing-xxs); + } + + .mt--0 { + margin-block-start: 0; + } + + .mb--xxl { + margin-block-end: var(--spacing-xxl); + } + + .mb--xl { + margin-block-end: var(--spacing-xl); + } + + .mb--l { + margin-block-end: var(--spacing-l); + } + + .mb--m { + margin-block-end: var(--spacing-m); + } + + .mb--s { + margin-block-end: var(--spacing-s); + } + + .mb--xs { + margin-block-end: var(--spacing-xs); + } + + .mb--xxs { + margin-block-end: var(--spacing-xxs); + } + + .mb--0 { + margin-block-end: 0; + } + + .mx--xxl { + margin-block: var(--spacing-xxl); + } + + .mx--xl { + margin-block: var(--spacing-xl); + } + + .mx--l { + margin-block: var(--spacing-l); + } + + .mx--m { + margin-block: var(--spacing-m); + } + + .mx--s { + margin-block: var(--spacing-s); + } + + .mx--xs { + margin-block: var(--spacing-xs); + } + + .mx--xxs { + margin-block: var(--spacing-xxs); + } + + .mx--0 { + margin-block: 0; + } +} diff --git a/assets/css/components/_tables.css b/assets/css/components/_tables.css new file mode 100644 index 0000000..11909d9 --- /dev/null +++ b/assets/css/components/_tables.css @@ -0,0 +1,61 @@ +@layer components { + .zebra-table { + --table-cell-padding: .5rem; + + @media (max-width: 666px) { + --table-cell-padding: .3rem; + } + + th, + td { + padding: var(--table-cell-padding); + } + + thead { + tr { + background-color: var(--color-row-header); + } + } + + tbody { + tr { + &:nth-child(odd) { + background-color: var(--color-row-odd); + } + + &:nth-child(even) { + background-color: var(--color-row-even); + } + } + } + } + + .responsive-table { + --table-gap: .5rem; + + @media (max-width: 666px) { + th { + display: none; + } + + td { + display: grid; + gap: var(--table-gap); + grid-template-columns: 12ch auto; + + &::before { + content: attr(aria-label) ':'; + font-weight: var(--fw-bold); + } + + &:first-of-type { + padding-block-start: var(--table-gap); + } + + &:last-of-type { + padding-block-end: var(--table-gap); + } + } + } + } +} diff --git a/assets/css/components/_tags.css b/assets/css/components/_tags.css new file mode 100644 index 0000000..8ead6b1 --- /dev/null +++ b/assets/css/components/_tags.css @@ -0,0 +1,7 @@ +@layer components { + .tags { + ul { + margin-block: 0; + } + } +} diff --git a/assets/css/components/_visually-hidden.css b/assets/css/components/_visually-hidden.css new file mode 100644 index 0000000..5c2500a --- /dev/null +++ b/assets/css/components/_visually-hidden.css @@ -0,0 +1,17 @@ +/* Visually hidden + +Make an element visually hidden, but accessible to screen readers, etc. */ + +@layer components { + .visually-hidden { + &:not(:focus, :active) { + position: absolute; + clip-path: inset(50%); + height: 1px; + width: 1px; + margin: 0; + overflow: hidden; + white-space: nowrap; + } + } +} diff --git a/assets/css/components/_wrap.css b/assets/css/components/_wrap.css new file mode 100644 index 0000000..19a3803 --- /dev/null +++ b/assets/css/components/_wrap.css @@ -0,0 +1,9 @@ +@layer components { + .wrap-any { + overflow-wrap: anywhere; + } + + .wrap-word { + overflow-wrap: break-word; + } +} diff --git a/assets/css/layers-init.css b/assets/css/layers-init.css new file mode 100644 index 0000000..5d4d48a --- /dev/null +++ b/assets/css/layers-init.css @@ -0,0 +1 @@ +@layer reset, fonts, vars, base, layout, components, mobilemenu, print, zen; diff --git a/assets/sass/layouts/_layouts.scss b/assets/css/layouts/_layouts.css similarity index 60% rename from assets/sass/layouts/_layouts.scss rename to assets/css/layouts/_layouts.css index 24042c3..e7b0abb 100644 --- a/assets/sass/layouts/_layouts.scss +++ b/assets/css/layouts/_layouts.css @@ -1,8 +1,8 @@ /* stylelint-disable no-duplicate-selectors */ -/* Initial layout setup. */ -.layout { - &__page { +@layer layout { + /* Initial layout setup. */ + .layout__page { max-width: var(--max-page-width); @media (min-width: 666px) { @@ -12,71 +12,60 @@ } } - &__header, - &__footer, - &__main, - &__navigation, - &__first-sidebar, - &__second-sidebar, - &__page-top, - &__page-bottom, - &__cookieconsent { + .layout__header, + .layout__footer, + .layout__main, + .layout__navigation, + .layout__first-sidebar, + .layout__second-sidebar, + .layout__page-top, + .layout__page-bottom, + .layout__cookieconsent { padding-inline: var(--gutters); min-width: 0; /* With display grid defaults to auto, making
 overflow. */
   }
-}
 
-/* If page width is bigger then content with, */
+  /* If page width is bigger then content with, */
+  .layout__navigation > * {
+    max-width: var(--max-content-width);
 
-/* setup grid with breakout and stretch for main section. */
-@if $max-page-width > $max-content-width {
-  .layout {
-    &__navigation > * {
-      max-width: var(--max-content-width);
-
-      @media (min-width: 666px) {
-        margin-inline: auto;
-      }
-    }
-
-    &__main,
-    &__grid {
-      display: grid;
-
-      /* Writing "Min" instead of "min" to force use of css "min()" instead of sass "min()". */
-      /* stylelint-disable function-name-case */
-      grid-template-columns:
-        [stretch-start] minmax(var(--gutters), 1fr)
-        [breakout-start] minmax(0, var(--breakout))
-        [content-start] Min(calc(100% - var(--gutters) * 2), var(--max-content-width)) [content-end]
-        minmax(0, var(--breakout)) [breakout-end]
-        minmax(var(--gutters), 1fr) [stretch-end];
-      /* stylelint-enable function-name-case */
-
-      padding-inline: 0;
-
-      /* Stop content in main from stretching. */
-      height: fit-content;
-
-      & > :not(.breakout, .stretch) {
-        grid-column: content;
-      }
-
-      & > .breakout {
-        grid-column: breakout;
-      }
-
-      & > .stretch {
-        grid-column: stretch;
-        padding-inline: var(--gutters);
-      }
+    @media (min-width: 666px) {
+      margin-inline: auto;
     }
   }
-}
 
-/* Setup template areas/rown/columns for page. */
-.layout {
-  &__page {
+  .layout__main,
+  .layout__grid {
+    display: grid;
+
+    grid-template-columns:
+      [stretch-start] minmax(var(--gutters), 1fr)
+      [breakout-start] minmax(0, var(--breakout))
+      [content-start] min(calc(100% - var(--gutters) * 2), var(--max-content-width)) [content-end]
+      minmax(0, var(--breakout)) [breakout-end]
+      minmax(var(--gutters), 1fr) [stretch-end];
+
+    padding-inline: 0;
+
+    /* Stop content in main from stretching. */
+    height: fit-content;
+
+    & > :not(.breakout, .stretch) {
+      grid-column: content;
+    }
+
+    & > .breakout {
+      grid-column: breakout;
+    }
+
+    & > .stretch {
+      grid-column: stretch;
+      padding-inline: var(--gutters);
+    }
+  }
+
+  /* Setup template areas/rown/columns for page. */
+  .layout__page {
     display: grid;
     grid-template-areas: 'head'
                          'nav'
@@ -100,7 +89,7 @@
   }
 
   @media (min-width: 999px) {
-    &__page {
+    .layout__page {
       grid-template-rows: auto
                           auto
                           auto
@@ -110,7 +99,7 @@
                           auto;
     }
 
-    &__sidebar-first {
+    .layout__sidebar-first {
       grid-template-areas: 'head head'
                            'nav nav'
                            'side1 top'
@@ -122,7 +111,7 @@
                              2fr;
     }
 
-    &__sidebar-second {
+    .layout__sidebar-second {
       grid-template-areas: 'head head'
                            'nav nav'
                            'top side2'
@@ -134,7 +123,7 @@
                              1fr;
     }
 
-    &__sidebar-two {
+    .layout__sidebar-two {
       grid-template-areas: 'head head head'
                            'nav nav nav'
                            'side1 top side2'
@@ -148,39 +137,39 @@
     }
   }
 
-  &__header {
+  .layout__header {
     grid-area: head;
   }
 
-  &__navigation {
+  .layout__navigation {
     grid-area: nav;
   }
 
-  &__page-top {
+  .layout__page-top {
     grid-area: top;
   }
 
-  &__main {
+  .layout__main {
     grid-area: main;
   }
 
-  &__first-sidebar {
+  .layout__first-sidebar {
     grid-area: side1;
   }
 
-  &__second-sidebar {
+  .layout__second-sidebar {
     grid-area: side2;
   }
 
-  &__page-bottom {
+  .layout__page-bottom {
     grid-area: bottom;
   }
 
-  &__footer {
+  .layout__footer {
     grid-area: foot;
   }
 
-  &__cookieconsent {
+  .layout__cookieconsent {
     grid-area: notice;
   }
 }
diff --git a/assets/sass/mobilemenu.scss b/assets/css/mobilemenu.css
similarity index 76%
rename from assets/sass/mobilemenu.scss
rename to assets/css/mobilemenu.css
index 3f68c3d..ed4122f 100644
--- a/assets/sass/mobilemenu.scss
+++ b/assets/css/mobilemenu.css
@@ -1,31 +1,32 @@
 /* The mobile navigation stylesheet for this theme. */
 
-@import 'init';
+@layer mobilemenu {
+  .mobile-nav {
+    position: absolute;
+    right: 0;
+    top: 0;
+    width: 100vw;
+    height: 100vh;
+    overflow: hidden;
+    font-family: var(--ff-headings);
+    z-index: 20;
+    pointer-events: none;
 
-.mobile-nav {
-  position: absolute;
-  right: 0;
-  top: 0;
-  width: 100vw;
-  height: 100vh;
-  overflow: hidden;
-  font-family: var(--ff-headings);
-  z-index: 20;
-  pointer-events: none;
+    &[data-navopen] {
+      position: fixed;
+    }
 
-  &[data-navopen] {
-    position: fixed;
+    .language-icon {
+      fill: var(--color-text-bg);
+    }
   }
 
-  .language-icon {
-    fill: var(--color-text-bg);
-  }
-
-  &__cover {
+  .mobile-nav__cover {
     position: absolute;
     width: 100vw;
     height: 100vh;
     background-color: var(--color-mobile-menu-cover);
+    backdrop-filter: blur(3px);
     opacity: 0;
 
     [data-navopen] & {
@@ -34,7 +35,7 @@
     }
   }
 
-  &__toggle {
+  .mobile-nav__toggle {
     display: flex;
     align-items: center;
     position: absolute;
@@ -54,7 +55,7 @@
     }
   }
 
-  &__hamburger {
+  .mobile-nav__hamburger {
     fill: var(--color-button-text);
     width: 1.6rem;
     margin-inline-start: .1rem;
@@ -86,7 +87,7 @@
     }
   }
 
-  &__sheet {
+  .mobile-nav__sheet {
     visibility: hidden;
     background-color: var(--color-mobile-menu);
     width: 90vw;
@@ -103,13 +104,13 @@
     }
   }
 
-  &__region {
+  .mobile-nav__region {
     &:not(:empty) {
       margin-block-end: .5rem;
     }
   }
 
-  &__navbar {
+  .mobile-nav__navbar {
     display: flex;
     flex-direction: column;
     padding-inline-start: 0;
@@ -125,10 +126,10 @@
     }
   }
 
-  &__cover,
-  &__toggle,
-  &__hamburger > rect,
-  &__sheet {
+  .mobile-nav__cover,
+  .mobile-nav__toggle,
+  .mobile-nav__hamburger > rect,
+  .mobile-nav__sheet {
     /* Add some transitions unless user prefer less motion. */
     @media (prefers-reduced-motion: no-preference) {
       transition: all 130ms ease-in;
diff --git a/assets/sass/print.scss b/assets/css/print.css
similarity index 82%
rename from assets/sass/print.scss
rename to assets/css/print.css
index 0894c24..d8f6e1d 100644
--- a/assets/sass/print.scss
+++ b/assets/css/print.css
@@ -1,17 +1,14 @@
 /* The print stylesheet for this theme. */
 
-@import 'init';
+@layer print {
+  .pager,
+  .mobile-nav,
+  aside,
+  nav,
+  footer {
+    display: none;
+  }
 
-.pager,
-%pager,
-.mobile-nav,
-aside,
-nav,
-footer {
-  display: none;
-}
-
-@media print {
   html {
     font-size: var(--print-font-size);
   }
diff --git a/assets/css/reset/_reset.css b/assets/css/reset/_reset.css
new file mode 100644
index 0000000..389a1c7
--- /dev/null
+++ b/assets/css/reset/_reset.css
@@ -0,0 +1,105 @@
+/* stylelint-disable property-no-vendor-prefix */
+
+/* Reset browsers to some sane defaults. */
+
+@layer reset {
+  /* Document */
+
+  /* Use the saner border-box model for all elements. */
+  *,
+  *::before,
+  *::after {
+    box-sizing: border-box;
+  }
+
+  :root {
+    /* Activate transition to intrinsic sizes like auto and fit-content. */
+    interpolate-size: allow-keywords;
+  }
+
+  /* Transitioning page view. */
+  @view-transition {
+    navigation: auto;
+  }
+
+  html {
+    /* Prevent adjustments of font size. */
+    -webkit-text-size-adjust: none;
+    text-size-adjust: none;
+
+    /* Improve text rendering. */
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+  }
+
+  /* Sections */
+
+  body {
+    /* Remove the margin in all browsers. */
+    margin: 0;
+    padding: 0;
+
+    /* On short pages, we want the body to fill the entire height */
+    /* of the browser. */
+    min-height: 100vh;
+  }
+
+  /* Embedded content */
+
+  img,
+  svg,
+  picture,
+  audio,
+  video,
+  canvas,
+  iframe,
+  embed,
+  object {
+    display: block;
+  }
+
+  img,
+  svg,
+  video {
+    max-width: 100%;
+    height: auto;
+  }
+
+  figure {
+    margin-inline: 0;
+  }
+
+  /* Form defaults. */
+
+  input,
+  button,
+  textarea,
+  select {
+    font: inherit;
+    letter-spacing: inherit;
+    word-spacing: inherit;
+  }
+
+  [type='search'] {
+    @media (min-width: 666px) {
+      /* Correct the odd appearance in Safari on desktop. */
+      -webkit-appearance: textfield;
+    }
+  }
+
+  /* Code */
+
+  code,
+  kbd,
+  samp {
+    font-family: var(--ff-monospace);
+  }
+
+  /* Numbers */
+
+  td,
+  math,
+  time[datetime*=':'] {
+    font-variant-numeric: tabular-nums lining-nums;
+  }
+}
diff --git a/assets/sass/_colors.scss b/assets/sass/_colors.scss
deleted file mode 100644
index 0be1474..0000000
--- a/assets/sass/_colors.scss
+++ /dev/null
@@ -1,97 +0,0 @@
-/* Theme colours. */
-
-/* Override css variables in "assets/sass/_custom.scss" */
-
-:root {
-  /* Base colours. */
-  --color-black:                  oklch(1% 0.01 0);
-  --color-nearblack:              oklch(25% 0.01 0);
-  --color-grey-700:               oklch(38% 0 0);
-  --color-grey-600:               oklch(49% 0 0);
-  --color-grey-500:               oklch(60% 0 0);
-  --color-grey-400:               oklch(71% 0 0);
-  --color-grey-300:               oklch(80% 0 0);
-  --color-grey-200:               oklch(89% 0 0);
-  --color-grey-100:               oklch(95% 0 0);
-  --color-nearwhite:              oklch(98% 0 0);
-  --color-white:                  oklch(100% 0 0);
-  --color-red:                    oklch(65% 0.2 24);
-  --color-yellow:                 oklch(65% 0.12 80);
-  --color-green:                  oklch(65% 0.19 138);
-  --color-blue:                   oklch(65% 0.16 247);
-
-  /* Transparent colours. */
-  --color-black-60:               oklch(0% 0 0 / 0.6);
-  --color-black-40:               oklch(0% 0 0 / 0.4);
-  --color-black-20:               oklch(0% 0 0 / 0.2);
-  --color-black-10:               oklch(0% 0 0 / 0.1);
-  --color-white-20:               oklch(100% 0 0 / 0.2);
-  --color-white-10:               oklch(100% 0 0 / 0.1);
-
-  /* Brand colours. */
-  --color-brand:                  var(--color-nearblack);
-  --color-brand-alt:              var(--color-grey-500);
-  --color-brand-light:            var(--color-grey-300);
-  --color-brand-dark:             var(--color-grey-700);
-
-  /* Text colours. */
-  --color-text:                   var(--color-black);
-  --color-text-bg:                var(--color-white);
-  --color-text-meta:              var(--color-grey-600);
-  --color-headings:               var(--color-nearblack);
-  --color-code:                   var(--color-nearblack);
-
-  /* Link colours. */
-  --color-link:                   var(--color-brand);
-  --color-link-visited:           var(--color-brand);
-  --color-link-hover:             var(--color-brand-alt);
-  --color-link-active:            var(--color-red);
-  --color-link-inverted:          var(--color-white);
-  --color-link-visited-inverted:  var(--color-white);
-  --color-link-hover-inverted:    var(--color-white);
-  --color-link-active-inverted:   var(--color-red);
-
-  /* Button colours. */
-  --color-button:                 var(--color-brand);
-  --color-button-hover:           var(--color-brand-alt);
-  --color-button-text:            var(--color-white);
-  --color-button-text-hover:      var(--color-white);
-  --color-button-disabled:        var(--color-grey-400);
-
-  /* Border colours. */
-  --color-border:                 var(--color-brand);
-  --color-border-light:           var(--color-brand-light);
-  --color-border-dark:            var(--color-brand-dark);
-
-  /* Background colours. */
-  --color-header-bg:              var(--color-white);
-  --color-body-bg:                var(--color-white);
-  --color-footer-bg:              var(--color-white);
-  --color-backdrop:               var(--color-grey-100);
-
-  /* Mobil menu colours. */
-  --color-mobile-menu:            var(--color-brand);
-  --color-mobile-menu-cover:      var(--color-black-20);
-
-  /* Form colours. */
-  --color-accent:                 var(--color-brand);
-
-  /* Row (e.g. in table) colours. */
-  --color-row-header:             transparent;
-  --color-row-odd:                var(--color-nearwhite);
-  --color-row-even:               transparent;
-
-  /* Status colours. */
-  --color-info:                   var(--color-blue);
-  --color-info-bg:                oklch(from var(--color-blue) 100% 0.03 h);
-  --color-success:                 var(--color-green);
-  --color-success-bg:              oklch(from var(--color-green) 100% 0.03 h);
-  --color-warning:                var(--color-yellow);
-  --color-warning-bg:             oklch(from var(--color-yellow) 100% 0.03 h);
-  --color-error:                  var(--color-red);
-  --color-error-bg:               oklch(from var(--color-red) 100% 0.03 h);
-
-  /* Highlight colours. */
-  --color-highlight:              var(--color-brand-alt);
-  --color-mark-highlight:         var(--color-red);
-}
diff --git a/assets/sass/_extra.scss b/assets/sass/_extra.scss
deleted file mode 100644
index bd1ebca..0000000
--- a/assets/sass/_extra.scss
+++ /dev/null
@@ -1 +0,0 @@
-/* Add and override variables. This file loads last during init. */
diff --git a/assets/sass/_init.scss b/assets/sass/_init.scss
deleted file mode 100644
index 0991865..0000000
--- a/assets/sass/_init.scss
+++ /dev/null
@@ -1,15 +0,0 @@
-/* Initialization partial
-
-To make it easier to use all variables and mixins in any Sass file in this
-project, each .scss file has a `@import 'init';` declaration. The _init.scss
-file is in charge of importing all the other partials needed for the
-project. */
-
-/* Variables. */
-@import 'sass_variables';
-@import 'extra';
-
-/* Mixins and functions. */
-@import 'mixins/breakpoint/respond-to';
-@import 'mixins/flex-calc/flex-calc';
-@import 'mixins/spacing/spacing';
diff --git a/assets/sass/_sass_variables.scss b/assets/sass/_sass_variables.scss
deleted file mode 100644
index bc75b77..0000000
--- a/assets/sass/_sass_variables.scss
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Variables
-These need to be sass variables since they are used in sass functions and mixins.
-Override sass variables in "assets/sass/_extra.scss" */
-
-/* Base line height, unitless. */
-$base-line-height: 1.5;
-
-/* The font sizes in our type hierarchy as tee shirt sizes.
-Size m is base.
-Use like this: var(--fs-m) */
-$font-size-fixed: (
-  xxxxl:      3rem,
-  xxxl:       2.5rem,
-  xxl:        2rem,
-  xl:         1.5rem,
-  l:          1.25rem,
-  m:          1rem,
-  s:          0.889rem,
-  xs:         0.778rem,
-);
-
-/* The responsive font sizes in our type hierarchy as tee shirt sizes.
-Size m is base.
-Use like this: var(--fs-m) */
-$font-size-fluid: (
-  xxxxl:      clamp(2.4881rem, calc(1.8896rem + 2.9924vw), 4.2088rem),
-  xxxl:       clamp(2.0738rem, calc(1.6968rem + 1.8848vw), 3.1575rem),
-  xxl:        clamp(1.7281rem, calc(1.5053rem + 1.1141vw), 2.3688rem),
-  xl:         clamp(1.44rem, calc(1.3228rem + 0.5859vw), 1.7769rem),
-  l:          clamp(1.2rem, calc(1.1537rem + 0.2315vw), 1.3331rem),
-  m:          1rem,
-  s:          0.889rem,
-  xs:         0.778rem,
-);
-
-/* Set the font sizes to use, fixed or fluid. */
-$font-size: $font-size-fixed;
-
-/* Breakpoints (Deprecated in v5, use css @media directly instead.)
-Use the `respond-to(s)` mixin to use named breakpoints. */
-$breakpoints: (
-  'xxxl':     1222px,
-  'xxl':      1111px,
-  'xl':       999px,
-  'l':        888px,
-  'm':        777px,
-  's':        666px,
-  'xs':       555px,
-  'xxs':      444px,
-  'xxxs':     333px,
-);
-
-/* Spacing (Deprecated in v5, use spacing css variables instead.)
-$spacing: (
-  xxl:        3,
-  xl:         2,
-  l:          1.5,
-  m:          1,
-  s:          0.75,
-  xs:         0.5,
-  xxs:        0.3,
-  0:          0,
-);
-
-/* The max content width. (Consider using one of the breakpoints.) */
-$max-content-width: 1111px;
-
-/* The max page width. Defaults to max-content-width.
-Setting this to a larger value than max-content-width allows
-content with class "stretch" to stretch out to the page edge. */
-$max-page-width: $max-content-width;
diff --git a/assets/sass/_variables.scss b/assets/sass/_variables.scss
deleted file mode 100644
index 3b98ae6..0000000
--- a/assets/sass/_variables.scss
+++ /dev/null
@@ -1,115 +0,0 @@
-:root {
-  /* Convert sass variables to css variables. */
-
-  @each $name, $size in $font-size {
-    --fs-#{$name}: #{$size};
-  }
-
-  --max-content-width: #{$max-content-width};
-  --max-page-width: #{$max-page-width};
-
-  /* Base line height, unitless. */
-  --base-line-height: #{$base-line-height};
-
-
-  /* Set theme css variables.
-  Override css variables in "assets/sass/_custom.scss" */
-
-  /* Heading line height, unitless. */
-  --heading-line-height: 1.3;
-
-  /* The font size set on the root html element.
-  Specify unitless, it will be recalculated as %. */
-  --base-font-size: 18;
-
-  /* Modern font stacks. See how they look at https://modernfontstacks.com/.
-
-  The following font family declarations use widely available fonts.
-  A user's web browser will look at the comma-separated list and will
-  attempt to use each font in turn until it finds one that is available
-  on the user's computer. The final "generic" font (sans-serif, serif or
-  monospace) hints at what type of font to use if the web browser doesn't
-  find any of the fonts in the list. */
-
-  /* stylelint-disable value-keyword-case */
-
-  /* Emojis font stack. Add to end of other stacks when needed. */
-  --emojis:          'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
-
-  /* System-ui font stack. */
-  --system-ui:       system-ui, sans-serif;
-
-  /* Serif font stacks. */
-  --ui-serif:        ui-serif, Charter, 'Bitstream Charter', 'Sitka Text', Cambria, serif;
-  --transitional:    Charter, 'Bitstream Charter', 'Sitka Text', Cambria, serif;
-  --old:             'Iowan Old Style', 'Palatino Linotype', 'URW Palladio L', P052, serif;
-  --slab:            Rockwell, 'Rockwell Nova', 'Roboto Slab', 'DejaVu Serif', 'Sitka Small', serif;
-  --antique:         Superclarendon, 'Bookman Old Style', 'URW Bookman', 'URW Bookman L', 'Georgia Pro', Georgia, serif;
-  --didone:          Didot, 'Bodoni MT', 'Noto Serif Display', 'URW Palladio L', P052, Sylfaen, serif;
-
-  /* Sans-serif font stacks. */
-  --ui-sans-serif:   ui-sans-serif, system-ui, sans-serif;
-  --humanist:        Seravek, 'Gill Sans Nova', Ubuntu, Calibri, 'DejaVu Sans', source-sans-pro, sans-serif;
-  --geometric:       Avenir, Montserrat, Corbel, 'URW Gothic', source-sans-pro, sans-serif;
-  --classical:       Optima, Candara, 'Noto Sans', source-sans-pro, sans-serif;
-  --neo:             Inter, Roboto, 'Helvetica Neue', 'Arial Nova', 'Nimbus Sans', Arial, sans-serif;
-  --industrial:      Bahnschrift, 'DIN Alternate', 'Franklin Gothic Medium', 'Nimbus Sans Narrow', sans-serif-condensed, sans-serif;
-  --futura:          Futura, Montserrat, Corbel, 'URW Gothic', source-sans-pro, sans-serif;
-
-  /* Rounded Sans-serif font stacks. */
-  --ui-rounded:      ui-rounded, 'Hiragino Maru Gothic ProN', Quicksand, Comfortaa, Manjari, 'Arial Rounded MT', 'Arial Rounded MT Bold', Calibri, source-sans-pro, sans-serif;
-
-  /* Monospace font stacks. */
-  --ui-monospace:    ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, 'DejaVu Sans Mono', monospace;
-  /* stylelint-enable value-keyword-case */
-
-  /* Font family. */
-  --ff-body: var(--ui-serif);
-  --ff-headings: var(--ui-sans-serif);
-  --ff-alt: var(--system-ui);
-  --ff-monospace: var(--ui-monospace);
-
-  /* Font weights. */
-  --fw-headings: 700;
-  --fw-bolder: 900;
-  --fw-bold: 700;
-  --fw-medium: 500;
-  --fw-normal: 400;
-  --fw-light: 300;
-  --fw-lighter: 200;
-
-  /* Spacing.
-  Generates mt--m (mt = margin-top), mb--m (mb = margin-bottom) and
-  mx--m (mx = margin-block) classes. */
-  --spacing-xxl: calc(3rem * var(--base-line-height));
-  --spacing-xl: calc(2rem * var(--base-line-height));
-  --spacing-l: calc(1.5rem * var(--base-line-height));
-  --spacing-m: calc(1rem * var(--base-line-height));
-  --spacing-s: calc(0.75rem * var(--base-line-height));
-  --spacing-xs: calc(0.5rem * var(--base-line-height));
-  --spacing-xxs: calc(0.3rem * var(--base-line-height));
-
-  /* Border radius. */
-  --radius-xl: 1rem;
-  --radius-l: 0.75rem;
-  --radius-m: 0.5rem;
-  --radius-s: 0.3rem;
-  --radius-xs: 0.125rem;
-
-  /* Breakout amount.
-  How much should the "breakout" be. Defaults to same as gutters value. */
-  --breakout: calc(5px + 1.5625vw);
-
-  /* The left/right gutter/padding. */
-  --gutters: calc(5px + 1.5625vw);
-  --gutters-reverse: calc(0px - (5px + 1.5625vw));
-
-  /* The amount lists, blockquotes and comments are indented. */
-  --indent-amount: 2rem;
-
-  /* The max line width for readability. */
-  --max-line-width: 70ch;
-
-  /* The pt font-size to be used for printing. */
-  --print-font-size: 12pt;
-}
diff --git a/assets/sass/_zen.scss b/assets/sass/_zen.scss
deleted file mode 100644
index 60dc1aa..0000000
--- a/assets/sass/_zen.scss
+++ /dev/null
@@ -1,178 +0,0 @@
-/* Zen custom styles */
-
-/* Page */
-
-body {
-  background-color: var(--color-backdrop);
-}
-
-.page {
-  background-color: var(--color-body-bg);
-}
-
-.footer {
-  border-block-start: 2px solid var(--color-border);
-}
-
-/* Apply smaller text to blocks, footer etc. */
-
-th,
-label,
-legend,
-figcaption {
-  font-size: var(--fs-s);
-}
-
-.language-selector,
-.footer {
-  font-size: var(--fs-xs);
-}
-
-/* Apply heading font stack and colour to labels etc. */
-
-th,
-label,
-legend,
-.main-menu,
-.header,
-.footer {
-  color: var(--color-headings);
-  font-family: var(--ff-headings);
-}
-
-th,
-label {
-  font-weight: var(--fw-headings);
-}
-
-/* Article and content. */
-
-article,
-aside {
-  & > ul {
-    @extend %ul-straight-left;
-  }
-
-  & > ol {
-    @extend %ol-straight-left;
-  }
-}
-
-article {
-  .submitted,
-  .tags {
-    @media (min-width: 666px) {
-      display: inline-block;
-      padding-inline-end: 1rem;
-    }
-  }
-
-  code {
-    font-size: var(--fs-xs);
-    overflow-wrap: break-word;
-  }
-
-  pre {
-    border-radius: var(--radius-xs);
-    padding: 5px;
-    border: 1px solid var(--color-border-light);
-    background-color: var(--color-text-bg);
-    overflow: auto;
-    max-height: 300px;
-
-    &.chroma {
-      max-height: initial;
-      overflow-x: scroll;
-    }
-
-    & > code {
-      display: inline-block;
-      white-space: pre;
-    }
-  }
-}
-
-.content-dates {
-  text-align: end;
-}
-
-.repository-links {
-  justify-content: end;
-  align-items: center;
-
-  svg {
-    order: 1;
-  }
-}
-
-/* Navigation */
-
-.main-menu {
-  a {
-    display: block;
-    background-color: var(--color-button);
-    color: var(--color-button-text);
-    padding: 2px 8px;
-    text-decoration: none;
-
-    &:hover,
-    &:focus {
-      background-color: var(--color-button-hover);
-    }
-
-    &:active,
-    &[aria-current] {
-      text-decoration: underline;
-    }
-  }
-}
-
-/* Search */
-
-.search-text {
-  font-size: var(--fs-l);
-}
-
-/* Copy code */
-
-[data-codeblock] {
-  position: relative;
-
-  & > pre {
-    padding-block-start: 1lh;
-  }
-}
-
-.codebutton {
-  position: absolute;
-  inset-inline-end: 1rem;
-  background: unset;
-  border: unset;
-  text-shadow: unset;
-  font-size: var(--fs-l);
-  color: var(--color-border);
-  rotate: 90deg;
-  cursor: pointer;
-
-  & > span {
-    pointer-events: none;
-  }
-
-  &:hover,
-  &:focus-visible,
-  &:active {
-    scale: 1.15;
-  }
-}
-
-.flash-item {
-  animation: --flash 500ms ease-in-out 1;
-}
-
-@keyframes --flash {
-  50% {
-    border-color: var(--color-warning);
-    background-color: var(--color-warning-bg);
-  }
-}
-
diff --git a/assets/sass/base/_base.scss b/assets/sass/base/_base.scss
deleted file mode 100644
index bac59e5..0000000
--- a/assets/sass/base/_base.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-/* Base styles. */
-
-/* Broken into modular pieces to make it easier to edit. */
-@import 'reset/reset';
-@import 'document/document';
-@import 'forms/forms';
-@import 'grouping/grouping';
-@import 'headings/headings';
-@import 'images/images';
-@import 'links/links';
-@import 'tables/tables';
diff --git a/assets/sass/base/document/_document.scss b/assets/sass/base/document/_document.scss
deleted file mode 100644
index 5acaa8e..0000000
--- a/assets/sass/base/document/_document.scss
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Document */
-
-html {
-  /* Change the default font family in all browsers. */
-  font-family: var(--ff-body);
-
-  /* Set base font size in percent. */
-  font-size: calc(var(--base-font-size) / 16 * 100%);
-
-  /* Set text colour. */
-  color: var(--color-text);
-}
-
-body {
-  /* Correct the line height in all browsers. */
-  line-height: var(--base-line-height);
-
-  /* Accent colour for forms. */
-  accent-color: var(--color-accent);
-}
diff --git a/assets/sass/base/forms/_forms.scss b/assets/sass/base/forms/_forms.scss
deleted file mode 100644
index cf3962d..0000000
--- a/assets/sass/base/forms/_forms.scss
+++ /dev/null
@@ -1,108 +0,0 @@
-/* Form defaults. */
-
-form {
-  /* Add vertical rhythm margins. */
-  margin-block: 0 var(--spacing-m);
-}
-
-input,
-textarea,
-select {
-  margin-block: 0 var(--spacing-m);
-}
-
-label {
-  font-weight: var(--fw-bold);
-
-  /* Display as block if before input. */
-  &:has(+ input),
-  &:has(+ textarea){
-    display: block;
-  }
-
-  /* Mark field as required if needed. */
-  &:has(+ :required) {
-    &::after {
-      content: '*';
-      color: var(--color-mark-highlight);
-    }
-  }
-}
-
-/* Valid and invalid state. */
-input,
-textarea {
-  &:user-valid {
-    border-color: var(--color-success);
-    border-style: solid;
-    background-color: var(--color-success-bg);
-  }
-
-  &:focus:user-valid {
-    border-color: transparent;
-  }
-
-  &:user-invalid {
-    border-color: var(--color-error);
-    border-style: solid;
-    background-color: var(--color-error-bg);
-  }
-
-  &:focus:user-invalid {
-    border-color: transparent;
-    background-color: var(--color-warning-bg);
-  }
-}
-
-/* Set max text line width for readability. */
-input,
-label,
-textarea,
-select {
-  max-width: var(--max-line-width);
-}
-
-fieldset {
-  border: 1px solid var(--color-border);
-}
-
-/* Make field where you enter more info a bit wider. */
-[type='email'],
-[type='password'],
-[type='range'],
-[type='search'],
-[type='url'] {
-  /* Writing "Min" instead of "min" to force use of css "min()" instead of sass "min()". */
-  /* stylelint-disable-next-line function-name-case */
-  width: Min(20em, 100%);
-}
-
-/* Make field where you enter more info a bit wider. */
-[type='text'],
-textarea {
-  /* Writing "Min" instead of "min" to force use of css "min()" instead of sass "min()". */
-  /* stylelint-disable-next-line function-name-case */
-  width: Min(30em, 100%);
-}
-
-/* Make sure textareas without a rows attribute are not tiny. */
-textarea:not([rows]) {
-  min-height: 7lh;
-}
-
-/* For forms with multibple fields show submit button below the form. */
-input:not(:only-of-type),
-textarea {
-  & + [type='submit'] {
-    display: block;
-  }
-}
-
-/* For forms on mobile with single field add space between it and the submit button. */
-@media (min-width: 666px) {
-  input:only-of-type {
-    &:has(+ [type='submit']) {
-      margin-inline-end: .5rem;
-    }
-  }
-}
diff --git a/assets/sass/base/grouping/_grouping.scss b/assets/sass/base/grouping/_grouping.scss
deleted file mode 100644
index 520660c..0000000
--- a/assets/sass/base/grouping/_grouping.scss
+++ /dev/null
@@ -1,105 +0,0 @@
-/* Grouping content */
-
-/* Block quotes */
-
-blockquote {
-  /* Add vertical rhythm margins. */
-  margin-block: 0 var(--spacing-m);
-
-  /* Nicer text wrap, e.g. no lone word on last line. */
-  text-wrap: pretty;
-
-  /* Also indent the quote on both sides. */
-  margin-inline: var(--indent-amount);
-
-  /* Set max text line width in main for readability. */
-  max-width: var(--max-line-width);
-}
-
-/* Lists */
-
-dl,
-ol,
-ul,
-menu {
-  /* Add vertical rhythm margins. */
-  margin-block: 0 var(--spacing-m);
-}
-
-dt {
-  font-weight: var(--fw-bold);
-}
-
-dd {
-  margin: 0;
-  margin-inline-start: var(--indent-amount);
-
-  /* Nicer text wrap, e.g. no lone word on last line. */
-  text-wrap: pretty;
-}
-
-ol,
-ul,
-menu {
-  padding: 0;
-  padding-inline-start: var(--indent-amount);
-
-  /* Turn off margins on nested lists. */
-  ol,
-  ul,
-  menu {
-    margin: 0;
-  }
-}
-
-li {
-  /* Nicer text wrap, e.g. no lone word on last line. */
-  text-wrap: pretty;
-
-  /* Set max text line width in main for readability. */
-  .main & {
-    max-width: var(--max-line-width);
-  }
-}
-
-/* Horizontal rule */
-
-hr {
-  /* Add vertical rhythm margins. */
-  margin-block: var(--spacing-m);
-  border: 0;
-  border-block-start: 1px solid var(--color-border);
-  height: 0;
-}
-
-/* Paragraphs */
-
-p {
-  /* Add vertical rhythm margins. */
-  margin-block: 0 var(--spacing-m);
-
-  /* Nicer text wrap, e.g. no lone word on last line. */
-  text-wrap: pretty;
-
-  /* Set max text line width in main for readability. */
-  .main & {
-    max-width: var(--max-line-width);
-  }
-}
-
-/* Preformatted text */
-
-pre {
-  /* Add vertical rhythm margins. */
-  margin-block: 0 var(--spacing-m);
-  font-family: var(--ff-monospace);
-}
-
-/* Code */
-
-/* Do not set colour for code with syntax highlighting. */
-code:not([data-lang]),
-kbd,
-samp {
-  color: var(--color-code);
-}
diff --git a/assets/sass/base/headings/_headings.scss b/assets/sass/base/headings/_headings.scss
deleted file mode 100644
index f499acd..0000000
--- a/assets/sass/base/headings/_headings.scss
+++ /dev/null
@@ -1,71 +0,0 @@
-/* Headings
-
-All HTML headings, `

` through `

`, are available. `%h1` through `%h6` -classes are also available, for when you want to match the font styling of a -heading but not be a heading. */ - -h1, -%h1, -h2, -%h2, -h3, -%h3, -h4, -%h4, -h5, -%h5, -h6, -%h6 { - margin-block: 1.5em .5em; - color: var(--color-headings); - font-family: var(--ff-headings); - font-weight: var(--fw-headings); - line-height: var(--heading-line-height); - text-wrap: balance; - - /* Smaller margin when a headeing is right after another heading. */ - & + & { - margin-block-start: .75em - } - - /* Set max text line width in main for readability. */ - .main & { - max-width: var(--max-line-width); - } -} - -h1, -%h1 { - /* h1 only on top of page so different margins. */ - margin-block-start: var(--spacing-m); - margin-block-end: var(--spacing-xs); - font-size: var(--fs-xxl); - letter-spacing: -.01em; -} - -h2, -%h2 { - font-size: var(--fs-xl); - letter-spacing: -.01em; -} - -h3, -%h3 { - font-size: var(--fs-l); - letter-spacing: -.01em; -} - -h4, -%h4 { - font-size: var(--fs-m); -} - -h5, -%h5 { - font-size: var(--fs-s); -} - -h6, -%h6 { - font-size: var(--fs-xs); -} diff --git a/assets/sass/base/images/_images.scss b/assets/sass/base/images/_images.scss deleted file mode 100644 index 0d6b12b..0000000 --- a/assets/sass/base/images/_images.scss +++ /dev/null @@ -1,87 +0,0 @@ -/* Figure and image. */ - -figure, -img { - &.image { - --image-padding: .75rem; - - @media (min-width: 666px) { - &.center { - margin-inline: auto; - } - - &.left { - padding-inline-end: var(--image-padding); - padding-block-end: var(--image-padding); - margin: 0; - float: left; - clear: both; - } - - &.right { - padding-inline-start: var(--image-padding); - padding-block-end: var(--image-padding); - margin: 0; - float: right; - clear: both; - } - } - } -} - -figure { - /* Add vertical rhythm margins. */ - margin-block: 0 var(--spacing-m); - - &.image { - figcaption { - padding-block-start: var(--image-padding); - contain: inline-size; - - /* Set max text line width in main for readability. */ - max-width: var(--max-line-width); - - /* Nicer text wrap, e.g. no lone word on last line. */ - text-wrap: pretty; - - @media (min-width: 666px) { - padding-block-start: 0; - } - - p { - margin: 0; - } - } - - @media (min-width: 666px) { - inline-size: fit-content; - - &.left { - figcaption { - padding-inline-end: var(--image-padding); - padding-block-end: var(--image-padding); - } - } - - &.right { - figcaption { - padding-inline-start: var(--image-padding); - padding-block-end: var(--image-padding); - } - } - } - } - - &.podcast { - audio { - width: 95%; - } - } -} - -img { - &.image { - /* Add vertical rhythm margins. */ - margin-block: 0 var(--spacing-m); - } -} diff --git a/assets/sass/base/links/_links.scss b/assets/sass/base/links/_links.scss deleted file mode 100644 index a15a865..0000000 --- a/assets/sass/base/links/_links.scss +++ /dev/null @@ -1,82 +0,0 @@ -/* Links - -Hyperlinks are used to allow the user to navigate to other resources or to -download a resource. - -The order of link states are based on Eric Meyer's article: -http://meyerweb.com/eric/thoughts/2007/06/11/who-ordered-the-link-states - -:visited - A link that has already been visited. -:hover - A link that is being hovered over. -:focus - A link that has been given keyboard focus. -:active - A link that is being actively clicked. */ - -a, -%link { - color: var(--color-link); -} - -/* Any element can receive focus, but only links can be visited, so we can -safely lower this selector's specificity. This also ensures visited links -with additional styles won't have their styles overridden. */ -:visited { - color: var(--color-link-visited); -} - -a:hover, -a:focus { - color: var(--color-link-hover); -} - -a:active { - color: var(--color-link-active); -} - -/* Remove underline from links to current page to */ -/* indicate that there is no need to click on it. */ -[aria-current] { - text-decoration: none; -} - -/* Use smooth scrolling unless user prefer less motion. */ -@media (prefers-reduced-motion: no-preference) { - :has(:target) { - scroll-behavior: smooth; - scroll-padding-block-start: var(--gutters); - } -} - -.link-nav, -%link-nav { - a { - text-decoration: none; - - &:hover, - &:focus { - text-decoration: underline; - } - } -} - -/* Inverted links, for dark backgrounds. */ -.link-inverted, -%link-inverted { - a { - &:link { - color: var(--color-link-inverted); - } - - &:visited { - color: var(--color-link-visited-inverted); - } - - &:hover, - &:focus { - color: var(--color-link-hover-inverted); - } - - &:active { - color: var(--color-link-active-inverted); - } - } -} diff --git a/assets/sass/base/reset/_reset.scss b/assets/sass/base/reset/_reset.scss deleted file mode 100644 index fc34e52..0000000 --- a/assets/sass/base/reset/_reset.scss +++ /dev/null @@ -1,103 +0,0 @@ -/* stylelint-disable property-no-vendor-prefix */ - -/* Reset browsers to some sane defaults. */ - -/* Document */ - -/* Use the saner border-box model for all elements. */ -*, -*::before, -*::after { - box-sizing: border-box; -} - -:root { - /* Activate transition to intrinsic sizes like auto and fit-content. */ - interpolate-size: allow-keywords; -} - -/* Transitioning page view. */ -@view-transition { - navigation: auto; -} - -html { - /* Prevent adjustments of font size. */ - -webkit-text-size-adjust: none; - text-size-adjust: none; - - /* Improve text rendering. */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -/* Sections */ - -body { - /* Remove the margin in all browsers. */ - margin: 0; - padding: 0; - - /* On short pages, we want the body to fill the entire height */ - /* of the browser. */ - min-height: 100vh; -} - -/* Embedded content */ - -img, -svg, -picture, -audio, -video, -canvas, -iframe, -embed, -object { - display: block; -} - -img, -svg, -video { - max-width: 100%; - height: auto; -} - -figure { - margin-inline: 0; -} - -/* Form defaults. */ - -input, -button, -textarea, -select { - font: inherit; - letter-spacing: inherit; - word-spacing: inherit; -} - -[type='search'] { - @media (min-width: 666px) { - /* Correct the odd appearance in Safari on desktop. */ - -webkit-appearance: textfield; - } -} - -/* Code */ - -code, -kbd, -samp { - font-family: var(--ff-monospace); -} - -/* Numbers */ - -td, -math, -time[datetime*=':'] { - font-variant-numeric: tabular-nums lining-nums; -} diff --git a/assets/sass/base/tables/_tables.scss b/assets/sass/base/tables/_tables.scss deleted file mode 100644 index cdde0d6..0000000 --- a/assets/sass/base/tables/_tables.scss +++ /dev/null @@ -1,32 +0,0 @@ -/* Tables */ - -table { - /* Add vertical rhythm margins. */ - margin-block: 0 var(--spacing-m); - - /* Remove default spacing between table cells. */ - border-collapse: collapse; - - /* Prevent cramped-looking tables */ - width: 100%; -} - -td, -th { - /* Remove most spacing between table cells. */ - padding: 0; - - /* Align content to top of cells. */ - vertical-align: text-top; -} - -th { - /* Align content to bottom of headers. */ - vertical-align: bottom; -} - -caption, -th { - /* Align all text the same. */ - text-align: start; -} diff --git a/assets/sass/components/anchor/_anchor.scss b/assets/sass/components/anchor/_anchor.scss deleted file mode 100644 index 3fdafc0..0000000 --- a/assets/sass/components/anchor/_anchor.scss +++ /dev/null @@ -1,35 +0,0 @@ -/* Anchor */ - -.anchor, -%anchor { - --anchor-gap: .5rem; - --anchor-opacity: .4; - - display: grid; - grid-template-columns: auto auto; - justify-content: start; - align-items: baseline; - gap: var(--anchor-gap); - - a { - opacity: 0; - text-decoration: none; - width: fit-content; - } - - &:has(:focus-visible), - &:hover { - a { - opacity: var(--anchor-opacity); - - &:focus-visible, - &:hover { - opacity: 1; - } - } - } - - p:has(+ &) { - margin-block-end: 0; - } -} diff --git a/assets/sass/components/box/_box.scss b/assets/sass/components/box/_box.scss deleted file mode 100644 index ea5651a..0000000 --- a/assets/sass/components/box/_box.scss +++ /dev/null @@ -1,46 +0,0 @@ -/* Box */ - -.box { - /* Add vertical rhythm margins. */ - margin-block: var(--spacing-m); - padding: var(--spacing-xs); - border: 5px solid var(--color-border); - - &__title, - .title { - margin-top: 0; - } - - &--highlight { - border-color: var(--color-highlight); - } - - &--fit { - width: fit-content; - } - - &--gutter { - padding-inline: var(--gutters); - } - - &--inverted { - @extend %link-inverted; - background: var(--color-border); - color: var(--color-text-bg); - - /* Make sure headings etc. also gets inverted. */ - * { - color: var(--color-text-bg); - } - } - - > * { - &:first-child { - margin-top: 0; - } - - &:last-child { - margin-block-end: 0; - } - } -} diff --git a/assets/sass/components/button/_button.scss b/assets/sass/components/button/_button.scss deleted file mode 100644 index b9c19ca..0000000 --- a/assets/sass/components/button/_button.scss +++ /dev/null @@ -1,74 +0,0 @@ -/* Button */ - -.button, -%button, -[type='button'], -[type='submit'] { - @extend %button--disabled; - - /* Some styles don't apply to links since they are inline elements by default. */ - display: inline-block; - font-family: var(--ff-headings); - text-decoration: none; - text-align: center; - width: fit-content; - padding: .2rem 1rem; - - /* Improve usability and consistency of cursor style between image-type `input` and others. */ - cursor: pointer; - color: var(--color-button-text); - text-shadow: var(--color-button) 0 1px 0; - background: linear-gradient(var(--color-button), var(--color-button-hover)); - border: 1px solid var(--color-button-hover); - border-radius: var(--radius-s); - - &:hover, - &:focus-visible, - &:active { - /* Override any link underlines and color changes. */ - text-decoration: none; - color: var(--color-button-text-hover); - text-shadow: var(--color-button-hover) 0 1px 0; - background: linear-gradient(var(--color-button-hover), var(--color-button)); - } - - &:active { - box-shadow: inset 2px 2px 5px var(--color-black-40); - } -} - -/* Add button variations here. */ -.button, -%button { - &--small { - font-size: var(--fs-xs); - padding: .2rem .75rem; - } - - &--alt { - color: var(--color-button-text-hover); - background: var(--color-button-hover); - - &:hover, - &:focus-visible, - &:active { - color: var(--color-button-text); - background: var(--color-button); - } - } - - &--outline { - color: var(--color-button); - background: var(--color-button-text); - } -} - -/* The disabled variation should always go last, so that it overrides any -other variations. */ -%button--disabled[disabled] { - @extend %disabled; - background-color: var(--color-grey-200); - border: 1px solid var(--color-button-disabled); - background-image: none; - text-shadow: none; -} diff --git a/assets/sass/components/cards/_cards.scss b/assets/sass/components/cards/_cards.scss deleted file mode 100644 index 1bba00b..0000000 --- a/assets/sass/components/cards/_cards.scss +++ /dev/null @@ -1,46 +0,0 @@ -/* Cards - -A simple cards style. */ - -.cards, -%cards { - @extend %grid-group; - - /* Add vertical rhythm margins. */ - margin-block: var(--spacing-m); -} - -.card, -%card { - padding: var(--spacing-xs); - border: 1px solid var(--color-border); - - &--highlight { - border-color: var(--color-highlight); - } - - &--featured { - grid-row: span 2; - grid-column: span 2; - } - - &--gutter { - padding-inline: var(--gutters); - } - - &--inverted { - @extend %link-inverted; - background: var(--color-border); - color: var(--color-text-bg); - } - - > * { - &:first-child { - margin-top: 0; - } - - &:last-child { - margin-block-end: 0; - } - } -} diff --git a/assets/sass/components/center/_center.scss b/assets/sass/components/center/_center.scss deleted file mode 100644 index dfd8243..0000000 --- a/assets/sass/components/center/_center.scss +++ /dev/null @@ -1,12 +0,0 @@ -.grid-center { - display: grid; - place-items: center; -} - -.text-center { - text-align: center; -} - -.margin-center { - margin-inline: auto; -} diff --git a/assets/sass/components/clearfix/_clearfix.scss b/assets/sass/components/clearfix/_clearfix.scss deleted file mode 100644 index b11776f..0000000 --- a/assets/sass/components/clearfix/_clearfix.scss +++ /dev/null @@ -1,18 +0,0 @@ -/* Clearfix - -Allows the bottom of an element to extend to the bottom of all floated child -elements. See http://nicolasgallagher.com/micro-clearfix-hack/ */ - -.clearfix, -%clearfix { - &::before { - content: ''; - display: table; - } - - &::after { - content: ''; - display: table; - clear: both; - } -} diff --git a/assets/sass/components/cookieconsent/_cookieconsent.scss b/assets/sass/components/cookieconsent/_cookieconsent.scss deleted file mode 100644 index 244c50f..0000000 --- a/assets/sass/components/cookieconsent/_cookieconsent.scss +++ /dev/null @@ -1,42 +0,0 @@ -/* Cookieconsent */ - -.cookieconsent { - display: flex; - flex-flow: wrap; - justify-content: center; - gap: .5rem; - position: sticky; - bottom: 0; - width: 100%; - padding: var(--spacing-xs); - color: var(--color-warning); - background-color: var(--color-warning-bg); - border-block-start: 4px solid var(--color-warning-border); - font-size: var(--fs-s); - transform: translateY(100vh); - transition: all 130ms ease-out; - z-index: 99; - - &__actions { - display: flex; - gap: .5rem; - } - - &[hidden] { - display: none; - } -} - -.button { - &--accept { - border-color: var(--color-success); - } - - &--decline { - border-color: var(--color-warning-border); - } -} - -[data-cookieconsentopen] { - transform: translateY(0); -} diff --git a/assets/sass/components/disabled/_disabled.scss b/assets/sass/components/disabled/_disabled.scss deleted file mode 100644 index bf99f2d..0000000 --- a/assets/sass/components/disabled/_disabled.scss +++ /dev/null @@ -1,14 +0,0 @@ -.disabled, -%disabled { - /* Re-set default cursor for disabled elements. */ - cursor: default; - color: var(--color-button-disabled); - - &:hover, - &:focus, - &:active { - /* Override any link underlines and color changes. */ - color: var(--color-button-disabled); - text-decoration: none; - } -} diff --git a/assets/sass/components/flex-inline/_flex-inline.scss b/assets/sass/components/flex-inline/_flex-inline.scss deleted file mode 100644 index 1ffe4e6..0000000 --- a/assets/sass/components/flex-inline/_flex-inline.scss +++ /dev/null @@ -1,19 +0,0 @@ -.flex-inline, -%flex-inline { - --flex-inline-gap: .5rem; - - display: flex; - flex-wrap: wrap; - gap: var(--flex-inline-gap); - padding: 0; - text-align: start; - - &__item, - li { - list-style: none; - } - - &--inline { - display: inline-flex; - } -} diff --git a/assets/sass/components/footer/_footer.scss b/assets/sass/components/footer/_footer.scss deleted file mode 100644 index c1a4e9b..0000000 --- a/assets/sass/components/footer/_footer.scss +++ /dev/null @@ -1,12 +0,0 @@ -/* Branding footer */ - -.footer, -%footer { - padding-block: var(--gutters); - background-color: var(--color-footer-bg); - text-align: center; - - p { - margin: 0; - } -} diff --git a/assets/sass/components/grid-group/_grid-group.scss b/assets/sass/components/grid-group/_grid-group.scss deleted file mode 100644 index c9b0ea5..0000000 --- a/assets/sass/components/grid-group/_grid-group.scss +++ /dev/null @@ -1,53 +0,0 @@ -.grid-group, -%grid-group { - --grid-group-column-min: 200px; - --grid-group-gap: 1.5rem; - - display: grid; - gap: var(--grid-group-gap); - - /* Writing "Min" instead of "min" to force use of css "min()" instead of sass "min()". */ - /* stylelint-disable-next-line function-name-case */ - grid-template-columns: repeat(auto-fit, minmax(Min(var(--grid-group-column-min), 100%), 1fr)); - - &--fill { - /* stylelint-disable-next-line function-name-case */ - grid-template-columns: repeat(auto-fill, minmax(Min(var(--grid-group-column-min), 100%), 1fr)); - } - - &--100 { - --grid-group-column-min: 100px; - } - - &--150 { - --grid-group-column-min: 150px; - } - - &--200 { - --grid-group-column-min: 200px; - } - - &--250 { - --grid-group-column-min: 250px; - } - - &--300 { - --grid-group-column-min: 300px; - } - - &--350 { - --grid-group-column-min: 350px; - } - - &--400 { - --grid-group-column-min: 400px; - } - - &--500 { - --grid-group-column-min: 500px; - } - - &--600 { - --grid-group-column-min: 600px; - } -} diff --git a/assets/sass/components/grid-stack/_grid-stack.scss b/assets/sass/components/grid-stack/_grid-stack.scss deleted file mode 100644 index d949251..0000000 --- a/assets/sass/components/grid-stack/_grid-stack.scss +++ /dev/null @@ -1,9 +0,0 @@ -.grid-stack, -%grid-stack { - display: grid; - - & > * { - grid-column: 1 / 2; - grid-row: 1 / 2; - } -} diff --git a/assets/sass/components/header/_header.scss b/assets/sass/components/header/_header.scss deleted file mode 100644 index 93a482f..0000000 --- a/assets/sass/components/header/_header.scss +++ /dev/null @@ -1,56 +0,0 @@ -/* Branding header */ - -.header, -%header { - --header-gap: var(--spacing-s); - - /* Writing "Min" instead of "min" to force use of css "min()" instead of sass "min()". */ - /* stylelint-disable-next-line function-name-case */ - padding-block: Min(var(--gutters), var(--spacing-m)); - display: flex; - flex-direction: column; - gap: var(--header-gap); - background-color: var(--color-header-bg); - - @media (min-width: 666px) { - flex-direction: row; - align-items: center; - } - - /* Wrapping link for logo. */ - &__logo { - width: fit-content; - } - - /* Logo image. */ - &__logo-image { - vertical-align: bottom; - } - - /* The name of the website. */ - &__site-name { - margin: 0; - line-height: 1; - } - - /* The link around the name of the website. */ - &__site-link { - &:link, - &:visited { - color: var(--color-text); - text-decoration: none; - } - - &:hover, - &:focus { - text-decoration: underline; - } - } - - /* Wrapper for any blocks placed in the header region. */ - &__region { - @media (min-width: 666px) { - margin-inline-start: auto; - } - } -} diff --git a/assets/sass/components/icon-inline/_icon-inline.scss b/assets/sass/components/icon-inline/_icon-inline.scss deleted file mode 100644 index de4a9e0..0000000 --- a/assets/sass/components/icon-inline/_icon-inline.scss +++ /dev/null @@ -1,27 +0,0 @@ -/* Inline icons. */ - -.icon-inline, -%icon-inline { - .icon-link { - opacity: 0; - transition: all 130ms ease-in; - text-decoration: none; - } - - &:focus-visible, - &:hover { - .icon-link { - opacity: .3; - - &:focus-visible, - &:hover { - opacity: 1; - } - } - } - - svg { - display: inline; - vertical-align: middle; - } -} diff --git a/assets/sass/components/language-selector/_language-selector.scss b/assets/sass/components/language-selector/_language-selector.scss deleted file mode 100644 index efb44fa..0000000 --- a/assets/sass/components/language-selector/_language-selector.scss +++ /dev/null @@ -1,10 +0,0 @@ -/* Language selector */ - -.language-selector { - display: flex; -} - -.language-icon { - margin-inline-end: var(--spacing-xs); - fill: var(--color-text); -} diff --git a/assets/sass/components/list-straight-left/_list-straight-left.scss b/assets/sass/components/list-straight-left/_list-straight-left.scss deleted file mode 100644 index eb7775b..0000000 --- a/assets/sass/components/list-straight-left/_list-straight-left.scss +++ /dev/null @@ -1,55 +0,0 @@ -/* Lists with a straight left margin. */ - -.ul-straight-left, -%ul-straight-left { - display: table; - list-style: none; - padding: 0; - - & > li { - display: table-row; - - &::before { - padding-inline-end: var(--spacing-xs); - display: table-cell; - content: '\2981'; - font-size: var(--fs-s); - } - } -} - -.ol-straight-left, -%ol-straight-left { - display: table; - list-style: none; - padding: 0; - - & > li { - display: table-row; - counter-increment: table-ol; - - &::before { - padding-inline-end: var(--spacing-xs); - display: table-cell; - content: counter(table-ol) '.'; - font-size: var(--fs-s); - text-align: end; - } - } -} - -.ul-straight-left--off, -%ul-straight-left--off { - display: block; - list-style: inherit; - - & > li { - display: list-item; - - &::before { - content: ''; - display: inline; - padding: inherit; - } - } -} diff --git a/assets/sass/components/messages/_messages.scss b/assets/sass/components/messages/_messages.scss deleted file mode 100644 index db9ae97..0000000 --- a/assets/sass/components/messages/_messages.scss +++ /dev/null @@ -1,43 +0,0 @@ -/* Messages */ - -.message, -%message { - padding: .5rem; - outline-width: 2px; - outline-style: solid; - width: 95%; - - &.success { - background-color: var(--color-success-bg); - color: var(--color-success); - outline-color: var(--color-success); - } - - &.info { - background-color: var(--color-info-bg); - color: var(--color-info); - outline-color: var(--color-info); - } - - &.warning { - background-color: var(--color-warning-bg); - color: var(--color-warning); - outline-color: var(--color-warning); - } - - &.error { - background-color: var(--color-error-bg); - color: var(--color-error); - outline-color: var(--color-error); - } - - &--highlight { - animation: 2s ease-in-out infinite --outline-highlight; - } - - @keyframes --outline-highlight { - 50% { - outline-width: .3rem; - } - } -} diff --git a/assets/sass/components/meta/_meta.scss b/assets/sass/components/meta/_meta.scss deleted file mode 100644 index b4b44c1..0000000 --- a/assets/sass/components/meta/_meta.scss +++ /dev/null @@ -1,8 +0,0 @@ -/* Style for meta content. */ - -.meta, -%meta { - font-family: var(--ff-headings); - font-size: var(--fs-xs); - color: var(--color-text-meta); -} diff --git a/assets/sass/components/overlay/_overlay.scss b/assets/sass/components/overlay/_overlay.scss deleted file mode 100644 index 4da1f94..0000000 --- a/assets/sass/components/overlay/_overlay.scss +++ /dev/null @@ -1,6 +0,0 @@ -.overlay, -%overlay { - --color-overlay: var(--color-black-20); - --color-overlay2: var(--color-black-10); - border-image: linear-gradient(var(--color-overlay), var(--color-overlay2)) fill 1; -} diff --git a/assets/sass/components/pager/_pager.scss b/assets/sass/components/pager/_pager.scss deleted file mode 100644 index d8798a6..0000000 --- a/assets/sass/components/pager/_pager.scss +++ /dev/null @@ -1,33 +0,0 @@ -/* Pager - -Paged navigation is a list of page numbers when more than 1 page of content -is available. */ - -.pagination, -.pager, -%pager { - @extend %flex-inline; - @extend %link-nav; - - /* Add vertical rhythm margins. */ - margin-block: var(--spacing-m); - justify-content: center; - - .page-item { - } - - &__item, - .page-link { - padding-inline: 2px; - } - - .active { - font-weight: var(--fw-bold); - } - - .disabled { - .page-link { - @extend %disabled; - } - } -} diff --git a/assets/sass/components/responsive-video/_responsive-video.scss b/assets/sass/components/responsive-video/_responsive-video.scss deleted file mode 100644 index bffdc1b..0000000 --- a/assets/sass/components/responsive-video/_responsive-video.scss +++ /dev/null @@ -1,31 +0,0 @@ -/* Responsive video - -Using a wrapper div, embedded videos can be made responsive so that their -intrinsic aspect ratio is preserved at any screen width. The -`responsive-video__embed` class is optional if the embed is an `iframe`. - -.responsive-video--4-3 - A video with a 4:3 aspect ratio instead of the -default 16:9 one. */ - -.responsive-video, -%responsive-video { - --aspect-ratio: 9 / 16; /* 16:9 aspect ratio */ - - position: relative; - padding-block-end: calc(var(--aspect-ratio) * 100%); /* 16:9 aspect ratio */ - padding-block-start: 25px; /* Height of video controls */ - height: 0; - - iframe, - &__embed { - position: absolute; - inset-block-start: 0; - inset-inline-start: 0; - width: 100%; - height: 100%; - } - - &--4-3 { - --aspect-ratio: 3 / 4; /* 4:3 aspect ratio */ - } -} diff --git a/assets/sass/components/spacing/_spacing.scss b/assets/sass/components/spacing/_spacing.scss deleted file mode 100644 index 6d0bd72..0000000 --- a/assets/sass/components/spacing/_spacing.scss +++ /dev/null @@ -1,95 +0,0 @@ -.mt--xxl { - margin-block-start: var(--spacing-xxl); -} - -.mt--xl { - margin-block-start: var(--spacing-xl); -} - -.mt--l { - margin-block-start: var(--spacing-l); -} - -.mt--m { - margin-block-start: var(--spacing-m); -} - -.mt--s { - margin-block-start: var(--spacing-s); -} - -.mt--xs { - margin-block-start: var(--spacing-xs); -} - -.mt--xxs { - margin-block-start: var(--spacing-xxs); -} - -.mt--0 { - margin-block-start: 0; -} - -.mb--xxl { - margin-block-end: var(--spacing-xxl); -} - -.mb--xl { - margin-block-end: var(--spacing-xl); -} - -.mb--l { - margin-block-end: var(--spacing-l); -} - -.mb--m { - margin-block-end: var(--spacing-m); -} - -.mb--s { - margin-block-end: var(--spacing-s); -} - -.mb--xs { - margin-block-end: var(--spacing-xs); -} - -.mb--xxs { - margin-block-end: var(--spacing-xxs); -} - -.mb--0 { - margin-block-end: 0; -} - -.mx--xxl { - margin-block: var(--spacing-xxl); -} - -.mx--xl { - margin-block: var(--spacing-xl); -} - -.mx--l { - margin-block: var(--spacing-l); -} - -.mx--m { - margin-block: var(--spacing-m); -} - -.mx--s { - margin-block: var(--spacing-s); -} - -.mx--xs { - margin-block: var(--spacing-xs); -} - -.mx--xxs { - margin-block: var(--spacing-xxs); -} - -.mx--0 { - margin-block: 0; -} diff --git a/assets/sass/components/tables/_tables.scss b/assets/sass/components/tables/_tables.scss deleted file mode 100644 index c4da578..0000000 --- a/assets/sass/components/tables/_tables.scss +++ /dev/null @@ -1,61 +0,0 @@ -.zebra-table, -%zebra-table { - --table-cell-padding: .5rem; - - @media (max-width: 666px) { - --table-cell-padding: .3rem; - } - - th, - td { - padding: var(--table-cell-padding); - } - - thead { - tr { - background-color: var(--color-row-header); - } - } - - tbody { - tr { - &:nth-child(odd) { - background-color: var(--color-row-odd); - } - - &:nth-child(even) { - background-color: var(--color-row-even); - } - } - } -} - -.responsive-table, -%responsive-table { - --table-gap: .5rem; - - @media (max-width: 666px) { - th { - display: none; - } - - td { - display: grid; - gap: var(--table-gap); - grid-template-columns: 12ch auto; - - &::before { - content: attr(aria-label) ':'; - font-weight: var(--fw-bold); - } - - &:first-of-type { - padding-block-start: var(--table-gap); - } - - &:last-of-type { - padding-block-end: var(--table-gap); - } - } - } -} diff --git a/assets/sass/components/tags/_tags.scss b/assets/sass/components/tags/_tags.scss deleted file mode 100644 index 4e9c1c7..0000000 --- a/assets/sass/components/tags/_tags.scss +++ /dev/null @@ -1,5 +0,0 @@ -.tags { - ul { - margin-block: 0; - } -} diff --git a/assets/sass/components/visually-hidden/_visually-hidden.scss b/assets/sass/components/visually-hidden/_visually-hidden.scss deleted file mode 100644 index 0a5d22a..0000000 --- a/assets/sass/components/visually-hidden/_visually-hidden.scss +++ /dev/null @@ -1,16 +0,0 @@ -/* Visually hidden - -Make an element visually hidden, but accessible to screen readers, etc. */ - -.visually-hidden, -%visually-hidden { - &:not(:focus, :active) { - position: absolute; - clip-path: inset(50%); - height: 1px; - width: 1px; - margin: 0; - overflow: hidden; - white-space: nowrap; - } -} diff --git a/assets/sass/components/wrap/_wrap.scss b/assets/sass/components/wrap/_wrap.scss deleted file mode 100644 index 07fd687..0000000 --- a/assets/sass/components/wrap/_wrap.scss +++ /dev/null @@ -1,7 +0,0 @@ -.wrap-any { - overflow-wrap: anywhere; -} - -.wrap-word { - overflow-wrap: break-word; -} diff --git a/assets/sass/mixins/breakpoint/_respond-to.scss b/assets/sass/mixins/breakpoint/_respond-to.scss deleted file mode 100644 index 3354cd1..0000000 --- a/assets/sass/mixins/breakpoint/_respond-to.scss +++ /dev/null @@ -1,27 +0,0 @@ -@mixin respond-to($breakpoint) { - /* If the key exists in the map */ - @if map-has-key($breakpoints, $breakpoint) { - /* Prints a media query based on the value */ - @media (min-width: map-get($breakpoints, $breakpoint)) { - @content; - } - } @else { - @media (min-width: $breakpoint) { - @content; - } - } -} - -@mixin respond-to-max($breakpoint) { - /* If the key exists in the map */ - @if map-has-key($breakpoints, $breakpoint) { - /* Prints a media query based on the value */ - @media (max-width: map-get($breakpoints, $breakpoint)) { - @content; - } - } @else { - @media (max-width: $breakpoint) { - @content; - } - } -} diff --git a/assets/sass/mixins/flex-calc/_flex-calc.scss b/assets/sass/mixins/flex-calc/_flex-calc.scss deleted file mode 100644 index 6c634a2..0000000 --- a/assets/sass/mixins/flex-calc/_flex-calc.scss +++ /dev/null @@ -1,3 +0,0 @@ -@mixin flex($col, $gap) { - flex-basis: calc(100% / #{$col} - #{$gap * $base-line-height + 'rem'}); -} diff --git a/assets/sass/mixins/spacing/_spacing.scss b/assets/sass/mixins/spacing/_spacing.scss deleted file mode 100644 index f73fc55..0000000 --- a/assets/sass/mixins/spacing/_spacing.scss +++ /dev/null @@ -1,108 +0,0 @@ -@mixin spacing($property, $spacing, $unit) { - $converted-list: (); - - @each $x in $spacing { - $xunit: $unit; - - @if $x == 0 { - $xunit: ''; - } - - $spacing: #{$x * $base-line-height + $xunit}; - $converted-list: join($converted-list, $spacing, $separator: space); - } - - #{$property}: $converted-list; -} - -@mixin gap($x, $unit: 'rem') { - @include spacing(gap, $x, $unit); -} - -@mixin margin($x, $unit: 'rem') { - @include spacing(margin, $x, $unit); -} - -@mixin margin-inline($x, $unit: 'rem') { - @include spacing(margin-inline, $x, $unit); -} - -@mixin margin-inline-start($x, $unit: 'rem') { - @include spacing(margin-inline-start, $x, $unit); -} - -@mixin margin-inline-end($x, $unit: 'rem') { - @include spacing(margin-inline-end, $x, $unit); -} - -@mixin margin-block($x, $unit: 'rem') { - @include spacing(margin-block, $x, $unit); -} - -@mixin margin-block-start($x, $unit: 'rem') { - @include spacing(margin-block-start, $x, $unit); -} - -@mixin margin-block-end($x, $unit: 'rem') { - @include spacing(margin-block-end, $x, $unit); -} - -@mixin margin-top($x, $unit: 'rem') { - @include spacing(margin-top, $x, $unit); -} - -@mixin margin-bottom($x, $unit: 'rem') { - @include spacing(margin-bottom, $x, $unit); -} - -@mixin margin-left($x, $unit: 'rem') { - @include spacing(margin-left, $x, $unit); -} - -@mixin margin-right($x, $unit: 'rem') { - @include spacing(margin-right, $x, $unit); -} - -@mixin padding($x, $unit: 'rem') { - @include spacing(padding, $x, $unit); -} - -@mixin padding-inline($x, $unit: 'rem') { - @include spacing(padding-inline, $x, $unit); -} - -@mixin padding-inline-start($x, $unit: 'rem') { - @include spacing(padding-inline-start, $x, $unit); -} - -@mixin padding-inline-end($x, $unit: 'rem') { - @include spacing(padding-inline-end, $x, $unit); -} - -@mixin padding-block($x, $unit: 'rem') { - @include spacing(padding-block, $x, $unit); -} - -@mixin padding-block-start($x, $unit: 'rem') { - @include spacing(padding-block-start, $x, $unit); -} - -@mixin padding-block-end($x, $unit: 'rem') { - @include spacing(padding-block-end, $x, $unit); -} - -@mixin padding-top($x, $unit: 'rem') { - @include spacing(padding-top, $x, $unit); -} - -@mixin padding-bottom($x, $unit: 'rem') { - @include spacing(padding-bottom, $x, $unit); -} - -@mixin padding-left($x, $unit: 'rem') { - @include spacing(padding-left, $x, $unit); -} - -@mixin padding-right($x, $unit: 'rem') { - @include spacing(padding-right, $x, $unit); -} diff --git a/assets/sass/styles.scss b/assets/sass/styles.scss deleted file mode 100644 index 6e8a720..0000000 --- a/assets/sass/styles.scss +++ /dev/null @@ -1,67 +0,0 @@ -/* The main stylesheet for this theme. */ - -/* Sass init files. */ - -@import 'init'; - -/* Declaring CSS colour variables in :root. */ - -@import 'colors'; - -/* Declaring CSS misc variables in :root. */ - -@import 'variables'; - -/* Ensure fonts get loaded early to minimize front-end performance impact. */ - -@import 'fonts'; - -/* Base styles. */ - -@import 'base/base'; - -/* Layouts */ - -@import 'layouts/layouts'; - -/* Components */ - -/* Design components are reusable designs that can be applied using just the CSS -class names specified in the component. */ - -@import 'components/anchor/anchor'; -@import 'components/box/box'; -@import 'components/button/button'; -@import 'components/cards/cards'; -@import 'components/center/center'; -@import 'components/clearfix/clearfix'; -@import 'components/cookieconsent/cookieconsent'; -@import 'components/disabled/disabled'; -@import 'components/flex-group/flex-group'; -@import 'components/flex-inline/flex-inline'; -@import 'components/footer/footer'; -@import 'components/grid-group/grid-group'; -@import 'components/grid-stack/grid-stack'; -@import 'components/header/header'; -@import 'components/hidden/hidden'; -@import 'components/icon-inline/icon-inline'; -@import 'components/language-selector/language-selector'; -@import 'components/list-straight-left/list-straight-left'; -@import 'components/messages/messages'; -@import 'components/meta/meta'; -@import 'components/overlay/overlay'; -@import 'components/pager/pager'; -@import 'components/responsive-video/responsive-video'; -@import 'components/spacing/spacing'; -@import 'components/tables/tables'; -@import 'components/tags/tags'; -@import 'components/visually-hidden/visually-hidden'; -@import 'components/wrap/wrap'; - -/* Zen styles */ - -@import 'zen'; - -/* Custom styles */ - -@import 'custom'; diff --git a/biome.json b/biome.json index 5ffe474..4840137 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "$schema": "https://biomejs.dev/schemas/2.4.6/schema.json", "vcs": { "enabled": true, "clientKind": "git", @@ -8,16 +8,13 @@ }, "files": { "ignoreUnknown": true, - "include": ["assets/**/*.js"], - "ignore": ["**/*.min.js", "assets/libs/**/*.js"] + "includes": ["**/assets/**/*.js", "!**/*.min.js", "!**/assets/libs/**/*.js"] }, "formatter": { "enabled": true, "indentStyle": "space" }, - "organizeImports": { - "enabled": true - }, + "assist": { "actions": { "source": { "organizeImports": "on" } } }, "linter": { "enabled": true, "rules": { diff --git a/hugo.yaml b/hugo.yaml index 849146c..007a857 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -1,4 +1,4 @@ module: hugoVersion: - extended: true + extended: false min: "0.146.0" diff --git a/layouts/_partials/head/scripts.html b/layouts/_partials/head/scripts.html index ab47494..013062b 100644 --- a/layouts/_partials/head/scripts.html +++ b/layouts/_partials/head/scripts.html @@ -5,7 +5,7 @@ {{ $opts = merge $opts (dict "minify" false) -}} {{ end -}} -{{ $early := resources.Get "js/script-early.js" | js.Build $opts | fingerprint -}} +{{ $early := resources.Get "js/script-early.js" | js.Build $opts -}} diff --git a/layouts/_partials/head/styles.html b/layouts/_partials/head/styles.html index 87e0aad..598c745 100644 --- a/layouts/_partials/head/styles.html +++ b/layouts/_partials/head/styles.html @@ -1,17 +1,12 @@ -{{ $main_options := (dict "targetPath" "css/styles.css" "outputStyle" "compressed" "enableSourceMap" false "transpiler" (site.Params.sassTranspiler | default "libsass")) -}} -{{ if eq hugo.Environment "development" -}} - {{ $main_options = merge $main_options (dict "outputStyle" "nested" "enableSourceMap" true) -}} -{{ end -}} -{{ $mobile_options := merge $main_options (dict "targetPath" "css/mobilemenu.css") -}} -{{ $print_options := merge $main_options (dict "targetPath" "css/print.css") -}} -{{ $main_style := resources.Get "sass/styles.scss" | toCSS $main_options -}} -{{ $mobile_style := resources.Get "sass/mobilemenu.scss" | toCSS $mobile_options -}} -{{ $print_style := resources.Get "sass/print.scss" | toCSS $print_options -}} +{{ $main_style := resources.Match "css/_*.css" | append (resources.Match "css/**/_*.css") | resources.Concat "css/styles.css" -}} +{{ $mobile_style := resources.Get "css/mobilemenu.css" -}} +{{ $print_style := resources.Get "css/print.css" -}} {{ if ne hugo.Environment "development" -}} - {{ $main_style = $main_style | fingerprint -}} - {{ $mobile_style = $mobile_style | fingerprint -}} - {{ $print_style = $print_style | fingerprint -}} + {{ $main_style = $main_style | minify | fingerprint -}} + {{ $mobile_style = $mobile_style | minify | fingerprint -}} + {{ $print_style = $print_style | minify | fingerprint -}} {{ end -}} +{{ with resources.Get "css/layers-init.css" }}{{ end }} {{ if $.Param "mobilemenu" -}} diff --git a/package-lock.json b/package-lock.json index 7a75b42..5f14669 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,21 +9,22 @@ "version": "1.0.0", "license": "GPL-2.0", "devDependencies": { - "stylelint": "^16.25.0", - "stylelint-config-standard-scss": "^16.0.0" + "@biomejs/biome": "^2.4.6", + "stylelint": "^17.4.0", + "stylelint-config-standard": "^40.0.0" }, "engines": { "node": ">=24.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -41,43 +42,221 @@ "node": ">=6.9.0" } }, - "node_modules/@cacheable/memoize": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@cacheable/memoize/-/memoize-2.0.3.tgz", - "integrity": "sha512-hl9wfQgpiydhQEIv7fkjEzTGE+tcosCXLKFDO707wYJ/78FVOlowb36djex5GdbSyeHnG62pomYLMuV/OT8Pbw==", + "node_modules/@biomejs/biome": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.4.6.tgz", + "integrity": "sha512-QnHe81PMslpy3mnpL8DnO2M4S4ZnYPkjlGCLWBZT/3R9M6b5daArWMMtEfP52/n174RKnwRIf3oT8+wc9ihSfQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@cacheable/utils": "^2.0.3" + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "2.4.6", + "@biomejs/cli-darwin-x64": "2.4.6", + "@biomejs/cli-linux-arm64": "2.4.6", + "@biomejs/cli-linux-arm64-musl": "2.4.6", + "@biomejs/cli-linux-x64": "2.4.6", + "@biomejs/cli-linux-x64-musl": "2.4.6", + "@biomejs/cli-win32-arm64": "2.4.6", + "@biomejs/cli-win32-x64": "2.4.6" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.4.6.tgz", + "integrity": "sha512-NW18GSyxr+8sJIqgoGwVp5Zqm4SALH4b4gftIA0n62PTuBs6G2tHlwNAOj0Vq0KKSs7Sf88VjjmHh0O36EnzrQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.4.6.tgz", + "integrity": "sha512-4uiE/9tuI7cnjtY9b07RgS7gGyYOAfIAGeVJWEfeCnAarOAS7qVmuRyX6d7JTKw28/mt+rUzMasYeZ+0R/U1Mw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.4.6.tgz", + "integrity": "sha512-kMLaI7OF5GN1Q8Doymjro1P8rVEoy7BKQALNz6fiR8IC1WKduoNyteBtJlHT7ASIL0Cx2jR6VUOBIbcB1B8pew==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.4.6.tgz", + "integrity": "sha512-F/JdB7eN22txiTqHM5KhIVt0jVkzZwVYrdTR1O3Y4auBOQcXxHK4dxULf4z43QyZI5tsnQJrRBHZy7wwtL+B3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.4.6.tgz", + "integrity": "sha512-oHXmUFEoH8Lql1xfc3QkFLiC1hGR7qedv5eKNlC185or+o4/4HiaU7vYODAH3peRCfsuLr1g6v2fK9dFFOYdyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.4.6.tgz", + "integrity": "sha512-C9s98IPDu7DYarjlZNuzJKTjVHN03RUnmHV5htvqsx6vEUXCDSJ59DNwjKVD5XYoSS4N+BYhq3RTBAL8X6svEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.4.6.tgz", + "integrity": "sha512-xzThn87Pf3YrOGTEODFGONmqXpTwUNxovQb72iaUOdcw8sBSY3+3WD8Hm9IhMYLnPi0n32s3L3NWU6+eSjfqFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.4.6.tgz", + "integrity": "sha512-7++XhnsPlr1HDbor5amovPjOH6vsrFOCdp93iKXhFn6bcMUI6soodj3WWKfgEO6JosKU1W5n3uky3WW9RlRjTg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" } }, "node_modules/@cacheable/memory": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.4.tgz", - "integrity": "sha512-cCmJKCKlT1t7hNBI1+gFCwmKFd9I4pS3zqBeNGXTSODnpa0EeDmORHY8oEMTuozfdg3cgsVh8ojLaPYb6eC7Cg==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.8.tgz", + "integrity": "sha512-FvEb29x5wVwu/Kf93IWwsOOEuhHh6dYCJF3vcKLzXc0KXIW181AOzv6ceT4ZpBHDvAfG60eqb+ekmrnLHIy+jw==", "dev": true, "license": "MIT", "dependencies": { - "@cacheable/utils": "^2.2.0", - "@keyv/bigmap": "^1.1.0", - "hookified": "^1.12.2", - "keyv": "^5.5.3" + "@cacheable/utils": "^2.4.0", + "@keyv/bigmap": "^1.3.1", + "hookified": "^1.15.1", + "keyv": "^5.6.0" } }, "node_modules/@cacheable/utils": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.2.0.tgz", - "integrity": "sha512-7xaQayO3msdVcxXLYcLU5wDqJBNdQcPPPHr6mdTEIQI7N7TbtSVVTpWOTfjyhg0L6AQwQdq7miKdWtTDBoBldQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.4.0.tgz", + "integrity": "sha512-PeMMsqjVq+bF0WBsxFBxr/WozBJiZKY0rUojuaCoIaKnEl3Ju1wfEwS+SV1DU/cSe8fqHIPiYJFif8T3MVt4cQ==", "dev": true, "license": "MIT", "dependencies": { - "keyv": "^5.5.3" + "hashery": "^1.5.0", + "keyv": "^5.6.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.1.1.tgz", + "integrity": "sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", "dev": true, "funding": [ { @@ -91,16 +270,33 @@ ], "license": "MIT", "engines": { - "node": ">=18" + "node": ">=20.19.0" }, "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-tokenizer": "^4.0.0" } }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.0.tgz", + "integrity": "sha512-H4tuz2nhWgNKLt1inYpoVCfbJbMwX/lQKp3g69rrrIMIYlFD9+zTykOKhNR8uGrAmbS/kT9n6hTFkmDkxLgeTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0" + }, "node_modules/@csstools/css-tokenizer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", "dev": true, "funding": [ { @@ -114,13 +310,13 @@ ], "license": "MIT", "engines": { - "node": ">=18" + "node": ">=20.19.0" } }, "node_modules/@csstools/media-query-list-parser": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", - "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-5.0.0.tgz", + "integrity": "sha512-T9lXmZOfnam3eMERPsszjY5NK0jX8RmThmmm99FZ8b7z8yMaFZWKwLWGZuTwdO3ddRY5fy13GmmEYZXB4I98Eg==", "dev": true, "funding": [ { @@ -134,17 +330,17 @@ ], "license": "MIT", "engines": { - "node": ">=18" + "node": ">=20.19.0" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" } }, - "node_modules/@csstools/selector-specificity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", - "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "node_modules/@csstools/selector-resolve-nested": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-4.0.0.tgz", + "integrity": "sha512-9vAPxmp+Dx3wQBIUwc1v7Mdisw1kbbaGqXUM8QLTgWg7SoPGYtXBsMXvsFs/0Bn5yoFhcktzxNZGNaUt0VjgjA==", "dev": true, "funding": [ { @@ -158,38 +354,50 @@ ], "license": "MIT-0", "engines": { - "node": ">=18" + "node": ">=20.19.0" }, "peerDependencies": { - "postcss-selector-parser": "^7.0.0" + "postcss-selector-parser": "^7.1.1" } }, - "node_modules/@dual-bundle/import-meta-resolve": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz", - "integrity": "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==", + "node_modules/@csstools/selector-specificity": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-6.0.0.tgz", + "integrity": "sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==", "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/JounQin" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.1.1" } }, "node_modules/@keyv/bigmap": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.2.0.tgz", - "integrity": "sha512-4Lme8NejkyetZ9oJ6u8NSf0iJEFFt7I+tyDI48wZlaFmbhDEh4nZg7bEPFPwCWkpIuL50/ukWBC9AHQTmdJLUA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", + "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", "dev": true, "license": "MIT", "dependencies": { - "hashery": "^1.2.0", - "hookified": "^1.12.2" + "hashery": "^1.4.0", + "hookified": "^1.15.0" }, "engines": { "node": ">= 18" }, "peerDependencies": { - "keyv": "^5.5.4" + "keyv": "^5.6.0" } }, "node_modules/@keyv/serialize": { @@ -237,10 +445,23 @@ "node": ">= 8" } }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "dev": true, "license": "MIT", "dependencies": { @@ -255,13 +476,16 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { @@ -287,16 +511,6 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -307,13 +521,6 @@ "node": ">=8" } }, - "node_modules/balanced-match": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", - "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true, - "license": "MIT" - }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -328,18 +535,17 @@ } }, "node_modules/cacheable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.1.1.tgz", - "integrity": "sha512-LmF4AXiSNdiRbI2UjH8pAp9NIXxeQsTotpEaegPiDcnN0YPygDJDV3l/Urc0mL72JWdATEorKqIHEx55nDlONg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.3.3.tgz", + "integrity": "sha512-iffYMX4zxKp54evOH27fm92hs+DeC1DhXmNVN8Tr94M/iZIV42dqTHSR2Ik4TOSPyOAwKr7Yu3rN9ALoLkbWyQ==", "dev": true, "license": "MIT", "dependencies": { - "@cacheable/memoize": "^2.0.3", - "@cacheable/memory": "^2.0.3", - "@cacheable/utils": "^2.1.0", - "hookified": "^1.12.2", - "keyv": "^5.5.3", - "qified": "^0.5.0" + "@cacheable/memory": "^2.0.8", + "@cacheable/utils": "^2.4.0", + "hookified": "^1.15.0", + "keyv": "^5.6.0", + "qified": "^0.6.0" } }, "node_modules/callsites": { @@ -380,9 +586,9 @@ "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -407,24 +613,24 @@ } }, "node_modules/css-functions-list": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", - "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.3.3.tgz", + "integrity": "sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12 || >=16" + "node": ">=12" } }, "node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "dev": true, "license": "MIT", "dependencies": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" @@ -461,19 +667,6 @@ } } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -553,9 +746,9 @@ } }, "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", "dependencies": { @@ -563,13 +756,13 @@ } }, "node_modules/file-entry-cache": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.4.tgz", - "integrity": "sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==", + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.2.tgz", + "integrity": "sha512-N2WFfK12gmrK1c1GXOqiAJ1tc5YE+R53zvQ+t5P8S5XhnmKYVB5eZEiLNZKDSmoG8wqqbF9EXYBBW/nef19log==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^6.1.13" + "flat-cache": "^6.1.20" } }, "node_modules/fill-range": { @@ -586,24 +779,37 @@ } }, "node_modules/flat-cache": { - "version": "6.1.18", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.18.tgz", - "integrity": "sha512-JUPnFgHMuAVmLmoH9/zoZ6RHOt5n9NlUw/sDXsTbROJ2SFoS2DS4s+swAV6UTeTbGH/CAsZIE6M8TaG/3jVxgQ==", + "version": "6.1.20", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.20.tgz", + "integrity": "sha512-AhHYqwvN62NVLp4lObVXGVluiABTHapoB57EyegZVmazN+hhGhLTn3uZbOofoTw4DSDvVCadzzyChXhOAvy8uQ==", "dev": true, "license": "MIT", "dependencies": { - "cacheable": "^2.1.0", + "cacheable": "^2.3.2", "flatted": "^3.3.3", - "hookified": "^1.12.0" + "hookified": "^1.15.0" } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.4.tgz", + "integrity": "sha512-3+mMldrTAPdta5kjX2G2J7iX4zxtnwpdA8Tr2ZSjkyPSanvbZAcy6flmtnXbEybHrDcU9641lxrMfFuUxVz9vA==", "dev": true, "license": "ISC" }, + "node_modules/get-east-asian-width": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", + "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -646,36 +852,26 @@ } }, "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "version": "16.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-16.1.1.tgz", + "integrity": "sha512-dW7vl+yiAJSp6aCekaVnVJxurRv7DCOLyXqEG3RYMYUg7AuJ2jCqPkZTA8ooqC2vtnkaMcV5WfFBMuEnTu1OQg==", "dev": true, "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "@sindresorhus/merge-streams": "^4.0.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.5", + "is-path-inside": "^4.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.4.0" }, "engines": { - "node": ">=10" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/globjoin": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", @@ -684,43 +880,46 @@ "license": "MIT" }, "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-5.0.1.tgz", + "integrity": "sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/hashery": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.2.0.tgz", - "integrity": "sha512-43XJKpwle72Ik5Zpam7MuzRWyNdwwdf6XHlh8wCj2PggvWf+v/Dm5B0dxGZOmddidgeO6Ofu9As/o231Ti/9PA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.0.tgz", + "integrity": "sha512-nhQ6ExaOIqti2FDWoEMWARUqIKyjr2VcZzXShrI+A3zpeiuPWzx6iPftt44LhP74E5sW36B75N6VHbvRtpvO6Q==", "dev": true, "license": "MIT", "dependencies": { - "hookified": "^1.13.0" + "hookified": "^1.14.0" }, "engines": { "node": ">=20" } }, "node_modules/hookified": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.13.0.tgz", - "integrity": "sha512-6sPYUY8olshgM/1LDNW4QZQN0IqgKhtl/1C8koNZBJrKLBk3AZl6chQtNwpNztvfiApHMEwMHek5rv993PRbWw==", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", + "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", "dev": true, "license": "MIT" }, "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-5.1.0.tgz", + "integrity": "sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=20.10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -753,14 +952,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/imurmurhash": { @@ -830,6 +1030,19 @@ "node": ">=0.12.0" } }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -882,9 +1095,9 @@ "license": "MIT" }, "node_modules/keyv": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.4.tgz", - "integrity": "sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "license": "MIT", "dependencies": { @@ -901,13 +1114,6 @@ "node": ">=0.10.0" } }, - "node_modules/known-css-properties": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", - "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", - "dev": true, - "license": "MIT" - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -923,9 +1129,9 @@ "license": "MIT" }, "node_modules/mathml-tag-names": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", - "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-4.0.0.tgz", + "integrity": "sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==", "dev": true, "license": "MIT", "funding": { @@ -934,20 +1140,20 @@ } }, "node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", "dev": true, "license": "CC0-1.0" }, "node_modules/meow": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", - "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-14.1.0.tgz", + "integrity": "sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -1045,16 +1251,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -1076,9 +1272,9 @@ } }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", "dev": true, "funding": [ { @@ -1104,20 +1300,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-media-query-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true, - "license": "MIT" - }, - "node_modules/postcss-resolve-nested-selector": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", - "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", - "dev": true, - "license": "MIT" - }, "node_modules/postcss-safe-parser": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", @@ -1145,37 +1327,10 @@ "postcss": "^8.4.31" } }, - "node_modules/postcss-scss": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", - "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss-scss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.4.29" - } - }, "node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -1194,13 +1349,13 @@ "license": "MIT" }, "node_modules/qified": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/qified/-/qified-0.5.2.tgz", - "integrity": "sha512-7gJ6mxcQb9vUBOtbKm5mDevbe2uRcOEVp1g4gb/Q+oLntB3HY8eBhOYRxFI2mlDFlY1e4DOSCptzxarXRvzxCA==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.6.0.tgz", + "integrity": "sha512-tsSGN1x3h569ZSU1u6diwhltLyfUWDp3YbFHedapTmpBl0B3P6U3+Qptg7xu+v+1io1EwhdPyyRHYbEw0KN2FA==", "dev": true, "license": "MIT", "dependencies": { - "hookified": "^1.13.0" + "hookified": "^1.14.0" }, "engines": { "node": ">=20" @@ -1238,13 +1393,13 @@ } }, "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/reusify": { @@ -1296,13 +1451,16 @@ } }, "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/slice-ansi": { @@ -1334,37 +1492,42 @@ } }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", + "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": ">=8" + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.2.2" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/stylelint": { - "version": "16.25.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.25.0.tgz", - "integrity": "sha512-Li0avYWV4nfv1zPbdnxLYBGq4z8DVZxbRgx4Kn6V+Uftz1rMoF1qiEI3oL4kgWqyYgCgs7gT5maHNZ82Gk03vQ==", + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-17.4.0.tgz", + "integrity": "sha512-3kQ2/cHv3Zt8OBg+h2B8XCx9evEABQIrv4hh3uXahGz/ZEHrTR80zxBiK2NfXNaSoyBzxO1pjsz1Vhdzwn5XSw==", "dev": true, "funding": [ { @@ -1378,56 +1541,55 @@ ], "license": "MIT", "dependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4", - "@csstools/media-query-list-parser": "^4.0.3", - "@csstools/selector-specificity": "^5.0.0", - "@dual-bundle/import-meta-resolve": "^4.2.1", - "balanced-match": "^2.0.0", + "@csstools/css-calc": "^3.1.1", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-syntax-patches-for-csstree": "^1.0.27", + "@csstools/css-tokenizer": "^4.0.0", + "@csstools/media-query-list-parser": "^5.0.0", + "@csstools/selector-resolve-nested": "^4.0.0", + "@csstools/selector-specificity": "^6.0.0", "colord": "^2.9.3", "cosmiconfig": "^9.0.0", - "css-functions-list": "^3.2.3", + "css-functions-list": "^3.3.3", "css-tree": "^3.1.0", "debug": "^4.4.3", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^10.1.4", + "file-entry-cache": "^11.1.2", "global-modules": "^2.0.0", - "globby": "^11.1.0", + "globby": "^16.1.0", "globjoin": "^0.1.4", - "html-tags": "^3.3.1", + "html-tags": "^5.1.0", "ignore": "^7.0.5", + "import-meta-resolve": "^4.2.0", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.37.0", - "mathml-tag-names": "^2.1.3", - "meow": "^13.2.0", + "mathml-tag-names": "^4.0.0", + "meow": "^14.0.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.5.6", - "postcss-resolve-nested-selector": "^0.1.6", "postcss-safe-parser": "^7.0.1", - "postcss-selector-parser": "^7.1.0", + "postcss-selector-parser": "^7.1.1", "postcss-value-parser": "^4.2.0", - "resolve-from": "^5.0.0", - "string-width": "^4.2.3", - "supports-hyperlinks": "^3.2.0", + "string-width": "^8.1.1", + "supports-hyperlinks": "^4.4.0", "svg-tags": "^1.0.0", "table": "^6.9.0", - "write-file-atomic": "^5.0.1" + "write-file-atomic": "^7.0.0" }, "bin": { "stylelint": "bin/stylelint.mjs" }, "engines": { - "node": ">=18.12.0" + "node": ">=20.19.0" } }, "node_modules/stylelint-config-recommended": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-17.0.0.tgz", - "integrity": "sha512-WaMSdEiPfZTSFVoYmJbxorJfA610O0tlYuU2aEwY33UQhSPgFbClrVJYWvy3jGJx+XW37O+LyNLiZOEXhKhJmA==", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-18.0.0.tgz", + "integrity": "sha512-mxgT2XY6YZ3HWWe3Di8umG6aBmWmHTblTgu/f10rqFXnyWxjKWwNdjSWkgkwCtxIKnqjSJzvFmPT5yabVIRxZg==", "dev": true, "funding": [ { @@ -1441,40 +1603,16 @@ ], "license": "MIT", "engines": { - "node": ">=18.12.0" + "node": ">=20.19.0" }, "peerDependencies": { - "stylelint": "^16.23.0" - } - }, - "node_modules/stylelint-config-recommended-scss": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-16.0.2.tgz", - "integrity": "sha512-aUTHhPPWCvFyWaxtckJlCPaXTDFsp4pKO8evXNCsW9OwsaUWyMd6jvcUhSmfGWPrTddvzNqK4rS/UuSLcbVGdQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-scss": "^4.0.9", - "stylelint-config-recommended": "^17.0.0", - "stylelint-scss": "^6.12.1" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "postcss": "^8.3.3", - "stylelint": "^16.24.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - } + "stylelint": "^17.0.0" } }, "node_modules/stylelint-config-standard": { - "version": "39.0.1", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-39.0.1.tgz", - "integrity": "sha512-b7Fja59EYHRNOTa3aXiuWnhUWXFU2Nfg6h61bLfAb5GS5fX3LMUD0U5t4S8N/4tpHQg3Acs2UVPR9jy2l1g/3A==", + "version": "40.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-40.0.0.tgz", + "integrity": "sha512-EznGJxOUhtWck2r6dJpbgAdPATIzvpLdK9+i5qPd4Lx70es66TkBPljSg4wN3Qnc6c4h2n+WbUrUynQ3fanjHw==", "dev": true, "funding": [ { @@ -1488,100 +1626,40 @@ ], "license": "MIT", "dependencies": { - "stylelint-config-recommended": "^17.0.0" + "stylelint-config-recommended": "^18.0.0" }, "engines": { - "node": ">=18.12.0" + "node": ">=20.19.0" }, "peerDependencies": { - "stylelint": "^16.23.0" + "stylelint": "^17.0.0" } }, - "node_modules/stylelint-config-standard-scss": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-16.0.0.tgz", - "integrity": "sha512-/FHECLUu+med/e6OaPFpprG86ShC4SYT7Tzb2PTVdDjJsehhFBOioSlWqYFqJxmGPIwO3AMBxNo+kY3dxrbczA==", - "dev": true, - "license": "MIT", - "dependencies": { - "stylelint-config-recommended-scss": "^16.0.1", - "stylelint-config-standard": "^39.0.0" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "postcss": "^8.3.3", - "stylelint": "^16.23.1" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - } - } - }, - "node_modules/stylelint-scss": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.12.1.tgz", - "integrity": "sha512-UJUfBFIvXfly8WKIgmqfmkGKPilKB4L5j38JfsDd+OCg2GBdU0vGUV08Uw82tsRZzd4TbsUURVVNGeOhJVF7pA==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-tree": "^3.0.1", - "is-plain-object": "^5.0.0", - "known-css-properties": "^0.36.0", - "mdn-data": "^2.21.0", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.6", - "postcss-selector-parser": "^7.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "stylelint": "^16.0.2" - } - }, - "node_modules/stylelint-scss/node_modules/known-css-properties": { - "version": "0.36.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.36.0.tgz", - "integrity": "sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/stylelint-scss/node_modules/mdn-data": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.25.0.tgz", - "integrity": "sha512-T2LPsjgUE/tgMmRXREVmwsux89DwWfNjiynOeXuLd2mX6jphGQ2YE3Ukz7LQ2VOFKiVZU/Ee1GqzHiipZCjymw==", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", "dev": true, "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/supports-hyperlinks": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", - "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-4.4.0.tgz", + "integrity": "sha512-UKbpT93hN5Nr9go5UY7bopIB9YQlMz9nm/ct4IXt/irb5YRkn9WaqrOBJGZ5Pwvsd5FQzSVeYlGdXoCAPQZrPg==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" + "has-flag": "^5.0.1", + "supports-color": "^10.2.2" }, "engines": { - "node": ">=14.18" + "node": ">=20" }, "funding": { "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" @@ -1610,6 +1688,44 @@ "node": ">=10.0.0" } }, + "node_modules/table/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -1623,6 +1739,19 @@ "node": ">=8.0" } }, + "node_modules/unicorn-magic": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", + "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -1644,17 +1773,16 @@ } }, "node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-7.0.1.tgz", + "integrity": "sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==", "dev": true, "license": "ISC", "dependencies": { - "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": "^20.17.0 || >=22.9.0" } } } diff --git a/package.json b/package.json index b794f79..1ef8c68 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,9 @@ "version": "1.0.0", "description": "The node.js requirements to lint this project.", "scripts": { - "lint-theme:css": "stylelint \"assets/sass/**/*.scss\"", + "lint-theme:css": "stylelint \"assets/css/**/*.css\"", "lint-theme:js": "biome check", - "lint-project:css": "stylelint \"../../assets/sass/**/*.scss\"", + "lint-project:css": "stylelint \"../../assets/css/**/*.css\"", "lint-project:js": "biome check \"../../assets/js/**/*.js\"", "lint-theme": "npm run lint-theme:css && npm run lint-theme:js", "lint-project": "npm run lint-project:css && npm run lint-project:js", @@ -20,8 +20,9 @@ "author": "Fredrik Jonsson", "license": "GPL-2.0", "devDependencies": { - "stylelint": "^16.25.0", - "stylelint-config-standard-scss": "^16.0.0" + "@biomejs/biome": "^2.4.6", + "stylelint": "^17.4.0", + "stylelint-config-standard": "^40.0.0" }, "engines": { "node": ">=24.0.0" diff --git a/scripts/set_up_new_site.sh b/scripts/set_up_new_site.sh index f29691d..eba5de4 100755 --- a/scripts/set_up_new_site.sh +++ b/scripts/set_up_new_site.sh @@ -13,13 +13,12 @@ if [[ ! "$0" =~ "themes/zen/scripts/set_up_new_site.sh" ]]; then exit 1 fi -mkdir -p "assets/sass" +mkdir -p "assets/css" mkdir -p "layouts" -copy_files=("themes/zen/assets/sass/_extra.scss:assets/sass/_extra.scss" - "themes/zen/assets/sass/_fonts.scss:assets/sass/_fonts.scss" - "themes/zen/assets/sass/_custom.scss:assets/sass/_custom.scss" - "themes/zen/assets/sass/_zen.scss:assets/sass/_zen.scss" +copy_files=("themes/zen/assets/css/_fonts.scss:assets/css/_fonts.css" + "themes/zen/assets/css/_custom.scss:assets/css/_custom.css" + "themes/zen/assets/css/_zen.scss:assets/css/_zen.css" "themes/zen/layouts/home.html:layouts/home.html" "themes/zen/exampleSite/hugo.yaml:hugo.yaml" "themes/zen/.editorconfig:.editorconfig") diff --git a/theme.toml b/theme.toml index 1178f76..fac42eb 100644 --- a/theme.toml +++ b/theme.toml @@ -5,7 +5,7 @@ demosite = "https://zen-demo.xdeb.org/" license = "GPLv2" licenselink = "http://www.gnu.org/licenses/old-licenses/gpl-2.0.html" tags = ["accessible", "multilingual", "responsive", "blog", "search", "math", "podcast"] -features = ["accessible", "multilingual", "responsive", "grid", "sass", "search", "matomo", "jsonfeed", "math", "podcast"] +features = ["accessible", "multilingual", "responsive", "grid", "search", "matomo", "jsonfeed", "math", "podcast"] min_version = "0.146.0" [author]