diff --git a/conf/css/.postcssrc.yml b/conf/css/.postcssrc.yml index 39b75802a..7938a3ed5 100644 --- a/conf/css/.postcssrc.yml +++ b/conf/css/.postcssrc.yml @@ -17,6 +17,11 @@ plugins: features: custom-media-queries: true media-query-ranges: true + not-pseudo-class: true + nesting-rules: true + # RFE: Fix bug on the Internet so we can use these reliably + # SEE: https://github.com/postcss/postcss-custom-selectors/issues/40 + custom-selectors: true cssnano: preset: - 'default' @@ -27,3 +32,7 @@ plugins: exclude: true mergeRules: exclude: true + # This breaks values like `clamp(0px, 15%, 48px)` by stripping 0's unit + # SEE: https://github.com/cssnano/cssnano/issues/286 + convertValues: + exclude: true diff --git a/conf/css/freeze_variables/.postcssrc.yml b/conf/css/freeze_variables/.postcssrc.yml deleted file mode 100644 index 7ad61f018..000000000 --- a/conf/css/freeze_variables/.postcssrc.yml +++ /dev/null @@ -1,8 +0,0 @@ -plugins: - postcss-import: - path: - - './taccsite_cms/static/site_cms/css/src' - postcss-css-variables: - preserve: 'computed' - preserveAtRulesOrder: true - cssnano: {} diff --git a/package-lock.json b/package-lock.json index 463ff5341..baf9c1c4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "async": "^3.2.0", "cssnano": "^4.1.10", "dotenv": "^8.2.0", + "merge-lite": "^1.0.2", "npm-watch": "^0.7.0", "postcss-cli": "^7.1.2", "postcss-css-variables": "^0.17.0", @@ -1976,6 +1977,12 @@ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", "dev": true }, + "node_modules/merge-lite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/merge-lite/-/merge-lite-1.0.2.tgz", + "integrity": "sha512-28Q9aFRLzLCSp/2MLV49sbilBcCw7pIxq9YfOuX8+g/cMbPgYcAZgI0BLHnsb7ZRgvYOuaEGQPYJk8OWcGHk4A==", + "dev": true + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -5941,6 +5948,12 @@ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", "dev": true }, + "merge-lite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/merge-lite/-/merge-lite-1.0.2.tgz", + "integrity": "sha512-28Q9aFRLzLCSp/2MLV49sbilBcCw7pIxq9YfOuX8+g/cMbPgYcAZgI0BLHnsb7ZRgvYOuaEGQPYJk8OWcGHk4A==", + "dev": true + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", diff --git a/package.json b/package.json index d3d02dac4..3439077e8 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "async": "^3.2.0", "cssnano": "^4.1.10", "dotenv": "^8.2.0", + "merge-lite": "^1.0.2", "npm-watch": "^0.7.0", "postcss-cli": "^7.1.2", "postcss-css-variables": "^0.17.0", diff --git a/postcss.js b/postcss.js index a47f81ff5..e5890d1ee 100644 --- a/postcss.js +++ b/postcss.js @@ -35,20 +35,12 @@ function parallelCallback(err, results) { // SEE: https://www.npmjs.com/package/postcss#js-api /** * Build styles for the Core CMS - * @param {boolean} [shouldFreezeVariables=false] - Whether to freeze values of custom properties */ -function buildStylesCore({shouldFreezeVariables = false} = {}) { +function buildStylesCore() { let command; - let sourceDir; - let configDir; - if (shouldFreezeVariables === true) { - sourceDir = 'freeze_variables/'; - configDir = 'conf/css/freeze_variables/'; - } else { - sourceDir = ''; - configDir = standardConfigDir; - } + const sourceDir = ''; + const configDir = standardConfigDir; // Quote globbed paths to prevent OS from parsing them // SEE: https://github.com/postcss/postcss-cli/issues/142#issuecomment-310681302 @@ -69,20 +61,12 @@ function buildStylesCustom() { exec(command, execCallback); } -// The confusing is worth explaining (and fixing if we know how) -console.warn('The commands are run in parallel so the output may be out of order.' + "\n"); +// To explain why output is not sequiential +console.warn('The output may be out of order because the commands are run in parallel.' + "\n"); // Build process for styles may be run in parallel because they are independent // SEE: https://stackoverflow.com/a/10776939/11817077 parallel([ - // Always build Core assets buildStylesCore, - - // Build custom assets, except for Core - () => { if (env.CUSTOM_ASSET_DIR !== 'core-cms') buildStylesCustom() }, - - // Temporarily build "frozen variables" from Core - // FAQ: This is an advanced solution to a problem that should not exist - () => { buildStylesCore({shouldFreezeVariables: true}) }, - // NOTE: Do NOT support freezing variables for custom projects + buildStylesCustom ], parallelCallback); diff --git a/taccsite_cms/static/site_cms/css/src/_imports/_tests/postcss-extend.css b/taccsite_cms/static/site_cms/css/src/_imports/_tests/postcss-extend.css index 129caa323..18f68d831 100644 --- a/taccsite_cms/static/site_cms/css/src/_imports/_tests/postcss-extend.css +++ b/taccsite_cms/static/site_cms/css/src/_imports/_tests/postcss-extend.css @@ -54,7 +54,7 @@ Styleguide _Test.Extend /*! Class & Placeholder Selector, Use Placeholder Selector */ /*! Goal: */ -._test_4{color:blue} +._test_4,._test_mixin_4{color:blue} /*! Test: */ %_test_mixin_4, @@ -78,3 +78,21 @@ Styleguide _Test.Extend ._test_5 { @extend _test_mixin_5; } + + +/*! Nested Extends */ + +/*! Goal: */ +._test_6{color:#000}._test_6{background-color:#fff} + +/*! Test: */ +%_test_mixin_6a { + color: black; +} +%_test_mixin_6b { + @extend %_test_mixin_6a; + background-color: white; +} +._test_6 { + @extend %_test_mixin_6b; +} diff --git a/taccsite_cms/static/site_cms/css/src/_imports/_tests/postcss-preset-env.css b/taccsite_cms/static/site_cms/css/src/_imports/_tests/postcss-preset-env.css index 3e269189d..b4cce7ab6 100644 --- a/taccsite_cms/static/site_cms/css/src/_imports/_tests/postcss-preset-env.css +++ b/taccsite_cms/static/site_cms/css/src/_imports/_tests/postcss-preset-env.css @@ -73,3 +73,82 @@ Styleguide _Test.PresetEnv @media (--wide-window) { ._test{ background-color:red; } } + +/*! Custom Selectors */ +/* SEE: https://preset-env.cssdb.org/features#custom-selectors */ + +/*! Goal: */ +article h1+p,article h2+p,article h3+p{color: #000;} + +/*! Test: */ +@custom-selector :--heading h1, h2, h3; + +article :--heading + p { + color: #000; +} + +/*! Goal: */ +.nav-link:hover,.nav-link:focus,.nav-link:active{color:red;} + +/*! See: https://github.com/postcss/postcss-custom-selectors/issues/40 */ + +/*! Test: */ +@custom-selector :--nav-link-hover .nav-link:hover; +@custom-selector :--nav-link-focus .nav-link:focus; +@custom-selector :--nav-link-active .nav-link:active; + +:--nav-link-hover, +:--nav-link-focus, +:--nav-link-active { + color: red; +} + +/*! Goal: */ +h4,h5,h6{color: lime;}h4,h5,h6{color: magenta;} + +/*! Test: */ +@custom-selector :--test h1, h2, h3; + +:--test { + color: lime; +} + +@custom-selector :--test h4, h5, h6; + +:--test { + color: magenta; +} + +/*! `:not` Pseudo Class */ +/* SEE: https://preset-env.cssdb.org/features#not-pseudo-class */ + +/*! Goal: */ +._test>:not(._test--x):not(._test--y){align-items:center} + +/*! Test: */ +._test > *:not(._test--x, ._test--y) { + align-items: center; +} + +/*! Nesting Rules */ +/* SEE: https://preset-env.cssdb.org/features#nesting-rules */ + +/*! Goal: */ +.foo { display: grid; } + +@media (orientation: landscape) { + .foo { + grid-auto-flow: column; + } +} + +/*! Test: */ +.foo { + display: grid; + + @media (orientation: landscape) { + & { + grid-auto-flow: column; + } + } +} diff --git a/taccsite_cms/static/site_cms/css/src/_imports/branding_logos.css b/taccsite_cms/static/site_cms/css/src/_imports/branding_logos.css deleted file mode 100644 index e1d157770..000000000 --- a/taccsite_cms/static/site_cms/css/src/_imports/branding_logos.css +++ /dev/null @@ -1,71 +0,0 @@ -/* BRANDING & LOGO CLASS SELECTORS */ -/* TODO: Convert to a component */ - -/* WARNING: NO-R/EM: Until Frontera CMS drops Bootstrap 3.7.1 (for old design)… - `em` nor `rem` was not allowed because results were not consistent. - UPDATE: As of PR #312, this has likely changed (untested). */ - -/* Shared by All Templates */ - -/* Branding Selectors */ - -.branding-header { - --branding-logo-height: 24px; - - display: flex; - align-items: center; - justify-content: center; - - /* This prevents header bar resize when branding is dynamically added */ - /* CAVEAT: This is only for Portal and Docs which dynamically load content */ - /* FAQ: Do not use `48.78px`, because Safari only accepts whole numbers */ - height: 49px; - - background-color: var(--global-color-primary--xx-dark); - color: var(--global-color-primary--xx-light); - border-bottom: 1px solid var(--global-color-primary--normal); -} - -.branding-seperator { - width: 1px; - height: 100%; - max-height: var(--branding-logo-height); - border-left: solid 1px var(--global-color-primary--xx-light); - margin: 0 15px; - vertical-align: middle; -} - -.branding-logo { - height: 30px; - margin: 0; - padding: 0; - border: none; -} - -.branding-logo--tall { - height: 35px; -} - -/* Specific Brand Logo Selectors */ - -.branding-nsf { - height: 35px; -} - -.branding-tacc { - height: var(--branding-logo-height); -} - -.branding-utaustin { - height: var(--branding-logo-height); -} - -/* Logo Selectors */ - -.portal-logo { - float: left; - height: 40px; - margin: 0; - padding: 0; - border: none; -} diff --git a/taccsite_cms/static/site_cms/css/src/_imports/components/c-branding.css b/taccsite_cms/static/site_cms/css/src/_imports/components/c-branding.css new file mode 100644 index 000000000..3a24ef2be --- /dev/null +++ b/taccsite_cms/static/site_cms/css/src/_imports/components/c-branding.css @@ -0,0 +1,88 @@ +/* +Branding + +A list of linked images for funders and affiliates. Project customization should be minimal. + +Markup: c-branding.twig.html + +Styleguide Components.Branding +*/ +@import url("_imports/tools/selectors.css"); +@import url("_imports/tools/media-queries.css"); + +/* IDEA: Use multi-column (`column-*`) to simplify border, margin, separator */ + + + +/* Base */ + +.c-branding { + --column-gap--side: 25px; + --column-gap--center: 35px; + + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} + + +/* A responsive column gap */ +.c-branding__link:first-child .c-branding__image { + margin-right: var(--column-gap--side); +} +.c-branding__link:not(:first-child, :last-child) .c-branding__image { + margin-left: var(--column-gap--center); + margin-right: var(--column-gap--center); +} +.c-branding__link:last-child .c-branding__image { + margin-left: var(--column-gap--side); +} +@media (--nav-compressed) { + .c-branding { + --column-gap--side: 10px; + --column-gap--center: 10px; + } +} + + + +/* Elements */ + +.c-branding__link { + /* To center image (in case other styles shrink the image) */ + display: flex; + align-items: center; + justify-content: center; + + /* FAQ: Percentage-based math adapts to container height */ + height: var(--height, 90%); +} +.c-branding__separator { + /* To add border */ + /* FAQ: Percentage-based math adapts to container height */ + height: calc(100% - 35%); + border-left: env(--border-width--normal) solid var(--global-color-primary--xx-light); + + /* To hide text */ + width: 0; + overflow: hidden; +} + +/* Specific brands */ +/* FAQ: Percentage-based math adapts to container height */ + +.c-branding__nsf-link +.c-branding__tall-link, { --height: 87.5%; } +.c-branding__tacc-link { --height: 75%; } +.c-branding__utexas-link { --height: 65%; } + + + +/* Modifiers */ + +/* Compact */ +.c-branding--compact { + --column-gap--side: 10px; + --column-gap--center: 10px; +} diff --git a/taccsite_cms/static/site_cms/css/src/_imports/components/c-branding.twig.html b/taccsite_cms/static/site_cms/css/src/_imports/components/c-branding.twig.html new file mode 100644 index 000000000..32731f22b --- /dev/null +++ b/taccsite_cms/static/site_cms/css/src/_imports/components/c-branding.twig.html @@ -0,0 +1,22 @@ +
diff --git a/taccsite_cms/static/site_cms/css/src/_imports/components/c-logo.css b/taccsite_cms/static/site_cms/css/src/_imports/components/c-logo.css new file mode 100644 index 000000000..902ca73d6 --- /dev/null +++ b/taccsite_cms/static/site_cms/css/src/_imports/components/c-logo.css @@ -0,0 +1,29 @@ +/* +Logo + +The main website logo. Project customization should be minimal. + +Markup: c-logo.twig.html + +Styleguide Components.Logo +*/ +/* NOTE: All styles here are currently handled by Bootstrap `.navbar-brand` */ +/* TODO: Abandon Bootstrap `.navbar-brand`. Implement minimum styles instead. */ + + + +/* Base */ + +.c-logo { + /* … */ +} + + + +/* Elements */ + +.c-logo__image { + /* Of base i.e. container */ + max-height: 100%; + max-width: 100%; +} diff --git a/taccsite_cms/static/site_cms/css/src/_imports/components/c-logo.twig.html b/taccsite_cms/static/site_cms/css/src/_imports/components/c-logo.twig.html new file mode 100644 index 000000000..710c26a39 --- /dev/null +++ b/taccsite_cms/static/site_cms/css/src/_imports/components/c-logo.twig.html @@ -0,0 +1,4 @@ + + + diff --git a/taccsite_cms/static/site_cms/css/src/_imports/elements/html-elements.css b/taccsite_cms/static/site_cms/css/src/_imports/elements/html-elements.css index 29516ae10..e3a087888 100755 --- a/taccsite_cms/static/site_cms/css/src/_imports/elements/html-elements.css +++ b/taccsite_cms/static/site_cms/css/src/_imports/elements/html-elements.css @@ -29,7 +29,7 @@ body { body { /* To avoid negative whitespace at right on horz scroll on tiny screen */ - min-width: 290px; /* developer-decided value */ + min-width: env(--body-min-width); /* To overwrite Bootstrap */ color: var(--global-color-primary--x-dark); diff --git a/taccsite_cms/static/site_cms/css/src/_imports/elements/tacc-search-bar.css b/taccsite_cms/static/site_cms/css/src/_imports/elements/tacc-search-bar.css index 9b67162e5..9d4fbb97d 100644 --- a/taccsite_cms/static/site_cms/css/src/_imports/elements/tacc-search-bar.css +++ b/taccsite_cms/static/site_cms/css/src/_imports/elements/tacc-search-bar.css @@ -1,64 +1,21 @@ /* Search Bar -Styles for search bar cloned from Portal codebase, but also relying on Bootstrap ([whose version usage is complicated][bootstrap-versions]): -- Bootstrap 4.0.0 (loaded as external file in CMS via `` in template) -- relevant delta (manually built) from Bootstrap 4.0.0 (CMS) to 4.3.1 (Portal) +A custom search bar originally designed for the header. -[bootstrap-versions]: https://confluence.tacc.utexas.edu/x/OAACBw - -Markup: s-search-bar.html +Markup: tacc-search-bar.html Styleguide Elements.TACC.SearchBar */ - - -/* FAQ: The `.s-search-bar` is added to trump Bootstrap class specificity */ - -/* tacc-search-bar.s-search-bar::part(form) { */ [part="form"] { - /* FAQ: Ensure search field font matches Portal */ - /* SEE: https://confluence.tacc.utexas.edu/x/cYAZCg */ - font-family: "Roboto"; - - /* Copied from `.container` from Portal */ - /* SEE: https://github.com/TACC/Frontera-Portal/blob/master/client/src/components/DataFiles/DataFilesSearchbar/DataFilesSearchbar.module.css */ - display: flex; - flex-direction: row; - align-items: center; -} - -/* FAQ: Added `#s-header` to trump `.workbench-content .btn-secondary` specificity because it should match (thus override); could have used merely `.s-header`, but CMS use of `@apply` brings in CSS pseudo-class styles, while Portal use of `composes` does not, so `:hover` styles have effect in CMS while they do not have effect in Portal, hence using `#s-header` to create a more specific selector */ -/* !!!: This causes the same bug it does in Portal; no `:hover` state */ -/* #s-header tacc-search-bar.s-search-bar::part(button) { */ -[part="button"] { - @extend .c-button--secondary; - - /* Copied from `.workbench-content .btn-secondary` from Portal `Workbench.scss` */ - background-color: #F4F4F4; - color: #484848; - border: 1px solid #AFAFAF; -} - -.input-group { - /* If link text uses 2 lines, header grows taller (but it must not do so) */ - flex-wrap: nowrap; -} - -/* tacc-search-bar.s-search-bar::part(button__icon) { */ -[part="button__icon"] { - @extend .c-button__icon--before; -} - -/* tacc-search-bar.s-search-bar::part(input) { */ -[part="input"] { - @extend .form-control; - @extend input.form-control; + /* To fill available space of `:host` */ + width: 100%; + height: 100%; } /* Show search bar after all relevant styles have loaded */ /* FAQ: Manage visibility of search bar to avoid FOUC */ -/* HACK: This should be done via a dynamically-added `-is-loaded` class */ -/* tacc-search-bar.s-search-bar::part(form) { */ +/* HACK: This should be done via dynamic `[data-status="loaded"]` */ +/* SEE: /.../templates/nav_search.raw.html */ :host { visibility: visible; height: auto; } diff --git a/taccsite_cms/static/site_cms/css/src/_imports/objects/o-site.css b/taccsite_cms/static/site_cms/css/src/_imports/objects/o-site.css index 85a85c178..96472dceb 100644 --- a/taccsite_cms/static/site_cms/css/src/_imports/objects/o-site.css +++ b/taccsite_cms/static/site_cms/css/src/_imports/objects/o-site.css @@ -24,7 +24,8 @@ Styleguide Objects.Site .o-site__foot { flex-shrink: 0; - /* Hides any overflow from `o-site__body` (e.g. `o-section__banner-image`) */ - position: relative; - z-index: 1; + position: relative; /* required for `z-index` */ } +/* To hide overflow from `o-site__body` (ex: `o-section__banner-image`) */ +.o-site__head { z-index: 2; } +.o-site__foot { z-index: 1; } diff --git a/taccsite_cms/static/site_cms/css/src/_imports/settings/border.css b/taccsite_cms/static/site_cms/css/src/_imports/settings/border.css index c11cd836a..07bf41593 100644 --- a/taccsite_cms/static/site_cms/css/src/_imports/settings/border.css +++ b/taccsite_cms/static/site_cms/css/src/_imports/settings/border.css @@ -7,13 +7,17 @@ /* Usage: `var(--global-border-width--normal)` */ /* SEE: https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties */ +/* TODO: Replace use of `var(--global-border…)` with `env(--border…)` */ :root { - --global-border-width--normal: 1px; + --global-border-width--normal: env(--border-width--normal); --global-border--normal: var(--global-border-width--normal) solid var(--global-color-primary--normal); - --global-border-width--thick: 2px; + --global-border-width--thick: env(--border-width--thick); --global-border--thick: var(--global-border-width--thick) solid var(--global-color-primary--normal); - --global-border-width--x-thick: 3px; + --global-border-width--x-thick: env(--border-width--x-thick); --global-border--x-thick: var(--global-border-width--x-thick) solid var(--global-color-primary--normal); + + --global-border-width--xx-thick: env(--border-width--xx-thick); + --global-border--xx-thick: var(--global-border-width--xx-thick) solid var(--global-color-primary--normal); } diff --git a/taccsite_cms/static/site_cms/css/src/_imports/settings/font.css b/taccsite_cms/static/site_cms/css/src/_imports/settings/font.css index e45477bc2..9113f227e 100644 --- a/taccsite_cms/static/site_cms/css/src/_imports/settings/font.css +++ b/taccsite_cms/static/site_cms/css/src/_imports/settings/font.css @@ -54,14 +54,8 @@ Styleguide Settings.CustomProperties.Font /* Weight */ - /* SEE: https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight */ - - /* NOTE: Long names to be consistent (opinions welcome) */ - --global-font-weight--regular: 400; - --global-font-weight--medium: 500; - --global-font-weight--bold: 700; - - /* NOTE: Short names to increase adoption (opinions welcome) */ + /* TODO: Replace use of `var(--…)` with `env(--…)` for font weights */ + /* WARNING: Deprecated! Do NOT use. Use `env(--…)` instead for font weights */ --regular: 400; --medium: 500; --bold: 700; diff --git a/taccsite_cms/static/site_cms/css/src/_imports/tools/media-queries.css b/taccsite_cms/static/site_cms/css/src/_imports/tools/media-queries.css index 1671ae32d..1e4bae2c4 100644 --- a/taccsite_cms/static/site_cms/css/src/_imports/tools/media-queries.css +++ b/taccsite_cms/static/site_cms/css/src/_imports/tools/media-queries.css @@ -15,6 +15,15 @@ Reference: Styleguide Tools.CustomMediaQueries.Breakpoints */ + + + +/* Standard Breakpoints (based on Bootstrap) */ + +@custom-media --xx-narrow-and-below (width < 320px); +@custom-media --xx-narrow-and-above (width >= 320px); +@custom-media --xx-narrow-to-narrow (320px <= width < 576px); + @custom-media --x-narrow-and-below (width < 576px); @custom-media --x-narrow-and-above (width >= 576px); @custom-media --x-narrow-to-narrow (576px <= width < 768px); @@ -46,3 +55,22 @@ Styleguide Tools.CustomMediaQueries.Breakpoints @custom-media --max-wide-and-below (width < 2400px); @custom-media --max-wide-and-above (width >= 2400px); /* @custom-media --max-wide-to-god-wide (... <= width < ...); */ + + + +/* Header Navbar State (Compressed/Expanded) */ + +/* Map `s-header.html`'s `navbar-expand-*` to `--*-and-below|above`: + - `...-xl` → `--wide-and-...` + - `...-lg` → `--medium-and-...` + - `...-md` → `--narrow-and-...` + - `...-sm` → `--x-narrow-and-...` */ +@custom-media --nav-compressed (width < 1200px); +@custom-media --nav-expanded (width >= 1200px); + +/* Arbitrary widths above `--nav-expanded` */ +/* TODO: Rename these to `--nav-expanded-*` */ +@custom-media --nav-wide-and-below (width < 1400px); +@custom-media --nav-wide-and-above (width >= 1400px); +@custom-media --nav-x-wide-and-below (width < 1680px); +@custom-media --nav-x-wide-and-above (width >= 1680px); diff --git a/taccsite_cms/static/site_cms/css/src/_imports/tools/selectors.css b/taccsite_cms/static/site_cms/css/src/_imports/tools/selectors.css new file mode 100644 index 000000000..de05919e0 --- /dev/null +++ b/taccsite_cms/static/site_cms/css/src/_imports/tools/selectors.css @@ -0,0 +1,19 @@ +/* DO NOT ADD STYLES HERE; ADD CUSTOM SELECTORS TO USE IN OTHER STYLESHEETS */ + +/* +For Other Sites + +These are global selectors to target known subsites. + +Usage: `:--for-subsite .some-class { … }` + +Notice: These must be Tools (imported as needed) until native browser support, at which time they can become Settings (imported globally). + +Reference: +- https://drafts.csswg.org/css-extensions/#custom-selectors + +Styleguide Tools.CustomSelectors.ForOtherSites +*/ +@custom-selector :--for-cms body > .o-site__head; +@custom-selector :--for-portal body > .content; +@custom-selector :--for-docs .wy-body-for-nav; diff --git a/taccsite_cms/static/site_cms/css/src/_imports/tools/x-arrow.css b/taccsite_cms/static/site_cms/css/src/_imports/tools/x-arrow.css new file mode 100644 index 000000000..c7f1d74ea --- /dev/null +++ b/taccsite_cms/static/site_cms/css/src/_imports/tools/x-arrow.css @@ -0,0 +1,35 @@ +/* +Arrow + +An arrow generator. Set variables for specific use cases. + +.x-arrow--right - Rightward (>) +.x-arrow--left - Leftward (<) +.x-arrow--up - Upward (^) +.x-arrow--down - Downward (v) + +Styleguide Components.Branding +*/ + +/* SEE: https://www.w3schools.com/howto/howto_css_arrows.asp */ +%x-arrow { + --size: 5px; + --line: 2px; + --color: black; + + display: inline-block; + vertical-align: middle; + + /* arrow size */ + padding: var(--size); + + /* line width */ + border-width: 0 var(--line) var(--line) 0; + border-style: solid; + border-color: var(--color); +} + +%x-arrow--right { transform: rotate(-45deg); } +%x-arrow--left { transform: rotate(135deg); } +%x-arrow--up { transform: rotate(-135deg); } +%x-arrow--down { transform: rotate(45deg); } diff --git a/taccsite_cms/static/site_cms/css/src/_imports/tools/x-hide.css b/taccsite_cms/static/site_cms/css/src/_imports/tools/x-hide.css new file mode 100644 index 000000000..615d4bc6a --- /dev/null +++ b/taccsite_cms/static/site_cms/css/src/_imports/tools/x-hide.css @@ -0,0 +1,50 @@ +/* +Hide + +Methods to hide text. + +.x-hide--for-all - Hide for all media and remove layout +.x-hide--for-all-but-has-layout - Hide for all media but retain layout +.x-hide--text-image-replacement - Hide text to replace with image +.x-hide--visually - Hide only for visual UI + +Resources: +- https://kittygiraudel.com/2021/02/17/hiding-content-responsibly/ +- https://codepen.io/vincent-valentin/full/JjGmxzV + +Styleguide Tools.ExtendsAndMixins.Hide +*/ + +/* To hide content from all interfaces, even screen readers */ +%x-hide--for-all { + display: none; +} +%x-hide--for-all-but-has-layout { + visibility: hidden; +} + +/* To replace text with image (meets WCAG 2.0 success criteria) */ +/* SEE: https://www.w3.org/TR/WCAG20-TECHS/C30.html */ +%x-hide--text-image-replacement { + /* background-image: url('…'); *//* for user to define */ +} +%x-hide--text-image-replacement__text { + position: absolute; + left: -9999em; +} + +/* To hide content only from visual interfaces (not screen readers) */ +/* SEE: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/ */ +%x-hide--visually { + clip: rect(0 0 0 0); + clip-path: inset(50%); + height: 1px; + overflow: hidden; + position: absolute; + white-space: nowrap; + width: 1px; + + /* Added by TACC based on other examples */ + border: none; + padding: 0; +} diff --git a/taccsite_cms/static/site_cms/css/src/_imports/tools/x-mobile-button.css b/taccsite_cms/static/site_cms/css/src/_imports/tools/x-mobile-button.css new file mode 100644 index 000000000..39a4c256f --- /dev/null +++ b/taccsite_cms/static/site_cms/css/src/_imports/tools/x-mobile-button.css @@ -0,0 +1,126 @@ +/* +Mobile Button (or Link) + +Styles to lay out button icon, text, and toggle in a compressed area. + +`x-mobile-button--has-toggle` +``` +┌────────────┬───┐ +│ │ │ +│ │ │ +│ Icon │ │ +├────────────┤ ▼ │ +│ Text │ │ +│ │ │ +└────────────┴───┘ +``` + +`x-mobile-button--no-toggle` +``` +┌────────────────┐ +│ │ +│ │ +│ Icon │ +├────────────────┤ +│ Text │ +│ │ +└────────────────┘ +``` + +`x-mobile-button--only-icon` +``` +┌────────────────┐ +│ │ +│ │ +│ │ +│ Icon │ +│ │ +│ │ +└────────────────┘ +``` + +%x-mobile-button--has-toggle - Position toggle (assumed) on side of button +%x-mobile-button--no-toggle - Do not position toggle (would fall to bottom) +%x-mobile-button--only-icon - Position icon (no other el's) in center of button + +Styleguide Tools.ExtendsAndMixins.MobileButton +*/ + +/* WARNING: A button must have `display: (inline-)grid` set externally */ +/* FAQ: Why not set `display: grid` here? + - It may break a button conditionally dependent on `display: none`. + - It would be overridden if button needs `display: inline-grid`. + - It makes user aware of the complexity of `display` and `grid`. +*/ + + + +/* Base */ + +%x-mobile-button { + /* FAQ: The flex properties require `display` of `grid` or `inline-grid` */ + /* display: grid; *//* set this externally */ + + grid-auto-flow: column; + grid-template-rows: auto; + justify-items: center; +} + + + +/* Elements */ + +%x-mobile-button__icon { + grid-area: icon; +} + +%x-mobile-button__text { + grid-area: text; + + align-self: start; + + font-family: var(--global-font-family--sans); + font-size: 10px; /* WARNING: Do not use `rem` until `html { 62.5%; }` */ + text-align: center; + text-transform: uppercase; + font-weight: env(--medium); +} + +%x-mobile-button__toggle { + grid-area: toggle; + + align-self: center; +} + + +/* Modifiers */ + +%x-mobile-button--has-toggle, +%x-mobile-button--no-toggle { + /* To make icon and text appear vertically centered as a group */ + grid-template-rows: auto 16px; /* a tad taller than text line height */ + + align-items: end; +} + +%x-mobile-button--has-toggle { + @extend %x-mobile-button; + + grid-template-areas: + "icon toggle" + "text toggle"; +} +%x-mobile-button--no-toggle { + @extend %x-mobile-button; + + grid-template-areas: + "icon" + "text"; +} +%x-mobile-button--only-icon { + @extend %x-mobile-button; + + align-items: center; /* To vertically center icon */ + grid-template-areas: + "icon"; +} diff --git a/taccsite_cms/static/site_cms/css/src/_imports/tools/x-overlay.css b/taccsite_cms/static/site_cms/css/src/_imports/tools/x-overlay.css index 57209b900..c6cbf601f 100644 --- a/taccsite_cms/static/site_cms/css/src/_imports/tools/x-overlay.css +++ b/taccsite_cms/static/site_cms/css/src/_imports/tools/x-overlay.css @@ -14,9 +14,24 @@ Styleguide Tools.ExtendsAndMixins.Overlay --color-bkgd-rgb: var(--global-color-primary--normal); color: var(--color-text); - background-color: rgba(var(--color-bkgd-rgb), 0.65); - backdrop-filter: blur(6px); - -webkit-backdrop-filter: blur(6px); + + @supports (-webkit-backdrop-filter: none) { + & { + background-color: rgba(var(--color-bkgd-rgb), 0.65); + -webkit-backdrop-filter: blur(6px); + } + } + @supports (backdrop-filter: none) { + & { + background-color: rgba(var(--color-bkgd-rgb), 0.65); + backdrop-filter: blur(6px); + } + } + @supports not (backdrop-filter: none) and not (backdrop-filter: none) { + & { + background-color: rgba(var(--color-bkgd-rgb), 0.95); + } + } } %x-overlay--callout { diff --git a/taccsite_cms/static/site_cms/css/src/_imports/trumps/README.css b/taccsite_cms/static/site_cms/css/src/_imports/trumps/README.css index 1068295b7..2f990b30c 100755 --- a/taccsite_cms/static/site_cms/css/src/_imports/trumps/README.css +++ b/taccsite_cms/static/site_cms/css/src/_imports/trumps/README.css @@ -54,6 +54,47 @@ Rules: Styleguide Trumps.Scopes */ +/* +For (Other Sites) + +For (Other Sites) styles are functional overrides and styles that are scoped to a specific subsite that shares elements with sibling subsites. These are meant to be used sparingly. The for-other-site styles are specifically intended for needs specific to Docs, CMS, or Portal. + +Guidelines: + +- For (Other Site) styles are especially rare, evaluate before creating. +- For reliable results, use a consistent selector for each subsite. + +Rules: + +- The `!important` may be used. +- All styles **must** have a comment. + +Styleguide Trumps.ForOtherSites +*/ + +/* +Scopes + +Scope styles are functional overrides and styles that are scoped to a specific area. These are meant to be used sparingly. Examples of scopes are functional styles for third-party markup, WYSIWIG editor tags, form elements, components with a forced relationship. + +Reference: + +- [BEM with Namespaces: Scope Namespaces](https://csswizardry.com/2015/03/more-transparent-ui-code-with-namespaces/#scope-namespaces-s-) + +Guidelines: + +- Scopes are pretty rare, evaluate before creating. +- A consistent way to author these in nested inside `.s-* {}`. + +Rules: + +- The `!important` may be used. +- All overrides **must** have a comment. +- Scope styles should have a comment. + +Styleguide Trumps.Scopes +*/ + /* Utility diff --git a/taccsite_cms/static/site_cms/css/src/_imports/trumps/for-docs.header.css b/taccsite_cms/static/site_cms/css/src/_imports/trumps/for-docs.header.css new file mode 100644 index 000000000..3d8c623d0 --- /dev/null +++ b/taccsite_cms/static/site_cms/css/src/_imports/trumps/for-docs.header.css @@ -0,0 +1,127 @@ +/* +Docs + +The [Core Docs](https://github.com/TACC/Core-Docs). + +Styleguide Trumps.ForOtherSites.Docs +*/ +@import url("_imports/tools/selectors.css"); +@import url("_imports/tools/x-hide.css"); + + + +/* Update & Unset Outdated Styles */ + +:--for-docs #frontera-top-nav { + min-height: calc( + var(--header-brandbar-height) + var(--header-navbar-height) + ); + background-color: unset; +} + + + +/* Ammend `s-header.css` (for Header because of Body) */ + +@media (--xx-narrow-and-below) { + + /* To position navbar+button based on screen width instead of parent width */ + /* FAQ: Portal body min-width places a static button outside narrow screen */ + :--for-docs .s-header :--navbar-toggle { + flex-grow: 1; + + /* To overwrite `s-header.css` */ + margin-right: 0; + } + :--for-docs .s-header .navbar-collapse { + /* To overwrite `s-header.css` */ + right: 0; + } + +} + + + +/* Initialize Sidebar Position (for Dependency on Header Height) */ + +/* To position Docs' sidebar nav at expected initial vertical location ASAP */ +:--for-docs nav.stickynav { + /* To override `top: 0` (in `theme.css`) */ + /* FAQ: This is an initial value that is re-calculated by a Docs script */ + /* SEE: https://bitbucket.org/taccaci/frontera-tech-docs/src/429f05f/frontera_theme/base.html#lines-69 */ + top: calc( + var(--header-brandbar-height) + var(--header-navbar-height) + ); +} + + + +/* Supplement Bootstrap (for Search Form in Header) */ +/* AFTER GH-101: Docs: Remove these blocks */ +/* SEE: https://bitbucket.org/taccaci/frontera-tech-docs/src/ed6a61a/docs/css/cms.bootstrap.4.3.1.css#lines-18:25 */ +/* SEE: https://bitbucket.org/taccaci/frontera-tech-docs/src/ed6a61aeb8bc7776a0b1be0f93ade47bcd05e3ba/docs/css/cms.bootstrap.4.3.1.css#lines-606:624 */ + +/* To compensate for Docs not having `.form-inline` in _its_ Bootstrap 4.3.1 */ +:--for-docs .form-inline { + /* The search bar expects these styles to be available */ + /* SEE: CMS //maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap… */ + /* SEE: Portal //stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap… */ + /* SEE: Docs /src/5b223a5/docs/css/cms.bootstrap.4.3.1.css */ + display: flex; + /* NOTE: These are perceptibly ineffectual but consistent with Portal & CMS */ + flex-flow: row wrap; + align-items: center; +} + +/* To compensate for Docs not having `.sr-only` in _its_ Bootstrap 4.3.1 */ +:--for-docs .sr-only { + @extend %x-hide--visually; +} + + + +/* Overwrite ReadTheDocs (for Images in Header) */ + +:--for-docs .s-header img, +:--for-docs .c-branding img { + width: unset; + vertical-align: unset; +} + + + +/* Overwrite ReadTheDocs (so Header Mobile Nav covers Body Side Nav) */ + +.wy-nav-side { + z-index: unset; +} + + + +/* Overwrite TACC (for TACC Icons in Header, for FontAwesome Icons in Body) */ + +/* To override an override that exists in a - + - - - -{# NOTE: Copied from Portal DataFiles search bar (rendered markup, not raw) #} -{# SEE: https://github.com/TACC/Frontera-Portal/blob/master/client/src/components/DataFiles/DataFilesSearchbar/DataFilesSearchbar.js #} diff --git a/taccsite_custom b/taccsite_custom index 4e51b1a7f..9a7ea578e 160000 --- a/taccsite_custom +++ b/taccsite_custom @@ -1 +1 @@ -Subproject commit 4e51b1a7f4c26d9bc67589df22037789e42e6c5d +Subproject commit 9a7ea578ea7d52a9df5b6300d4456fa2f99df362 diff --git a/yarn.lock b/yarn.lock index 85332abc7..dc026c254 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1277,6 +1277,11 @@ mdn-data@2.0.4: resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz" integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== +merge-lite@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/merge-lite/-/merge-lite-1.0.2.tgz" + integrity sha512-28Q9aFRLzLCSp/2MLV49sbilBcCw7pIxq9YfOuX8+g/cMbPgYcAZgI0BLHnsb7ZRgvYOuaEGQPYJk8OWcGHk4A== + merge2@^1.3.0: version "1.4.1" resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"