diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index b69c9e964a..130b374feb 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -5,19 +5,19 @@ on: pull_request jobs: build: name: Build docs - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Check out code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5 with: go-version: '~1.17' - name: Get Go module cache directory path id: go-module-cache-dir-path run: echo "dir=$(go env GOMODCACHE)" >> $GITHUB_OUTPUT - name: Initialize Go module cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ${{ steps.go-module-cache-dir-path.outputs.dir }} key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} @@ -25,25 +25,9 @@ jobs: ${{ runner.os }}-go- - name: Download Go dependencies run: make go.deps - - name: Set up Node - uses: actions/setup-node@v3 - with: - node-version: '~16' - - name: Get Yarn cache directory path - id: yarn-cache-dir-path - run: echo "dir=$(npx yarn cache dir)" >> $GITHUB_OUTPUT - - name: Initialize Yarn module cache - uses: actions/cache@v3 - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - name: Download Yarn dependencies - run: make js.deps - name: Initialize Hugo binary cache id: cache-hugo - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: hugo.linux key: ${{ runner.os }}-hugo-${{ hashFiles('**/go.sum') }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 28a5b46839..fbafc1857a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,24 +5,27 @@ on: branches: - master +permissions: + contents: write + jobs: release: name: Release docs - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Check out code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@v3 + uses: actions/setup-go@v5 with: go-version: '~1.17' - name: Get Go module cache directory path id: go-module-cache-dir-path run: echo "dir=$(go env GOMODCACHE)" >> $GITHUB_OUTPUT - name: Initialize Go module cache - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ${{ steps.go-module-cache-dir-path.outputs.dir }} key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} @@ -30,25 +33,9 @@ jobs: ${{ runner.os }}-go- - name: Download Go dependencies run: make go.deps - - name: Set up Node - uses: actions/setup-node@v3 - with: - node-version: '~16' - - name: Get Yarn cache directory path - id: yarn-cache-dir-path - run: echo "dir=$(npx yarn cache dir)" >> $GITHUB_OUTPUT - - name: Initialize Yarn module cache - uses: actions/cache@v3 - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - name: Download Yarn dependencies - run: make js.deps - name: Initialize Hugo binary cache id: cache-hugo - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: hugo.linux key: ${{ runner.os }}-hugo-${{ hashFiles('**/go.sum') }} @@ -63,8 +50,7 @@ jobs: HUGO: ./hugo.linux HUGO_BASE_URL: https://www.thethingsnetwork.org/docs - name: Deploy documentation to Github pages - uses: JamesIves/github-pages-deploy-action@releases/v3 + uses: JamesIves/github-pages-deploy-action@v4 with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BRANCH: gh-pages - FOLDER: public + branch: gh-pages + folder: public diff --git a/.gitignore b/.gitignore index 66cba4aff9..70220c187b 100644 --- a/.gitignore +++ b/.gitignore @@ -107,3 +107,6 @@ $RECYCLE.BIN/ ### Internal docs build /internal/ + +### Hugo build lock +.hugo_build.lock diff --git a/Makefile b/Makefile index e13d46323b..86f51653a4 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,6 @@ clean.public: .PHONY: clean.deps clean.deps: rm -rf $(FREQUENCY_PLAN_DEST) - rm -rf $(YARN_DEPS) .PHONY: build.internal build.internal: @@ -57,16 +56,12 @@ new: @: .PHONY: deps -deps: hooks | go.deps js.deps +deps: hooks | go.deps .PHONY: go.deps go.deps: go mod download -.PHONY: js.deps -js.deps: - yarn --cwd $(DOC_ROOT) - hugo.exe: go.mod go.sum GOOS=windows go build -o $@ $(HUGO_BUILD_FLAGS) $(HUGO_MODULE) diff --git a/README.md b/README.md index 4e006e9e63..6c7dbfb75f 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,29 @@ Data for generated documentation like the glossary is stored in `doc/data`. ## Development Environment Dependencies -The Things Network Documentation development tooling uses [Go](https://golang.org/doc/install) and [Yarn](https://yarnpkg.com/en/docs/install). +The Things Network Documentation development tooling uses [Go](https://golang.org/doc/install) +(Hugo is pinned in `go.mod` and built with `make deps`). The theme has no JavaScript build step. - Follow [Go's installation guide](https://golang.org/doc/install) to install Go. -- Follow [Yarn's installation guide](https://yarnpkg.com/en/docs/install) to install Yarn. -In order to build the documentation site with the right theme, you need to run -`make deps` from time to time. This will install [Yarn](https://yarnpkg.com/) on Mac and Unix systems if it is not already installed. +## Theme + +The theme lives in `doc/layouts` + `doc/assets` (plain CSS and JS, no Bulma/TTUI). The global +header and footer render from `doc/data/site_nav.json`, and icons from `doc/data/icons.json`. Both +are **generated** from www.thethingsnetwork.org's single navigation source — do not edit them by +hand; re-export them from the platform repo instead: + +``` +node scripts/export-docs-chrome.mjs /doc/data +``` + +Nav hrefs are root-relative and prefixed with `params.ttnOrigin` (default +`https://www.thethingsnetwork.org`); for a local all-in-one preview run Hugo with +`HUGO_PARAMS_TTNORIGIN=http://localhost:3000`. + +Section landing pages can use the `lead`, `actions`/`button`, `chapters`, `feature` and `topics` +shortcodes (see `doc/content/lorawan/_index.md`); a section's numbered course is its `chapters` +front matter and its topic index the `topics` front matter. ## Getting Started diff --git a/doc/assets/css/common/fonts.scss b/doc/assets/css/common/fonts.scss deleted file mode 100644 index 8c320ce61c..0000000000 --- a/doc/assets/css/common/fonts.scss +++ /dev/null @@ -1,25 +0,0 @@ -@import url('https://fonts.googleapis.com/css?family=Lato:400,700&display=swap'); - -@font-face { - font-family: 'LatoFallback'; - src: url(../fonts/Lato-Regular.woff2) format('woff2'), url(../fonts/Lato-Regular.woff) format('woff'), url(../fonts/Lato-Regular.ttf) format('ttf'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'LatoFallback'; - src: url(../fonts/Lato-Bold.woff2) format('woff2'), url(../fonts/Lato-Bold.woff) format('woff'), url(../fonts/Lato-Bold.ttf) format('ttf'); - font-weight: bold; - font-style: normal; -} - -@font-face { - font-family: "AvantGardePro"; - src: url(../fonts/AvantGardePro-Bold.otf); - font-weight: bold; - font-style: normal; -} - -$family-sans-serif: "Lato", "LatoFallback", $family-sans-serif; -$title-family: "AvantGardePro", $family-sans-serif; diff --git a/doc/assets/css/common/global.scss b/doc/assets/css/common/global.scss deleted file mode 100644 index cae5187656..0000000000 --- a/doc/assets/css/common/global.scss +++ /dev/null @@ -1,190 +0,0 @@ -.container { - @media (max-width: $desktop) { - padding-left: $content-padding-side; - padding-right: $content-padding-side; - } -} - -.is-not-wrapped { - white-space: nowrap; -} - -.is-borderless { - border: 0 !important -} - -.table.has-text-in-td-centered td { - text-align: center; -} - -.schema { - margin: 100px 0px; -} - -.content-intro, .title-intro { - display: flex; - margin: auto; - max-width: 650px; - text-align: center; -} - -.has-vertical-space { - margin-top: 3rem; - margin-bottom: 3rem; -} - -.content { - h1, h2, h3, h4, h5, h6 { - font-family: $title-family; - color: $title-color; - } - figure { - cursor: pointer; - transition: transform ease-out 150ms 150ms; - - &:hover { - transform: scale(1.01); - } - - &.float { - @media (max-width: 620px) { - max-width: none; - } - float: right; - @media (min-width: 621px) { - max-width: 40%; - } - } - - & > img { - max-height: 500px; - object-fit: contain; - } - - &:not(.plain) > img { - box-shadow: $card-shadow; - } - } - - table { - display: block; - overflow: auto; - } - -} - -details + p { - margin-top: 1em; -} - -details + blockquote { - margin-top: 1em; -} - -.glossary { - .term, .term-abbr, .term-alt{ - background-color: #ececec; - padding: 0.25rem; - font-weight: bold; - } - dd { - margin: 0.5em 0 0.5em 0; - } -} - -.frequency-plan { - .id { - background-color: $white-ter; - padding: 0.25rem; - font-weight: bold; - } - dd { - margin: 0.5em 0 0.5em 0; - } -} - -.feedback { - text-align: center; - background-color: $white-ter; - border-radius: 8px; - padding: 12px; -} - -table.fixed { table-layout:fixed; } -table.fixed td { overflow: auto; } - -// Fix for anchor link headbutting https://css-tricks.com/hash-tag-links-padding/ -[id]::before { - display: block; - content: " "; - margin-top: $anchor-offset * -1; - height: $anchor-offset; - visibility: hidden; - pointer-events: none; - z-index: -1; -} - -.has-ttn-navbar-top { - padding-top: 65px; -} - -.is-fullwidth { - width: 100%; -} - -.learn-header { - display: table; - width: 100%; - .text, .span { - vertical-align: middle; - display: table-cell; - } - span { - font-size: 120px; - font-weight: bold; - text-transform: uppercase; - } -} - -.lorawan-image { - width: 300px; - height: 130px; - display: flex; - flex-direction: column; - justify-content: center; -} - -.certifications-image { - height: 130px; - - img { - height: 120px; - width: auto; - } -} - -.quick-start-image { - width: 300px; - height: 130px; - display: flex; - flex-direction: column; - justify-content: center; -} - -.section-lorawan { - @media (min-width: $tablet) { - margin-top: -6rem; - } -} - -.header-hash { - font-size: 100%; - visibility: hidden; - color: silver; -} - -h2, h3, h4, h5, h6 { - &:hover a.header-hash { - visibility: visible - } -} diff --git a/doc/assets/css/common/tabs.scss b/doc/assets/css/common/tabs.scss deleted file mode 100644 index 99c9783151..0000000000 --- a/doc/assets/css/common/tabs.scss +++ /dev/null @@ -1,24 +0,0 @@ -.tabs.is-boxed li.is-active a { - background-color: $blue-alt !important; - border-color: transparent !important; - border-bottom-color: $blue !important; -} - -.tabs.is-boxed a { - color: lighten($blue, 24%); - background-color: lighten($blue-alt, 4%); - border-bottom-color: $blue !important; - margin-right: 4px; -} - -.tabs.is-boxed a:hover { - background-color: $blue-bg; -} - -.tab-content section { - display: none; -} - -.tab-content section.is-active { - display: block; -} diff --git a/doc/assets/css/common/variables.scss b/doc/assets/css/common/variables.scss deleted file mode 100644 index 1c257e45d1..0000000000 --- a/doc/assets/css/common/variables.scss +++ /dev/null @@ -1,57 +0,0 @@ -// Colors - -$blue: rgb(13, 131, 208); -$blue-secondary: #0039CE; -$blue-alt: #D9E4FF; -$white: #FFFFFF; -$graphite: #292929; -$white-bis: #FBFBFB; -$white-ter : #ECECEC; -$red: #F9595A; -$blue-bg: #E5ECFF; -$gray: #AEAEAE; -$red: #FF5C5C; - -$border: #e9ecef; -$code: $blue; -$link-hover: darken($blue, 20%); -$link: $blue; -$primary: $blue; -$title-color: $blue; -$info: $gray; -$warning: $red; - -$navbar-background-color: $white-bis; -$navbar-item-color: $blue; -$navbar-item-hover-background-color: $blue-bg; -$navbar-item-active-color: $blue; -$navbar-item-active-background-color: $white-bis; -$navbar-height: 6rem; - -$card-content-padding: 2rem; - -$border: $white-ter; -$table-head-cell-border-width: 1px 1px 1px; -$table-foot-cell-border-width: 1px 1px 1px; -$table-cell-border: 1px solid $white-ter; -$table-cell-border-width: 1px 1px 1px; -$table-cell-padding: 1.2em 0.75em; - -$tabs-border-bottom-color: $blue; - -$content-blockquote-background-color: inherit; - -$column-gap: 1.25rem; - -$content-padding-top: 2rem; -$content-padding-side: 2rem; -$content-max-width: 820px; - -$menu-item-active-color: $grey-dark; -$menu-item-active-background-color: $blue-bg; - -$banner-height: 4rem; - -$divider-font-size: $size-1; - -$anchor-offset: $navbar-height + 1rem; diff --git a/doc/assets/css/docs.css b/doc/assets/css/docs.css new file mode 100644 index 0000000000..b9ddfc64b0 --- /dev/null +++ b/doc/assets/css/docs.css @@ -0,0 +1,417 @@ +/* The Things Network docs theme (2026 redesign). + Tokens: The Things Industries design system (colors_and_type.css), TTN brand. + Chrome (header/footer) mirrors the www platform's site.css so /docs looks like the rest of the site. */ + +/* ---------- Fonts ---------- */ +@font-face { font-family: "Inter"; font-weight: 400; font-style: normal; font-display: swap; src: url("../fonts/inter/Inter-Regular.woff2") format("woff2"); } +@font-face { font-family: "Inter"; font-weight: 500; font-style: normal; font-display: swap; src: url("../fonts/inter/Inter-Medium.woff2") format("woff2"); } +@font-face { font-family: "Inter"; font-weight: 600; font-style: normal; font-display: swap; src: url("../fonts/inter/Inter-SemiBold.woff2") format("woff2"); } +@font-face { font-family: "Inter"; font-weight: 700; font-style: normal; font-display: swap; src: url("../fonts/inter/Inter-Bold.woff2") format("woff2"); } +@font-face { font-family: "Poppins"; font-weight: 700; font-style: normal; font-display: swap; src: url("https://fonts.gstatic.com/s/poppins/v22/pxiByp8kv8JHgFVrLCz7Z1xlFd2JQEk.woff2") format("woff2"); } + +/* ---------- Tokens ---------- */ +:root { + --grey-025: #fbfcfd; --grey-050: #f3f5f8; --grey-075: #ebeef3; --grey-100: #dee3ea; --grey-200: #d2d7e0; + --grey-300: #c3c9d4; --grey-400: #b2bac8; --grey-500: #98a4b6; --grey-600: #7887a1; --grey-700: #536482; + --grey-800: #354661; --grey-900: #1c293f; --grey-1000: #0c1525; + + --info-050: #effaff; --info-100: #ccefff; --info-600: #005edb; + --warning-050: #fff9e6; --warning-100: #ffeebc; --warning-600: #db7600; --warning-700: #b75b00; + + --ttn: #26a0ff; --ttn-600: #008df9; --ttn-700: #0071c7; + --navy: #001859; --navy-900: #00103f; --ink: #000e36; + --tint: #e6f4ff; --muted-invert: #aebbd3; --navy-text: #c7d4ea; + + --font-display: "Poppins", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif; + --font-body: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif; + --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace; + + --br-s: 4px; --br-m: 9px; --br-l: 0.9rem; --br-xl: 1.25rem; --br-pill: 3rem; + --bs-s: 0 0.2rem 1rem 0 rgb(0 0 0 / 5%); + --header-h: 72px; /* = the global header on www (platform site.css .tn-header__bar) */ +} + +/* ---------- Base ---------- */ +*, *::before, *::after { box-sizing: border-box; } +html { font-size: 15px; scroll-padding-top: calc(var(--header-h) + 24px); -webkit-text-size-adjust: 100%; } +body { + margin: 0; + font-family: var(--font-body); + font-size: 1rem; + line-height: 1.6; + color: var(--grey-900); + background: #fff; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +a { color: var(--ttn-600); text-decoration: none; } +a:hover { color: var(--navy); } +img { max-width: 100%; height: auto; } +:focus-visible { outline: 3px solid #cce8ff; outline-offset: 2px; border-radius: 4px; } + +.dx-icon { width: 1em; height: 1em; flex: none; vertical-align: -0.125em; } +.dx-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; } +.dx-skip { position: absolute; left: 16px; top: -48px; z-index: 50; padding: 8px 14px; border-radius: var(--br-m); background: var(--navy); color: #fff; } +.dx-skip:focus { top: 12px; color: #fff; } +.dx-wrap { max-width: 1200px; margin-inline: auto; padding-inline: 24px; } + +/* ---------- Buttons ---------- */ +.dx-btn { + display: inline-flex; align-items: center; gap: 8px; + padding: 12px 22px; border: 1px solid transparent; border-radius: var(--br-pill); + font: inherit; font-size: 15px; font-weight: 600; line-height: 1.2; white-space: nowrap; + cursor: pointer; transition: background-color 0.1s, border-color 0.1s, color 0.1s; +} +.dx-btn p { margin: 0; } +.dx-btn--sm { padding: 9px 18px; font-size: 14px; } +.dx-btn, .dx-btn--brand { background: var(--ttn); color: #fff; } +.dx-btn:hover, .dx-btn--brand:hover { background: var(--ttn-600); color: #fff; } +.dx-btn--primary { background: var(--navy); color: #fff; } +.dx-btn--primary:hover { background: var(--navy-900); color: #fff; } +.dx-btn--outline { background: transparent; border-color: var(--grey-300); color: var(--navy); } +.dx-btn--outline:hover { background: transparent; border-color: var(--grey-500); color: var(--navy); } +.dx-actions { display: flex; flex-wrap: wrap; gap: 12px; margin: 24px 0; } + +/* ---------- Header ---------- */ +.dx-header { + position: sticky; top: 0; z-index: 20; + background: rgb(255 255 255 / 88%); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); + border-bottom: 1px solid var(--grey-100); +} +.dx-header__bar { max-width: 1200px; height: var(--header-h); margin-inline: auto; padding-inline: 24px; display: flex; align-items: center; gap: 32px; } +.dx-header__logo { flex: none; } +.dx-header__logo img { display: block; height: 34px; width: auto; } +.dx-header__panel { flex: 1; min-width: 0; display: flex; align-items: center; gap: 16px; } +.dx-header__nav { display: flex; align-items: center; gap: 2px; } +.dx-header__link { + display: inline-flex; align-items: center; gap: 4px; + padding: 6px 10px; border-radius: var(--br-m); + color: var(--grey-800); font-size: 14px; font-weight: 500; line-height: 24px; white-space: nowrap; + cursor: pointer; list-style: none; +} +.dx-header__link::-webkit-details-marker { display: none; } +.dx-header__link:hover { background: var(--grey-050); color: var(--grey-900); } +.dx-header__link[aria-current="page"] { color: var(--navy); font-weight: 600; } /* no pill: same as the global header */ +.dx-header__tools { flex: 1; display: flex; justify-content: flex-end; align-items: center; gap: 8px; } +.dx-header__auth { display: flex; align-items: center; gap: 4px; } +.dx-header__login { padding: 8px 14px; color: var(--grey-800); font-size: 14px; font-weight: 500; white-space: nowrap; } +.dx-header__login:hover { color: var(--navy); } +.dx-header__user { display: inline-flex; align-items: center; gap: 8px; padding: 4px 10px 4px 4px; border-radius: var(--br-pill); color: var(--grey-900); font-size: 14px; font-weight: 600; } +.dx-header__user:hover { background: var(--grey-050); color: var(--grey-900); } +.dx-header__user img { width: 28px; height: 28px; border-radius: 50%; background: var(--grey-050); } +.dx-header__toggle { display: none; margin-left: auto; padding: 8px; border: 0; border-radius: var(--br-m); background: transparent; color: var(--grey-900); font-size: 22px; line-height: 0; cursor: pointer; } +.dx-header__toggle-close { display: none; } + +.dx-drop { position: relative; } +.dx-drop__chev { font-size: 14px; transition: transform 0.15s; } +.dx-drop[open] .dx-drop__chev { transform: rotate(180deg); } +.dx-drop__menu { + position: absolute; top: calc(100% + 6px); left: 0; z-index: 30; min-width: 200px; + display: flex; flex-direction: column; padding: 6px; + background: #fff; border: 1px solid var(--grey-100); border-radius: var(--br-l); box-shadow: 0 12px 32px rgb(0 24 89 / 12%); +} +.dx-drop__item { padding: 8px 12px; border-radius: var(--br-m); color: var(--grey-800); font-size: 14px; white-space: nowrap; } +.dx-drop__item:hover { background: var(--grey-050); color: var(--grey-900); } + +/* Search */ +.dx-search { position: relative; width: min(100%, 240px); } +.dx-search__field { + display: flex; align-items: center; gap: 8px; height: 38px; padding: 0 12px; + border: 1px solid var(--grey-200); border-radius: var(--br-m); background: var(--grey-025); color: var(--grey-600); + font-size: 17px; +} +.dx-search__field:focus-within { border-color: var(--ttn); background: #fff; box-shadow: 0 0 0 3px #cce8ff; } +.dx-search__field input { flex: 1; min-width: 0; border: 0; outline: 0; background: transparent; font: inherit; font-size: 14px; color: var(--grey-900); } +.dx-search__field input::-webkit-search-cancel-button { display: none; } +.dx-search__field kbd { font-family: var(--font-mono); font-size: 11px; line-height: 1.4; padding: 1px 6px; border: 1px solid var(--grey-200); border-radius: var(--br-s); background: #fff; color: var(--grey-600); } +.dx-search__field:focus-within kbd { display: none; } +.dx-search__results { + position: absolute; top: calc(100% + 6px); right: 0; z-index: 30; width: min(440px, calc(100vw - 32px)); max-height: min(70vh, 480px); overflow-y: auto; + padding: 6px; background: #fff; border: 1px solid var(--grey-100); border-radius: var(--br-l); box-shadow: 0 12px 32px rgb(0 24 89 / 14%); +} +.dx-search__item { display: block; padding: 10px 12px; border-radius: var(--br-m); color: var(--grey-900); } +.dx-search__item:hover, .dx-search__item[aria-selected="true"] { background: var(--tint); color: var(--grey-900); } +.dx-search__title { display: block; font-size: 14px; font-weight: 600; color: var(--navy); } +.dx-search__meta { display: block; margin-top: 2px; font-size: 12.5px; line-height: 1.45; color: var(--grey-600); } +.dx-search__empty { padding: 12px; font-size: 14px; color: var(--grey-600); } +.dx-search__item mark { background: transparent; color: var(--ttn-700); font-weight: 700; } + +/* ---------- Docs layout ---------- */ +.dx-docs { max-width: 1440px; margin-inline: auto; display: flex; align-items: flex-start; } + +.dx-side { + flex: 0 0 280px; position: sticky; top: var(--header-h); max-height: calc(100vh - var(--header-h)); overflow-y: auto; + padding: 28px 20px 40px 24px; border-right: 1px solid var(--grey-100); overscroll-behavior: contain; +} +.dx-side__summary { display: none; } +.dx-side__nav { display: flex; flex-direction: column; gap: 28px; } +.dx-side__group { display: flex; flex-direction: column; gap: 2px; } +.dx-side__label { padding: 0 10px 8px; font-size: 12px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--grey-600); } +.dx-side__link { display: flex; align-items: baseline; gap: 10px; padding: 6px 10px; border-radius: var(--br-m); color: var(--grey-800); font-size: 14px; line-height: 1.45; } +.dx-side__link:hover { background: var(--grey-050); color: var(--grey-900); } +.dx-side__link[aria-current="page"] { background: var(--tint); color: var(--navy); font-weight: 600; } +.dx-side__link--overview { align-items: center; padding-block: 8px; font-weight: 600; color: var(--grey-900); } +.dx-side__link--overview .dx-icon { font-size: 17px; color: var(--ttn-700); } +.dx-side__num { flex: none; width: 16px; font-family: var(--font-mono); font-size: 11px; color: var(--grey-500); } +.dx-side__link[aria-current="page"] .dx-side__num { color: var(--ttn-700); } +.dx-side__tree { display: flex; flex-direction: column; gap: 2px; margin: 2px 0 4px 18px; padding-left: 8px; border-left: 1px solid var(--grey-100); } +.dx-side__tree .dx-side__link { font-size: 13.5px; padding-block: 5px; } + +.dx-main { flex: 1 1 560px; min-width: 0; display: flex; justify-content: center; gap: 48px; padding: 40px 40px 96px; } +.dx-article { flex: 1 1 560px; min-width: 0; max-width: 780px; } +.dx-article__head { display: flex; flex-direction: column; gap: 20px; margin-bottom: 20px; } + +.dx-crumbs { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; font-size: 13px; color: var(--grey-600); } +.dx-crumbs a { color: var(--grey-600); } +.dx-crumbs a:hover { color: var(--navy); } +.dx-crumbs .dx-icon { font-size: 13px; } +.dx-crumbs [aria-current] { color: var(--grey-900); font-weight: 500; } + +.dx-title { + margin: 0; font-family: var(--font-display); font-weight: 700; color: var(--navy); + font-size: clamp(2.2rem, 4vw, 3rem); line-height: 1.08; letter-spacing: -0.03em; text-wrap: balance; +} +.dx-docs .dx-article__head .dx-title { overflow-wrap: anywhere; } +/* A section landing (has chapters/topics) gets the full-size display title of the design. */ +.dx-article:has(.dx-lead) .dx-title { font-size: clamp(2.65rem, 5vw, 4rem); line-height: 1.05; } +.dx-eyebrow { font-size: 13px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ttn); } + +/* Right rail */ +.dx-rail { flex: 0 1 200px; min-width: 200px; position: sticky; top: calc(var(--header-h) + 40px); align-self: flex-start; display: flex; flex-direction: column; gap: 10px; font-size: 13px; max-height: calc(100vh - var(--header-h) - 64px); overflow-y: auto; } +.dx-rail__label { margin-bottom: 4px; font-size: 12px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--grey-600); } +.dx-toc { display: flex; flex-direction: column; gap: 10px; } +.dx-toc__link { padding-left: 12px; border-left: 2px solid var(--grey-100); color: var(--grey-700); line-height: 1.45; } +.dx-toc__link--sub { padding-left: 24px; } +.dx-toc__link:hover { color: var(--navy); } +.dx-toc__link[aria-current="true"] { border-left-color: var(--ttn); color: var(--navy); font-weight: 600; } +.dx-rail__rule { height: 1px; margin: 12px 0; background: var(--grey-100); } +.dx-rail__tool { display: flex; align-items: center; gap: 6px; color: var(--grey-700); } +.dx-rail__tool:hover { color: var(--navy); } + +/* ---------- Prose (rendered markdown) ---------- */ +.dx-prose { font-size: 16px; line-height: 1.7; color: var(--grey-800); overflow-wrap: break-word; } +.dx-prose::after { content: ""; display: table; clear: both; } +.dx-prose > :first-child { margin-top: 0; } +.dx-prose p, .dx-prose ul, .dx-prose ol, .dx-prose dl, .dx-prose table, .dx-prose pre, .dx-prose blockquote, .dx-prose figure, .dx-prose details { margin: 0 0 1.15em; } +.dx-prose h2, .dx-prose h3, .dx-prose h4, .dx-prose h5, .dx-prose h6 { color: var(--navy); font-family: var(--font-body); scroll-margin-top: calc(var(--header-h) + 24px); } +.dx-prose h2 { margin: 56px 0 16px; font-size: 26px; line-height: 1.2; letter-spacing: -0.02em; font-weight: 700; } +.dx-prose h3 { margin: 40px 0 12px; font-size: 20px; line-height: 1.3; letter-spacing: -0.01em; font-weight: 700; } +.dx-prose h4 { margin: 28px 0 8px; font-size: 17px; line-height: 1.4; font-weight: 600; } +.dx-prose h5, .dx-prose h6 { margin: 24px 0 8px; font-size: 15px; font-weight: 600; } +.dx-prose h2 + p, .dx-prose h3 + p { margin-top: 0; } +.dx-anchor { margin-left: 6px; color: var(--grey-300); font-weight: 400; opacity: 0; transition: opacity 0.1s; } +:is(h2, h3, h4, h5, h6):hover > .dx-anchor, .dx-anchor:focus-visible { opacity: 1; } +.dx-anchor:hover { color: var(--ttn-600); } +.dx-prose a { font-weight: 500; } +.dx-prose a:hover { text-decoration: underline; text-underline-offset: 3px; } +.dx-prose strong { color: var(--grey-900); font-weight: 600; } +.dx-prose ul, .dx-prose ol { padding-left: 1.5em; } +.dx-prose li { margin: 0.3em 0; } +.dx-prose li > ul, .dx-prose li > ol { margin: 0.3em 0; } +.dx-prose li::marker { color: var(--grey-500); } +.dx-prose hr { margin: 40px 0; border: 0; border-top: 1px solid var(--grey-100); } +.dx-prose blockquote { padding: 4px 0 4px 18px; border-left: 3px solid var(--ttn); color: var(--grey-700); } +.dx-prose dt { font-weight: 600; color: var(--grey-900); } +.dx-prose dd { margin: 0.25em 0 0.75em 1.25em; } +.dx-prose img { border-radius: var(--br-m); } +.dx-prose figure { margin-inline: 0; } +.dx-prose figure > img, .dx-prose figure > a > img { display: block; max-height: 500px; object-fit: contain; } +.dx-prose figure:not(.plain) > img { box-shadow: var(--bs-s); border: 1px solid var(--grey-100); } +.dx-prose figure.float { float: right; max-width: 40%; margin: 0 0 16px 24px; } +.dx-prose figcaption { margin-top: 8px; font-size: 13px; color: var(--grey-600); } +.dx-prose details { padding: 12px 16px; border: 1px solid var(--grey-100); border-radius: var(--br-m); } +.dx-prose summary { cursor: pointer; font-weight: 600; color: var(--navy); } +.dx-prose details[open] summary { margin-bottom: 8px; } +.dx-prose iframe { max-width: 100%; } + +/* Code */ +.dx-prose code { font-family: var(--font-mono); font-size: 0.86em; padding: 2px 6px; border-radius: 6px; background: var(--grey-050); color: var(--grey-900); } +.dx-prose pre { overflow-x: auto; padding: 16px 18px; border: 1px solid var(--grey-100); border-radius: var(--br-m); background: var(--grey-025); font-size: 13.5px; line-height: 1.6; } +.dx-prose pre code { padding: 0; background: none; font-size: inherit; color: inherit; } +.dx-prose .highlight { margin: 0 0 1.15em; } +.dx-prose .highlight pre { margin: 0; } + +/* Tables */ +.dx-prose table { display: block; max-width: 100%; overflow-x: auto; border-collapse: collapse; font-size: 14px; line-height: 1.5; } +.dx-prose th, .dx-prose td { padding: 9px 14px; border-bottom: 1px solid var(--grey-100); text-align: left; vertical-align: top; } +.dx-prose thead th, .dx-prose tr:first-child > th { border-bottom: 2px solid var(--grey-200); color: var(--grey-900); font-weight: 600; background: var(--grey-025); } +.dx-prose tbody tr:hover { background: var(--grey-025); } + +/* Callouts (info / note / warning shortcodes + V2 banner) */ +.dx-callout { display: flex; gap: 14px; align-items: flex-start; margin: 0 0 1.15em; padding: 16px 18px; border: 1px solid var(--info-100); border-radius: var(--br-m); background: var(--info-050); font-size: 14px; line-height: 1.6; color: var(--grey-800); } +.dx-callout__icon { font-size: 20px; margin-top: 1px; color: var(--info-600); } +.dx-callout__body { min-width: 0; } +.dx-callout__body > :last-child { margin-bottom: 0; } +.dx-callout__body p { margin: 0 0 0.6em; } +.dx-callout a { font-weight: 600; color: var(--info-600); } +.dx-callout--note { border-color: var(--grey-100); background: var(--grey-025); } +.dx-callout--note .dx-callout__icon { color: var(--grey-700); } +.dx-callout--warning { border-color: var(--warning-100); background: var(--warning-050); } +.dx-callout--warning .dx-callout__icon { color: var(--warning-600); } +.dx-callout--warning a { color: var(--warning-700); } +.dx-article__head + .dx-callout { margin-bottom: 28px; } + +/* Landing blocks (shortcodes) */ +.dx-lead { font-size: 19px; line-height: 1.6; color: var(--grey-800); text-wrap: pretty; } +.dx-lead p { margin: 0; } +.dx-lead strong { color: var(--navy); } +.dx-lead a { font-weight: 600; } +.dx-lead a strong { color: inherit; font-weight: inherit; } +.dx-prose .dx-actions + .dx-callout { margin-top: 0; } +.dx-prose .dx-btn, .dx-prose .dx-btn:hover { text-decoration: none; } + +.dx-video { aspect-ratio: 16 / 9; margin: 0 0 1.15em; border: 1px solid var(--grey-100); border-radius: var(--br-l); overflow: hidden; background: var(--navy); } +.dx-video iframe { display: block; width: 100%; height: 100%; border: 0; } + +.dx-chapters, .dx-prose .dx-chapters { list-style: none; margin: 20px 0 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 300px), 1fr)); gap: 12px; } +.dx-prose .dx-chapters li { margin: 0; display: flex; } +.dx-chapter { flex: 1; display: flex; align-items: center; gap: 16px; padding: 16px 18px; border: 1px solid var(--grey-100); border-radius: var(--br-l); background: #fff; color: var(--grey-900); transition: border-color 0.1s, box-shadow 0.1s; } +.dx-prose .dx-chapter:hover { border-color: var(--ttn); box-shadow: var(--bs-s); color: var(--grey-900); text-decoration: none; } +.dx-chapter__num { flex: none; width: 40px; height: 40px; display: flex; align-items: center; justify-content: center; border-radius: var(--br-m); background: var(--tint); color: var(--ttn-700); font-family: var(--font-mono); font-size: 14px; font-weight: 600; } +.dx-chapter__title { flex: 1; font-size: 15px; font-weight: 600; line-height: 1.35; color: var(--navy); } +.dx-chapter__arrow { font-size: 18px; color: var(--grey-400); } +.dx-chapter:hover .dx-chapter__arrow { color: var(--ttn); } + +.dx-feature { margin: 56px 0 0; padding: 36px; display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr)); gap: 32px; align-items: center; border-radius: var(--br-xl); background: var(--navy); color: #fff; } +.dx-feature__text { display: flex; flex-direction: column; gap: 14px; } +.dx-prose .dx-feature__eyebrow { margin: 0; font-size: 13px; font-weight: 600; line-height: 1.4; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ttn); } +.dx-feature__text p { margin: 0; font-size: 16px; line-height: 1.65; color: var(--navy-text); } +.dx-feature__text .dx-btn { align-self: flex-start; font-size: 14px; padding: 11px 20px; } +.dx-feature__media { aspect-ratio: 4 / 3; display: flex; align-items: center; justify-content: center; overflow: hidden; border-radius: var(--br-l); background: #fff; } +.dx-feature__media img { display: block; width: 100%; height: 100%; object-fit: contain; border-radius: 0; } + +.dx-topics { display: flex; flex-direction: column; gap: 28px; margin-top: 28px; } +.dx-topic { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr)); gap: 12px 32px; padding-top: 20px; border-top: 1px solid var(--grey-100); } +.dx-topic__title { display: flex; align-items: center; gap: 10px; align-self: start; font-size: 15px; font-weight: 600; color: var(--navy); } +.dx-topic__title .dx-icon { font-size: 20px; color: var(--ttn-700); } +.dx-topic__links { grid-column: span 2; display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 220px), 1fr)); gap: 4px 24px; } +.dx-prose .dx-topic__links a { display: flex; justify-content: space-between; align-items: center; gap: 8px; padding: 8px 0; border-bottom: 1px dashed var(--grey-100); font-size: 14px; font-weight: 400; color: var(--grey-800); text-decoration: none; } +.dx-prose .dx-topic__links a:hover { color: var(--ttn-600); } +.dx-topic__links .dx-icon { font-size: 14px; color: var(--grey-400); } +@media (max-width: 720px) { .dx-topic__links { grid-column: auto; } } + +/* Subpage cards */ +.dx-cards { list-style: none; margin: 40px 0 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 300px), 1fr)); gap: 12px; } +.dx-cards li { display: flex; } +.dx-card { flex: 1; display: flex; align-items: center; gap: 16px; padding: 16px 18px; border: 1px solid var(--grey-100); border-radius: var(--br-l); color: var(--grey-900); transition: border-color 0.1s, box-shadow 0.1s; } +.dx-card:hover { border-color: var(--ttn); box-shadow: var(--bs-s); color: var(--grey-900); } +.dx-card__body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; } +.dx-card__title { font-size: 15px; font-weight: 600; line-height: 1.35; color: var(--navy); } +.dx-card__desc { font-size: 13.5px; line-height: 1.5; color: var(--grey-700); } +.dx-card__arrow { font-size: 18px; color: var(--grey-400); } + +/* Prev / next */ +.dx-pager { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr)); gap: 12px; margin-top: 56px; padding-top: 32px; border-top: 1px solid var(--grey-100); } +.dx-pager__link { display: flex; flex-direction: column; gap: 4px; padding: 16px 18px; border: 1px solid var(--grey-100); border-radius: var(--br-l); color: var(--grey-900); } +.dx-pager__link:hover { border-color: var(--ttn); color: var(--grey-900); } +.dx-pager__link--next { text-align: right; } +.dx-pager__dir { font-size: 12px; color: var(--grey-600); } +.dx-pager__title { display: flex; align-items: center; gap: 6px; font-weight: 600; color: var(--navy); } +.dx-pager__link--next .dx-pager__title { justify-content: flex-end; } + +/* Glossary shortcode */ +.dx-prose .glossary { padding: 20px 0; border-top: 1px solid var(--grey-100); } +.dx-prose .glossary h2 { margin: 0 0 10px; font-size: 20px; } +.dx-prose .glossary h3 { margin: 12px 0 4px; font-size: 12px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--grey-600); } + +/* ---------- Docs home / 404 ---------- */ +.dx-home__hero { padding: 72px 0 56px; background: linear-gradient(180deg, var(--tint) 0%, #fff 100%); border-bottom: 1px solid var(--grey-100); } +.dx-home__hero .dx-title { max-width: 820px; margin-top: 14px; font-size: clamp(2.4rem, 5vw, 3.8rem); } +.dx-home__hero--404 { min-height: 50vh; } +.dx-home__sub { max-width: 640px; margin: 18px 0 0; font-size: 19px; line-height: 1.6; color: var(--grey-800); } +.dx-home__section { padding-block: 48px 8px; } +.dx-home__section:last-of-type { padding-bottom: 96px; } +.dx-home__h2 { margin: 0 0 20px; font-size: 26px; line-height: 1.2; letter-spacing: -0.02em; color: var(--navy); } +.dx-home__grid { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 300px), 1fr)); gap: 16px; } +.dx-home__grid li { display: flex; } +.dx-home__card { flex: 1; display: flex; flex-direction: column; gap: 10px; padding: 24px; border: 1px solid var(--grey-100); border-radius: var(--br-l); background: #fff; color: var(--grey-900); transition: border-color 0.1s, box-shadow 0.1s; } +.dx-home__card:hover { border-color: var(--ttn); box-shadow: var(--bs-s); color: var(--grey-900); } +.dx-home__img { height: 72px; width: auto; align-self: flex-start; margin-bottom: 6px; object-fit: contain; } +.dx-home__img--wide { height: 40px; margin-block: 16px 22px; } +.dx-home__card-title { font-size: 18px; font-weight: 700; color: var(--navy); } +.dx-home__card-text { flex: 1; font-size: 14.5px; line-height: 1.6; color: var(--grey-700); } +.dx-home__card-cta { display: inline-flex; align-items: center; gap: 6px; margin-top: 6px; font-size: 14px; font-weight: 600; color: var(--ttn-600); } + +/* ---------- Footer ---------- */ +.dx-footer { background: var(--ink); color: var(--muted-invert); } +.dx-footer__inner { display: flex; flex-direction: column; gap: 56px; padding-block: 72px 40px; } +.dx-footer__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 180px), 1fr)); gap: 40px; } +.dx-footer__brand { grid-column: span 2; max-width: 360px; display: flex; flex-direction: column; gap: 16px; } +.dx-footer__brand img { height: 34px; width: auto; align-self: flex-start; } +.dx-footer__brand p { margin: 0; font-size: 14px; line-height: 1.6; } +.dx-footer__col { display: flex; flex-direction: column; gap: 10px; } +.dx-footer__title { margin-bottom: 4px; color: #fff; font-size: 13px; font-weight: 600; } +.dx-footer a { color: var(--muted-invert); font-size: 14px; } +.dx-footer a:hover { color: #fff; } +.dx-footer__base { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 16px; padding-top: 24px; border-top: 1px solid rgb(255 255 255 / 12%); font-size: 13px; } +.dx-footer__legal { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 24px; } +/* "Cookie settings": hidden until /consent.js runs and reveals every [data-ttn-consent-settings]. */ +.dx-footer__consent { display: none; padding: 0; border: 0; background: none; color: var(--muted-invert); font: inherit; font-size: 13px; cursor: pointer; } +.dx-footer__consent:hover { color: #fff; } +.dx-footer__consent:focus-visible { outline: 2px solid #fff; outline-offset: 2px; } +.dx-footer__social { display: flex; gap: 20px; } +.dx-footer__social a { font-size: 20px; line-height: 0; } + + +/* ---------- Responsive ---------- */ +@media (max-width: 1240px) { + .dx-rail { display: none; } + .dx-main { padding-inline: 40px; } +} + +@media (max-width: 1080px) { + .dx-header__bar { gap: 16px; } + .dx-header__toggle { display: block; } + .dx-header__panel { + display: none; position: absolute; top: var(--header-h); left: 0; right: 0; + flex-direction: column; align-items: stretch; gap: 16px; padding: 16px 16px 24px; + background: #fff; border-bottom: 1px solid var(--grey-100); box-shadow: 0 12px 24px rgb(0 24 89 / 8%); + max-height: calc(100vh - var(--header-h)); overflow-y: auto; + } + .dx-header[data-open] .dx-header__panel { display: flex; } + .dx-header[data-open] .dx-header__toggle-open { display: none; } + .dx-header[data-open] .dx-header__toggle-close { display: inline; } + .dx-header__nav { flex-direction: column; align-items: stretch; } + .dx-header__link { padding: 10px 12px; font-size: 15px; } + .dx-drop__menu { position: static; box-shadow: none; border: 0; padding: 0 0 0 12px; } + .dx-header__tools { flex-direction: column; align-items: stretch; gap: 12px; } + .dx-search { width: 100%; } + .dx-search__results { position: static; width: 100%; margin-top: 6px; box-shadow: none; } + .dx-header__auth { justify-content: flex-start; gap: 8px; } + + .dx-docs { flex-direction: column; align-items: stretch; } + .dx-side { position: static; flex: none; max-height: none; overflow: visible; padding: 12px 16px; border-right: 0; border-bottom: 1px solid var(--grey-100); } + .dx-side__summary { display: flex; align-items: center; gap: 8px; padding: 8px 10px; border-radius: var(--br-m); color: var(--navy); font-size: 14px; font-weight: 600; cursor: pointer; list-style: none; } + .dx-side__summary::-webkit-details-marker { display: none; } + .dx-side__toggle[open] .dx-side__summary { margin-bottom: 12px; } + .dx-main { padding: 28px 16px 72px; } +} + +@media (max-width: 700px) { + html { font-size: 14px; } + .dx-prose figure.float { float: none; max-width: none; margin: 0 0 1.15em; } + .dx-feature { padding: 24px; } + .dx-footer__brand { grid-column: 1 / -1; } +} + +@media print { + .dx-header, .dx-side, .dx-rail, .dx-footer, .dx-pager { display: none !important; } + .dx-main { padding: 0; } +} + +/* ---------- Syntax highlighting (Chroma, class-based; light) ---------- */ +.chroma { color: var(--grey-900); background: var(--grey-025); } +.chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; } +.chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; } +.chroma .hl { display: block; width: 100%; background: #e6f4ff; } +.chroma .lnt, .chroma .ln { margin-right: 0.8em; padding: 0 0.4em; color: var(--grey-400); } +.chroma .k, .chroma .kc, .chroma .kd, .chroma .kn, .chroma .kp, .chroma .kr, .chroma .kt, .chroma .nt { color: #0050b3; font-weight: 600; } +.chroma .s, .chroma .sa, .chroma .sb, .chroma .sc, .chroma .s2, .chroma .s1, .chroma .sh, .chroma .se, .chroma .sx, .chroma .dl, .chroma .sd { color: #0a7c36; } +.chroma .m, .chroma .mi, .chroma .mf, .chroma .mh, .chroma .mo, .chroma .mb, .chroma .il { color: #b35900; } +.chroma .c, .chroma .c1, .chroma .cm, .chroma .cs, .chroma .ch, .chroma .cp, .chroma .cpf { color: var(--grey-600); font-style: italic; } +.chroma .nf, .chroma .fm, .chroma .nc, .chroma .nn { color: #6f42c1; } +.chroma .na, .chroma .nb, .chroma .bp, .chroma .no, .chroma .nv, .chroma .vc, .chroma .vg, .chroma .vi { color: #005cc5; } +.chroma .o, .chroma .ow, .chroma .p { color: var(--grey-800); } +.chroma .gd { color: #b31d28; background: #ffeef0; } +.chroma .gi { color: #22863a; background: #f0fff4; } +.chroma .err { color: #b31d28; } diff --git a/doc/assets/css/footer/footer.scss b/doc/assets/css/footer/footer.scss deleted file mode 100644 index 0b8918afbd..0000000000 --- a/doc/assets/css/footer/footer.scss +++ /dev/null @@ -1,24 +0,0 @@ -.footer { - background-size: cover; - .title { - color: $graphite; - } - .p { - color: $graphite; - } - a { - color: $graphite; - &:hover { - color: $blue; - } - } -} - -.ttn-footer { - background-color: var(--c-background-03); - padding-bottom: 0; - - @media (min-width: 768px) { - padding-bottom: var(--cs-s); - } -} diff --git a/doc/assets/css/glossary/glossary.scss b/doc/assets/css/glossary/glossary.scss deleted file mode 100644 index b2091ad4d5..0000000000 --- a/doc/assets/css/glossary/glossary.scss +++ /dev/null @@ -1,5 +0,0 @@ -.glossary { - padding-top: 2rem; - padding-bottom: 2rem; - border-top: 1px solid $border; -} diff --git a/doc/assets/css/header/nav.scss b/doc/assets/css/header/nav.scss deleted file mode 100644 index 59cc540904..0000000000 --- a/doc/assets/css/header/nav.scss +++ /dev/null @@ -1,39 +0,0 @@ -#migration-text { - color: $white; - font-weight: bold; - padding-right: 30px; -} - -#migration-button { - border: 1px $white; - border-style: solid; -} - -#migration-info { - width: 100vw; - height: $banner-height; - font-size: 15px; - justify-content: center; - align-items: center; - background-color: $blue; - display: none; // or `flex` -} - -.navbar { - display: block; - border-bottom: 1px solid #e9ecef; -} - -.navbar.is-fixed-top { - background-color: $white; -} - -a.navbar-item { - font-family: $family-sans-serif; - border-radius: 5px; - margin: 10px 5px; -} - -.has-navbar-banner-top { - padding-top: $navbar-height + $banner-height!important; -} diff --git a/doc/assets/css/header/search.scss b/doc/assets/css/header/search.scss deleted file mode 100644 index d2aebadf7b..0000000000 --- a/doc/assets/css/header/search.scss +++ /dev/null @@ -1,20 +0,0 @@ -.search-container { - margin: none; - padding-top: $content-padding-top; - padding-bottom: $content-padding-top; - display: flex; - align-items: center; - justify-content: center; - border-bottom: 1px solid #e9ecef; -} - -.search-bar { - border: solid 1px #888888; - background-color: white; - width: 55vw; - padding: 28px; - border-radius: 5px; - filter: drop-shadow(0 2px 5px rgba(0, 0, 0, 0.1)); - font-size: 20px; - left: -1px; // Hack for left-justified dropdown -} diff --git a/doc/assets/css/highlight.scss b/doc/assets/css/highlight.scss deleted file mode 100644 index 5732a2fac9..0000000000 --- a/doc/assets/css/highlight.scss +++ /dev/null @@ -1,297 +0,0 @@ -.chroma { - color: $dark; - background-color: $light; - - /* Error */ - .err { - color: $red; - background-color: $dark; - } - /* LineTableTD */ - .lntd { - vertical-align: top; - padding: 0; - margin: 0; - border: 0; - } - /* LineTable */ - .lntable { - border-spacing: 0; - padding: 0; - margin: 0; - border: 0; - width: auto; - overflow: auto; - display: block; - } - /* LineHighlight */ - .hl { - display: block; - width: 100%; - background-color: #ffffcc; - } - /* LineNumbersTable */ - .lnt { - margin-right: 0.4em; - padding: 0 0.4em 0 0.4em; - color: $grey-light; - } - /* LineNumbers */ - .ln { - margin-right: 0.4em; - padding: 0 0.4em 0 0.4em; - color: $grey-light; - } - /* Keyword */ - .k { - color: $blue; - } - /* KeywordConstant */ - .kc { - color: $blue; - } - /* KeywordDeclaration */ - .kd { - color: $blue; - } - /* KeywordNamespace */ - .kn { - color: $primary; - } - /* KeywordPseudo */ - .kp { - color: $blue; - } - /* KeywordReserved */ - .kr { - color: $blue; - } - /* KeywordType */ - .kt { - color: $blue; - } - /* Name */ - .n { - color: $dark; - } - /* NameAttribute */ - .na { - color: $green; - } - /* NameBuiltin */ - .nb { - color: $dark; - } - /* NameBuiltinPseudo */ - .bp { - color: $dark; - } - /* NameClass */ - .nc { - color: $green; - } - /* NameConstant */ - .no { - color: $blue; - } - /* NameDecorator */ - .nd { - color: $green; - } - /* NameEntity */ - .ni { - color: $dark; - } - /* NameException */ - .ne { - color: $green; - } - /* NameFunction */ - .nf { - color: $green; - } - /* NameFunctionMagic */ - .fm { - color: $dark; - } - /* NameLabel */ - .nl { - color: $dark; - } - /* NameNamespace */ - .nn { - color: $dark; - } - /* NameOther */ - .nx { - color: $green; - } - /* NameProperty */ - .py { - color: $dark; - } - /* NameTag */ - .nt { - color: $primary; - } - /* NameVariable */ - .nv { - color: $dark; - } - /* NameVariableClass */ - .vc { - color: $dark; - } - /* NameVariableGlobal */ - .vg { - color: $dark; - } - /* NameVariableInstance */ - .vi { - color: $dark; - } - /* NameVariableMagic */ - .vm { - color: $dark; - } - /* Literal */ - .l { - color: $purple; - } - /* LiteralDate */ - .ld { - color: $orange; - } - /* LiteralString */ - .s { - color: $orange; - } - /* LiteralStringAffix */ - .sa { - color: $orange; - } - /* LiteralStringBacktick */ - .sb { - color: $orange; - } - /* LiteralStringChar */ - .sc { - color: $orange; - } - /* LiteralStringDelimiter */ - .dl { - color: $orange; - } - /* LiteralStringDoc */ - .sd { - color: $orange; - } - /* LiteralStringDouble */ - .s2 { - color: $orange; - } - /* LiteralStringEscape */ - .se { - color: $orange; - } - /* LiteralStringHeredoc */ - .sh { - color: $orange; - } - /* LiteralStringInterpol */ - .si { - color: $orange; - } - /* LiteralStringOther */ - .sx { - color: $orange; - } - /* LiteralStringRegex */ - .sr { - color: $orange; - } - /* LiteralStringSingle */ - .s1 { - color: $orange; - } - /* LiteralStringSymbol */ - .ss { - color: $orange; - } - /* LiteralNumber */ - .m { - color: $purple; - } - /* LiteralNumberBin */ - .mb { - color: $purple; - } - /* LiteralNumberFloat */ - .mf { - color: $purple; - } - /* LiteralNumberHex */ - .mh { - color: $purple; - } - /* LiteralNumberInteger */ - .mi { - color: $purple; - } - /* LiteralNumberIntegerLong */ - .il { - color: $purple; - } - /* LiteralNumberOct */ - .mo { - color: $purple; - } - /* Operator */ - .o { - color: $primary; - } - /* OperatorWord */ - .ow { - color: $primary; - } - /* Punctuation */ - .p { - color: $dark; - } - /* Comment */ - .c { - color: $grey; - } - /* CommentHashbang */ - .ch { - color: $grey; - } - /* CommentMultiline */ - .cm { - color: $grey; - } - /* CommentSingle */ - .c1 { - color: $grey; - } - /* CommentSpecial */ - .cs { - color: $grey; - } - /* CommentPreproc */ - .cp { - color: $grey; - } - /* CommentPreprocFile */ - .cpf { - color: $grey; - } - /* GenericEmph */ - .ge { - font-style: italic; - } - /* GenericStrong */ - .gs { - font-weight: bold; - } -} diff --git a/doc/assets/css/sidebar/sidebar.scss b/doc/assets/css/sidebar/sidebar.scss deleted file mode 100644 index 3113fa7152..0000000000 --- a/doc/assets/css/sidebar/sidebar.scss +++ /dev/null @@ -1,45 +0,0 @@ -.sidebar-left { - @media (min-width: $desktop) { - order: 0; - border-right: 1px solid $border; - position: -webkit-sticky; - position: sticky; - top: 2 * $content-padding-top; - align-self: flex-start; // Fix for sticky in flex - } -} - -.sidebar-right { - display: none; - order: 2; - @media (min-width: $widescreen) { - display: block; - position: -webkit-sticky; - position: sticky; - top: 2 * $content-padding-top; - align-self: flex-start; // Fix for sticky in flex - } -} - -.sidebar-middle { - order: 1; -} - -.docs-content { - @media (min-width: $desktop) { - padding-left: $content-padding-side; - padding-right: $content-padding-side; - max-width: $content-max-width; - } -} - -.toc, .side-navigation { - @media (min-width: $desktop) { - max-height: calc(100vh - 9rem); - overflow-y: auto; - } -} - -.toc, .docs-content, .side-navigation { - padding-top: $content-padding-top; -} diff --git a/doc/assets/css/theme.scss b/doc/assets/css/theme.scss deleted file mode 100644 index b1f0841a31..0000000000 --- a/doc/assets/css/theme.scss +++ /dev/null @@ -1,38 +0,0 @@ -@charset "utf-8"; - -// `node_modules` mounted to css/vendor and js/vendor in config.toml - -@import "vendor/bulma/sass/utilities/initial-variables"; - -// TTUI cannot be inmported currently because of an issue with the -// hugo built-in SCSS transpiler with the minified CSS output. -// @import '@tti/design/ui/main'; - -@import "common/fonts"; -@import "common/variables"; - -@import "vendor/bulma/bulma"; - -@import "vendor/basicLightbox.min"; - -@import "common/global"; -@import "common/tabs"; -@import "footer/footer"; -@import "header/nav"; -@import "header/search"; -@import "sidebar/sidebar"; -@import "glossary/glossary"; - -@import "highlight"; - -.cli-flags dd { - margin-top: 0.5em; - margin-bottom: 0.5em; -} - -.cli-flags p:not(:last-child) { - margin-bottom: 0.5em; -} - -@import "vendor/bulma-tooltip.min"; -@import "vendor/bulma-divider"; diff --git a/doc/assets/css/vendor/basicLightbox.min.scss b/doc/assets/css/vendor/basicLightbox.min.scss deleted file mode 100644 index a8b8b7814d..0000000000 --- a/doc/assets/css/vendor/basicLightbox.min.scss +++ /dev/null @@ -1 +0,0 @@ -.basicLightbox{position:fixed;display:flex;justify-content:center;align-items:center;top:0;left:0;width:100%;height:100vh;background:rgba(0,0,0,.8);opacity:.01;transition:opacity .4s ease;z-index:1000;will-change:opacity}.basicLightbox--visible{opacity:1}.basicLightbox__placeholder{max-width:100%;transform:scale(.9);transition:transform .4s ease;z-index:1;will-change:transform}.basicLightbox__placeholder>iframe:first-child:last-child,.basicLightbox__placeholder>img:first-child:last-child,.basicLightbox__placeholder>video:first-child:last-child{display:block;position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;max-width:95%;max-height:95%}.basicLightbox__placeholder>iframe:first-child:last-child,.basicLightbox__placeholder>video:first-child:last-child{pointer-events:auto}.basicLightbox__placeholder>img:first-child:last-child,.basicLightbox__placeholder>video:first-child:last-child{width:auto;height:auto}.basicLightbox--iframe .basicLightbox__placeholder,.basicLightbox--img .basicLightbox__placeholder,.basicLightbox--video .basicLightbox__placeholder{width:100%;height:100%;pointer-events:none}.basicLightbox--visible .basicLightbox__placeholder{transform:scale(1)} diff --git a/doc/assets/css/vendor/bulma-divider.sass b/doc/assets/css/vendor/bulma-divider.sass deleted file mode 100644 index 9a7c5e9af9..0000000000 --- a/doc/assets/css/vendor/bulma-divider.sass +++ /dev/null @@ -1,73 +0,0 @@ -@charset "utf-8" - -$divider-background-color: $border !default -$divider-font-size: $size-7 !default -$divider-margin-inner-size: 10px !default -$divider-margin-size: 25px !default - -.divider - position: relative - display: flex - align-items: center - text-transform: uppercase - color: $grey - font-size: $divider-font-size - font-weight: $weight-semibold - letter-spacing: .5px - margin: $divider-margin-size 0 - - &::after, - &::before - content: '' - display: block - flex: 1 - height: 1px - background-color: $divider-background-color - - &:not(.is-right) - &::after - margin-left: $divider-margin-inner-size - - &:not(.is-left) - &::before - margin-right: $divider-margin-inner-size - - &.is-left - &::before - display: none - - &.is-right - &::after - display: none - - &.is-vertical - flex-direction: column - margin: 0 $divider-margin-size - - &::after, - &::before - height: auto - width: 1px - - &::after - margin-left: 0 - margin-top: $divider-margin-inner-size - - &::before - margin-right: 0 - margin-bottom: $divider-margin-inner-size - - @each $name, $pair in $colors - $color: nth($pair, 1) - &.is-#{$name} - &::after, - &::before - background-color: $color - - // If light and dark colors are provided - @if length($pair) >= 4 - $color-light: nth($pair, 3) - &.is-light - &::after, - &::before - background-color: $color-light diff --git a/doc/assets/css/vendor/bulma-tooltip.min.css b/doc/assets/css/vendor/bulma-tooltip.min.css deleted file mode 100644 index 00836bb456..0000000000 --- a/doc/assets/css/vendor/bulma-tooltip.min.css +++ /dev/null @@ -1,2 +0,0 @@ -/*! @creativebulma/bulma-tooltip v1.2.0 | (c) 2020 Gaetan | MIT License | https://github.com/CreativeBulma/bulma-tooltip */ -[data-tooltip]:not(.is-disabled),[data-tooltip]:not(.is-loading),[data-tooltip]:not([disabled]){cursor:pointer;overflow:visible;position:relative}[data-tooltip]:not(.is-disabled):before,[data-tooltip]:not(.is-loading):before,[data-tooltip]:not([disabled]):before{background:rgba(74,74,74,.9);border-radius:2px;content:attr(data-tooltip);padding:.5rem 1rem;text-overflow:ellipsis;white-space:pre;right:auto;bottom:auto;left:50%;top:0;margin-top:-5px;margin-bottom:auto;transform:translate(-50%,-100%)}[data-tooltip]:not(.is-disabled).has-tooltip-arrow:after,[data-tooltip]:not(.is-disabled):before,[data-tooltip]:not(.is-loading).has-tooltip-arrow:after,[data-tooltip]:not(.is-loading):before,[data-tooltip]:not([disabled]).has-tooltip-arrow:after,[data-tooltip]:not([disabled]):before{box-sizing:border-box;color:#fff;display:inline-block;font-family:BlinkMacSystemFont,-apple-system,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,Arial,sans-serif;font-size:.75rem;-webkit-hyphens:auto;-ms-hyphens:auto;hyphens:auto;opacity:0;overflow:hidden;pointer-events:none;position:absolute;visibility:hidden;z-index:1}[data-tooltip]:not(.is-disabled).has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-arrow:after{content:"";border-style:solid;border-width:6px;border-color:rgba(74,74,74,.9) transparent transparent;margin-bottom:-5px}[data-tooltip]:not(.is-disabled).has-tooltip-arrow.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-arrow.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-arrow.has-tooltip-arrow:after{top:0;right:auto;bottom:auto;left:50%;margin:-5px auto auto -5px;border-color:rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-bottom.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-bottom.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-bottom.has-tooltip-arrow:after{top:auto;right:auto;bottom:-1px;left:50%;margin:auto auto -5px -5px;border-color:transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-bottom:before,[data-tooltip]:not(.is-loading).has-tooltip-bottom:before,[data-tooltip]:not([disabled]).has-tooltip-bottom:before{top:auto;right:auto;bottom:0;left:50%;margin-top:auto;margin-bottom:-5px;transform:translate(-50%,100%)}[data-tooltip]:not(.is-disabled).has-tooltip-left.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-left.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-left.has-tooltip-arrow:after{top:auto;right:auto;bottom:50%;left:0;margin:auto auto -6px -5px;border-color:transparent transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-left:before,[data-tooltip]:not(.is-loading).has-tooltip-left:before,[data-tooltip]:not([disabled]).has-tooltip-left:before{top:auto;right:auto;bottom:50%;left:-5px;transform:translate(-100%,50%)}[data-tooltip]:not(.is-disabled).has-tooltip-right.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-right.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-right.has-tooltip-arrow:after{top:auto;right:0;bottom:50%;left:auto;margin:auto -6px -6px auto;border-color:transparent rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-right:before,[data-tooltip]:not(.is-loading).has-tooltip-right:before,[data-tooltip]:not([disabled]).has-tooltip-right:before{top:auto;right:-5px;bottom:50%;left:auto;margin-top:auto;transform:translate(100%,50%)}[data-tooltip]:not(.is-disabled).has-tooltip-multiline:before,[data-tooltip]:not(.is-loading).has-tooltip-multiline:before,[data-tooltip]:not([disabled]).has-tooltip-multiline:before{height:auto;width:15rem;max-width:15rem;text-overflow:clip;white-space:normal;word-break:keep-all}[data-tooltip]:not(.is-disabled).has-tooltip-text-left:before,[data-tooltip]:not(.is-loading).has-tooltip-text-left:before,[data-tooltip]:not([disabled]).has-tooltip-text-left:before{text-align:left}[data-tooltip]:not(.is-disabled).has-tooltip-text-centered:before,[data-tooltip]:not(.is-loading).has-tooltip-text-centered:before,[data-tooltip]:not([disabled]).has-tooltip-text-centered:before{text-align:center}[data-tooltip]:not(.is-disabled).has-tooltip-text-right:before,[data-tooltip]:not(.is-loading).has-tooltip-text-right:before,[data-tooltip]:not([disabled]).has-tooltip-text-right:before{text-align:right}[data-tooltip]:not(.is-disabled).has-tooltip-white:after,[data-tooltip]:not(.is-loading).has-tooltip-white:after,[data-tooltip]:not([disabled]).has-tooltip-white:after{border-color:hsla(0,0%,100%,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-white.has-tooltip-bottom:after,[data-tooltip]:not(.is-loading).has-tooltip-white.has-tooltip-bottom:after,[data-tooltip]:not([disabled]).has-tooltip-white.has-tooltip-bottom:after{border-color:transparent transparent hsla(0,0%,100%,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-white.has-tooltip-left:after,[data-tooltip]:not(.is-loading).has-tooltip-white.has-tooltip-left:after,[data-tooltip]:not([disabled]).has-tooltip-white.has-tooltip-left:after{border-color:transparent transparent transparent hsla(0,0%,100%,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-white.has-tooltip-right:after,[data-tooltip]:not(.is-loading).has-tooltip-white.has-tooltip-right:after,[data-tooltip]:not([disabled]).has-tooltip-white.has-tooltip-right:after{border-color:transparent hsla(0,0%,100%,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-white:before,[data-tooltip]:not(.is-loading).has-tooltip-white:before,[data-tooltip]:not([disabled]).has-tooltip-white:before{background-color:hsla(0,0%,100%,.9);color:#0a0a0a}[data-tooltip]:not(.is-disabled).has-tooltip-black:after,[data-tooltip]:not(.is-loading).has-tooltip-black:after,[data-tooltip]:not([disabled]).has-tooltip-black:after{border-color:hsla(0,0%,4%,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-black.has-tooltip-bottom:after,[data-tooltip]:not(.is-loading).has-tooltip-black.has-tooltip-bottom:after,[data-tooltip]:not([disabled]).has-tooltip-black.has-tooltip-bottom:after{border-color:transparent transparent hsla(0,0%,4%,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-black.has-tooltip-left:after,[data-tooltip]:not(.is-loading).has-tooltip-black.has-tooltip-left:after,[data-tooltip]:not([disabled]).has-tooltip-black.has-tooltip-left:after{border-color:transparent transparent transparent hsla(0,0%,4%,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-black.has-tooltip-right:after,[data-tooltip]:not(.is-loading).has-tooltip-black.has-tooltip-right:after,[data-tooltip]:not([disabled]).has-tooltip-black.has-tooltip-right:after{border-color:transparent hsla(0,0%,4%,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-black:before,[data-tooltip]:not(.is-loading).has-tooltip-black:before,[data-tooltip]:not([disabled]).has-tooltip-black:before{background-color:hsla(0,0%,4%,.9);color:#fff}[data-tooltip]:not(.is-disabled).has-tooltip-light:after,[data-tooltip]:not(.is-loading).has-tooltip-light:after,[data-tooltip]:not([disabled]).has-tooltip-light:after{border-color:hsla(0,0%,96%,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-light.has-tooltip-bottom:after,[data-tooltip]:not(.is-loading).has-tooltip-light.has-tooltip-bottom:after,[data-tooltip]:not([disabled]).has-tooltip-light.has-tooltip-bottom:after{border-color:transparent transparent hsla(0,0%,96%,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-light.has-tooltip-left:after,[data-tooltip]:not(.is-loading).has-tooltip-light.has-tooltip-left:after,[data-tooltip]:not([disabled]).has-tooltip-light.has-tooltip-left:after{border-color:transparent transparent transparent hsla(0,0%,96%,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-light.has-tooltip-right:after,[data-tooltip]:not(.is-loading).has-tooltip-light.has-tooltip-right:after,[data-tooltip]:not([disabled]).has-tooltip-light.has-tooltip-right:after{border-color:transparent hsla(0,0%,96%,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-light:before,[data-tooltip]:not(.is-loading).has-tooltip-light:before,[data-tooltip]:not([disabled]).has-tooltip-light:before{background-color:hsla(0,0%,96%,.9);color:rgba(0,0,0,.7)}[data-tooltip]:not(.is-disabled).has-tooltip-dark:after,[data-tooltip]:not(.is-loading).has-tooltip-dark:after,[data-tooltip]:not([disabled]).has-tooltip-dark:after{border-color:rgba(54,54,54,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-dark.has-tooltip-bottom:after,[data-tooltip]:not(.is-loading).has-tooltip-dark.has-tooltip-bottom:after,[data-tooltip]:not([disabled]).has-tooltip-dark.has-tooltip-bottom:after{border-color:transparent transparent rgba(54,54,54,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-dark.has-tooltip-left:after,[data-tooltip]:not(.is-loading).has-tooltip-dark.has-tooltip-left:after,[data-tooltip]:not([disabled]).has-tooltip-dark.has-tooltip-left:after{border-color:transparent transparent transparent rgba(54,54,54,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-dark.has-tooltip-right:after,[data-tooltip]:not(.is-loading).has-tooltip-dark.has-tooltip-right:after,[data-tooltip]:not([disabled]).has-tooltip-dark.has-tooltip-right:after{border-color:transparent rgba(54,54,54,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-dark:before,[data-tooltip]:not(.is-loading).has-tooltip-dark:before,[data-tooltip]:not([disabled]).has-tooltip-dark:before{background-color:rgba(54,54,54,.9);color:#fff}[data-tooltip]:not(.is-disabled).has-tooltip-primary:after,[data-tooltip]:not(.is-loading).has-tooltip-primary:after,[data-tooltip]:not([disabled]).has-tooltip-primary:after{border-color:rgba(0,209,178,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-primary.has-tooltip-bottom:after,[data-tooltip]:not(.is-loading).has-tooltip-primary.has-tooltip-bottom:after,[data-tooltip]:not([disabled]).has-tooltip-primary.has-tooltip-bottom:after{border-color:transparent transparent rgba(0,209,178,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-primary.has-tooltip-left:after,[data-tooltip]:not(.is-loading).has-tooltip-primary.has-tooltip-left:after,[data-tooltip]:not([disabled]).has-tooltip-primary.has-tooltip-left:after{border-color:transparent transparent transparent rgba(0,209,178,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-primary.has-tooltip-right:after,[data-tooltip]:not(.is-loading).has-tooltip-primary.has-tooltip-right:after,[data-tooltip]:not([disabled]).has-tooltip-primary.has-tooltip-right:after{border-color:transparent rgba(0,209,178,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-primary:before,[data-tooltip]:not(.is-loading).has-tooltip-primary:before,[data-tooltip]:not([disabled]).has-tooltip-primary:before{background-color:rgba(0,209,178,.9);color:#fff}[data-tooltip]:not(.is-disabled).has-tooltip-link:after,[data-tooltip]:not(.is-loading).has-tooltip-link:after,[data-tooltip]:not([disabled]).has-tooltip-link:after{border-color:rgba(50,115,220,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-link.has-tooltip-bottom:after,[data-tooltip]:not(.is-loading).has-tooltip-link.has-tooltip-bottom:after,[data-tooltip]:not([disabled]).has-tooltip-link.has-tooltip-bottom:after{border-color:transparent transparent rgba(50,115,220,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-link.has-tooltip-left:after,[data-tooltip]:not(.is-loading).has-tooltip-link.has-tooltip-left:after,[data-tooltip]:not([disabled]).has-tooltip-link.has-tooltip-left:after{border-color:transparent transparent transparent rgba(50,115,220,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-link.has-tooltip-right:after,[data-tooltip]:not(.is-loading).has-tooltip-link.has-tooltip-right:after,[data-tooltip]:not([disabled]).has-tooltip-link.has-tooltip-right:after{border-color:transparent rgba(50,115,220,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-link:before,[data-tooltip]:not(.is-loading).has-tooltip-link:before,[data-tooltip]:not([disabled]).has-tooltip-link:before{background-color:rgba(50,115,220,.9);color:#fff}[data-tooltip]:not(.is-disabled).has-tooltip-info:after,[data-tooltip]:not(.is-loading).has-tooltip-info:after,[data-tooltip]:not([disabled]).has-tooltip-info:after{border-color:rgba(50,152,220,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-info.has-tooltip-bottom:after,[data-tooltip]:not(.is-loading).has-tooltip-info.has-tooltip-bottom:after,[data-tooltip]:not([disabled]).has-tooltip-info.has-tooltip-bottom:after{border-color:transparent transparent rgba(50,152,220,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-info.has-tooltip-left:after,[data-tooltip]:not(.is-loading).has-tooltip-info.has-tooltip-left:after,[data-tooltip]:not([disabled]).has-tooltip-info.has-tooltip-left:after{border-color:transparent transparent transparent rgba(50,152,220,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-info.has-tooltip-right:after,[data-tooltip]:not(.is-loading).has-tooltip-info.has-tooltip-right:after,[data-tooltip]:not([disabled]).has-tooltip-info.has-tooltip-right:after{border-color:transparent rgba(50,152,220,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-info:before,[data-tooltip]:not(.is-loading).has-tooltip-info:before,[data-tooltip]:not([disabled]).has-tooltip-info:before{background-color:rgba(50,152,220,.9);color:#fff}[data-tooltip]:not(.is-disabled).has-tooltip-success:after,[data-tooltip]:not(.is-loading).has-tooltip-success:after,[data-tooltip]:not([disabled]).has-tooltip-success:after{border-color:rgba(72,199,116,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-success.has-tooltip-bottom:after,[data-tooltip]:not(.is-loading).has-tooltip-success.has-tooltip-bottom:after,[data-tooltip]:not([disabled]).has-tooltip-success.has-tooltip-bottom:after{border-color:transparent transparent rgba(72,199,116,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-success.has-tooltip-left:after,[data-tooltip]:not(.is-loading).has-tooltip-success.has-tooltip-left:after,[data-tooltip]:not([disabled]).has-tooltip-success.has-tooltip-left:after{border-color:transparent transparent transparent rgba(72,199,116,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-success.has-tooltip-right:after,[data-tooltip]:not(.is-loading).has-tooltip-success.has-tooltip-right:after,[data-tooltip]:not([disabled]).has-tooltip-success.has-tooltip-right:after{border-color:transparent rgba(72,199,116,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-success:before,[data-tooltip]:not(.is-loading).has-tooltip-success:before,[data-tooltip]:not([disabled]).has-tooltip-success:before{background-color:rgba(72,199,116,.9);color:#fff}[data-tooltip]:not(.is-disabled).has-tooltip-warning:after,[data-tooltip]:not(.is-loading).has-tooltip-warning:after,[data-tooltip]:not([disabled]).has-tooltip-warning:after{border-color:rgba(255,221,87,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-warning.has-tooltip-bottom:after,[data-tooltip]:not(.is-loading).has-tooltip-warning.has-tooltip-bottom:after,[data-tooltip]:not([disabled]).has-tooltip-warning.has-tooltip-bottom:after{border-color:transparent transparent rgba(255,221,87,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-warning.has-tooltip-left:after,[data-tooltip]:not(.is-loading).has-tooltip-warning.has-tooltip-left:after,[data-tooltip]:not([disabled]).has-tooltip-warning.has-tooltip-left:after{border-color:transparent transparent transparent rgba(255,221,87,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-warning.has-tooltip-right:after,[data-tooltip]:not(.is-loading).has-tooltip-warning.has-tooltip-right:after,[data-tooltip]:not([disabled]).has-tooltip-warning.has-tooltip-right:after{border-color:transparent rgba(255,221,87,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-warning:before,[data-tooltip]:not(.is-loading).has-tooltip-warning:before,[data-tooltip]:not([disabled]).has-tooltip-warning:before{background-color:rgba(255,221,87,.9);color:rgba(0,0,0,.7)}[data-tooltip]:not(.is-disabled).has-tooltip-danger:after,[data-tooltip]:not(.is-loading).has-tooltip-danger:after,[data-tooltip]:not([disabled]).has-tooltip-danger:after{border-color:rgba(241,70,104,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-danger.has-tooltip-bottom:after,[data-tooltip]:not(.is-loading).has-tooltip-danger.has-tooltip-bottom:after,[data-tooltip]:not([disabled]).has-tooltip-danger.has-tooltip-bottom:after{border-color:transparent transparent rgba(241,70,104,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-danger.has-tooltip-left:after,[data-tooltip]:not(.is-loading).has-tooltip-danger.has-tooltip-left:after,[data-tooltip]:not([disabled]).has-tooltip-danger.has-tooltip-left:after{border-color:transparent transparent transparent rgba(241,70,104,.9)!important}[data-tooltip]:not(.is-disabled).has-tooltip-danger.has-tooltip-right:after,[data-tooltip]:not(.is-loading).has-tooltip-danger.has-tooltip-right:after,[data-tooltip]:not([disabled]).has-tooltip-danger.has-tooltip-right:after{border-color:transparent rgba(241,70,104,.9) transparent transparent!important}[data-tooltip]:not(.is-disabled).has-tooltip-danger:before,[data-tooltip]:not(.is-loading).has-tooltip-danger:before,[data-tooltip]:not([disabled]).has-tooltip-danger:before{background-color:rgba(241,70,104,.9);color:#fff}[data-tooltip]:not(.is-disabled).has-tooltip-active:after,[data-tooltip]:not(.is-disabled).has-tooltip-active:before,[data-tooltip]:not(.is-disabled):hover:after,[data-tooltip]:not(.is-disabled):hover:before,[data-tooltip]:not(.is-loading).has-tooltip-active:after,[data-tooltip]:not(.is-loading).has-tooltip-active:before,[data-tooltip]:not(.is-loading):hover:after,[data-tooltip]:not(.is-loading):hover:before,[data-tooltip]:not([disabled]).has-tooltip-active:after,[data-tooltip]:not([disabled]).has-tooltip-active:before,[data-tooltip]:not([disabled]):hover:after,[data-tooltip]:not([disabled]):hover:before{opacity:1;visibility:visible}[data-tooltip]:not(.is-disabled).has-tooltip-fade:after,[data-tooltip]:not(.is-disabled).has-tooltip-fade:before,[data-tooltip]:not(.is-loading).has-tooltip-fade:after,[data-tooltip]:not(.is-loading).has-tooltip-fade:before,[data-tooltip]:not([disabled]).has-tooltip-fade:after,[data-tooltip]:not([disabled]).has-tooltip-fade:before{transition:opacity .3s linear,visibility .3s linear}@media screen and (max-width:768px){[data-tooltip]:not(.is-disabled).has-tooltip-top-mobile.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-top-mobile.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-top-mobile.has-tooltip-arrow:after{top:0;right:auto;bottom:auto;left:50%;margin:-5px auto auto -5px;border-color:rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-top-mobile:before,[data-tooltip]:not(.is-loading).has-tooltip-top-mobile:before,[data-tooltip]:not([disabled]).has-tooltip-top-mobile:before{right:auto;bottom:auto;left:50%;top:0;margin-top:-5px;margin-bottom:auto;transform:translate(-50%,-100%)}}@media print,screen and (min-width:769px){[data-tooltip]:not(.is-disabled).has-tooltip-top-tablet.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-top-tablet.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-top-tablet.has-tooltip-arrow:after{top:0;right:auto;bottom:auto;left:50%;margin:-5px auto auto -5px;border-color:rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-top-tablet:before,[data-tooltip]:not(.is-loading).has-tooltip-top-tablet:before,[data-tooltip]:not([disabled]).has-tooltip-top-tablet:before{right:auto;bottom:auto;left:50%;top:0;margin-top:-5px;margin-bottom:auto;transform:translate(-50%,-100%)}}@media screen and (min-width:769px) and (max-width:1023px){[data-tooltip]:not(.is-disabled).has-tooltip-top-tablet-only.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-top-tablet-only.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-top-tablet-only.has-tooltip-arrow:after{top:0;right:auto;bottom:auto;left:50%;margin:-5px auto auto -5px;border-color:rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-top-tablet-only:before,[data-tooltip]:not(.is-loading).has-tooltip-top-tablet-only:before,[data-tooltip]:not([disabled]).has-tooltip-top-tablet-only:before{right:auto;bottom:auto;left:50%;top:0;margin-top:-5px;margin-bottom:auto;transform:translate(-50%,-100%)}}@media screen and (max-width:1023px){[data-tooltip]:not(.is-disabled).has-tooltip-top-touch.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-top-touch.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-top-touch.has-tooltip-arrow:after{top:0;right:auto;bottom:auto;left:50%;margin:-5px auto auto -5px;border-color:rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-top-touch:before,[data-tooltip]:not(.is-loading).has-tooltip-top-touch:before,[data-tooltip]:not([disabled]).has-tooltip-top-touch:before{right:auto;bottom:auto;left:50%;top:0;margin-top:-5px;margin-bottom:auto;transform:translate(-50%,-100%)}}@media screen and (min-width:1024px){[data-tooltip]:not(.is-disabled).has-tooltip-top-desktop.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-top-desktop.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-top-desktop.has-tooltip-arrow:after{top:0;right:auto;bottom:auto;left:50%;margin:-5px auto auto -5px;border-color:rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-top-desktop:before,[data-tooltip]:not(.is-loading).has-tooltip-top-desktop:before,[data-tooltip]:not([disabled]).has-tooltip-top-desktop:before{right:auto;bottom:auto;left:50%;top:0;margin-top:-5px;margin-bottom:auto;transform:translate(-50%,-100%)}}@media screen and (min-width:1024px) and (max-width:1215px){[data-tooltip]:not(.is-disabled).has-tooltip-top-desktop-only.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-top-desktop-only.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-top-desktop-only.has-tooltip-arrow:after{top:0;right:auto;bottom:auto;left:50%;margin:-5px auto auto -5px;border-color:rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-top-desktop-only:before,[data-tooltip]:not(.is-loading).has-tooltip-top-desktop-only:before,[data-tooltip]:not([disabled]).has-tooltip-top-desktop-only:before{right:auto;bottom:auto;left:50%;top:0;margin-top:-5px;margin-bottom:auto;transform:translate(-50%,-100%)}}@media screen and (max-width:1215px){[data-tooltip]:not(.is-disabled).has-tooltip-top-until-widescreen.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-top-until-widescreen.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-top-until-widescreen.has-tooltip-arrow:after{top:0;right:auto;bottom:auto;left:50%;margin:-5px auto auto -5px;border-color:rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-top-until-widescreen:before,[data-tooltip]:not(.is-loading).has-tooltip-top-until-widescreen:before,[data-tooltip]:not([disabled]).has-tooltip-top-until-widescreen:before{right:auto;bottom:auto;left:50%;top:0;margin-top:-5px;margin-bottom:auto;transform:translate(-50%,-100%)}}@media screen and (min-width:1216px){[data-tooltip]:not(.is-disabled).has-tooltip-top-widescreen.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-top-widescreen.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-top-widescreen.has-tooltip-arrow:after{top:0;right:auto;bottom:auto;left:50%;margin:-5px auto auto -5px;border-color:rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-top-widescreen:before,[data-tooltip]:not(.is-loading).has-tooltip-top-widescreen:before,[data-tooltip]:not([disabled]).has-tooltip-top-widescreen:before{right:auto;bottom:auto;left:50%;top:0;margin-top:-5px;margin-bottom:auto;transform:translate(-50%,-100%)}}@media screen and (min-width:1216px) and (max-width:1407px){[data-tooltip]:not(.is-disabled).has-tooltip-top-widescreen-only.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-top-widescreen-only.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-top-widescreen-only.has-tooltip-arrow:after{top:0;right:auto;bottom:auto;left:50%;margin:-5px auto auto -5px;border-color:rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-top-widescreen-only:before,[data-tooltip]:not(.is-loading).has-tooltip-top-widescreen-only:before,[data-tooltip]:not([disabled]).has-tooltip-top-widescreen-only:before{right:auto;bottom:auto;left:50%;top:0;margin-top:-5px;margin-bottom:auto;transform:translate(-50%,-100%)}}@media screen and (max-width:1407px){[data-tooltip]:not(.is-disabled).has-tooltip-top-until-fullhd.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-top-until-fullhd.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-top-until-fullhd.has-tooltip-arrow:after{top:0;right:auto;bottom:auto;left:50%;margin:-5px auto auto -5px;border-color:rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-top-until-fullhd:before,[data-tooltip]:not(.is-loading).has-tooltip-top-until-fullhd:before,[data-tooltip]:not([disabled]).has-tooltip-top-until-fullhd:before{right:auto;bottom:auto;left:50%;top:0;margin-top:-5px;margin-bottom:auto;transform:translate(-50%,-100%)}}@media screen and (min-width:1408px){[data-tooltip]:not(.is-disabled).has-tooltip-top-fullhd.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-top-fullhd.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-top-fullhd.has-tooltip-arrow:after{top:0;right:auto;bottom:auto;left:50%;margin:-5px auto auto -5px;border-color:rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-top-fullhd:before,[data-tooltip]:not(.is-loading).has-tooltip-top-fullhd:before,[data-tooltip]:not([disabled]).has-tooltip-top-fullhd:before{right:auto;bottom:auto;left:50%;top:0;margin-top:-5px;margin-bottom:auto;transform:translate(-50%,-100%)}}@media screen and (max-width:768px){[data-tooltip]:not(.is-disabled).has-tooltip-right-mobile.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-right-mobile.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-right-mobile.has-tooltip-arrow:after{top:auto;right:0;bottom:50%;left:auto;margin:auto -6px -6px auto;border-color:transparent rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-right-mobile:before,[data-tooltip]:not(.is-loading).has-tooltip-right-mobile:before,[data-tooltip]:not([disabled]).has-tooltip-right-mobile:before{top:auto;right:-5px;bottom:50%;left:auto;margin-top:auto;transform:translate(100%,50%)}}@media print,screen and (min-width:769px){[data-tooltip]:not(.is-disabled).has-tooltip-right-tablet.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-right-tablet.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-right-tablet.has-tooltip-arrow:after{top:auto;right:0;bottom:50%;left:auto;margin:auto -6px -6px auto;border-color:transparent rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-right-tablet:before,[data-tooltip]:not(.is-loading).has-tooltip-right-tablet:before,[data-tooltip]:not([disabled]).has-tooltip-right-tablet:before{top:auto;right:-5px;bottom:50%;left:auto;margin-top:auto;transform:translate(100%,50%)}}@media screen and (min-width:769px) and (max-width:1023px){[data-tooltip]:not(.is-disabled).has-tooltip-right-tablet-only.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-right-tablet-only.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-right-tablet-only.has-tooltip-arrow:after{top:auto;right:0;bottom:50%;left:auto;margin:auto -6px -6px auto;border-color:transparent rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-right-tablet-only:before,[data-tooltip]:not(.is-loading).has-tooltip-right-tablet-only:before,[data-tooltip]:not([disabled]).has-tooltip-right-tablet-only:before{top:auto;right:-5px;bottom:50%;left:auto;margin-top:auto;transform:translate(100%,50%)}}@media screen and (max-width:1023px){[data-tooltip]:not(.is-disabled).has-tooltip-right-touch.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-right-touch.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-right-touch.has-tooltip-arrow:after{top:auto;right:0;bottom:50%;left:auto;margin:auto -6px -6px auto;border-color:transparent rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-right-touch:before,[data-tooltip]:not(.is-loading).has-tooltip-right-touch:before,[data-tooltip]:not([disabled]).has-tooltip-right-touch:before{top:auto;right:-5px;bottom:50%;left:auto;margin-top:auto;transform:translate(100%,50%)}}@media screen and (min-width:1024px){[data-tooltip]:not(.is-disabled).has-tooltip-right-desktop.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-right-desktop.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-right-desktop.has-tooltip-arrow:after{top:auto;right:0;bottom:50%;left:auto;margin:auto -6px -6px auto;border-color:transparent rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-right-desktop:before,[data-tooltip]:not(.is-loading).has-tooltip-right-desktop:before,[data-tooltip]:not([disabled]).has-tooltip-right-desktop:before{top:auto;right:-5px;bottom:50%;left:auto;margin-top:auto;transform:translate(100%,50%)}}@media screen and (min-width:1024px) and (max-width:1215px){[data-tooltip]:not(.is-disabled).has-tooltip-right-desktop-only.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-right-desktop-only.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-right-desktop-only.has-tooltip-arrow:after{top:auto;right:0;bottom:50%;left:auto;margin:auto -6px -6px auto;border-color:transparent rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-right-desktop-only:before,[data-tooltip]:not(.is-loading).has-tooltip-right-desktop-only:before,[data-tooltip]:not([disabled]).has-tooltip-right-desktop-only:before{top:auto;right:-5px;bottom:50%;left:auto;margin-top:auto;transform:translate(100%,50%)}}@media screen and (max-width:1215px){[data-tooltip]:not(.is-disabled).has-tooltip-right-until-widescreen.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-right-until-widescreen.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-right-until-widescreen.has-tooltip-arrow:after{top:auto;right:0;bottom:50%;left:auto;margin:auto -6px -6px auto;border-color:transparent rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-right-until-widescreen:before,[data-tooltip]:not(.is-loading).has-tooltip-right-until-widescreen:before,[data-tooltip]:not([disabled]).has-tooltip-right-until-widescreen:before{top:auto;right:-5px;bottom:50%;left:auto;margin-top:auto;transform:translate(100%,50%)}}@media screen and (min-width:1216px){[data-tooltip]:not(.is-disabled).has-tooltip-right-widescreen.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-right-widescreen.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-right-widescreen.has-tooltip-arrow:after{top:auto;right:0;bottom:50%;left:auto;margin:auto -6px -6px auto;border-color:transparent rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-right-widescreen:before,[data-tooltip]:not(.is-loading).has-tooltip-right-widescreen:before,[data-tooltip]:not([disabled]).has-tooltip-right-widescreen:before{top:auto;right:-5px;bottom:50%;left:auto;margin-top:auto;transform:translate(100%,50%)}}@media screen and (min-width:1216px) and (max-width:1407px){[data-tooltip]:not(.is-disabled).has-tooltip-right-widescreen-only.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-right-widescreen-only.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-right-widescreen-only.has-tooltip-arrow:after{top:auto;right:0;bottom:50%;left:auto;margin:auto -6px -6px auto;border-color:transparent rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-right-widescreen-only:before,[data-tooltip]:not(.is-loading).has-tooltip-right-widescreen-only:before,[data-tooltip]:not([disabled]).has-tooltip-right-widescreen-only:before{top:auto;right:-5px;bottom:50%;left:auto;margin-top:auto;transform:translate(100%,50%)}}@media screen and (max-width:1407px){[data-tooltip]:not(.is-disabled).has-tooltip-right-until-fullhd.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-right-until-fullhd.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-right-until-fullhd.has-tooltip-arrow:after{top:auto;right:0;bottom:50%;left:auto;margin:auto -6px -6px auto;border-color:transparent rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-right-until-fullhd:before,[data-tooltip]:not(.is-loading).has-tooltip-right-until-fullhd:before,[data-tooltip]:not([disabled]).has-tooltip-right-until-fullhd:before{top:auto;right:-5px;bottom:50%;left:auto;margin-top:auto;transform:translate(100%,50%)}}@media screen and (min-width:1408px){[data-tooltip]:not(.is-disabled).has-tooltip-right-fullhd.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-right-fullhd.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-right-fullhd.has-tooltip-arrow:after{top:auto;right:0;bottom:50%;left:auto;margin:auto -6px -6px auto;border-color:transparent rgba(74,74,74,.9) transparent transparent}[data-tooltip]:not(.is-disabled).has-tooltip-right-fullhd:before,[data-tooltip]:not(.is-loading).has-tooltip-right-fullhd:before,[data-tooltip]:not([disabled]).has-tooltip-right-fullhd:before{top:auto;right:-5px;bottom:50%;left:auto;margin-top:auto;transform:translate(100%,50%)}}@media screen and (max-width:768px){[data-tooltip]:not(.is-disabled).has-tooltip-bottom-mobile.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-bottom-mobile.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-bottom-mobile.has-tooltip-arrow:after{top:auto;right:auto;bottom:-1px;left:50%;margin:auto auto -5px -5px;border-color:transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-bottom-mobile:before,[data-tooltip]:not(.is-loading).has-tooltip-bottom-mobile:before,[data-tooltip]:not([disabled]).has-tooltip-bottom-mobile:before{top:auto;right:auto;bottom:0;left:50%;margin-top:auto;margin-bottom:-5px;transform:translate(-50%,100%)}}@media print,screen and (min-width:769px){[data-tooltip]:not(.is-disabled).has-tooltip-bottom-tablet.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-bottom-tablet.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-bottom-tablet.has-tooltip-arrow:after{top:auto;right:auto;bottom:-1px;left:50%;margin:auto auto -5px -5px;border-color:transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-bottom-tablet:before,[data-tooltip]:not(.is-loading).has-tooltip-bottom-tablet:before,[data-tooltip]:not([disabled]).has-tooltip-bottom-tablet:before{top:auto;right:auto;bottom:0;left:50%;margin-top:auto;margin-bottom:-5px;transform:translate(-50%,100%)}}@media screen and (min-width:769px) and (max-width:1023px){[data-tooltip]:not(.is-disabled).has-tooltip-bottom-tablet-only.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-bottom-tablet-only.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-bottom-tablet-only.has-tooltip-arrow:after{top:auto;right:auto;bottom:-1px;left:50%;margin:auto auto -5px -5px;border-color:transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-bottom-tablet-only:before,[data-tooltip]:not(.is-loading).has-tooltip-bottom-tablet-only:before,[data-tooltip]:not([disabled]).has-tooltip-bottom-tablet-only:before{top:auto;right:auto;bottom:0;left:50%;margin-top:auto;margin-bottom:-5px;transform:translate(-50%,100%)}}@media screen and (max-width:1023px){[data-tooltip]:not(.is-disabled).has-tooltip-bottom-touch.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-bottom-touch.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-bottom-touch.has-tooltip-arrow:after{top:auto;right:auto;bottom:-1px;left:50%;margin:auto auto -5px -5px;border-color:transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-bottom-touch:before,[data-tooltip]:not(.is-loading).has-tooltip-bottom-touch:before,[data-tooltip]:not([disabled]).has-tooltip-bottom-touch:before{top:auto;right:auto;bottom:0;left:50%;margin-top:auto;margin-bottom:-5px;transform:translate(-50%,100%)}}@media screen and (min-width:1024px){[data-tooltip]:not(.is-disabled).has-tooltip-bottom-desktop.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-bottom-desktop.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-bottom-desktop.has-tooltip-arrow:after{top:auto;right:auto;bottom:-1px;left:50%;margin:auto auto -5px -5px;border-color:transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-bottom-desktop:before,[data-tooltip]:not(.is-loading).has-tooltip-bottom-desktop:before,[data-tooltip]:not([disabled]).has-tooltip-bottom-desktop:before{top:auto;right:auto;bottom:0;left:50%;margin-top:auto;margin-bottom:-5px;transform:translate(-50%,100%)}}@media screen and (min-width:1024px) and (max-width:1215px){[data-tooltip]:not(.is-disabled).has-tooltip-bottom-desktop-only.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-bottom-desktop-only.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-bottom-desktop-only.has-tooltip-arrow:after{top:auto;right:auto;bottom:-1px;left:50%;margin:auto auto -5px -5px;border-color:transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-bottom-desktop-only:before,[data-tooltip]:not(.is-loading).has-tooltip-bottom-desktop-only:before,[data-tooltip]:not([disabled]).has-tooltip-bottom-desktop-only:before{top:auto;right:auto;bottom:0;left:50%;margin-top:auto;margin-bottom:-5px;transform:translate(-50%,100%)}}@media screen and (max-width:1215px){[data-tooltip]:not(.is-disabled).has-tooltip-bottom-until-widescreen.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-bottom-until-widescreen.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-bottom-until-widescreen.has-tooltip-arrow:after{top:auto;right:auto;bottom:-1px;left:50%;margin:auto auto -5px -5px;border-color:transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-bottom-until-widescreen:before,[data-tooltip]:not(.is-loading).has-tooltip-bottom-until-widescreen:before,[data-tooltip]:not([disabled]).has-tooltip-bottom-until-widescreen:before{top:auto;right:auto;bottom:0;left:50%;margin-top:auto;margin-bottom:-5px;transform:translate(-50%,100%)}}@media screen and (min-width:1216px){[data-tooltip]:not(.is-disabled).has-tooltip-bottom-widescreen.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-bottom-widescreen.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-bottom-widescreen.has-tooltip-arrow:after{top:auto;right:auto;bottom:-1px;left:50%;margin:auto auto -5px -5px;border-color:transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-bottom-widescreen:before,[data-tooltip]:not(.is-loading).has-tooltip-bottom-widescreen:before,[data-tooltip]:not([disabled]).has-tooltip-bottom-widescreen:before{top:auto;right:auto;bottom:0;left:50%;margin-top:auto;margin-bottom:-5px;transform:translate(-50%,100%)}}@media screen and (min-width:1216px) and (max-width:1407px){[data-tooltip]:not(.is-disabled).has-tooltip-bottom-widescreen-only.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-bottom-widescreen-only.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-bottom-widescreen-only.has-tooltip-arrow:after{top:auto;right:auto;bottom:-1px;left:50%;margin:auto auto -5px -5px;border-color:transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-bottom-widescreen-only:before,[data-tooltip]:not(.is-loading).has-tooltip-bottom-widescreen-only:before,[data-tooltip]:not([disabled]).has-tooltip-bottom-widescreen-only:before{top:auto;right:auto;bottom:0;left:50%;margin-top:auto;margin-bottom:-5px;transform:translate(-50%,100%)}}@media screen and (max-width:1407px){[data-tooltip]:not(.is-disabled).has-tooltip-bottom-until-fullhd.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-bottom-until-fullhd.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-bottom-until-fullhd.has-tooltip-arrow:after{top:auto;right:auto;bottom:-1px;left:50%;margin:auto auto -5px -5px;border-color:transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-bottom-until-fullhd:before,[data-tooltip]:not(.is-loading).has-tooltip-bottom-until-fullhd:before,[data-tooltip]:not([disabled]).has-tooltip-bottom-until-fullhd:before{top:auto;right:auto;bottom:0;left:50%;margin-top:auto;margin-bottom:-5px;transform:translate(-50%,100%)}}@media screen and (min-width:1408px){[data-tooltip]:not(.is-disabled).has-tooltip-bottom-fullhd.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-bottom-fullhd.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-bottom-fullhd.has-tooltip-arrow:after{top:auto;right:auto;bottom:-1px;left:50%;margin:auto auto -5px -5px;border-color:transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-bottom-fullhd:before,[data-tooltip]:not(.is-loading).has-tooltip-bottom-fullhd:before,[data-tooltip]:not([disabled]).has-tooltip-bottom-fullhd:before{top:auto;right:auto;bottom:0;left:50%;margin-top:auto;margin-bottom:-5px;transform:translate(-50%,100%)}}@media screen and (max-width:768px){[data-tooltip]:not(.is-disabled).has-tooltip-left-mobile.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-left-mobile.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-left-mobile.has-tooltip-arrow:after{top:auto;right:auto;bottom:50%;left:0;margin:auto auto -6px -5px;border-color:transparent transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-left-mobile:before,[data-tooltip]:not(.is-loading).has-tooltip-left-mobile:before,[data-tooltip]:not([disabled]).has-tooltip-left-mobile:before{top:auto;right:auto;bottom:50%;left:-5px;transform:translate(-100%,50%)}}@media print,screen and (min-width:769px){[data-tooltip]:not(.is-disabled).has-tooltip-left-tablet.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-left-tablet.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-left-tablet.has-tooltip-arrow:after{top:auto;right:auto;bottom:50%;left:0;margin:auto auto -6px -5px;border-color:transparent transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-left-tablet:before,[data-tooltip]:not(.is-loading).has-tooltip-left-tablet:before,[data-tooltip]:not([disabled]).has-tooltip-left-tablet:before{top:auto;right:auto;bottom:50%;left:-5px;transform:translate(-100%,50%)}}@media screen and (min-width:769px) and (max-width:1023px){[data-tooltip]:not(.is-disabled).has-tooltip-left-tablet-only.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-left-tablet-only.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-left-tablet-only.has-tooltip-arrow:after{top:auto;right:auto;bottom:50%;left:0;margin:auto auto -6px -5px;border-color:transparent transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-left-tablet-only:before,[data-tooltip]:not(.is-loading).has-tooltip-left-tablet-only:before,[data-tooltip]:not([disabled]).has-tooltip-left-tablet-only:before{top:auto;right:auto;bottom:50%;left:-5px;transform:translate(-100%,50%)}}@media screen and (max-width:1023px){[data-tooltip]:not(.is-disabled).has-tooltip-left-touch.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-left-touch.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-left-touch.has-tooltip-arrow:after{top:auto;right:auto;bottom:50%;left:0;margin:auto auto -6px -5px;border-color:transparent transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-left-touch:before,[data-tooltip]:not(.is-loading).has-tooltip-left-touch:before,[data-tooltip]:not([disabled]).has-tooltip-left-touch:before{top:auto;right:auto;bottom:50%;left:-5px;transform:translate(-100%,50%)}}@media screen and (min-width:1024px){[data-tooltip]:not(.is-disabled).has-tooltip-left-desktop.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-left-desktop.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-left-desktop.has-tooltip-arrow:after{top:auto;right:auto;bottom:50%;left:0;margin:auto auto -6px -5px;border-color:transparent transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-left-desktop:before,[data-tooltip]:not(.is-loading).has-tooltip-left-desktop:before,[data-tooltip]:not([disabled]).has-tooltip-left-desktop:before{top:auto;right:auto;bottom:50%;left:-5px;transform:translate(-100%,50%)}}@media screen and (min-width:1024px) and (max-width:1215px){[data-tooltip]:not(.is-disabled).has-tooltip-left-desktop-only.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-left-desktop-only.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-left-desktop-only.has-tooltip-arrow:after{top:auto;right:auto;bottom:50%;left:0;margin:auto auto -6px -5px;border-color:transparent transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-left-desktop-only:before,[data-tooltip]:not(.is-loading).has-tooltip-left-desktop-only:before,[data-tooltip]:not([disabled]).has-tooltip-left-desktop-only:before{top:auto;right:auto;bottom:50%;left:-5px;transform:translate(-100%,50%)}}@media screen and (max-width:1215px){[data-tooltip]:not(.is-disabled).has-tooltip-left-until-widescreen.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-left-until-widescreen.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-left-until-widescreen.has-tooltip-arrow:after{top:auto;right:auto;bottom:50%;left:0;margin:auto auto -6px -5px;border-color:transparent transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-left-until-widescreen:before,[data-tooltip]:not(.is-loading).has-tooltip-left-until-widescreen:before,[data-tooltip]:not([disabled]).has-tooltip-left-until-widescreen:before{top:auto;right:auto;bottom:50%;left:-5px;transform:translate(-100%,50%)}}@media screen and (min-width:1216px){[data-tooltip]:not(.is-disabled).has-tooltip-left-widescreen.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-left-widescreen.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-left-widescreen.has-tooltip-arrow:after{top:auto;right:auto;bottom:50%;left:0;margin:auto auto -6px -5px;border-color:transparent transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-left-widescreen:before,[data-tooltip]:not(.is-loading).has-tooltip-left-widescreen:before,[data-tooltip]:not([disabled]).has-tooltip-left-widescreen:before{top:auto;right:auto;bottom:50%;left:-5px;transform:translate(-100%,50%)}}@media screen and (min-width:1216px) and (max-width:1407px){[data-tooltip]:not(.is-disabled).has-tooltip-left-widescreen-only.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-left-widescreen-only.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-left-widescreen-only.has-tooltip-arrow:after{top:auto;right:auto;bottom:50%;left:0;margin:auto auto -6px -5px;border-color:transparent transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-left-widescreen-only:before,[data-tooltip]:not(.is-loading).has-tooltip-left-widescreen-only:before,[data-tooltip]:not([disabled]).has-tooltip-left-widescreen-only:before{top:auto;right:auto;bottom:50%;left:-5px;transform:translate(-100%,50%)}}@media screen and (max-width:1407px){[data-tooltip]:not(.is-disabled).has-tooltip-left-until-fullhd.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-left-until-fullhd.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-left-until-fullhd.has-tooltip-arrow:after{top:auto;right:auto;bottom:50%;left:0;margin:auto auto -6px -5px;border-color:transparent transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-left-until-fullhd:before,[data-tooltip]:not(.is-loading).has-tooltip-left-until-fullhd:before,[data-tooltip]:not([disabled]).has-tooltip-left-until-fullhd:before{top:auto;right:auto;bottom:50%;left:-5px;transform:translate(-100%,50%)}}@media screen and (min-width:1408px){[data-tooltip]:not(.is-disabled).has-tooltip-left-fullhd.has-tooltip-arrow:after,[data-tooltip]:not(.is-loading).has-tooltip-left-fullhd.has-tooltip-arrow:after,[data-tooltip]:not([disabled]).has-tooltip-left-fullhd.has-tooltip-arrow:after{top:auto;right:auto;bottom:50%;left:0;margin:auto auto -6px -5px;border-color:transparent transparent transparent rgba(74,74,74,.9)}[data-tooltip]:not(.is-disabled).has-tooltip-left-fullhd:before,[data-tooltip]:not(.is-loading).has-tooltip-left-fullhd:before,[data-tooltip]:not([disabled]).has-tooltip-left-fullhd:before{top:auto;right:auto;bottom:50%;left:-5px;transform:translate(-100%,50%)}}@media screen and (max-width:768px){[data-tooltip]:not(.is-disabled).has-tooltip-hidden-mobile:after,[data-tooltip]:not(.is-disabled).has-tooltip-hidden-mobile:before,[data-tooltip]:not(.is-loading).has-tooltip-hidden-mobile:after,[data-tooltip]:not(.is-loading).has-tooltip-hidden-mobile:before,[data-tooltip]:not([disabled]).has-tooltip-hidden-mobile:after,[data-tooltip]:not([disabled]).has-tooltip-hidden-mobile:before{opacity:0!important;display:none!important}}@media print,screen and (min-width:769px){[data-tooltip]:not(.is-disabled).has-tooltip-hidden-tablet:after,[data-tooltip]:not(.is-disabled).has-tooltip-hidden-tablet:before,[data-tooltip]:not(.is-loading).has-tooltip-hidden-tablet:after,[data-tooltip]:not(.is-loading).has-tooltip-hidden-tablet:before,[data-tooltip]:not([disabled]).has-tooltip-hidden-tablet:after,[data-tooltip]:not([disabled]).has-tooltip-hidden-tablet:before{opacity:0!important;display:none!important}}@media screen and (min-width:769px) and (max-width:1023px){[data-tooltip]:not(.is-disabled).has-tooltip-hidden-tablet-only:after,[data-tooltip]:not(.is-disabled).has-tooltip-hidden-tablet-only:before,[data-tooltip]:not(.is-loading).has-tooltip-hidden-tablet-only:after,[data-tooltip]:not(.is-loading).has-tooltip-hidden-tablet-only:before,[data-tooltip]:not([disabled]).has-tooltip-hidden-tablet-only:after,[data-tooltip]:not([disabled]).has-tooltip-hidden-tablet-only:before{opacity:0!important;display:none!important}}@media screen and (max-width:1023px){[data-tooltip]:not(.is-disabled).has-tooltip-hidden-touch:after,[data-tooltip]:not(.is-disabled).has-tooltip-hidden-touch:before,[data-tooltip]:not(.is-loading).has-tooltip-hidden-touch:after,[data-tooltip]:not(.is-loading).has-tooltip-hidden-touch:before,[data-tooltip]:not([disabled]).has-tooltip-hidden-touch:after,[data-tooltip]:not([disabled]).has-tooltip-hidden-touch:before{opacity:0!important;display:none!important}}@media screen and (min-width:1024px){[data-tooltip]:not(.is-disabled).has-tooltip-hidden-desktop:after,[data-tooltip]:not(.is-disabled).has-tooltip-hidden-desktop:before,[data-tooltip]:not(.is-loading).has-tooltip-hidden-desktop:after,[data-tooltip]:not(.is-loading).has-tooltip-hidden-desktop:before,[data-tooltip]:not([disabled]).has-tooltip-hidden-desktop:after,[data-tooltip]:not([disabled]).has-tooltip-hidden-desktop:before{opacity:0!important;display:none!important}}@media screen and (min-width:1024px) and (max-width:1215px){[data-tooltip]:not(.is-disabled).has-tooltip-hidden-desktop-only:after,[data-tooltip]:not(.is-disabled).has-tooltip-hidden-desktop-only:before,[data-tooltip]:not(.is-loading).has-tooltip-hidden-desktop-only:after,[data-tooltip]:not(.is-loading).has-tooltip-hidden-desktop-only:before,[data-tooltip]:not([disabled]).has-tooltip-hidden-desktop-only:after,[data-tooltip]:not([disabled]).has-tooltip-hidden-desktop-only:before{opacity:0!important;display:none!important}}@media screen and (max-width:1215px){[data-tooltip]:not(.is-disabled).has-tooltip-hidden-until-widescreen:after,[data-tooltip]:not(.is-disabled).has-tooltip-hidden-until-widescreen:before,[data-tooltip]:not(.is-loading).has-tooltip-hidden-until-widescreen:after,[data-tooltip]:not(.is-loading).has-tooltip-hidden-until-widescreen:before,[data-tooltip]:not([disabled]).has-tooltip-hidden-until-widescreen:after,[data-tooltip]:not([disabled]).has-tooltip-hidden-until-widescreen:before{opacity:0!important;display:none!important}}@media screen and (min-width:1216px){[data-tooltip]:not(.is-disabled).has-tooltip-hidden-widescreen:after,[data-tooltip]:not(.is-disabled).has-tooltip-hidden-widescreen:before,[data-tooltip]:not(.is-loading).has-tooltip-hidden-widescreen:after,[data-tooltip]:not(.is-loading).has-tooltip-hidden-widescreen:before,[data-tooltip]:not([disabled]).has-tooltip-hidden-widescreen:after,[data-tooltip]:not([disabled]).has-tooltip-hidden-widescreen:before{opacity:0!important;display:none!important}}@media screen and (min-width:1216px) and (max-width:1407px){[data-tooltip]:not(.is-disabled).has-tooltip-hidden-widescreen-only:after,[data-tooltip]:not(.is-disabled).has-tooltip-hidden-widescreen-only:before,[data-tooltip]:not(.is-loading).has-tooltip-hidden-widescreen-only:after,[data-tooltip]:not(.is-loading).has-tooltip-hidden-widescreen-only:before,[data-tooltip]:not([disabled]).has-tooltip-hidden-widescreen-only:after,[data-tooltip]:not([disabled]).has-tooltip-hidden-widescreen-only:before{opacity:0!important;display:none!important}}@media screen and (max-width:1407px){[data-tooltip]:not(.is-disabled).has-tooltip-hidden-until-fullhd:after,[data-tooltip]:not(.is-disabled).has-tooltip-hidden-until-fullhd:before,[data-tooltip]:not(.is-loading).has-tooltip-hidden-until-fullhd:after,[data-tooltip]:not(.is-loading).has-tooltip-hidden-until-fullhd:before,[data-tooltip]:not([disabled]).has-tooltip-hidden-until-fullhd:after,[data-tooltip]:not([disabled]).has-tooltip-hidden-until-fullhd:before{opacity:0!important;display:none!important}}@media screen and (min-width:1408px){[data-tooltip]:not(.is-disabled).has-tooltip-hidden-fullhd:after,[data-tooltip]:not(.is-disabled).has-tooltip-hidden-fullhd:before,[data-tooltip]:not(.is-loading).has-tooltip-hidden-fullhd:after,[data-tooltip]:not(.is-loading).has-tooltip-hidden-fullhd:before,[data-tooltip]:not([disabled]).has-tooltip-hidden-fullhd:after,[data-tooltip]:not([disabled]).has-tooltip-hidden-fullhd:before{opacity:0!important;display:none!important}}@media screen and (max-width:768px){[data-tooltip]:not(.is-disabled).has-tooltip-text-left-mobile:before,[data-tooltip]:not(.is-loading).has-tooltip-text-left-mobile:before,[data-tooltip]:not([disabled]).has-tooltip-text-left-mobile:before{text-align:left}}@media print,screen and (min-width:769px){[data-tooltip]:not(.is-disabled).has-tooltip-text-left-tablet:before,[data-tooltip]:not(.is-loading).has-tooltip-text-left-tablet:before,[data-tooltip]:not([disabled]).has-tooltip-text-left-tablet:before{text-align:left}}@media screen and (min-width:769px) and (max-width:1023px){[data-tooltip]:not(.is-disabled).has-tooltip-text-left-tablet-only:before,[data-tooltip]:not(.is-loading).has-tooltip-text-left-tablet-only:before,[data-tooltip]:not([disabled]).has-tooltip-text-left-tablet-only:before{text-align:left}}@media screen and (max-width:1023px){[data-tooltip]:not(.is-disabled).has-tooltip-text-left-touch:before,[data-tooltip]:not(.is-loading).has-tooltip-text-left-touch:before,[data-tooltip]:not([disabled]).has-tooltip-text-left-touch:before{text-align:left}}@media screen and (min-width:1024px){[data-tooltip]:not(.is-disabled).has-tooltip-text-left-desktop:before,[data-tooltip]:not(.is-loading).has-tooltip-text-left-desktop:before,[data-tooltip]:not([disabled]).has-tooltip-text-left-desktop:before{text-align:left}}@media screen and (min-width:1024px) and (max-width:1215px){[data-tooltip]:not(.is-disabled).has-tooltip-text-left-desktop-only:before,[data-tooltip]:not(.is-loading).has-tooltip-text-left-desktop-only:before,[data-tooltip]:not([disabled]).has-tooltip-text-left-desktop-only:before{text-align:left}}@media screen and (max-width:1215px){[data-tooltip]:not(.is-disabled).has-tooltip-text-left-until-widescreen:before,[data-tooltip]:not(.is-loading).has-tooltip-text-left-until-widescreen:before,[data-tooltip]:not([disabled]).has-tooltip-text-left-until-widescreen:before{text-align:left}}@media screen and (min-width:1216px){[data-tooltip]:not(.is-disabled).has-tooltip-text-left-widescreen:before,[data-tooltip]:not(.is-loading).has-tooltip-text-left-widescreen:before,[data-tooltip]:not([disabled]).has-tooltip-text-left-widescreen:before{text-align:left}}@media screen and (min-width:1216px) and (max-width:1407px){[data-tooltip]:not(.is-disabled).has-tooltip-text-left-widescreen-only:before,[data-tooltip]:not(.is-loading).has-tooltip-text-left-widescreen-only:before,[data-tooltip]:not([disabled]).has-tooltip-text-left-widescreen-only:before{text-align:left}}@media screen and (max-width:1407px){[data-tooltip]:not(.is-disabled).has-tooltip-text-left-until-fullhd:before,[data-tooltip]:not(.is-loading).has-tooltip-text-left-until-fullhd:before,[data-tooltip]:not([disabled]).has-tooltip-text-left-until-fullhd:before{text-align:left}}@media screen and (min-width:1408px){[data-tooltip]:not(.is-disabled).has-tooltip-text-left-fullhd:before,[data-tooltip]:not(.is-loading).has-tooltip-text-left-fullhd:before,[data-tooltip]:not([disabled]).has-tooltip-text-left-fullhd:before{text-align:left}}@media screen and (max-width:768px){[data-tooltip]:not(.is-disabled).has-tooltip-text-centered-mobile:before,[data-tooltip]:not(.is-loading).has-tooltip-text-centered-mobile:before,[data-tooltip]:not([disabled]).has-tooltip-text-centered-mobile:before{text-align:center}}@media print,screen and (min-width:769px){[data-tooltip]:not(.is-disabled).has-tooltip-text-centered-tablet:before,[data-tooltip]:not(.is-loading).has-tooltip-text-centered-tablet:before,[data-tooltip]:not([disabled]).has-tooltip-text-centered-tablet:before{text-align:center}}@media screen and (min-width:769px) and (max-width:1023px){[data-tooltip]:not(.is-disabled).has-tooltip-text-centered-tablet-only:before,[data-tooltip]:not(.is-loading).has-tooltip-text-centered-tablet-only:before,[data-tooltip]:not([disabled]).has-tooltip-text-centered-tablet-only:before{text-align:center}}@media screen and (max-width:1023px){[data-tooltip]:not(.is-disabled).has-tooltip-text-centered-touch:before,[data-tooltip]:not(.is-loading).has-tooltip-text-centered-touch:before,[data-tooltip]:not([disabled]).has-tooltip-text-centered-touch:before{text-align:center}}@media screen and (min-width:1024px){[data-tooltip]:not(.is-disabled).has-tooltip-text-centered-desktop:before,[data-tooltip]:not(.is-loading).has-tooltip-text-centered-desktop:before,[data-tooltip]:not([disabled]).has-tooltip-text-centered-desktop:before{text-align:center}}@media screen and (min-width:1024px) and (max-width:1215px){[data-tooltip]:not(.is-disabled).has-tooltip-text-centered-desktop-only:before,[data-tooltip]:not(.is-loading).has-tooltip-text-centered-desktop-only:before,[data-tooltip]:not([disabled]).has-tooltip-text-centered-desktop-only:before{text-align:center}}@media screen and (max-width:1215px){[data-tooltip]:not(.is-disabled).has-tooltip-text-centered-until-widescreen:before,[data-tooltip]:not(.is-loading).has-tooltip-text-centered-until-widescreen:before,[data-tooltip]:not([disabled]).has-tooltip-text-centered-until-widescreen:before{text-align:center}}@media screen and (min-width:1216px){[data-tooltip]:not(.is-disabled).has-tooltip-text-centered-widescreen:before,[data-tooltip]:not(.is-loading).has-tooltip-text-centered-widescreen:before,[data-tooltip]:not([disabled]).has-tooltip-text-centered-widescreen:before{text-align:center}}@media screen and (min-width:1216px) and (max-width:1407px){[data-tooltip]:not(.is-disabled).has-tooltip-text-centered-widescreen-only:before,[data-tooltip]:not(.is-loading).has-tooltip-text-centered-widescreen-only:before,[data-tooltip]:not([disabled]).has-tooltip-text-centered-widescreen-only:before{text-align:center}}@media screen and (max-width:1407px){[data-tooltip]:not(.is-disabled).has-tooltip-text-centered-until-fullhd:before,[data-tooltip]:not(.is-loading).has-tooltip-text-centered-until-fullhd:before,[data-tooltip]:not([disabled]).has-tooltip-text-centered-until-fullhd:before{text-align:center}}@media screen and (min-width:1408px){[data-tooltip]:not(.is-disabled).has-tooltip-text-centered-fullhd:before,[data-tooltip]:not(.is-loading).has-tooltip-text-centered-fullhd:before,[data-tooltip]:not([disabled]).has-tooltip-text-centered-fullhd:before{text-align:center}}@media screen and (max-width:768px){[data-tooltip]:not(.is-disabled).has-tooltip-text-right-mobile:before,[data-tooltip]:not(.is-loading).has-tooltip-text-right-mobile:before,[data-tooltip]:not([disabled]).has-tooltip-text-right-mobile:before{text-align:right}}@media print,screen and (min-width:769px){[data-tooltip]:not(.is-disabled).has-tooltip-text-right-tablet:before,[data-tooltip]:not(.is-loading).has-tooltip-text-right-tablet:before,[data-tooltip]:not([disabled]).has-tooltip-text-right-tablet:before{text-align:right}}@media screen and (min-width:769px) and (max-width:1023px){[data-tooltip]:not(.is-disabled).has-tooltip-text-right-tablet-only:before,[data-tooltip]:not(.is-loading).has-tooltip-text-right-tablet-only:before,[data-tooltip]:not([disabled]).has-tooltip-text-right-tablet-only:before{text-align:right}}@media screen and (max-width:1023px){[data-tooltip]:not(.is-disabled).has-tooltip-text-right-touch:before,[data-tooltip]:not(.is-loading).has-tooltip-text-right-touch:before,[data-tooltip]:not([disabled]).has-tooltip-text-right-touch:before{text-align:right}}@media screen and (min-width:1024px){[data-tooltip]:not(.is-disabled).has-tooltip-text-right-desktop:before,[data-tooltip]:not(.is-loading).has-tooltip-text-right-desktop:before,[data-tooltip]:not([disabled]).has-tooltip-text-right-desktop:before{text-align:right}}@media screen and (min-width:1024px) and (max-width:1215px){[data-tooltip]:not(.is-disabled).has-tooltip-text-right-desktop-only:before,[data-tooltip]:not(.is-loading).has-tooltip-text-right-desktop-only:before,[data-tooltip]:not([disabled]).has-tooltip-text-right-desktop-only:before{text-align:right}}@media screen and (max-width:1215px){[data-tooltip]:not(.is-disabled).has-tooltip-text-right-until-widescreen:before,[data-tooltip]:not(.is-loading).has-tooltip-text-right-until-widescreen:before,[data-tooltip]:not([disabled]).has-tooltip-text-right-until-widescreen:before{text-align:right}}@media screen and (min-width:1216px){[data-tooltip]:not(.is-disabled).has-tooltip-text-right-widescreen:before,[data-tooltip]:not(.is-loading).has-tooltip-text-right-widescreen:before,[data-tooltip]:not([disabled]).has-tooltip-text-right-widescreen:before{text-align:right}}@media screen and (min-width:1216px) and (max-width:1407px){[data-tooltip]:not(.is-disabled).has-tooltip-text-right-widescreen-only:before,[data-tooltip]:not(.is-loading).has-tooltip-text-right-widescreen-only:before,[data-tooltip]:not([disabled]).has-tooltip-text-right-widescreen-only:before{text-align:right}}@media screen and (max-width:1407px){[data-tooltip]:not(.is-disabled).has-tooltip-text-right-until-fullhd:before,[data-tooltip]:not(.is-loading).has-tooltip-text-right-until-fullhd:before,[data-tooltip]:not([disabled]).has-tooltip-text-right-until-fullhd:before{text-align:right}}@media screen and (min-width:1408px){[data-tooltip]:not(.is-disabled).has-tooltip-text-right-fullhd:before,[data-tooltip]:not(.is-loading).has-tooltip-text-right-fullhd:before,[data-tooltip]:not([disabled]).has-tooltip-text-right-fullhd:before{text-align:right}}span[data-tooltip]{border-bottom:1px dashed #dbdbdb}span[data-tooltip].has-tooltip-white{border-bottom-color:#fff}span[data-tooltip].has-tooltip-black{border-bottom-color:#171717}span[data-tooltip].has-tooltip-light{border-bottom-color:#fff}span[data-tooltip].has-tooltip-dark{border-bottom-color:#424242}span[data-tooltip].has-tooltip-primary{border-bottom-color:#00ebc7}span[data-tooltip].has-tooltip-link{border-bottom-color:#4882e0}span[data-tooltip].has-tooltip-info{border-bottom-color:#48a3e0}span[data-tooltip].has-tooltip-success{border-bottom-color:#5bcd83}span[data-tooltip].has-tooltip-warning{border-bottom-color:#ffe270}span[data-tooltip].has-tooltip-danger{border-bottom-color:#f35e7c}.control span[data-tooltip]{border-bottom:none} diff --git a/doc/assets/js/docs.js b/doc/assets/js/docs.js new file mode 100644 index 0000000000..71ef54809c --- /dev/null +++ b/doc/assets/js/docs.js @@ -0,0 +1,210 @@ +// The Things Network docs theme — progressive enhancement only: every page is fully usable without +// this script (navigation is plain links, dropdowns are
, the sidebar starts open). +(function () { + "use strict"; + + var script = document.currentScript; + var header = document.querySelector("[data-header]"); + + // ---- Mobile header menu ---- + var toggle = document.querySelector("[data-header-toggle]"); + if (header && toggle) { + toggle.addEventListener("click", function () { + var open = !header.hasAttribute("data-open"); + header.toggleAttribute("data-open", open); + toggle.setAttribute("aria-expanded", String(open)); + }); + } + + // ---- Dropdowns: close on outside click / Escape, one open at a time ---- + var drops = Array.prototype.slice.call(document.querySelectorAll(".dx-drop")); + function closeDrops(except) { + drops.forEach(function (d) { if (d !== except) d.removeAttribute("open"); }); + } + drops.forEach(function (d) { + d.addEventListener("toggle", function () { if (d.open) closeDrops(d); }); + }); + document.addEventListener("pointerdown", function (e) { + drops.forEach(function (d) { if (d.open && !d.contains(e.target)) d.removeAttribute("open"); }); + }); + document.addEventListener("keydown", function (e) { + if (e.key === "Escape") closeDrops(null); + }); + + // ---- Sidebar: collapsed by default on narrow screens ---- + var side = document.querySelector("[data-side]"); + if (side) { + var narrow = window.matchMedia("(max-width: 1080px)"); + var syncSide = function () { side.open = !narrow.matches; }; + syncSide(); + if (narrow.addEventListener) narrow.addEventListener("change", syncSide); + } + + // ---- Signed-in state (same-origin session API of www.thethingsnetwork.org; absent elsewhere) ---- + var auth = document.querySelector("[data-auth]"); + if (auth && /(^|\.)thethingsnetwork\.org$/.test(location.hostname) && window.fetch) { + fetch("/api/session", { credentials: "same-origin" }) + .then(function (r) { return r.ok ? r.json() : null; }) + .then(function (d) { + var u = d && d.user && d.user.username; + if (!u) return; + var a = document.createElement("a"); + a.className = "dx-header__user"; + a.href = "/u/" + encodeURIComponent(u); + var img = document.createElement("img"); + img.src = "https://id.thethingsnetwork.org/pictures/" + encodeURIComponent(u) + "/thumbnail"; + img.alt = ""; + img.width = 28; + img.height = 28; + a.appendChild(img); + a.appendChild(document.createTextNode(u)); + auth.replaceChildren(a); + }) + .catch(function () {}); + } + + // ---- "On this page": highlight the section being read ---- + var tocLinks = Array.prototype.slice.call(document.querySelectorAll("[data-toc] a")); + if (tocLinks.length && "IntersectionObserver" in window) { + var targets = tocLinks + .map(function (a) { return document.getElementById(decodeURIComponent(a.hash.slice(1))); }) + .filter(Boolean); + var current = null; + var setCurrent = function (id) { + if (id === current) return; + current = id; + tocLinks.forEach(function (a) { + if (decodeURIComponent(a.hash.slice(1)) === id) a.setAttribute("aria-current", "true"); + else a.removeAttribute("aria-current"); + }); + }; + var update = function () { + var line = 120; + var active = targets[0]; + for (var i = 0; i < targets.length; i++) { + if (targets[i].getBoundingClientRect().top - line <= 0) active = targets[i]; + else break; + } + if (active) setCurrent(active.id); + }; + var ticking = false; + window.addEventListener("scroll", function () { + if (ticking) return; + ticking = true; + requestAnimationFrame(function () { ticking = false; update(); }); + }, { passive: true }); + update(); + } + + // ---- Search (client-side over the Hugo-generated index.json) ---- + var box = document.querySelector("[data-search]"); + var input = box && box.querySelector("[data-search-input]"); + var results = box && box.querySelector("[data-search-results]"); + var indexUrl = script && script.getAttribute("data-search-index"); + if (!box || !input || !results || !indexUrl || !window.fetch) return; + + var index = null; + var loading = null; + var selected = -1; + var shown = []; + + function load() { + if (!loading) { + loading = fetch(indexUrl) + .then(function (r) { if (!r.ok) throw new Error(r.status); return r.json(); }) + .then(function (d) { index = d; }) + .catch(function () { index = []; loading = null; }); + } + return loading; + } + + function norm(s) { return (s || "").toLowerCase().normalize("NFD").replace(/[̀-ͯ]/g, ""); } + function esc(s) { return String(s).replace(/[&<>"']/g, function (c) { return { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c]; }); } + function mark(text, terms) { + var out = esc(text); + terms.forEach(function (t) { + if (t.length < 2) return; + out = out.replace(new RegExp("(" + t.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + ")", "ig"), "$1"); + }); + return out; + } + + function search(q) { + var terms = norm(q).split(/\s+/).filter(Boolean); + if (!terms.length) return []; + var scored = []; + for (var i = 0; i < index.length; i++) { + var p = index[i]; + var t = norm(p.t), d = norm(p.d), s = norm(p.s); + var score = 0, ok = true; + for (var j = 0; j < terms.length; j++) { + var term = terms[j]; + if (t.indexOf(term) === 0) score += 12; + else if (t.indexOf(term) !== -1) score += 8; + else if (s.indexOf(term) !== -1) score += 3; + else if (d.indexOf(term) !== -1) score += 2; + else { ok = false; break; } + } + if (ok) scored.push({ p: p, score: score }); + } + scored.sort(function (a, b) { return b.score - a.score || a.p.t.length - b.p.t.length; }); + return scored.slice(0, 8).map(function (x) { return x.p; }); + } + + function render() { + var q = input.value.trim(); + if (!q) { close(); return; } + shown = index ? search(q) : []; + selected = shown.length ? 0 : -1; + var terms = norm(q).split(/\s+/).filter(Boolean); + if (!index) { + results.innerHTML = '
Loading…
'; + } else if (!shown.length) { + results.innerHTML = '
No pages match “' + esc(q) + '”.
'; + } else { + results.innerHTML = shown.map(function (p, i) { + return '" + + '' + mark(p.t, terms) + "" + + '' + esc(p.s) + (p.d ? " · " + esc(p.d) : "") + ""; + }).join(""); + } + results.hidden = false; + input.setAttribute("aria-expanded", "true"); + input.setAttribute("aria-activedescendant", selected >= 0 ? "dx-sr-" + selected : ""); + } + + function close() { + results.hidden = true; + input.setAttribute("aria-expanded", "false"); + input.removeAttribute("aria-activedescendant"); + } + + function move(delta) { + if (!shown.length) return; + selected = (selected + delta + shown.length) % shown.length; + var items = results.querySelectorAll(".dx-search__item"); + for (var i = 0; i < items.length; i++) items[i].toggleAttribute("aria-selected", i === selected); + if (items[selected]) items[selected].scrollIntoView({ block: "nearest" }); + input.setAttribute("aria-activedescendant", "dx-sr-" + selected); + } + + input.addEventListener("focus", load); + input.addEventListener("input", function () { load().then(render); render(); }); + input.addEventListener("keydown", function (e) { + if (e.key === "ArrowDown") { e.preventDefault(); move(1); } + else if (e.key === "ArrowUp") { e.preventDefault(); move(-1); } + else if (e.key === "Enter" && shown[selected]) { e.preventDefault(); location.href = shown[selected].u; } + else if (e.key === "Escape") { input.value = ""; close(); input.blur(); } + }); + document.addEventListener("pointerdown", function (e) { if (!box.contains(e.target)) close(); }); + + // "/" focuses search (unless already typing somewhere). + document.addEventListener("keydown", function (e) { + if (e.key !== "/" || e.metaKey || e.ctrlKey || e.altKey) return; + var el = document.activeElement; + if (el && (el.isContentEditable || /^(INPUT|TEXTAREA|SELECT)$/.test(el.tagName))) return; + e.preventDefault(); + if (header && getComputedStyle(toggle).display !== "none" && !header.hasAttribute("data-open")) toggle.click(); + input.focus(); + }); +})(); diff --git a/doc/assets/js/theme.js b/doc/assets/js/theme.js deleted file mode 100644 index cf46ae7415..0000000000 --- a/doc/assets/js/theme.js +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright © 2019 The Things Network Foundation, The Things Industries B.V. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - - -import "@tti/design/ui/ttui-vendor.js"; -import "@tti/design/ui/main.js"; -import "@tti/design/ui/components/ttui-header/index.js"; -import "@tti/design/ui/components/ttui-footer/index.js"; -import "@tti/design/ui/components/ttn-header/index.js"; -import "@tti/design/ui/components/ttn-footer/index.js"; -import "@tti/design/ui/components/cookie-banner"; diff --git a/doc/assets/js/vendor/basicLightbox.min.js b/doc/assets/js/vendor/basicLightbox.min.js deleted file mode 100644 index e0ed0b2058..0000000000 --- a/doc/assets/js/vendor/basicLightbox.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).basicLightbox=e()}}((function(){return function e(n,t,o){function r(c,u){if(!t[c]){if(!n[c]){var s="function"==typeof require&&require;if(!u&&s)return s(c,!0);if(i)return i(c,!0);var a=new Error("Cannot find module '"+c+"'");throw a.code="MODULE_NOT_FOUND",a}var l=t[c]={exports:{}};n[c][0].call(l.exports,(function(e){return r(n[c][1][e]||e)}),l,l.exports,e,n,t,o)}return t[c].exports}for(var i="function"==typeof require&&require,c=0;c1&&void 0!==arguments[1]&&arguments[1],t=document.createElement("div");return t.innerHTML=e.trim(),!0===n?t.children:t.firstChild},r=function(e,n){var t=e.children;return 1===t.length&&t[0].tagName===n},i=function(e){return null!=(e=e||document.querySelector(".basicLightbox"))&&!0===e.ownerDocument.body.contains(e)};t.visible=i;t.create=function(e,n){var t=function(e,n){var t=o('\n\t\t
\n\t\t\t\n\t\t
\n\t')),i=t.querySelector(".basicLightbox__placeholder");e.forEach((function(e){return i.appendChild(e)}));var c=r(i,"IMG"),u=r(i,"VIDEO"),s=r(i,"IFRAME");return!0===c&&t.classList.add("basicLightbox--img"),!0===u&&t.classList.add("basicLightbox--video"),!0===s&&t.classList.add("basicLightbox--iframe"),t}(e=function(e){var n="string"==typeof e,t=e instanceof HTMLElement==!0;if(!1===n&&!1===t)throw new Error("Content must be a DOM element/node or string");return!0===n?Array.from(o(e,!0)):"TEMPLATE"===e.tagName?[e.content.cloneNode(!0)]:Array.from(e.children)}(e),n=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(null==(e=Object.assign({},e)).closable&&(e.closable=!0),null==e.className&&(e.className=""),null==e.onShow&&(e.onShow=function(){}),null==e.onClose&&(e.onClose=function(){}),"boolean"!=typeof e.closable)throw new Error("Property `closable` must be a boolean");if("string"!=typeof e.className)throw new Error("Property `className` must be a string");if("function"!=typeof e.onShow)throw new Error("Property `onShow` must be a function");if("function"!=typeof e.onClose)throw new Error("Property `onClose` must be a function");return e}(n)),c=function(e){return!1!==n.onClose(u)&&function(e,n){return e.classList.remove("basicLightbox--visible"),setTimeout((function(){return!1===i(e)||e.parentElement.removeChild(e),n()}),410),!0}(t,(function(){if("function"==typeof e)return e(u)}))};!0===n.closable&&t.addEventListener("click",(function(e){e.target===t&&c()}));var u={element:function(){return t},visible:function(){return i(t)},show:function(e){return!1!==n.onShow(u)&&function(e,n){return document.body.appendChild(e),setTimeout((function(){requestAnimationFrame((function(){return e.classList.add("basicLightbox--visible"),n()}))}),10),!0}(t,(function(){if("function"==typeof e)return e(u)}))},close:c};return u}},{}]},{},[1])(1)})); diff --git a/doc/config/_default/config.toml b/doc/config/_default/config.toml index f28b851298..3e1de8ac50 100644 --- a/doc/config/_default/config.toml +++ b/doc/config/_default/config.toml @@ -13,8 +13,9 @@ enableGitInfo = true languageCode = "en-us" languageName = "English" -pygmentsCodeFences = true -pygmentsUseClasses = true +[outputs] + # JSON = the client-side search index behind the header search box (layouts/index.json). + home = ["HTML", "JSON"] [params] title = "The Things Network" @@ -25,6 +26,8 @@ pygmentsUseClasses = true tts_github_repository = "https://github.com/TheThingsNetwork/lorawan-stack" [markup] + [markup.highlight] + noClasses = false [markup.goldmark] [markup.goldmark.renderer] unsafe = true @@ -72,6 +75,3 @@ pygmentsUseClasses = true [[module.mounts]] source = "static" target = "static" - [[module.mounts]] - source = "node_modules/bulma" - target = "assets/css/vendor/bulma" diff --git a/doc/content/lorawan/_index.md b/doc/content/lorawan/_index.md index b61598dca2..33b9236831 100644 --- a/doc/content/lorawan/_index.md +++ b/doc/content/lorawan/_index.md @@ -7,40 +7,63 @@ description: "Learn about LoRaWAN: the secure messaging protocol used by The Thi sections: - The Things Fundamentals - Additional Information +# The numbered course (sidebar numbers, the chapter grid and chapter-to-chapter prev/next). +chapters: + - what-is-lorawan + - architecture + - regional-parameters + - message-types + - security + - classes + - end-device-activation + - spreading-factors + - adaptive-data-rate + - limitations +# The "Additional Information" index, grouped by topic. Pages not listed here appear under "More". +topics: + - title: Radio & spectrum + icon: wave-sine + pages: [frequencies-by-country, frequency-plans, duty-cycle, modulation-data-rate, fec-and-code-rate, lora-phy-format, regional-limitations-of-rf-use] + - title: Antennas & signal + icon: antenna + pages: [antenna-connectors, antenna-types, db-dbm-dbi-dbd, eirp-and-erp, rssi-and-snr] + - title: Hardware & addressing + icon: cpu + pages: [concentrators, transceivers, addressing, prefix-assignments] + - title: Certification & research + icon: certificate + pages: [preparing-certification, the-things-certified-security, academic, glossary] --- -{{< figure width="150px" class="float plain" src="icon.png" >}} +{{< lead >}} +**Welcome to The Things Fundamentals on LoRaWAN!** This series of chapters was created to prepare you for [**The Things Fundamentals certification**](https://www.thethingsnetwork.org/achievements/certificates/). You'll learn all about LoRa® and LoRaWAN and suitable use cases, and afterwards you'll be ready to start developing your own LoRaWAN applications. +{{< /lead >}} -**Welcome to The Things Fundamentals on LoRaWAN!** - -This series of chapters was created to prepare you for [**The Things Fundamentals certification**](https://www.thethingsnetwork.org/achievements/certificates/). You'll learn all about LoRa® and LoRaWAN and suitable use cases, and afterwards you'll be ready to start developing your own LoRaWAN applications. +{{< actions >}} +{{< button ref="what-is-lorawan" icon="arrow-right" >}}Start chapter 1{{< /button >}} +{{< button href="#everything-you-need-to-know-about-lorawan-in-60-minutes" style="outline" icon-before="player-play" >}}Watch the 60-minute video{{< /button >}} +{{< /actions >}} {{< info >}} The LoRaWAN Fundamentals course can also be followed on Udemy. [Sign up for the online course today!](https://www.udemy.com/course/lorawan-fundamentals/) {{}} -### Everything you need to know about LoRaWAN in 60 minutes +## Everything you need to know about LoRaWAN in 60 minutes The chapters are designed to be paired with the following video by Johan Stokking, which covers the Fundamentals of LoRaWAN in 60 minutes: -{{< youtube "ZsVhYiX4_6o" >}} +{{< youtube id="ZsVhYiX4_6o" title="LoRaWAN Fundamentals in 60 minutes" >}} -### Chapters +## Chapters -- [What are LoRa and LoRaWAN]({{< relref "what-is-lorawan" >}}) -- [LoRaWAN Architecture]({{< relref "architecture" >}}) -- [Regional Parameters]({{< relref "regional-parameters" >}}) -- [Message Types]({{< relref "message-types" >}}) -- [Security]({{< relref "security" >}}) -- [Classes]({{< relref "classes" >}}) -- [End Device Activation]({{< relref "end-device-activation" >}}) -- [Spreading Factors]({{< relref "spreading-factors" >}}) -- [Adaptive Data Rate]({{< relref "adaptive-data-rate" >}}) -- [Limitations]({{< relref "limitations" >}}) +{{< chapters >}} +{{< feature title="The Things Certifications" image="certifications.png" alt="The Things Certification" href="https://www.thethingsnetwork.org/achievements/" button="Visit The Things Certification" >}} +The Things Network developed a certification program, allowing you to officially certify your skills and knowledge around LoRaWAN. Once completed the The Things Fundamentals course, you are ready to take up The Things Fundamentals Certification. +{{< /feature >}} -### The Things Certifications -The Things Network developed a certification program, allowing you to officially certify your skills and knowledge around LoRaWAN. Once completed the The Things Fundamentals course, you are ready to take up The Things Fundamentals Certification. To learn more about our certification program, visit [The Things Certification](https://www.thethingsnetwork.org/achievements/). +## Additional Information -The Things Certification +Reference articles grouped by topic. +{{< topics section="Additional Information" >}} diff --git a/doc/data/icons.json b/doc/data/icons.json new file mode 100644 index 0000000000..05d45b4702 --- /dev/null +++ b/doc/data/icons.json @@ -0,0 +1,31 @@ +{ + "search": "", + "menu-2": "", + "x": "", + "chevron-down": "", + "chevron-right": "", + "arrow-right": "", + "arrow-left": "", + "player-play": "", + "info-circle": "", + "alert-triangle": "", + "notes": "", + "layout-grid": "", + "edit": "", + "messages": "", + "list": "", + "link": "", + "wave-sine": "", + "antenna": "", + "cpu": "", + "certificate": "", + "book": "", + "school": "", + "box": "", + "network": "", + "file-text": "", + "brand-github": "", + "brand-linkedin": "", + "brand-youtube": "", + "brand-x": "" +} diff --git a/doc/data/site_nav.json b/doc/data/site_nav.json new file mode 100644 index 0000000000..a291c310a0 --- /dev/null +++ b/doc/data/site_nav.json @@ -0,0 +1,169 @@ +{ + "origin": "https://www.thethingsnetwork.org", + "header": [ + { + "label": "Learn", + "href": "/docs/", + "external": false, + "key": "learn", + "children": [] + }, + { + "label": "Hardware", + "href": "/device-repository/", + "external": false, + "key": "hardware", + "children": [ + { + "label": "Device Repository", + "href": "/device-repository/", + "external": false + }, + { + "label": "The Things Shop", + "href": "https://www.thethingsshop.com/", + "external": true + } + ] + }, + { + "label": "Forum", + "href": "/forum", + "external": false, + "key": "forum", + "children": [] + }, + { + "label": "Community", + "href": "/community", + "external": false, + "key": "community", + "children": [] + }, + { + "label": "Conference", + "href": "https://www.thethingsconference.com/", + "external": true, + "key": "conference", + "children": [] + }, + { + "label": "Enterprise", + "href": "https://www.thethingsindustries.com/", + "external": true, + "key": "enterprise", + "children": [] + } + ], + "auth": { + "login": "/get-started?login", + "signup": "/get-started", + "console": "https://console.cloud.thethings.network/" + }, + "footer": [ + { + "title": "Learn", + "links": [ + { + "label": "Get started", + "href": "/docs/network/", + "external": false + }, + { + "label": "LoRaWAN® fundamentals", + "href": "/docs/lorawan/", + "external": false + }, + { + "label": "Certification", + "href": "/achievements", + "external": false + }, + { + "label": "The Things Academy", + "href": "/achievements/a/the-things-academy/", + "external": false + } + ] + }, + { + "title": "Community", + "links": [ + { + "label": "Communities", + "href": "/community", + "external": false + }, + { + "label": "Forum", + "href": "/forum", + "external": false + }, + { + "label": "Start a community", + "href": "/start-a-community", + "external": false + }, + { + "label": "Conference", + "href": "https://www.thethingsconference.com/", + "external": true + } + ] + }, + { + "title": "Resources", + "links": [ + { + "label": "Documentation", + "href": "/docs/", + "external": false + }, + { + "label": "Device Repository", + "href": "/device-repository/", + "external": false + }, + { + "label": "Help & user guide", + "href": "/help", + "external": false + }, + { + "label": "The Things Stack", + "href": "https://www.thethingsindustries.com/stack/", + "external": true + }, + { + "label": "Open source", + "href": "https://github.com/TheThingsNetwork/lorawan-stack", + "external": true + } + ] + } + ], + "social": [ + { + "label": "GitHub", + "href": "https://github.com/TheThingsNetwork", + "icon": "brand-github" + }, + { + "label": "LinkedIn", + "href": "https://www.linkedin.com/company/the-things-network/", + "icon": "brand-linkedin" + }, + { + "label": "YouTube", + "href": "https://www.youtube.com/c/TheThingsNetworkCommunity", + "icon": "brand-youtube" + }, + { + "label": "X", + "href": "https://twitter.com/thethingsntwrk", + "icon": "brand-x" + } + ], + "tagline": "A global collaborative Internet of Things ecosystem, initiated by The Things Industries.", + "lorawanNotice": "LoRaWAN® is a mark used under license from the LoRa Alliance®." +} diff --git a/doc/layouts/404.html b/doc/layouts/404.html index f2ba8d5610..f0521d573b 100644 --- a/doc/layouts/404.html +++ b/doc/layouts/404.html @@ -1,11 +1,15 @@ {{ define "main" }} -
-
-
-

{{ .Title }}

-

Go Home

-
{{ .Content }}
+
+
+
+
404
+

{{ .Title | default "Page not found" }}

+

This page does not exist (anymore). Try the search above, or start from the docs home.

+ + {{ with .Content }}
{{ . }}
{{ end }}
-
-
+ + {{ end }} diff --git a/doc/layouts/_default/_markup/render-heading.html b/doc/layouts/_default/_markup/render-heading.html new file mode 100644 index 0000000000..e970953f51 --- /dev/null +++ b/doc/layouts/_default/_markup/render-heading.html @@ -0,0 +1 @@ +{{ .Text | safeHTML }}{{ if ge .Level 2 }} #{{ end }} diff --git a/doc/layouts/_default/baseof.html b/doc/layouts/_default/baseof.html index 77e4aba61e..dd8d06c4eb 100644 --- a/doc/layouts/_default/baseof.html +++ b/doc/layouts/_default/baseof.html @@ -1,50 +1,20 @@ - - + {{ partial "head/head.html" . }} - - - +Skip to content - +{{ partial "site/header.html" . }} {{- block "main" . }}{{- end }} - - - - - -{{- $script := resources.Get "js/vendor/basicLightbox.min.js" }} - -{{- $script := resources.Get "js/theme.js" | js.Build | resources.Minify | resources.Fingerprint }} - - - - - +{{- $script := resources.Get "js/docs.js" | resources.Minify | resources.Fingerprint }} + diff --git a/doc/layouts/_default/list.html b/doc/layouts/_default/list.html index d388d046ab..b159498cee 100644 --- a/doc/layouts/_default/list.html +++ b/doc/layouts/_default/list.html @@ -1,26 +1,3 @@ {{ define "main" }} - -{{- partial "header/breadcrumb-container.html" . -}} - -
-
- - -
-
+{{ partial "docs/page.html" . }} {{ end }} diff --git a/doc/layouts/_default/single.html b/doc/layouts/_default/single.html index 7411d78901..b159498cee 100644 --- a/doc/layouts/_default/single.html +++ b/doc/layouts/_default/single.html @@ -1,27 +1,3 @@ {{ define "main" }} - -{{- partial "header/breadcrumb-container.html" . -}} - -
-
- - -
-
- +{{ partial "docs/page.html" . }} {{ end }} diff --git a/doc/layouts/index.html b/doc/layouts/index.html index a0f203b98c..738b1fd81a 100644 --- a/doc/layouts/index.html +++ b/doc/layouts/index.html @@ -1,115 +1,59 @@ {{ define "main" }} -
-
-
-

- Learn -

-

- Learn all about LoRaWAN and The Things Network! -

+
+
+
+

{{ .Title }}

+

Learn all about LoRaWAN and The Things Network!

-
-
+ -
-
-
- {{ with .Site.GetPage "/lorawan" }} -
-
-
- - {{ with .Params.image }} -
-
- -
-
- {{ end }} -
-
- {{ .Description | plainify }} -
-
- Read -
-
-
-
- {{ end }} -
-
-
- -
-
- -
-
-
-
- Show off your LoRaWAN knowledge! Complete an official The Things Certification and get a badge. -
-
- Read -
-
-
-
-
-
-
- -
-
- -
-
-
-
- Get started with The Things Stack, an out-of-the-box LoRaWAN Network Server for monitoring of network components. -
-
- Read -
-
-
-
-
-
-
- -
-
-
- {{- range .Site.Menus.community }} -
-
-
-

{{ .Name }} -

-
- {{ with .Params.image }} -
-
- -
-
- {{ end }} - {{ .Pre | plainify }} -
- -
-
-
+
+
-
-
+
  • + + + The Things Certification + Show off your LoRaWAN knowledge! Complete an official The Things Certification and get a badge. + Get certified {{ partial "site/icon.html" (dict "n" "arrow-right") }} + +
  • +
  • + + + The Things Stack + Get started with The Things Stack, an out-of-the-box LoRaWAN Network Server for monitoring of network components. + Read the docs {{ partial "site/icon.html" (dict "n" "arrow-right") }} + +
  • + + -{{ .Content }} +
    +

    Community

    + +
    + {{ .Content }} + {{ end }} diff --git a/doc/layouts/index.json b/doc/layouts/index.json new file mode 100644 index 0000000000..64e60d40b9 --- /dev/null +++ b/doc/layouts/index.json @@ -0,0 +1,8 @@ +{{- /* Client-side search index for the header search box (assets/js/docs.js). */ -}} +{{- $out := slice -}} +{{- range site.Pages -}} + {{- if and (not .IsHome) .Title (ne .Kind "404") -}} + {{- $out = $out | append (dict "t" .Title "u" .RelPermalink "s" .FirstSection.Title "d" (.Description | default (.Summary | plainify | htmlUnescape | truncate 140))) -}} + {{- end -}} +{{- end -}} +{{- $out | jsonify -}} diff --git a/doc/layouts/partials/docs/breadcrumb.html b/doc/layouts/partials/docs/breadcrumb.html new file mode 100644 index 0000000000..720ee33dae --- /dev/null +++ b/doc/layouts/partials/docs/breadcrumb.html @@ -0,0 +1,17 @@ +{{- /* Learn › › … › . Hugo 0.88 has no .Ancestors, so walk .Parent. */ -}} +{{- $chain := slice -}} +{{- $p := .Parent -}} +{{- range seq 10 -}} + {{- if and $p (not $p.IsHome) -}} + {{- $chain = $chain | append $p -}} + {{- $p = $p.Parent -}} + {{- end -}} +{{- end -}} + diff --git a/doc/layouts/partials/docs/callout.html b/doc/layouts/partials/docs/callout.html new file mode 100644 index 0000000000..b9c0792bc9 --- /dev/null +++ b/doc/layouts/partials/docs/callout.html @@ -0,0 +1,8 @@ +{{- /* Shared body of the info / note / warning shortcodes. */ -}} +
    + {{ partial "site/icon.html" (dict "n" .icon "class" "dx-callout__icon") }} +
    + {{ .label }}: + {{ .body | markdownify }} +
    +
    diff --git a/doc/layouts/partials/docs/chapters.html b/doc/layouts/partials/docs/chapters.html new file mode 100644 index 0000000000..660882e35a --- /dev/null +++ b/doc/layouts/partials/docs/chapters.html @@ -0,0 +1,12 @@ +{{- /* Returns the numbered course of a first-level section, in order: the pages named by the + section's `chapters` front matter (slugs relative to the section). Empty when not set. */ -}} +{{- $section := . -}} +{{- $out := slice -}} +{{- range $section.Params.chapters -}} + {{- with site.GetPage (printf "/%s" (path.Join $section.File.Dir .)) -}} + {{- $out = $out | append . -}} + {{- else -}} + {{- errorf "%s: chapter %q not found" $section.File.Path . -}} + {{- end -}} +{{- end -}} +{{- return $out -}} diff --git a/doc/layouts/partials/docs/page.html b/doc/layouts/partials/docs/page.html new file mode 100644 index 0000000000..006a891a81 --- /dev/null +++ b/doc/layouts/partials/docs/page.html @@ -0,0 +1,18 @@ +
    + {{ partial "docs/sidebar.html" . }} +
    +
    +
    + {{ partial "docs/breadcrumb.html" . }} +

    {{ .Title }}

    +
    + {{ partial "docs/v2-warning.html" . }} +
    + {{ .Content }} +
    + {{ if .IsSection }}{{ partial "docs/subpages.html" . }}{{ end }} + {{ partial "docs/prev-next.html" . }} +
    + {{ partial "docs/rail.html" . }} +
    +
    diff --git a/doc/layouts/partials/docs/prev-next.html b/doc/layouts/partials/docs/prev-next.html new file mode 100644 index 0000000000..88ce9dd555 --- /dev/null +++ b/doc/layouts/partials/docs/prev-next.html @@ -0,0 +1,36 @@ +{{- /* Previous/next within the page's group: a course chapter steps through the course in chapter + order; any other page through its sidebar group (`section` front matter) by weight. */ -}} +{{- $cur := . -}} +{{- $first := .FirstSection -}} +{{- $chapters := partial "docs/chapters.html" $first -}} +{{- $list := slice -}} +{{- $isChapter := false -}} +{{- range $chapters }}{{ if eq .RelPermalink $cur.RelPermalink }}{{ $isChapter = true }}{{ end }}{{ end -}} +{{- if $isChapter -}} + {{- $list = $chapters -}} +{{- else if and .Params.section (eq .Parent $first) -}} + {{- $list = where $first.Pages.ByWeight "Params.section" .Params.section -}} +{{- end -}} +{{- $prev := false -}}{{- $next := false -}} +{{- range $i, $p := $list -}} + {{- if eq $p.RelPermalink $cur.RelPermalink -}} + {{- if gt $i 0 }}{{ $prev = index $list (sub $i 1) }}{{ end -}} + {{- if lt (add $i 1) (len $list) }}{{ $next = index $list (add $i 1) }}{{ end -}} + {{- end -}} +{{- end -}} +{{- if or $prev $next }} + +{{- end }} diff --git a/doc/layouts/partials/docs/rail.html b/doc/layouts/partials/docs/rail.html new file mode 100644 index 0000000000..6a07e19f16 --- /dev/null +++ b/doc/layouts/partials/docs/rail.html @@ -0,0 +1,26 @@ +{{- /* "On this page" + page tools. The TOC is read from the rendered HTML (h2/h3 with an id) rather + than .TableOfContents, so headings emitted by shortcodes are included too. */ -}} +{{- $nav := site.Data.site_nav -}} +{{- $heads := findRE `(?s)]*\sid="[^"]+"[^>]*>.*?` .Content -}} +{{- $min := 3 -}} +{{- range $heads }}{{ if hasPrefix . " + {{- if ge (len $heads) 2 }} +
    On this page
    + +
    + {{- end }} + {{- with .File }} + {{ partial "site/icon.html" (dict "n" "edit") }}Edit this page + {{- end }} + {{- range where $nav.header "key" "forum" }} + {{ partial "site/icon.html" (dict "n" "messages") }}Ask on the forum + {{- end }} + diff --git a/doc/layouts/partials/docs/sidebar.html b/doc/layouts/partials/docs/sidebar.html new file mode 100644 index 0000000000..70e149a39d --- /dev/null +++ b/doc/layouts/partials/docs/sidebar.html @@ -0,0 +1,62 @@ +{{- $current := . -}} +{{- $first := .FirstSection -}} +{{- $chapters := partial "docs/chapters.html" $first -}} +{{- $chapterLinks := slice -}} +{{- range $chapters }}{{ $chapterLinks = $chapterLinks | append .RelPermalink }}{{ end -}} + + + +{{- define "dx-side-item" }} +{{ .page.LinkTitle }} +{{- if and .page.IsSection (.page.IsAncestor .current) }}{{ template "dx-side-tree" (dict "section" .page "current" .current) }}{{ end }} +{{- end }} + +{{- define "dx-side-tree" }} +{{- $current := .current }} +{{- with .section.Pages.ByWeight }} +
    + {{- range . }} + {{ template "dx-side-item" (dict "page" . "current" $current) }} + {{- end }} +
    +{{- end }} +{{- end }} diff --git a/doc/layouts/partials/docs/subpages.html b/doc/layouts/partials/docs/subpages.html new file mode 100644 index 0000000000..ecae6fe9b0 --- /dev/null +++ b/doc/layouts/partials/docs/subpages.html @@ -0,0 +1,16 @@ +{{- /* Cards for a section's pages. Skipped when the page builds its own index (chapters/topics). */ -}} +{{- if and .Pages (not (.HasShortcode "chapters")) (not (.HasShortcode "topics")) }} + +{{- end }} diff --git a/doc/layouts/partials/docs/v2-warning.html b/doc/layouts/partials/docs/v2-warning.html new file mode 100644 index 0000000000..7d2b47b13e --- /dev/null +++ b/doc/layouts/partials/docs/v2-warning.html @@ -0,0 +1,10 @@ +{{- if in (slice "devices" "applications" "gateways" "network") .Section }} +
    + {{ partial "site/icon.html" (dict "n" "alert-triangle" "class" "dx-callout__icon") }} +
    +

    Outdated: this section documents The Things Network V2, which is no longer maintained. + See the documentation for The Things Stack V3 + {{- with site.GetPage "/v2-docs" }}, or browse the V2 docs index{{ end }}.

    +
    +
    +{{- end }} diff --git a/doc/layouts/partials/head/head.html b/doc/layouts/partials/head/head.html index 98759d11a9..2902640668 100644 --- a/doc/layouts/partials/head/head.html +++ b/doc/layouts/partials/head/head.html @@ -1,59 +1,35 @@ - - - - + {{- /* Cookie banner + Google Tag Manager, served by the www platform (platform/app/consent.js): GTM + loads only after the visitor accepts. Root-relative on purpose — it exists only behind the www + front door, so the raw GitHub Pages origin and local Hugo previews stay untracked. */}} + {{ hugo.Generator }} {{ with .Title }}{{ . }} | {{ end }}{{ .Site.Title }} + {{- /* Most pages have no `description`; fall back to the page summary so every page gets one. */}} + {{- $desc := .Description | default (.Summary | plainify | htmlUnescape | truncate 160) | default .Site.Params.description }} + + {{- if hasPrefix .Permalink "http" }} - {{ end }} - - - - - + {{- end }} + + + - - + - - - - - - - - - - - - - - - - - - {{- $options := (dict "includePaths" (slice "node_modules")) -}} - {{- $style := resources.Get "css/theme.scss" | resources.ToCSS $options | resources.Minify | resources.Fingerprint }} - - - {{- if .Site.Params.search.enabled -}} - - {{- end }} + + - + {{- $style := resources.Get "css/docs.css" | resources.Minify | resources.Fingerprint }} + {{ template "_internal/opengraph.html" . }} diff --git a/doc/layouts/partials/header-hash.html b/doc/layouts/partials/header-hash.html deleted file mode 100644 index ae3c89d3d6..0000000000 --- a/doc/layouts/partials/header-hash.html +++ /dev/null @@ -1,2 +0,0 @@ - -{{ . | replaceRE "()" "${1} # ${3}" | safeHTML }} diff --git a/doc/layouts/partials/header/breadcrumb-container.html b/doc/layouts/partials/header/breadcrumb-container.html deleted file mode 100644 index 2e07e29f46..0000000000 --- a/doc/layouts/partials/header/breadcrumb-container.html +++ /dev/null @@ -1,43 +0,0 @@ -
    -
    - - {{ if (in $v2 .Section) }} -
    -
    Warning:
    - This section contains documentation written for The Things Network V2, which is no longer maintained. See documentation for The Things Stack V3. -
    - {{ end }} -
    -
    diff --git a/doc/layouts/partials/pages-cards.html b/doc/layouts/partials/pages-cards.html deleted file mode 100644 index 3fa0162e7f..0000000000 --- a/doc/layouts/partials/pages-cards.html +++ /dev/null @@ -1,43 +0,0 @@ -{{ if .Pages }} - - - -{{ $currentPage := . }} -{{ $currentSection := or .CurrentSection.Parent .CurrentSection }} -{{- $sidebarMenuPages := slice $currentSection }} -{{- $sidebarMenuPageNumber := 0 }} -{{- if eq $currentPage $currentSection }}{{ $sidebarMenuPageNumber = (len $sidebarMenuPages) }}{{ end }} -{{- range $currentSection.Pages.ByWeight }} - {{- $sidebarMenuPages = $sidebarMenuPages | append . }} - {{- if eq $currentPage . }}{{ $sidebarMenuPageNumber = (len $sidebarMenuPages) }}{{ end }} - {{- if .Pages }} - {{- range .Pages.ByWeight }} - {{- $sidebarMenuPages = $sidebarMenuPages | append . }} - {{- if eq $currentPage . }}{{ $sidebarMenuPageNumber = (len $sidebarMenuPages) }}{{ end }} - {{- end }} - {{- end }} -{{- end }} - -{{ .Scratch.Set "previous" (index $sidebarMenuPages (add $sidebarMenuPageNumber -2 )) }} -{{ .Scratch.Set "next" (index $sidebarMenuPages $sidebarMenuPageNumber) }} - -{{ with .Pages }} -
    - {{- range .ByWeight }} -
    -
    -
    -

    {{ .Title }} -

    -
    - Read -
    -
    -
    -
    - {{- end }} -
    - -{{ end }} - -{{ end }} diff --git a/doc/layouts/partials/prev-next-in-section.html b/doc/layouts/partials/prev-next-in-section.html deleted file mode 100644 index 546f28f964..0000000000 --- a/doc/layouts/partials/prev-next-in-section.html +++ /dev/null @@ -1,19 +0,0 @@ -{{ $currentPage := . }} -{{ $firstSection := .FirstSection }} - -{{ $section := where $firstSection.Pages.ByWeight "Params.section" .Params.Section }} -{{ range $index, $page := $section }} - {{ if eq $currentPage $page }} - {{ .Scratch.Set "previous" ( index $section (sub $index 1) ) }} - {{ .Scratch.Set "next" ( index $section (add $index 1) ) }} - {{ end }} -{{ end }} - -
    -{{- with .Scratch.Get "previous" }} -← {{ .LinkTitle }} -{{- end }} -{{- with .Scratch.Get "next" }} -{{ .LinkTitle }} → -{{- end }} -
    diff --git a/doc/layouts/partials/sidebar/side-navigation.html b/doc/layouts/partials/sidebar/side-navigation.html deleted file mode 100644 index 662d52426f..0000000000 --- a/doc/layouts/partials/sidebar/side-navigation.html +++ /dev/null @@ -1,55 +0,0 @@ -{{ $currentPage := . }} -{{ $firstSection := .FirstSection }} - - diff --git a/doc/layouts/partials/site/footer.html b/doc/layouts/partials/site/footer.html new file mode 100644 index 0000000000..3aac35ebf2 --- /dev/null +++ b/doc/layouts/partials/site/footer.html @@ -0,0 +1,30 @@ +{{- $nav := site.Data.site_nav -}} + diff --git a/doc/layouts/partials/site/header.html b/doc/layouts/partials/site/header.html new file mode 100644 index 0000000000..d8e60a47b1 --- /dev/null +++ b/doc/layouts/partials/site/header.html @@ -0,0 +1,51 @@ +{{- /* Global header. Links come from data/site_nav.json, exported from the platform's ONE nav source + (platform/app/lib/site-nav.ts) — never hardcode a nav link here. */ -}} +{{- $nav := site.Data.site_nav -}} +
    +
    + + + + +
    + + +
    + +
    + + Sign up +
    +
    +
    +
    +
    diff --git a/doc/layouts/partials/site/href.html b/doc/layouts/partials/site/href.html new file mode 100644 index 0000000000..aeea3b7350 --- /dev/null +++ b/doc/layouts/partials/site/href.html @@ -0,0 +1,8 @@ +{{- /* Resolves a nav href from data/site_nav.json: root-relative ("/forum") → params.ttnOrigin (default + the www origin) + href, so links work from the GitHub Pages origin and in a local preview. + Usage: {{ partial "site/href.html" .href }} */ -}} +{{- $href := . -}} +{{- if hasPrefix . "/" -}} + {{- $href = printf "%s%s" (strings.TrimSuffix "/" (site.Params.ttnOrigin | default site.Data.site_nav.origin)) . -}} +{{- end -}} +{{- return $href -}} diff --git a/doc/layouts/partials/site/icon.html b/doc/layouts/partials/site/icon.html new file mode 100644 index 0000000000..43f948e02d --- /dev/null +++ b/doc/layouts/partials/site/icon.html @@ -0,0 +1,7 @@ +{{- /* Inline Tabler icon from data/icons.json (generated by the platform's export-docs-chrome.mjs). + Usage: {{ partial "site/icon.html" (dict "n" "search" "class" "optional") }} */ -}} +{{- with index site.Data.icons .n -}} + +{{- else -}} +{{- errorf "icon %q is missing from data/icons.json — add it to DOCS_ICONS in the platform's scripts/export-docs-chrome.mjs and re-export" .n -}} +{{- end -}} diff --git a/doc/layouts/shortcodes/actions.html b/doc/layouts/shortcodes/actions.html new file mode 100644 index 0000000000..12c5a12d64 --- /dev/null +++ b/doc/layouts/shortcodes/actions.html @@ -0,0 +1,2 @@ +{{- /* A row of buttons: {{< actions >}}{{< button … >}}{{< button … >}}{{< /actions >}} */ -}} +
    {{ .Inner }}
    diff --git a/doc/layouts/shortcodes/button.html b/doc/layouts/shortcodes/button.html new file mode 100644 index 0000000000..aaf1238e9e --- /dev/null +++ b/doc/layouts/shortcodes/button.html @@ -0,0 +1,11 @@ +{{- /* Pill button. ref= is a page (resolved with relref), href= a URL or #anchor. + style= primary (navy, default) | outline | brand. icon= a Tabler icon after the label; + icon-before= one before it. Usage: {{< button ref="what-is-lorawan" icon="arrow-right" >}}Start{{< /button >}} */ -}} +{{- $href := .Get "href" -}} +{{- with .Get "ref" }}{{ $href = relref $.Page . }}{{ end -}} +{{- if not $href }}{{ errorf "%s: button needs ref= or href=" .Position }}{{ end -}} + + {{- with .Get "icon-before" }}{{ partial "site/icon.html" (dict "n" .) }}{{ end -}} + {{ .Inner | markdownify }} + {{- with .Get "icon" }}{{ partial "site/icon.html" (dict "n" .) }}{{ end -}} + diff --git a/doc/layouts/shortcodes/chapters.html b/doc/layouts/shortcodes/chapters.html new file mode 100644 index 0000000000..43ee94f60e --- /dev/null +++ b/doc/layouts/shortcodes/chapters.html @@ -0,0 +1,14 @@ +{{- /* Numbered grid of the section's course chapters (the `chapters` front matter of the section). */ -}} +{{- $section := .Page.FirstSection -}} +{{- $chapters := partial "docs/chapters.html" $section -}} +
      + {{- range $i, $c := $chapters }} +
    1. + + {{ printf "%02d" (add $i 1) }} + {{ $c.LinkTitle }} + {{ partial "site/icon.html" (dict "n" "arrow-right" "class" "dx-chapter__arrow") }} + +
    2. + {{- end }} +
    diff --git a/doc/layouts/shortcodes/feature.html b/doc/layouts/shortcodes/feature.html new file mode 100644 index 0000000000..e192d94b7c --- /dev/null +++ b/doc/layouts/shortcodes/feature.html @@ -0,0 +1,16 @@ +{{- /* Dark feature panel with text, a button and an image. + Usage: {{< feature title="…" image="pic.png" alt="…" href="https://…" button="Label" >}}markdown{{< /feature >}} + title= renders as an h2 (with an id, so it appears in "On this page"). image= is page-relative. */ -}} +{{- $title := .Get "title" -}} +
    +
    + {{- with $title }}

    {{ . }}

    {{ end }} + {{ .Inner | markdownify }} + {{- with .Get "href" }} + {{ $.Get "button" | default "Learn more" }}{{ partial "site/icon.html" (dict "n" "arrow-right") }} + {{- end }} +
    + {{- with .Get "image" }} +
    {{ $.Get
    + {{- end }} +
    diff --git a/doc/layouts/shortcodes/info.html b/doc/layouts/shortcodes/info.html index 0e87ca12c8..d22d51709b 100644 --- a/doc/layouts/shortcodes/info.html +++ b/doc/layouts/shortcodes/info.html @@ -1,4 +1 @@ -
    -
    Info:
    - {{ markdownify (or (.Get 0) .Inner) }} -
    +{{- partial "docs/callout.html" (dict "kind" "info" "icon" "info-circle" "label" "Info" "body" (or (.Get 0) .Inner)) -}} diff --git a/doc/layouts/shortcodes/lead.html b/doc/layouts/shortcodes/lead.html new file mode 100644 index 0000000000..045b7b465b --- /dev/null +++ b/doc/layouts/shortcodes/lead.html @@ -0,0 +1,2 @@ +{{- /* Larger intro paragraph at the top of a landing page. */ -}} +
    {{ .Inner | markdownify }}
    diff --git a/doc/layouts/shortcodes/note.html b/doc/layouts/shortcodes/note.html index 6893c46cda..7c47ae959c 100644 --- a/doc/layouts/shortcodes/note.html +++ b/doc/layouts/shortcodes/note.html @@ -1,4 +1 @@ -
    -
    Note:
    - {{ markdownify (or (.Get 0) .Inner) }} -
    +{{- partial "docs/callout.html" (dict "kind" "note" "icon" "notes" "label" "Note" "body" (or (.Get 0) .Inner)) -}} diff --git a/doc/layouts/shortcodes/topics.html b/doc/layouts/shortcodes/topics.html new file mode 100644 index 0000000000..8ac1f3e061 --- /dev/null +++ b/doc/layouts/shortcodes/topics.html @@ -0,0 +1,35 @@ +{{- /* Reference index of one sidebar group, organised by topic. + Topics come from the section's `topics` front matter ({title, icon, pages: [slugs]}); any page of + the group that no topic lists is shown under "More" so nothing silently drops off the index. + Usage: {{< topics section="Additional Information" >}} */ -}} +{{- $section := .Page.FirstSection -}} +{{- $group := .Get "section" -}} +{{- $pages := where $section.Pages.ByWeight "Params.section" $group -}} +{{- $listed := slice -}} +
    + {{- range $section.Params.topics }} +
    +
    {{ partial "site/icon.html" (dict "n" (.icon | default "book")) }}{{ .title }}
    + +
    + {{- end }} + {{- $rest := slice }} + {{- range $pages }}{{ if not (in $listed .RelPermalink) }}{{ $rest = $rest | append . }}{{ end }}{{ end }} + {{- with $rest }} +
    +
    {{ partial "site/icon.html" (dict "n" "book") }}{{ if $section.Params.topics }}More{{ else }}{{ $group }}{{ end }}
    + +
    + {{- end }} +
    diff --git a/doc/layouts/shortcodes/warning.html b/doc/layouts/shortcodes/warning.html index dfbb818d9b..eca470033b 100644 --- a/doc/layouts/shortcodes/warning.html +++ b/doc/layouts/shortcodes/warning.html @@ -1,4 +1 @@ -
    -
    Warning:
    - {{ markdownify (or (.Get 0) .Inner) }} -
    +{{- partial "docs/callout.html" (dict "kind" "warning" "icon" "alert-triangle" "label" "Warning" "body" (or (.Get 0) .Inner)) -}} diff --git a/doc/layouts/shortcodes/youtube.html b/doc/layouts/shortcodes/youtube.html new file mode 100644 index 0000000000..f227bb84e7 --- /dev/null +++ b/doc/layouts/shortcodes/youtube.html @@ -0,0 +1,8 @@ +{{- /* Overrides Hugo's built-in youtube shortcode: privacy-enhanced (no-cookie) embed in a 16:9 frame. + Usage: {{< youtube "ID" >}} or {{< youtube id="ID" title="…" >}} */ -}} +{{- $id := .Get "id" | default (.Get 0) -}} +{{- $title := .Get "title" | default "YouTube video" -}} +
    + +
    diff --git a/doc/package.json b/doc/package.json deleted file mode 100644 index 4b1adb6272..0000000000 --- a/doc/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "hugo-theme-the-things-stack", - "version": "3.10.0-dev", - "private": true, - "description": "Hugo Theme for The Things Stack", - "dependencies": { - "@tti/design": "https://ttui.thethingsindustries.com/release/ttui-1.7.4.tar.gz", - "bulma": "^0.9.1" - }, - "devDependencies": {} -} diff --git a/doc/static/fonts/inter/Inter-Bold.woff2 b/doc/static/fonts/inter/Inter-Bold.woff2 new file mode 100644 index 0000000000..622e5f1478 Binary files /dev/null and b/doc/static/fonts/inter/Inter-Bold.woff2 differ diff --git a/doc/static/fonts/inter/Inter-Medium.woff2 b/doc/static/fonts/inter/Inter-Medium.woff2 new file mode 100644 index 0000000000..ffb4206c2e Binary files /dev/null and b/doc/static/fonts/inter/Inter-Medium.woff2 differ diff --git a/doc/static/fonts/inter/Inter-Regular.woff2 b/doc/static/fonts/inter/Inter-Regular.woff2 new file mode 100644 index 0000000000..66691b83a5 Binary files /dev/null and b/doc/static/fonts/inter/Inter-Regular.woff2 differ diff --git a/doc/static/fonts/inter/Inter-SemiBold.woff2 b/doc/static/fonts/inter/Inter-SemiBold.woff2 new file mode 100644 index 0000000000..9fd7726ebb Binary files /dev/null and b/doc/static/fonts/inter/Inter-SemiBold.woff2 differ diff --git a/doc/static/img/ttn-horizontal-white.svg b/doc/static/img/ttn-horizontal-white.svg new file mode 100644 index 0000000000..867f84b9e4 --- /dev/null +++ b/doc/static/img/ttn-horizontal-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/doc/static/img/ttn-horizontal.svg b/doc/static/img/ttn-horizontal.svg new file mode 100644 index 0000000000..0aab447505 --- /dev/null +++ b/doc/static/img/ttn-horizontal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/doc/yarn.lock b/doc/yarn.lock deleted file mode 100644 index b87fcccaf3..0000000000 --- a/doc/yarn.lock +++ /dev/null @@ -1,12 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@tti/design@https://ttui.thethingsindustries.com/release/ttui-1.7.4.tar.gz": - version "0.0.0" - resolved "https://ttui.thethingsindustries.com/release/ttui-1.7.4.tar.gz#03bddf2d0cc548d977ba7b4a2fb7c6876bd3b939" - -bulma@^0.9.1: - version "0.9.4" - resolved "https://registry.yarnpkg.com/bulma/-/bulma-0.9.4.tgz#0ca8aeb1847a34264768dba26a064c8be72674a1" - integrity sha512-86FlT5+1GrsgKbPLRRY7cGDg8fsJiP/jzTqXXVqiUZZ2aZT8uemEOHlU1CDU+TxklPEZ11HZNNWclRBBecP4CQ==