`s.
-
-.nav {
- display: flex;
- flex-wrap: wrap;
- padding-left: 0;
- margin-bottom: 0;
- list-style: none;
-}
-
-.nav-link {
- display: block;
- padding: $nav-link-padding-y $nav-link-padding-x;
- @include font-size($nav-link-font-size);
- font-weight: $nav-link-font-weight;
- color: $nav-link-color;
- text-decoration: if($link-decoration == none, null, none);
- @include transition($nav-link-transition);
-
- &:hover,
- &:focus {
- color: $nav-link-hover-color;
- text-decoration: if($link-hover-decoration == underline, none, null);
- }
-
- // Disabled state lightens text
- &.disabled {
- color: $nav-link-disabled-color;
- pointer-events: none;
- cursor: default;
- }
-}
-
-//
-// Tabs
-//
-
-.nav-tabs {
- border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;
-
- .nav-link {
- margin-bottom: -$nav-tabs-border-width;
- background: none;
- border: $nav-tabs-border-width solid transparent;
- @include border-top-radius($nav-tabs-border-radius);
-
- &:hover,
- &:focus {
- border-color: $nav-tabs-link-hover-border-color;
- // Prevents active .nav-link tab overlapping focus outline of previous/next .nav-link
- isolation: isolate;
- }
-
- &.disabled {
- color: $nav-link-disabled-color;
- background-color: transparent;
- border-color: transparent;
- }
- }
-
- .nav-link.active,
- .nav-item.show .nav-link {
- color: $nav-tabs-link-active-color;
- background-color: $nav-tabs-link-active-bg;
- border-color: $nav-tabs-link-active-border-color;
- }
-
- .dropdown-menu {
- // Make dropdown border overlap tab border
- margin-top: -$nav-tabs-border-width;
- // Remove the top rounded corners here since there is a hard edge above the menu
- @include border-top-radius(0);
- }
-}
-
-
-//
-// Pills
-//
-
-.nav-pills {
- .nav-link {
- background: none;
- border: 0;
- @include border-radius($nav-pills-border-radius);
- }
-
- .nav-link.active,
- .show > .nav-link {
- color: $nav-pills-link-active-color;
- @include gradient-bg($nav-pills-link-active-bg);
- }
-}
-
-
-//
-// Justified variants
-//
-
-.nav-fill {
- > .nav-link,
- .nav-item {
- flex: 1 1 auto;
- text-align: center;
- }
-}
-
-.nav-justified {
- > .nav-link,
- .nav-item {
- flex-basis: 0;
- flex-grow: 1;
- text-align: center;
- }
-}
-
-.nav-fill,
-.nav-justified {
- .nav-item .nav-link {
- width: 100%; // Make sure button will grow
- }
-}
-
-
-// Tabbable tabs
-//
-// Hide tabbable panes to start, show them when `.active`
-
-.tab-content {
- > .tab-pane {
- display: none;
- }
- > .active {
- display: block;
- }
-}
diff --git a/sass/bootstrap/scss/_navbar.scss b/sass/bootstrap/scss/_navbar.scss
deleted file mode 100644
index 2ccef11..0000000
--- a/sass/bootstrap/scss/_navbar.scss
+++ /dev/null
@@ -1,306 +0,0 @@
-// Contents
-//
-// Navbar
-// Navbar brand
-// Navbar nav
-// Navbar text
-// Responsive navbar
-// Navbar position
-// Navbar themes
-
-
-// Navbar
-//
-// Provide a static navbar from which we expand to create full-width, fixed, and
-// other navbar variations.
-
-.navbar {
- position: relative;
- display: flex;
- flex-wrap: wrap; // allow us to do the line break for collapsing content
- align-items: center;
- justify-content: space-between; // space out brand from logo
- padding-top: $navbar-padding-y;
- padding-right: $navbar-padding-x; // default: null
- padding-bottom: $navbar-padding-y;
- padding-left: $navbar-padding-x; // default: null
- @include gradient-bg();
-
- // Because flex properties aren't inherited, we need to redeclare these first
- // few properties so that content nested within behave properly.
- // The `flex-wrap` property is inherited to simplify the expanded navbars
- %container-flex-properties {
- display: flex;
- flex-wrap: inherit;
- align-items: center;
- justify-content: space-between;
- }
-
- > .container,
- > .container-fluid {
- @extend %container-flex-properties;
- }
-
- @each $breakpoint, $container-max-width in $container-max-widths {
- > .container#{breakpoint-infix($breakpoint, $container-max-widths)} {
- @extend %container-flex-properties;
- }
- }
-}
-
-
-// Navbar brand
-//
-// Used for brand, project, or site names.
-
-.navbar-brand {
- padding-top: $navbar-brand-padding-y;
- padding-bottom: $navbar-brand-padding-y;
- margin-right: $navbar-brand-margin-end;
- @include font-size($navbar-brand-font-size);
- text-decoration: if($link-decoration == none, null, none);
- white-space: nowrap;
-
- &:hover,
- &:focus {
- text-decoration: if($link-hover-decoration == underline, none, null);
- }
-}
-
-
-// Navbar nav
-//
-// Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).
-
-.navbar-nav {
- display: flex;
- flex-direction: column; // cannot use `inherit` to get the `.navbar`s value
- padding-left: 0;
- margin-bottom: 0;
- list-style: none;
-
- .nav-link {
- padding-right: 0;
- padding-left: 0;
- }
-
- .dropdown-menu {
- position: static;
- }
-}
-
-
-// Navbar text
-//
-//
-
-.navbar-text {
- padding-top: $nav-link-padding-y;
- padding-bottom: $nav-link-padding-y;
-}
-
-
-// Responsive navbar
-//
-// Custom styles for responsive collapsing and toggling of navbar contents.
-// Powered by the collapse Bootstrap JavaScript plugin.
-
-// When collapsed, prevent the toggleable navbar contents from appearing in
-// the default flexbox row orientation. Requires the use of `flex-wrap: wrap`
-// on the `.navbar` parent.
-.navbar-collapse {
- flex-basis: 100%;
- flex-grow: 1;
- // For always expanded or extra full navbars, ensure content aligns itself
- // properly vertically. Can be easily overridden with flex utilities.
- align-items: center;
-}
-
-// Button for toggling the navbar when in its collapsed state
-.navbar-toggler {
- padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;
- @include font-size($navbar-toggler-font-size);
- line-height: 1;
- background-color: transparent; // remove default button style
- border: $border-width solid transparent; // remove default button style
- @include border-radius($navbar-toggler-border-radius);
- @include transition($navbar-toggler-transition);
-
- &:hover {
- text-decoration: none;
- }
-
- &:focus {
- text-decoration: none;
- outline: 0;
- box-shadow: 0 0 0 $navbar-toggler-focus-width;
- }
-}
-
-// Keep as a separate element so folks can easily override it with another icon
-// or image file as needed.
-.navbar-toggler-icon {
- display: inline-block;
- width: 1.5em;
- height: 1.5em;
- vertical-align: middle;
- background-repeat: no-repeat;
- background-position: center;
- background-size: 100%;
-}
-
-.navbar-nav-scroll {
- max-height: var(--#{$variable-prefix}scroll-height, 75vh);
- overflow-y: auto;
-}
-
-// scss-docs-start navbar-expand-loop
-// Generate series of `.navbar-expand-*` responsive classes for configuring
-// where your navbar collapses.
-.navbar-expand {
- @each $breakpoint in map-keys($grid-breakpoints) {
- $next: breakpoint-next($breakpoint, $grid-breakpoints);
- $infix: breakpoint-infix($next, $grid-breakpoints);
-
- // stylelint-disable-next-line scss/selector-no-union-class-name
- {$infix} {
- @include media-breakpoint-up($next) {
- flex-wrap: nowrap;
- justify-content: flex-start;
-
- .navbar-nav {
- flex-direction: row;
-
- .dropdown-menu {
- position: absolute;
- }
-
- .nav-link {
- padding-right: $navbar-nav-link-padding-x;
- padding-left: $navbar-nav-link-padding-x;
- }
- }
-
- .navbar-nav-scroll {
- overflow: visible;
- }
-
- .navbar-collapse {
- display: flex !important; // stylelint-disable-line declaration-no-important
- flex-basis: auto;
- }
-
- .navbar-toggler {
- display: none;
- }
- }
- }
- }
-}
-// scss-docs-end navbar-expand-loop
-
-
-// Navbar themes
-//
-// Styles for switching between navbars with light or dark background.
-
-// Dark links against a light background
-.navbar-light {
- .navbar-brand {
- color: $navbar-light-brand-color;
-
- &:hover,
- &:focus {
- color: $navbar-light-brand-hover-color;
- }
- }
-
- .navbar-nav {
- .nav-link {
- color: $navbar-light-color;
-
- &:hover,
- &:focus {
- color: $navbar-light-hover-color;
- }
-
- &.disabled {
- color: $navbar-light-disabled-color;
- }
- }
-
- .show > .nav-link,
- .nav-link.active {
- color: $navbar-light-active-color;
- }
- }
-
- .navbar-toggler {
- color: $navbar-light-color;
- border-color: $navbar-light-toggler-border-color;
- }
-
- .navbar-toggler-icon {
- background-image: escape-svg($navbar-light-toggler-icon-bg);
- }
-
- .navbar-text {
- color: $navbar-light-color;
-
- a,
- a:hover,
- a:focus {
- color: $navbar-light-active-color;
- }
- }
-}
-
-// White links against a dark background
-.navbar-dark {
- .navbar-brand {
- color: $navbar-dark-brand-color;
-
- &:hover,
- &:focus {
- color: $navbar-dark-brand-hover-color;
- }
- }
-
- .navbar-nav {
- .nav-link {
- color: $navbar-dark-color;
-
- &:hover,
- &:focus {
- color: $navbar-dark-hover-color;
- }
-
- &.disabled {
- color: $navbar-dark-disabled-color;
- }
- }
-
- .show > .nav-link,
- .nav-link.active {
- color: $navbar-dark-active-color;
- }
- }
-
- .navbar-toggler {
- color: $navbar-dark-color;
- border-color: $navbar-dark-toggler-border-color;
- }
-
- .navbar-toggler-icon {
- background-image: escape-svg($navbar-dark-toggler-icon-bg);
- }
-
- .navbar-text {
- color: $navbar-dark-color;
- a,
- a:hover,
- a:focus {
- color: $navbar-dark-active-color;
- }
- }
-}
diff --git a/sass/bootstrap/scss/_offcanvas.scss b/sass/bootstrap/scss/_offcanvas.scss
deleted file mode 100644
index 1eeb989..0000000
--- a/sass/bootstrap/scss/_offcanvas.scss
+++ /dev/null
@@ -1,77 +0,0 @@
-.offcanvas {
- position: fixed;
- bottom: 0;
- z-index: $zindex-offcanvas;
- display: flex;
- flex-direction: column;
- max-width: 100%;
- color: $offcanvas-color;
- visibility: hidden;
- background-color: $offcanvas-bg-color;
- background-clip: padding-box;
- outline: 0;
- @include box-shadow($offcanvas-box-shadow);
- @include transition(transform $offcanvas-transition-duration ease-in-out);
-}
-
-.offcanvas-header {
- display: flex;
- justify-content: space-between;
- padding: $offcanvas-padding-y $offcanvas-padding-x;
-
- .btn-close {
- padding: ($offcanvas-padding-y / 2) ($offcanvas-padding-x / 2);
- margin: ($offcanvas-padding-y / -2) ($offcanvas-padding-x / -2) ($offcanvas-padding-y / -2) auto;
- }
-}
-
-.offcanvas-title {
- margin-bottom: 0;
- line-height: $offcanvas-title-line-height;
-}
-
-.offcanvas-body {
- flex-grow: 1;
- padding: $offcanvas-padding-y $offcanvas-padding-x;
- overflow-y: auto;
-}
-
-.offcanvas-start {
- top: 0;
- left: 0;
- width: $offcanvas-horizontal-width;
- border-right: $offcanvas-border-width solid $offcanvas-border-color;
- transform: translateX(-100%);
-}
-
-.offcanvas-end {
- top: 0;
- right: 0;
- width: $offcanvas-horizontal-width;
- border-left: $offcanvas-border-width solid $offcanvas-border-color;
- transform: translateX(100%);
-}
-
-.offcanvas-bottom {
- right: 0;
- left: 0;
- height: $offcanvas-vertical-height;
- max-height: 100%;
- border-top: $offcanvas-border-width solid $offcanvas-border-color;
- transform: translateY(100%);
-}
-
-.offcanvas.show {
- transform: none;
-}
-
-.offcanvas-backdrop::before {
- position: fixed;
- top: 0;
- left: 0;
- z-index: $zindex-offcanvas - 1;
- width: 100vw;
- height: 100vh;
- content: "";
- background-color: $offcanvas-body-backdrop-color;
-}
diff --git a/sass/bootstrap/scss/_pagination.scss b/sass/bootstrap/scss/_pagination.scss
deleted file mode 100644
index 9c46666..0000000
--- a/sass/bootstrap/scss/_pagination.scss
+++ /dev/null
@@ -1,64 +0,0 @@
-.pagination {
- display: flex;
- @include list-unstyled();
-}
-
-.page-link {
- position: relative;
- display: block;
- color: $pagination-color;
- text-decoration: if($link-decoration == none, null, none);
- background-color: $pagination-bg;
- border: $pagination-border-width solid $pagination-border-color;
- @include transition($pagination-transition);
-
- &:hover {
- z-index: 2;
- color: $pagination-hover-color;
- text-decoration: if($link-hover-decoration == underline, none, null);
- background-color: $pagination-hover-bg;
- border-color: $pagination-hover-border-color;
- }
-
- &:focus {
- z-index: 3;
- color: $pagination-focus-color;
- background-color: $pagination-focus-bg;
- outline: $pagination-focus-outline;
- box-shadow: $pagination-focus-box-shadow;
- }
-}
-
-.page-item {
- &:not(:first-child) .page-link {
- margin-left: $pagination-margin-start;
- }
-
- &.active .page-link {
- z-index: 3;
- color: $pagination-active-color;
- @include gradient-bg($pagination-active-bg);
- border-color: $pagination-active-border-color;
- }
-
- &.disabled .page-link {
- color: $pagination-disabled-color;
- pointer-events: none;
- background-color: $pagination-disabled-bg;
- border-color: $pagination-disabled-border-color;
- }
-}
-
-
-//
-// Sizing
-//
-@include pagination-size($pagination-padding-y, $pagination-padding-x, null, $pagination-border-radius);
-
-.pagination-lg {
- @include pagination-size($pagination-padding-y-lg, $pagination-padding-x-lg, $font-size-lg, $pagination-border-radius-lg);
-}
-
-.pagination-sm {
- @include pagination-size($pagination-padding-y-sm, $pagination-padding-x-sm, $font-size-sm, $pagination-border-radius-sm);
-}
diff --git a/sass/bootstrap/scss/_popover.scss b/sass/bootstrap/scss/_popover.scss
deleted file mode 100644
index a55555e..0000000
--- a/sass/bootstrap/scss/_popover.scss
+++ /dev/null
@@ -1,158 +0,0 @@
-.popover {
- position: absolute;
- top: 0;
- left: 0 #{"/* rtl:ignore */"};
- z-index: $zindex-popover;
- display: block;
- max-width: $popover-max-width;
- // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
- // So reset our font and text properties to avoid inheriting weird values.
- @include reset-text();
- @include font-size($popover-font-size);
- // Allow breaking very long words so they don't overflow the popover's bounds
- word-wrap: break-word;
- background-color: $popover-bg;
- background-clip: padding-box;
- border: $popover-border-width solid $popover-border-color;
- @include border-radius($popover-border-radius);
- @include box-shadow($popover-box-shadow);
-
- .popover-arrow {
- position: absolute;
- display: block;
- width: $popover-arrow-width;
- height: $popover-arrow-height;
-
- &::before,
- &::after {
- position: absolute;
- display: block;
- content: "";
- border-color: transparent;
- border-style: solid;
- }
- }
-}
-
-.bs-popover-top {
- > .popover-arrow {
- bottom: subtract(-$popover-arrow-height, $popover-border-width);
-
- &::before {
- bottom: 0;
- border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;
- border-top-color: $popover-arrow-outer-color;
- }
-
- &::after {
- bottom: $popover-border-width;
- border-width: $popover-arrow-height ($popover-arrow-width / 2) 0;
- border-top-color: $popover-arrow-color;
- }
- }
-}
-
-.bs-popover-end {
- > .popover-arrow {
- left: subtract(-$popover-arrow-height, $popover-border-width);
- width: $popover-arrow-height;
- height: $popover-arrow-width;
-
- &::before {
- left: 0;
- border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;
- border-right-color: $popover-arrow-outer-color;
- }
-
- &::after {
- left: $popover-border-width;
- border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0;
- border-right-color: $popover-arrow-color;
- }
- }
-}
-
-.bs-popover-bottom {
- > .popover-arrow {
- top: subtract(-$popover-arrow-height, $popover-border-width);
-
- &::before {
- top: 0;
- border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);
- border-bottom-color: $popover-arrow-outer-color;
- }
-
- &::after {
- top: $popover-border-width;
- border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2);
- border-bottom-color: $popover-arrow-color;
- }
- }
-
- // This will remove the popover-header's border just below the arrow
- .popover-header::before {
- position: absolute;
- top: 0;
- left: 50%;
- display: block;
- width: $popover-arrow-width;
- margin-left: -$popover-arrow-width / 2;
- content: "";
- border-bottom: $popover-border-width solid $popover-header-bg;
- }
-}
-
-.bs-popover-start {
- > .popover-arrow {
- right: subtract(-$popover-arrow-height, $popover-border-width);
- width: $popover-arrow-height;
- height: $popover-arrow-width;
-
- &::before {
- right: 0;
- border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;
- border-left-color: $popover-arrow-outer-color;
- }
-
- &::after {
- right: $popover-border-width;
- border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height;
- border-left-color: $popover-arrow-color;
- }
- }
-}
-
-.bs-popover-auto {
- &[data-popper-placement^="top"] {
- @extend .bs-popover-top;
- }
- &[data-popper-placement^="right"] {
- @extend .bs-popover-end;
- }
- &[data-popper-placement^="bottom"] {
- @extend .bs-popover-bottom;
- }
- &[data-popper-placement^="left"] {
- @extend .bs-popover-start;
- }
-}
-
-// Offset the popover to account for the popover arrow
-.popover-header {
- padding: $popover-header-padding-y $popover-header-padding-x;
- margin-bottom: 0; // Reset the default from Reboot
- @include font-size($font-size-base);
- color: $popover-header-color;
- background-color: $popover-header-bg;
- border-bottom: $popover-border-width solid shade-color($popover-header-bg, 10%);
- @include border-top-radius($popover-inner-border-radius);
-
- &:empty {
- display: none;
- }
-}
-
-.popover-body {
- padding: $popover-body-padding-y $popover-body-padding-x;
- color: $popover-body-color;
-}
diff --git a/sass/bootstrap/scss/_progress.scss b/sass/bootstrap/scss/_progress.scss
deleted file mode 100644
index 5715ab0..0000000
--- a/sass/bootstrap/scss/_progress.scss
+++ /dev/null
@@ -1,48 +0,0 @@
-// Disable animation if transitions are disabled
-
-// scss-docs-start progress-keyframes
-@if $enable-transitions {
- @keyframes progress-bar-stripes {
- 0% { background-position-x: $progress-height; }
- }
-}
-// scss-docs-end progress-keyframes
-
-.progress {
- display: flex;
- height: $progress-height;
- overflow: hidden; // force rounded corners by cropping it
- @include font-size($progress-font-size);
- background-color: $progress-bg;
- @include border-radius($progress-border-radius);
- @include box-shadow($progress-box-shadow);
-}
-
-.progress-bar {
- display: flex;
- flex-direction: column;
- justify-content: center;
- overflow: hidden;
- color: $progress-bar-color;
- text-align: center;
- white-space: nowrap;
- background-color: $progress-bar-bg;
- @include transition($progress-bar-transition);
-}
-
-.progress-bar-striped {
- @include gradient-striped();
- background-size: $progress-height $progress-height;
-}
-
-@if $enable-transitions {
- .progress-bar-animated {
- animation: $progress-bar-animation-timing progress-bar-stripes;
-
- @if $enable-reduced-motion {
- @media (prefers-reduced-motion: reduce) {
- animation: none;
- }
- }
- }
-}
diff --git a/sass/bootstrap/scss/_reboot.scss b/sass/bootstrap/scss/_reboot.scss
deleted file mode 100644
index 3520469..0000000
--- a/sass/bootstrap/scss/_reboot.scss
+++ /dev/null
@@ -1,621 +0,0 @@
-// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix
-
-
-// Reboot
-//
-// Normalization of HTML elements, manually forked from Normalize.css to remove
-// styles targeting irrelevant browsers while applying new styles.
-//
-// Normalize is licensed MIT. https://github.com/necolas/normalize.css
-
-
-// Document
-//
-// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.
-
-*,
-*::before,
-*::after {
- box-sizing: border-box;
-}
-
-
-// Root
-//
-// Ability to the value of the root font sizes, affecting the value of `rem`.
-// null by default, thus nothing is generated.
-
-:root {
- font-size: $font-size-root;
-
- @if $enable-smooth-scroll {
- @media (prefers-reduced-motion: no-preference) {
- scroll-behavior: smooth;
- }
- }
-}
-
-
-// Body
-//
-// 1. Remove the margin in all browsers.
-// 2. As a best practice, apply a default `background-color`.
-// 3. Prevent adjustments of font size after orientation changes in iOS.
-// 4. Change the default tap highlight to be completely transparent in iOS.
-
-body {
- margin: 0; // 1
- font-family: $font-family-base;
- @include font-size($font-size-base);
- font-weight: $font-weight-base;
- line-height: $line-height-base;
- color: $body-color;
- text-align: $body-text-align;
- background-color: $body-bg; // 2
- -webkit-text-size-adjust: 100%; // 3
- -webkit-tap-highlight-color: rgba($black, 0); // 4
-}
-
-
-// Content grouping
-//
-// 1. Reset Firefox's gray color
-// 2. Set correct height and prevent the `size` attribute to make the `hr` look like an input field
-
-hr {
- margin: $hr-margin-y 0;
- color: $hr-color; // 1
- background-color: currentColor;
- border: 0;
- opacity: $hr-opacity;
-}
-
-hr:not([size]) {
- height: $hr-height; // 2
-}
-
-
-// Typography
-//
-// 1. Remove top margins from headings
-// By default, ``-`` all receive top and bottom margins. We nuke the top
-// margin for easier control within type scales as it avoids margin collapsing.
-
-%heading {
- margin-top: 0; // 1
- margin-bottom: $headings-margin-bottom;
- font-family: $headings-font-family;
- font-style: $headings-font-style;
- font-weight: $headings-font-weight;
- line-height: $headings-line-height;
- color: $headings-color;
-}
-
-h1 {
- @extend %heading;
- @include font-size($h1-font-size);
-}
-
-h2 {
- @extend %heading;
- @include font-size($h2-font-size);
-}
-
-h3 {
- @extend %heading;
- @include font-size($h3-font-size);
-}
-
-h4 {
- @extend %heading;
- @include font-size($h4-font-size);
-}
-
-h5 {
- @extend %heading;
- @include font-size($h5-font-size);
-}
-
-h6 {
- @extend %heading;
- @include font-size($h6-font-size);
-}
-
-
-// Reset margins on paragraphs
-//
-// Similarly, the top margin on ` `s get reset. However, we also reset the
-// bottom margin to use `rem` units instead of `em`.
-
-p {
- margin-top: 0;
- margin-bottom: $paragraph-margin-bottom;
-}
-
-
-// Abbreviations
-//
-// 1. Duplicate behavior to the data-bs-* attribute for our tooltip plugin
-// 2. Add the correct text decoration in Chrome, Edge, Opera, and Safari.
-// 3. Add explicit cursor to indicate changed behavior.
-// 4. Prevent the text-decoration to be skipped.
-
-abbr[title],
-abbr[data-bs-original-title] { // 1
- text-decoration: underline dotted; // 2
- cursor: help; // 3
- text-decoration-skip-ink: none; // 4
-}
-
-
-// Address
-
-address {
- margin-bottom: 1rem;
- font-style: normal;
- line-height: inherit;
-}
-
-
-// Lists
-
-ol,
-ul {
- padding-left: 2rem;
-}
-
-ol,
-ul,
-dl {
- margin-top: 0;
- margin-bottom: 1rem;
-}
-
-ol ol,
-ul ul,
-ol ul,
-ul ol {
- margin-bottom: 0;
-}
-
-dt {
- font-weight: $dt-font-weight;
-}
-
-// 1. Undo browser default
-
-dd {
- margin-bottom: .5rem;
- margin-left: 0; // 1
-}
-
-
-// Blockquote
-
-blockquote {
- margin: 0 0 1rem;
-}
-
-
-// Strong
-//
-// Add the correct font weight in Chrome, Edge, and Safari
-
-b,
-strong {
- font-weight: $font-weight-bolder;
-}
-
-
-// Small
-//
-// Add the correct font size in all browsers
-
-small {
- @include font-size($small-font-size);
-}
-
-
-// Mark
-
-mark {
- padding: $mark-padding;
- background-color: $mark-bg;
-}
-
-
-// Sub and Sup
-//
-// Prevent `sub` and `sup` elements from affecting the line height in
-// all browsers.
-
-sub,
-sup {
- position: relative;
- @include font-size($sub-sup-font-size);
- line-height: 0;
- vertical-align: baseline;
-}
-
-sub { bottom: -.25em; }
-sup { top: -.5em; }
-
-
-// Links
-
-a {
- color: $link-color;
- text-decoration: $link-decoration;
-
- &:hover {
- color: $link-hover-color;
- text-decoration: $link-hover-decoration;
- }
-}
-
-// And undo these styles for placeholder links/named anchors (without href).
-// It would be more straightforward to just use a[href] in previous block, but that
-// causes specificity issues in many other styles that are too complex to fix.
-// See https://github.com/twbs/bootstrap/issues/19402
-
-a:not([href]):not([class]) {
- &,
- &:hover {
- color: inherit;
- text-decoration: none;
- }
-}
-
-
-// Code
-
-pre,
-code,
-kbd,
-samp {
- font-family: $font-family-code;
- @include font-size(1em); // Correct the odd `em` font sizing in all browsers.
- direction: ltr #{"/* rtl:ignore */"};
- unicode-bidi: bidi-override;
-}
-
-// 1. Remove browser default top margin
-// 2. Reset browser default of `1em` to use `rem`s
-// 3. Don't allow content to break outside
-
-pre {
- display: block;
- margin-top: 0; // 1
- margin-bottom: 1rem; // 2
- overflow: auto; // 3
- @include font-size($code-font-size);
- color: $pre-color;
-
- // Account for some code outputs that place code tags in pre tags
- code {
- @include font-size(inherit);
- color: inherit;
- word-break: normal;
- }
-}
-
-code {
- @include font-size($code-font-size);
- color: $code-color;
- word-wrap: break-word;
-
- // Streamline the style when inside anchors to avoid broken underline and more
- a > & {
- color: inherit;
- }
-}
-
-kbd {
- padding: $kbd-padding-y $kbd-padding-x;
- @include font-size($kbd-font-size);
- color: $kbd-color;
- background-color: $kbd-bg;
- @include border-radius($border-radius-sm);
-
- kbd {
- padding: 0;
- @include font-size(1em);
- font-weight: $nested-kbd-font-weight;
- }
-}
-
-
-// Figures
-//
-// Apply a consistent margin strategy (matches our type styles).
-
-figure {
- margin: 0 0 1rem;
-}
-
-
-// Images and content
-
-img,
-svg {
- vertical-align: middle;
-}
-
-
-// Tables
-//
-// Prevent double borders
-
-table {
- caption-side: bottom;
- border-collapse: collapse;
-}
-
-caption {
- padding-top: $table-cell-padding-y;
- padding-bottom: $table-cell-padding-y;
- color: $table-caption-color;
- text-align: left;
-}
-
-// 1. Removes font-weight bold by inheriting
-// 2. Matches default `
` alignment by inheriting `text-align`.
-// 3. Fix alignment for Safari
-
-th {
- font-weight: $table-th-font-weight; // 1
- text-align: inherit; // 2
- text-align: -webkit-match-parent; // 3
-}
-
-thead,
-tbody,
-tfoot,
-tr,
-td,
-th {
- border-color: inherit;
- border-style: solid;
- border-width: 0;
-}
-
-
-// Forms
-//
-// 1. Allow labels to use `margin` for spacing.
-
-label {
- display: inline-block; // 1
-}
-
-// Remove the default `border-radius` that macOS Chrome adds.
-// See https://github.com/twbs/bootstrap/issues/24093
-
-button {
- // stylelint-disable-next-line property-disallowed-list
- border-radius: 0;
-}
-
-// Explicitly remove focus outline in Chromium when it shouldn't be
-// visible (e.g. as result of mouse click or touch tap). It already
-// should be doing this automatically, but seems to currently be
-// confused and applies its very visible two-tone outline anyway.
-
-button:focus:not(:focus-visible) {
- outline: 0;
-}
-
-// 1. Remove the margin in Firefox and Safari
-
-input,
-button,
-select,
-optgroup,
-textarea {
- margin: 0; // 1
- font-family: inherit;
- @include font-size(inherit);
- line-height: inherit;
-}
-
-// Remove the inheritance of text transform in Firefox
-button,
-select {
- text-transform: none;
-}
-// Set the cursor for non-`` buttons
-//
-// Details at https://github.com/twbs/bootstrap/pull/30562
-[role="button"] {
- cursor: pointer;
-}
-
-select {
- // Remove the inheritance of word-wrap in Safari.
- // See https://github.com/twbs/bootstrap/issues/24990
- word-wrap: normal;
-
- // Undo the opacity change from Chrome
- &:disabled {
- opacity: 1;
- }
-}
-
-// Remove the dropdown arrow in Chrome from inputs built with datalists.
-// See https://stackoverflow.com/a/54997118
-
-[list]::-webkit-calendar-picker-indicator {
- display: none;
-}
-
-// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
-// controls in Android 4.
-// 2. Correct the inability to style clickable types in iOS and Safari.
-// 3. Opinionated: add "hand" cursor to non-disabled button elements.
-
-button,
-[type="button"], // 1
-[type="reset"],
-[type="submit"] {
- -webkit-appearance: button; // 2
-
- @if $enable-button-pointers {
- &:not(:disabled) {
- cursor: pointer; // 3
- }
- }
-}
-
-// Remove inner border and padding from Firefox, but don't restore the outline like Normalize.
-
-::-moz-focus-inner {
- padding: 0;
- border-style: none;
-}
-
-// 1. Textareas should really only resize vertically so they don't break their (horizontal) containers.
-
-textarea {
- resize: vertical; // 1
-}
-
-// 1. Browsers set a default `min-width: min-content;` on fieldsets,
-// unlike e.g. ``s, which have `min-width: 0;` by default.
-// So we reset that to ensure fieldsets behave more like a standard block element.
-// See https://github.com/twbs/bootstrap/issues/12359
-// and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements
-// 2. Reset the default outline behavior of fieldsets so they don't affect page layout.
-
-fieldset {
- min-width: 0; // 1
- padding: 0; // 2
- margin: 0; // 2
- border: 0; // 2
-}
-
-// 1. By using `float: left`, the legend will behave like a block element.
-// This way the border of a fieldset wraps around the legend if present.
-// 2. Fix wrapping bug.
-// See https://github.com/twbs/bootstrap/issues/29712
-
-legend {
- float: left; // 1
- width: 100%;
- padding: 0;
- margin-bottom: $legend-margin-bottom;
- @include font-size($legend-font-size);
- font-weight: $legend-font-weight;
- line-height: inherit;
-
- + * {
- clear: left; // 2
- }
-}
-
-// Fix height of inputs with a type of datetime-local, date, month, week, or time
-// See https://github.com/twbs/bootstrap/issues/18842
-
-::-webkit-datetime-edit-fields-wrapper,
-::-webkit-datetime-edit-text,
-::-webkit-datetime-edit-minute,
-::-webkit-datetime-edit-hour-field,
-::-webkit-datetime-edit-day-field,
-::-webkit-datetime-edit-month-field,
-::-webkit-datetime-edit-year-field {
- padding: 0;
-}
-
-::-webkit-inner-spin-button {
- height: auto;
-}
-
-// 1. Correct the outline style in Safari.
-// 2. This overrides the extra rounded corners on search inputs in iOS so that our
-// `.form-control` class can properly style them. Note that this cannot simply
-// be added to `.form-control` as it's not specific enough. For details, see
-// https://github.com/twbs/bootstrap/issues/11586.
-
-[type="search"] {
- outline-offset: -2px; // 1
- -webkit-appearance: textfield; // 2
-}
-
-// 1. A few input types should stay LTR
-// See https://rtlstyling.com/posts/rtl-styling#form-inputs
-// 2. RTL only output
-// See https://rtlcss.com/learn/usage-guide/control-directives/#raw
-
-/* rtl:raw:
-[type="tel"],
-[type="url"],
-[type="email"],
-[type="number"] {
- direction: ltr;
-}
-*/
-
-// Remove the inner padding in Chrome and Safari on macOS.
-
-::-webkit-search-decoration {
- -webkit-appearance: none;
-}
-
-// Remove padding around color pickers in webkit browsers
-
-::-webkit-color-swatch-wrapper {
- padding: 0;
-}
-
-
-// Inherit font family and line height for file input buttons
-
-::file-selector-button {
- font: inherit;
-}
-
-// 1. Change font properties to `inherit`
-// 2. Correct the inability to style clickable types in iOS and Safari.
-
-::-webkit-file-upload-button {
- font: inherit; // 1
- -webkit-appearance: button; // 2
-}
-
-// Correct element displays
-
-output {
- display: inline-block;
-}
-
-// Remove border from iframe
-
-iframe {
- border: 0;
-}
-
-// Summary
-//
-// 1. Add the correct display in all browsers
-
-summary {
- display: list-item; // 1
- cursor: pointer;
-}
-
-
-// Progress
-//
-// Add the correct vertical alignment in Chrome, Firefox, and Opera.
-
-progress {
- vertical-align: baseline;
-}
-
-
-// Hidden attribute
-//
-// Always hide an element with the `hidden` HTML attribute.
-
-[hidden] {
- display: none !important;
-}
diff --git a/sass/bootstrap/scss/_root.scss b/sass/bootstrap/scss/_root.scss
deleted file mode 100644
index 768d634..0000000
--- a/sass/bootstrap/scss/_root.scss
+++ /dev/null
@@ -1,16 +0,0 @@
-:root {
- // Custom variable values only support SassScript inside `#{}`.
- @each $color, $value in $colors {
- --#{$variable-prefix}#{$color}: #{$value};
- }
-
- @each $color, $value in $theme-colors {
- --#{$variable-prefix}#{$color}: #{$value};
- }
-
- // Use `inspect` for lists so that quoted items keep the quotes.
- // See https://github.com/sass/sass/issues/2383#issuecomment-336349172
- --#{$variable-prefix}font-sans-serif: #{inspect($font-family-sans-serif)};
- --#{$variable-prefix}font-monospace: #{inspect($font-family-monospace)};
- --#{$variable-prefix}gradient: #{$gradient};
-}
diff --git a/sass/bootstrap/scss/_spinners.scss b/sass/bootstrap/scss/_spinners.scss
deleted file mode 100644
index 8e19bae..0000000
--- a/sass/bootstrap/scss/_spinners.scss
+++ /dev/null
@@ -1,69 +0,0 @@
-//
-// Rotating border
-//
-
-// scss-docs-start spinner-border-keyframes
-@keyframes spinner-border {
- to { transform: rotate(360deg) #{"/* rtl:ignore */"}; }
-}
-// scss-docs-end spinner-border-keyframes
-
-.spinner-border {
- display: inline-block;
- width: $spinner-width;
- height: $spinner-height;
- vertical-align: text-bottom;
- border: $spinner-border-width solid currentColor;
- border-right-color: transparent;
- // stylelint-disable-next-line property-disallowed-list
- border-radius: 50%;
- animation: $spinner-animation-speed linear infinite spinner-border;
-}
-
-.spinner-border-sm {
- width: $spinner-width-sm;
- height: $spinner-height-sm;
- border-width: $spinner-border-width-sm;
-}
-
-//
-// Growing circle
-//
-
-// scss-docs-start spinner-grow-keyframes
-@keyframes spinner-grow {
- 0% {
- transform: scale(0);
- }
- 50% {
- opacity: 1;
- transform: none;
- }
-}
-// scss-docs-end spinner-grow-keyframes
-
-.spinner-grow {
- display: inline-block;
- width: $spinner-width;
- height: $spinner-height;
- vertical-align: text-bottom;
- background-color: currentColor;
- // stylelint-disable-next-line property-disallowed-list
- border-radius: 50%;
- opacity: 0;
- animation: $spinner-animation-speed linear infinite spinner-grow;
-}
-
-.spinner-grow-sm {
- width: $spinner-width-sm;
- height: $spinner-height-sm;
-}
-
-@if $enable-reduced-motion {
- @media (prefers-reduced-motion: reduce) {
- .spinner-border,
- .spinner-grow {
- animation-duration: $spinner-animation-speed * 2;
- }
- }
-}
diff --git a/sass/bootstrap/scss/_tables.scss b/sass/bootstrap/scss/_tables.scss
deleted file mode 100644
index 5036829..0000000
--- a/sass/bootstrap/scss/_tables.scss
+++ /dev/null
@@ -1,150 +0,0 @@
-//
-// Basic Bootstrap table
-//
-
-.table {
- --#{$variable-prefix}table-bg: #{$table-bg};
- --#{$variable-prefix}table-striped-color: #{$table-striped-color};
- --#{$variable-prefix}table-striped-bg: #{$table-striped-bg};
- --#{$variable-prefix}table-active-color: #{$table-active-color};
- --#{$variable-prefix}table-active-bg: #{$table-active-bg};
- --#{$variable-prefix}table-hover-color: #{$table-hover-color};
- --#{$variable-prefix}table-hover-bg: #{$table-hover-bg};
-
- width: 100%;
- margin-bottom: $spacer;
- color: $table-color;
- vertical-align: $table-cell-vertical-align;
- border-color: $table-border-color;
-
- // Target th & td
- // We need the child combinator to prevent styles leaking to nested tables which doesn't have a `.table` class.
- // We use the universal selectors here to simplify the selector (else we would need 6 different selectors).
- // Another advantage is that this generates less code and makes the selector less specific making it easier to override.
- // stylelint-disable-next-line selector-max-universal
- > :not(caption) > * > * {
- padding: $table-cell-padding-y $table-cell-padding-x;
- background-color: var(--#{$variable-prefix}table-bg);
- border-bottom-width: $table-border-width;
- box-shadow: inset 0 0 0 9999px var(--#{$variable-prefix}table-accent-bg);
- }
-
- > tbody {
- vertical-align: inherit;
- }
-
- > thead {
- vertical-align: bottom;
- }
-
- // Highlight border color between thead, tbody and tfoot.
- > :not(:last-child) > :last-child > * {
- border-bottom-color: $table-group-separator-color;
- }
-}
-
-
-//
-// Change placement of captions with a class
-//
-
-.caption-top {
- caption-side: top;
-}
-
-
-//
-// Condensed table w/ half padding
-//
-
-.table-sm {
- // stylelint-disable-next-line selector-max-universal
- > :not(caption) > * > * {
- padding: $table-cell-padding-y-sm $table-cell-padding-x-sm;
- }
-}
-
-
-// Border versions
-//
-// Add or remove borders all around the table and between all the columns.
-//
-// When borders are added on all sides of the cells, the corners can render odd when
-// these borders do not have the same color or if they are semi-transparent.
-// Therefor we add top and border bottoms to the `tr`s and left and right borders
-// to the `td`s or `th`s
-
-.table-bordered {
- > :not(caption) > * {
- border-width: $table-border-width 0;
-
- // stylelint-disable-next-line selector-max-universal
- > * {
- border-width: 0 $table-border-width;
- }
- }
-}
-
-.table-borderless {
- // stylelint-disable-next-line selector-max-universal
- > :not(caption) > * > * {
- border-bottom-width: 0;
- }
-}
-
-// Zebra-striping
-//
-// Default zebra-stripe styles (alternating gray and transparent backgrounds)
-
-.table-striped {
- > tbody > tr:nth-of-type(#{$table-striped-order}) {
- --#{$variable-prefix}table-accent-bg: var(--#{$variable-prefix}table-striped-bg);
- color: var(--#{$variable-prefix}table-striped-color);
- }
-}
-
-// Active table
-//
-// The `.table-active` class can be added to highlight rows or cells
-
-.table-active {
- --#{$variable-prefix}table-accent-bg: var(--#{$variable-prefix}table-active-bg);
- color: var(--#{$variable-prefix}table-active-color);
-}
-
-// Hover effect
-//
-// Placed here since it has to come after the potential zebra striping
-
-.table-hover {
- > tbody > tr:hover {
- --#{$variable-prefix}table-accent-bg: var(--#{$variable-prefix}table-hover-bg);
- color: var(--#{$variable-prefix}table-hover-color);
- }
-}
-
-
-// Table variants
-//
-// Table variants set the table cell backgrounds, border colors
-// and the colors of the striped, hovered & active tables
-
-@each $color, $value in $table-variants {
- @include table-variant($color, $value);
-}
-
-// Responsive tables
-//
-// Generate series of `.table-responsive-*` classes for configuring the screen
-// size of where your table will overflow.
-
-@each $breakpoint in map-keys($grid-breakpoints) {
- $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
-
- @include media-breakpoint-down($breakpoint) {
- .table-responsive#{$infix} {
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- }
- }
-}
diff --git a/sass/bootstrap/scss/_toasts.scss b/sass/bootstrap/scss/_toasts.scss
deleted file mode 100644
index 5c533d7..0000000
--- a/sass/bootstrap/scss/_toasts.scss
+++ /dev/null
@@ -1,51 +0,0 @@
-.toast {
- width: $toast-max-width;
- max-width: 100%;
- @include font-size($toast-font-size);
- color: $toast-color;
- pointer-events: auto;
- background-color: $toast-background-color;
- background-clip: padding-box;
- border: $toast-border-width solid $toast-border-color;
- box-shadow: $toast-box-shadow;
- @include border-radius($toast-border-radius);
-
- &:not(.showing):not(.show) {
- opacity: 0;
- }
-
- &.hide {
- display: none;
- }
-}
-
-.toast-container {
- width: max-content;
- max-width: 100%;
- pointer-events: none;
-
- > :not(:last-child) {
- margin-bottom: $toast-spacing;
- }
-}
-
-.toast-header {
- display: flex;
- align-items: center;
- padding: $toast-padding-y $toast-padding-x;
- color: $toast-header-color;
- background-color: $toast-header-background-color;
- background-clip: padding-box;
- border-bottom: $toast-border-width solid $toast-header-border-color;
- @include border-top-radius(subtract($toast-border-radius, $toast-border-width));
-
- .btn-close {
- margin-right: $toast-padding-x / -2;
- margin-left: $toast-padding-x;
- }
-}
-
-.toast-body {
- padding: $toast-padding-x; // apply to both vertical and horizontal
- word-wrap: break-word;
-}
diff --git a/sass/bootstrap/scss/_tooltip.scss b/sass/bootstrap/scss/_tooltip.scss
deleted file mode 100644
index 2993bf7..0000000
--- a/sass/bootstrap/scss/_tooltip.scss
+++ /dev/null
@@ -1,115 +0,0 @@
-// Base class
-.tooltip {
- position: absolute;
- z-index: $zindex-tooltip;
- display: block;
- margin: $tooltip-margin;
- // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
- // So reset our font and text properties to avoid inheriting weird values.
- @include reset-text();
- @include font-size($tooltip-font-size);
- // Allow breaking very long words so they don't overflow the tooltip's bounds
- word-wrap: break-word;
- opacity: 0;
-
- &.show { opacity: $tooltip-opacity; }
-
- .tooltip-arrow {
- position: absolute;
- display: block;
- width: $tooltip-arrow-width;
- height: $tooltip-arrow-height;
-
- &::before {
- position: absolute;
- content: "";
- border-color: transparent;
- border-style: solid;
- }
- }
-}
-
-.bs-tooltip-top {
- padding: $tooltip-arrow-height 0;
-
- .tooltip-arrow {
- bottom: 0;
-
- &::before {
- top: -1px;
- border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;
- border-top-color: $tooltip-arrow-color;
- }
- }
-}
-
-.bs-tooltip-end {
- padding: 0 $tooltip-arrow-height;
-
- .tooltip-arrow {
- left: 0;
- width: $tooltip-arrow-height;
- height: $tooltip-arrow-width;
-
- &::before {
- right: -1px;
- border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0;
- border-right-color: $tooltip-arrow-color;
- }
- }
-}
-
-.bs-tooltip-bottom {
- padding: $tooltip-arrow-height 0;
-
- .tooltip-arrow {
- top: 0;
-
- &::before {
- bottom: -1px;
- border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;
- border-bottom-color: $tooltip-arrow-color;
- }
- }
-}
-
-.bs-tooltip-start {
- padding: 0 $tooltip-arrow-height;
-
- .tooltip-arrow {
- right: 0;
- width: $tooltip-arrow-height;
- height: $tooltip-arrow-width;
-
- &::before {
- left: -1px;
- border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height;
- border-left-color: $tooltip-arrow-color;
- }
- }
-}
-
-.bs-tooltip-auto {
- &[data-popper-placement^="top"] {
- @extend .bs-tooltip-top;
- }
- &[data-popper-placement^="right"] {
- @extend .bs-tooltip-end;
- }
- &[data-popper-placement^="bottom"] {
- @extend .bs-tooltip-bottom;
- }
- &[data-popper-placement^="left"] {
- @extend .bs-tooltip-start;
- }
-}
-
-// Wrapper for the tooltip content
-.tooltip-inner {
- max-width: $tooltip-max-width;
- padding: $tooltip-padding-y $tooltip-padding-x;
- color: $tooltip-color;
- text-align: center;
- background-color: $tooltip-bg;
- @include border-radius($tooltip-border-radius);
-}
diff --git a/sass/bootstrap/scss/_transitions.scss b/sass/bootstrap/scss/_transitions.scss
deleted file mode 100644
index 2905df4..0000000
--- a/sass/bootstrap/scss/_transitions.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-.fade {
- @include transition($transition-fade);
-
- &:not(.show) {
- opacity: 0;
- }
-}
-
-// scss-docs-start collapse-classes
-.collapse {
- &:not(.show) {
- display: none;
- }
-}
-
-.collapsing {
- height: 0;
- overflow: hidden;
- @include transition($transition-collapse);
-}
-// scss-docs-end collapse-classes
diff --git a/sass/bootstrap/scss/_type.scss b/sass/bootstrap/scss/_type.scss
deleted file mode 100644
index b2d524c..0000000
--- a/sass/bootstrap/scss/_type.scss
+++ /dev/null
@@ -1,104 +0,0 @@
-//
-// Headings
-//
-.h1 {
- @extend h1;
-}
-
-.h2 {
- @extend h2;
-}
-
-.h3 {
- @extend h3;
-}
-
-.h4 {
- @extend h4;
-}
-
-.h5 {
- @extend h5;
-}
-
-.h6 {
- @extend h6;
-}
-
-
-.lead {
- @include font-size($lead-font-size);
- font-weight: $lead-font-weight;
-}
-
-// Type display classes
-@each $display, $font-size in $display-font-sizes {
- .display-#{$display} {
- @include font-size($font-size);
- font-weight: $display-font-weight;
- line-height: $display-line-height;
- }
-}
-
-//
-// Emphasis
-//
-.small {
- @extend small;
-}
-
-.mark {
- @extend mark;
-}
-
-//
-// Lists
-//
-
-.list-unstyled {
- @include list-unstyled();
-}
-
-// Inline turns list items into inline-block
-.list-inline {
- @include list-unstyled();
-}
-.list-inline-item {
- display: inline-block;
-
- &:not(:last-child) {
- margin-right: $list-inline-padding;
- }
-}
-
-
-//
-// Misc
-//
-
-// Builds on `abbr`
-.initialism {
- @include font-size($initialism-font-size);
- text-transform: uppercase;
-}
-
-// Blockquotes
-.blockquote {
- margin-bottom: $blockquote-margin-y;
- @include font-size($blockquote-font-size);
-
- > :last-child {
- margin-bottom: 0;
- }
-}
-
-.blockquote-footer {
- margin-top: -$blockquote-margin-y;
- margin-bottom: $blockquote-margin-y;
- @include font-size($blockquote-footer-font-size);
- color: $blockquote-footer-color;
-
- &::before {
- content: "\2014\00A0"; // em dash, nbsp
- }
-}
diff --git a/sass/bootstrap/scss/_utilities.scss b/sass/bootstrap/scss/_utilities.scss
deleted file mode 100644
index 3c927cf..0000000
--- a/sass/bootstrap/scss/_utilities.scss
+++ /dev/null
@@ -1,594 +0,0 @@
-// stylelint-disable indentation
-
-// Utilities
-
-$utilities: () !default;
-// stylelint-disable-next-line scss/dollar-variable-default
-$utilities: map-merge(
- (
- // scss-docs-start utils-vertical-align
- "align": (
- property: vertical-align,
- class: align,
- values: baseline top middle bottom text-bottom text-top
- ),
- // scss-docs-end utils-vertical-align
- // scss-docs-start utils-float
- "float": (
- responsive: true,
- property: float,
- values: (
- start: left,
- end: right,
- none: none,
- )
- ),
- // scss-docs-end utils-float
- // scss-docs-start utils-overflow
- "overflow": (
- property: overflow,
- values: auto hidden visible scroll,
- ),
- // scss-docs-end utils-overflow
- // scss-docs-start utils-display
- "display": (
- responsive: true,
- print: true,
- property: display,
- class: d,
- values: inline inline-block block grid table table-row table-cell flex inline-flex none
- ),
- // scss-docs-end utils-display
- // scss-docs-start utils-shadow
- "shadow": (
- property: box-shadow,
- class: shadow,
- values: (
- null: $box-shadow,
- sm: $box-shadow-sm,
- lg: $box-shadow-lg,
- none: none,
- )
- ),
- // scss-docs-end utils-shadow
- // scss-docs-start utils-position
- "position": (
- property: position,
- values: static relative absolute fixed sticky
- ),
- "top": (
- property: top,
- values: $position-values
- ),
- "bottom": (
- property: bottom,
- values: $position-values
- ),
- "start": (
- property: left,
- class: start,
- values: $position-values
- ),
- "end": (
- property: right,
- class: end,
- values: $position-values
- ),
- "translate-middle": (
- property: transform,
- class: translate-middle,
- values: (
- null: translate(-50%, -50%),
- x: translateX(-50%),
- y: translateY(-50%),
- )
- ),
- // scss-docs-end utils-position
- // scss-docs-start utils-borders
- "border": (
- property: border,
- values: (
- null: $border-width solid $border-color,
- 0: 0,
- )
- ),
- "border-top": (
- property: border-top,
- values: (
- null: $border-width solid $border-color,
- 0: 0,
- )
- ),
- "border-end": (
- property: border-right,
- class: border-end,
- values: (
- null: $border-width solid $border-color,
- 0: 0,
- )
- ),
- "border-bottom": (
- property: border-bottom,
- values: (
- null: $border-width solid $border-color,
- 0: 0,
- )
- ),
- "border-start": (
- property: border-left,
- class: border-start,
- values: (
- null: $border-width solid $border-color,
- 0: 0,
- )
- ),
- "border-color": (
- property: border-color,
- class: border,
- values: map-merge($theme-colors, ("white": $white))
- ),
- "border-width": (
- property: border-width,
- class: border,
- values: $border-widths
- ),
- // scss-docs-end utils-borders
- // Sizing utilities
- // scss-docs-start utils-sizing
- "width": (
- property: width,
- class: w,
- values: (
- 25: 25%,
- 50: 50%,
- 75: 75%,
- 100: 100%,
- auto: auto
- )
- ),
- "max-width": (
- property: max-width,
- class: mw,
- values: (100: 100%)
- ),
- "viewport-width": (
- property: width,
- class: vw,
- values: (100: 100vw)
- ),
- "min-viewport-width": (
- property: min-width,
- class: min-vw,
- values: (100: 100vw)
- ),
- "height": (
- property: height,
- class: h,
- values: (
- 25: 25%,
- 50: 50%,
- 75: 75%,
- 100: 100%,
- auto: auto
- )
- ),
- "max-height": (
- property: max-height,
- class: mh,
- values: (100: 100%)
- ),
- "viewport-height": (
- property: height,
- class: vh,
- values: (100: 100vh)
- ),
- "min-viewport-height": (
- property: min-height,
- class: min-vh,
- values: (100: 100vh)
- ),
- // scss-docs-end utils-sizing
- // Flex utilities
- // scss-docs-start utils-flex
- "flex": (
- responsive: true,
- property: flex,
- values: (fill: 1 1 auto)
- ),
- "flex-direction": (
- responsive: true,
- property: flex-direction,
- class: flex,
- values: row column row-reverse column-reverse
- ),
- "flex-grow": (
- responsive: true,
- property: flex-grow,
- class: flex,
- values: (
- grow-0: 0,
- grow-1: 1,
- )
- ),
- "flex-shrink": (
- responsive: true,
- property: flex-shrink,
- class: flex,
- values: (
- shrink-0: 0,
- shrink-1: 1,
- )
- ),
- "flex-wrap": (
- responsive: true,
- property: flex-wrap,
- class: flex,
- values: wrap nowrap wrap-reverse
- ),
- "gap": (
- responsive: true,
- property: gap,
- class: gap,
- values: $spacers
- ),
- "justify-content": (
- responsive: true,
- property: justify-content,
- values: (
- start: flex-start,
- end: flex-end,
- center: center,
- between: space-between,
- around: space-around,
- evenly: space-evenly,
- )
- ),
- "align-items": (
- responsive: true,
- property: align-items,
- values: (
- start: flex-start,
- end: flex-end,
- center: center,
- baseline: baseline,
- stretch: stretch,
- )
- ),
- "align-content": (
- responsive: true,
- property: align-content,
- values: (
- start: flex-start,
- end: flex-end,
- center: center,
- between: space-between,
- around: space-around,
- stretch: stretch,
- )
- ),
- "align-self": (
- responsive: true,
- property: align-self,
- values: (
- auto: auto,
- start: flex-start,
- end: flex-end,
- center: center,
- baseline: baseline,
- stretch: stretch,
- )
- ),
- "order": (
- responsive: true,
- property: order,
- values: (
- first: -1,
- 0: 0,
- 1: 1,
- 2: 2,
- 3: 3,
- 4: 4,
- 5: 5,
- last: 6,
- ),
- ),
- // scss-docs-end utils-flex
- // Margin utilities
- // scss-docs-start utils-spacing
- "margin": (
- responsive: true,
- property: margin,
- class: m,
- values: map-merge($spacers, (auto: auto))
- ),
- "margin-x": (
- responsive: true,
- property: margin-right margin-left,
- class: mx,
- values: map-merge($spacers, (auto: auto))
- ),
- "margin-y": (
- responsive: true,
- property: margin-top margin-bottom,
- class: my,
- values: map-merge($spacers, (auto: auto))
- ),
- "margin-top": (
- responsive: true,
- property: margin-top,
- class: mt,
- values: map-merge($spacers, (auto: auto))
- ),
- "margin-end": (
- responsive: true,
- property: margin-right,
- class: me,
- values: map-merge($spacers, (auto: auto))
- ),
- "margin-bottom": (
- responsive: true,
- property: margin-bottom,
- class: mb,
- values: map-merge($spacers, (auto: auto))
- ),
- "margin-start": (
- responsive: true,
- property: margin-left,
- class: ms,
- values: map-merge($spacers, (auto: auto))
- ),
- // Negative margin utilities
- "negative-margin": (
- responsive: true,
- property: margin,
- class: m,
- values: $negative-spacers
- ),
- "negative-margin-x": (
- responsive: true,
- property: margin-right margin-left,
- class: mx,
- values: $negative-spacers
- ),
- "negative-margin-y": (
- responsive: true,
- property: margin-top margin-bottom,
- class: my,
- values: $negative-spacers
- ),
- "negative-margin-top": (
- responsive: true,
- property: margin-top,
- class: mt,
- values: $negative-spacers
- ),
- "negative-margin-end": (
- responsive: true,
- property: margin-right,
- class: me,
- values: $negative-spacers
- ),
- "negative-margin-bottom": (
- responsive: true,
- property: margin-bottom,
- class: mb,
- values: $negative-spacers
- ),
- "negative-margin-start": (
- responsive: true,
- property: margin-left,
- class: ms,
- values: $negative-spacers
- ),
- // Padding utilities
- "padding": (
- responsive: true,
- property: padding,
- class: p,
- values: $spacers
- ),
- "padding-x": (
- responsive: true,
- property: padding-right padding-left,
- class: px,
- values: $spacers
- ),
- "padding-y": (
- responsive: true,
- property: padding-top padding-bottom,
- class: py,
- values: $spacers
- ),
- "padding-top": (
- responsive: true,
- property: padding-top,
- class: pt,
- values: $spacers
- ),
- "padding-end": (
- responsive: true,
- property: padding-right,
- class: pe,
- values: $spacers
- ),
- "padding-bottom": (
- responsive: true,
- property: padding-bottom,
- class: pb,
- values: $spacers
- ),
- "padding-start": (
- responsive: true,
- property: padding-left,
- class: ps,
- values: $spacers
- ),
- // scss-docs-end utils-spacing
- // Text
- // scss-docs-start utils-text
- "font-family": (
- property: font-family,
- class: font,
- values: (monospace: var(--#{$variable-prefix}font-monospace))
- ),
- "font-size": (
- rfs: true,
- property: font-size,
- class: fs,
- values: $font-sizes
- ),
- "font-style": (
- property: font-style,
- class: fst,
- values: italic normal
- ),
- "font-weight": (
- property: font-weight,
- class: fw,
- values: (
- light: $font-weight-light,
- lighter: $font-weight-lighter,
- normal: $font-weight-normal,
- bold: $font-weight-bold,
- bolder: $font-weight-bolder
- )
- ),
- "line-height": (
- property: line-height,
- class: lh,
- values: (
- 1: 1,
- sm: $line-height-sm,
- base: $line-height-base,
- lg: $line-height-lg,
- )
- ),
- "text-align": (
- responsive: true,
- property: text-align,
- class: text,
- values: (
- start: left,
- end: right,
- center: center,
- )
- ),
- "text-decoration": (
- property: text-decoration,
- values: none underline line-through
- ),
- "text-transform": (
- property: text-transform,
- class: text,
- values: lowercase uppercase capitalize
- ),
- "white-space": (
- property: white-space,
- class: text,
- values: (
- wrap: normal,
- nowrap: nowrap,
- )
- ),
- "word-wrap": (
- property: word-wrap word-break,
- class: text,
- values: (break: break-word),
- rtl: false
- ),
- // scss-docs-end utils-text
- // scss-docs-start utils-color
- "color": (
- property: color,
- class: text,
- values: map-merge(
- $theme-colors,
- (
- "white": $white,
- "body": $body-color,
- "muted": $text-muted,
- "black-50": rgba($black, .5),
- "white-50": rgba($white, .5),
- "reset": inherit,
- )
- )
- ),
- // scss-docs-end utils-color
- // scss-docs-start utils-bg-color
- "background-color": (
- property: background-color,
- class: bg,
- values: map-merge(
- $theme-colors,
- (
- "body": $body-bg,
- "white": $white,
- "transparent": transparent
- )
- )
- ),
- // scss-docs-end utils-bg-color
- "gradient": (
- property: background-image,
- class: bg,
- values: (gradient: var(--#{$variable-prefix}gradient))
- ),
- // scss-docs-start utils-interaction
- "user-select": (
- property: user-select,
- values: all auto none
- ),
- "pointer-events": (
- property: pointer-events,
- class: pe,
- values: none auto,
- ),
- // scss-docs-end utils-interaction
- // scss-docs-start utils-border-radius
- "rounded": (
- property: border-radius,
- class: rounded,
- values: (
- null: $border-radius,
- 0: 0,
- 1: $border-radius-sm,
- 2: $border-radius,
- 3: $border-radius-lg,
- circle: 50%,
- pill: $border-radius-pill
- )
- ),
- "rounded-top": (
- property: border-top-left-radius border-top-right-radius,
- class: rounded-top,
- values: (null: $border-radius)
- ),
- "rounded-end": (
- property: border-top-right-radius border-bottom-right-radius,
- class: rounded-end,
- values: (null: $border-radius)
- ),
- "rounded-bottom": (
- property: border-bottom-right-radius border-bottom-left-radius,
- class: rounded-bottom,
- values: (null: $border-radius)
- ),
- "rounded-start": (
- property: border-bottom-left-radius border-top-left-radius,
- class: rounded-start,
- values: (null: $border-radius)
- ),
- // scss-docs-end utils-border-radius
- // scss-docs-start utils-visibility
- "visibility": (
- property: visibility,
- class: null,
- values: (
- visible: visible,
- invisible: hidden,
- )
- )
- // scss-docs-end utils-visibility
- ),
- $utilities
-);
diff --git a/sass/bootstrap/scss/_variables.scss b/sass/bootstrap/scss/_variables.scss
deleted file mode 100644
index 7558224..0000000
--- a/sass/bootstrap/scss/_variables.scss
+++ /dev/null
@@ -1,1464 +0,0 @@
-// Variables
-//
-// Variables should follow the `$component-state-property-size` formula for
-// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.
-
-// Color system
-
-// scss-docs-start gray-color-variables
-$white: #fff !default;
-$gray-100: #f8f9fa !default;
-$gray-200: #e9ecef !default;
-$gray-300: #dee2e6 !default;
-$gray-400: #ced4da !default;
-$gray-500: #adb5bd !default;
-$gray-600: #6c757d !default;
-$gray-700: #495057 !default;
-$gray-800: #343a40 !default;
-$gray-900: #212529 !default;
-$black: #000 !default;
-// scss-docs-end gray-color-variables
-
-// fusv-disable
-// scss-docs-start gray-colors-map
-$grays: (
- "100": $gray-100,
- "200": $gray-200,
- "300": $gray-300,
- "400": $gray-400,
- "500": $gray-500,
- "600": $gray-600,
- "700": $gray-700,
- "800": $gray-800,
- "900": $gray-900
-) !default;
-// scss-docs-end gray-colors-map
-// fusv-enable
-
-// scss-docs-start color-variables
-$blue: #0d6efd !default;
-$indigo: #6610f2 !default;
-$purple: #6f42c1 !default;
-$pink: #d63384 !default;
-$red: #dc3545 !default;
-$orange: #fd7e14 !default;
-$yellow: #ffc107 !default;
-$green: #198754 !default;
-$teal: #20c997 !default;
-$cyan: #0dcaf0 !default;
-// scss-docs-end color-variables
-
-// scss-docs-start colors-map
-$colors: (
- "blue": $blue,
- "indigo": $indigo,
- "purple": $purple,
- "pink": $pink,
- "red": $red,
- "orange": $orange,
- "yellow": $yellow,
- "green": $green,
- "teal": $teal,
- "cyan": $cyan,
- "white": $white,
- "gray": $gray-600,
- "gray-dark": $gray-800
-) !default;
-// scss-docs-end colors-map
-
-// scss-docs-start theme-color-variables
-$primary: $blue !default;
-$secondary: $gray-600 !default;
-$success: $green !default;
-$info: $cyan !default;
-$warning: $yellow !default;
-$danger: $red !default;
-$light: $gray-100 !default;
-$dark: $gray-900 !default;
-// scss-docs-end theme-color-variables
-
-// scss-docs-start theme-colors-map
-$theme-colors: (
- "primary": $primary,
- "secondary": $secondary,
- "success": $success,
- "info": $info,
- "warning": $warning,
- "danger": $danger,
- "light": $light,
- "dark": $dark
-) !default;
-// scss-docs-end theme-colors-map
-
-// The contrast ratio to reach against white, to determine if color changes from "light" to "dark". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.
-// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast
-$min-contrast-ratio: 4.5 !default;
-
-// Customize the light and dark text colors for use in our color contrast function.
-$color-contrast-dark: $black !default;
-$color-contrast-light: $white !default;
-
-// fusv-disable
-$blue-100: tint-color($blue, 80%) !default;
-$blue-200: tint-color($blue, 60%) !default;
-$blue-300: tint-color($blue, 40%) !default;
-$blue-400: tint-color($blue, 20%) !default;
-$blue-500: $blue !default;
-$blue-600: shade-color($blue, 20%) !default;
-$blue-700: shade-color($blue, 40%) !default;
-$blue-800: shade-color($blue, 60%) !default;
-$blue-900: shade-color($blue, 80%) !default;
-
-$indigo-100: tint-color($indigo, 80%) !default;
-$indigo-200: tint-color($indigo, 60%) !default;
-$indigo-300: tint-color($indigo, 40%) !default;
-$indigo-400: tint-color($indigo, 20%) !default;
-$indigo-500: $indigo !default;
-$indigo-600: shade-color($indigo, 20%) !default;
-$indigo-700: shade-color($indigo, 40%) !default;
-$indigo-800: shade-color($indigo, 60%) !default;
-$indigo-900: shade-color($indigo, 80%) !default;
-
-$purple-100: tint-color($purple, 80%) !default;
-$purple-200: tint-color($purple, 60%) !default;
-$purple-300: tint-color($purple, 40%) !default;
-$purple-400: tint-color($purple, 20%) !default;
-$purple-500: $purple !default;
-$purple-600: shade-color($purple, 20%) !default;
-$purple-700: shade-color($purple, 40%) !default;
-$purple-800: shade-color($purple, 60%) !default;
-$purple-900: shade-color($purple, 80%) !default;
-
-$pink-100: tint-color($pink, 80%) !default;
-$pink-200: tint-color($pink, 60%) !default;
-$pink-300: tint-color($pink, 40%) !default;
-$pink-400: tint-color($pink, 20%) !default;
-$pink-500: $pink !default;
-$pink-600: shade-color($pink, 20%) !default;
-$pink-700: shade-color($pink, 40%) !default;
-$pink-800: shade-color($pink, 60%) !default;
-$pink-900: shade-color($pink, 80%) !default;
-
-$red-100: tint-color($red, 80%) !default;
-$red-200: tint-color($red, 60%) !default;
-$red-300: tint-color($red, 40%) !default;
-$red-400: tint-color($red, 20%) !default;
-$red-500: $red !default;
-$red-600: shade-color($red, 20%) !default;
-$red-700: shade-color($red, 40%) !default;
-$red-800: shade-color($red, 60%) !default;
-$red-900: shade-color($red, 80%) !default;
-
-$orange-100: tint-color($orange, 80%) !default;
-$orange-200: tint-color($orange, 60%) !default;
-$orange-300: tint-color($orange, 40%) !default;
-$orange-400: tint-color($orange, 20%) !default;
-$orange-500: $orange !default;
-$orange-600: shade-color($orange, 20%) !default;
-$orange-700: shade-color($orange, 40%) !default;
-$orange-800: shade-color($orange, 60%) !default;
-$orange-900: shade-color($orange, 80%) !default;
-
-$yellow-100: tint-color($yellow, 80%) !default;
-$yellow-200: tint-color($yellow, 60%) !default;
-$yellow-300: tint-color($yellow, 40%) !default;
-$yellow-400: tint-color($yellow, 20%) !default;
-$yellow-500: $yellow !default;
-$yellow-600: shade-color($yellow, 20%) !default;
-$yellow-700: shade-color($yellow, 40%) !default;
-$yellow-800: shade-color($yellow, 60%) !default;
-$yellow-900: shade-color($yellow, 80%) !default;
-
-$green-100: tint-color($green, 80%) !default;
-$green-200: tint-color($green, 60%) !default;
-$green-300: tint-color($green, 40%) !default;
-$green-400: tint-color($green, 20%) !default;
-$green-500: $green !default;
-$green-600: shade-color($green, 20%) !default;
-$green-700: shade-color($green, 40%) !default;
-$green-800: shade-color($green, 60%) !default;
-$green-900: shade-color($green, 80%) !default;
-
-$teal-100: tint-color($teal, 80%) !default;
-$teal-200: tint-color($teal, 60%) !default;
-$teal-300: tint-color($teal, 40%) !default;
-$teal-400: tint-color($teal, 20%) !default;
-$teal-500: $teal !default;
-$teal-600: shade-color($teal, 20%) !default;
-$teal-700: shade-color($teal, 40%) !default;
-$teal-800: shade-color($teal, 60%) !default;
-$teal-900: shade-color($teal, 80%) !default;
-
-$cyan-100: tint-color($cyan, 80%) !default;
-$cyan-200: tint-color($cyan, 60%) !default;
-$cyan-300: tint-color($cyan, 40%) !default;
-$cyan-400: tint-color($cyan, 20%) !default;
-$cyan-500: $cyan !default;
-$cyan-600: shade-color($cyan, 20%) !default;
-$cyan-700: shade-color($cyan, 40%) !default;
-$cyan-800: shade-color($cyan, 60%) !default;
-$cyan-900: shade-color($cyan, 80%) !default;
-// fusv-enable
-
-// Characters which are escaped by the escape-svg function
-$escaped-characters: (
- ("<", "%3c"),
- (">", "%3e"),
- ("#", "%23"),
- ("(", "%28"),
- (")", "%29"),
-) !default;
-
-// Options
-//
-// Quickly modify global styling by enabling or disabling optional features.
-
-$enable-caret: true !default;
-$enable-rounded: true !default;
-$enable-shadows: false !default;
-$enable-gradients: false !default;
-$enable-transitions: true !default;
-$enable-reduced-motion: true !default;
-$enable-smooth-scroll: true !default;
-$enable-grid-classes: true !default;
-$enable-button-pointers: true !default;
-$enable-rfs: true !default;
-$enable-validation-icons: true !default;
-$enable-negative-margins: false !default;
-$enable-deprecation-messages: true !default;
-$enable-important-utilities: true !default;
-
-// Prefix for :root CSS variables
-
-$variable-prefix: bs- !default;
-
-// Gradient
-//
-// The gradient which is added to components if `$enable-gradients` is `true`
-// This gradient is also added to elements with `.bg-gradient`
-// scss-docs-start variable-gradient
-$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;
-// scss-docs-end variable-gradient
-
-// Spacing
-//
-// Control the default styling of most Bootstrap elements by modifying these
-// variables. Mostly focused on spacing.
-// You can add more entries to the $spacers map, should you need more variation.
-
-// scss-docs-start spacer-variables-maps
-$spacer: 1rem !default;
-$spacers: (
- 0: 0,
- 1: $spacer / 4,
- 2: $spacer / 2,
- 3: $spacer,
- 4: $spacer * 1.5,
- 5: $spacer * 3,
-) !default;
-
-$negative-spacers: if($enable-negative-margins, negativify-map($spacers), null) !default;
-// scss-docs-end spacer-variables-maps
-
-// Position
-//
-// Define the edge positioning anchors of the position utilities.
-
-// scss-docs-start position-map
-$position-values: (
- 0: 0,
- 50: 50%,
- 100: 100%
-) !default;
-// scss-docs-end position-map
-
-// Body
-//
-// Settings for the `` element.
-
-$body-bg: $white !default;
-$body-color: $gray-900 !default;
-$body-text-align: null !default;
-
-
-// Links
-//
-// Style anchor elements.
-
-$link-color: $primary !default;
-$link-decoration: underline !default;
-$link-shade-percentage: 20% !default;
-$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;
-$link-hover-decoration: null !default;
-
-$stretched-link-pseudo-element: after !default;
-$stretched-link-z-index: 1 !default;
-
-// Paragraphs
-//
-// Style p element.
-
-$paragraph-margin-bottom: 1rem !default;
-
-
-// Grid breakpoints
-//
-// Define the minimum dimensions at which your layout will change,
-// adapting to different screen sizes, for use in media queries.
-
-// scss-docs-start grid-breakpoints
-$grid-breakpoints: (
- xs: 0,
- sm: 576px,
- md: 768px,
- lg: 992px,
- xl: 1200px,
- xxl: 1400px
-) !default;
-// scss-docs-end grid-breakpoints
-
-@include _assert-ascending($grid-breakpoints, "$grid-breakpoints");
-@include _assert-starts-at-zero($grid-breakpoints, "$grid-breakpoints");
-
-
-// Grid containers
-//
-// Define the maximum width of `.container` for different screen sizes.
-
-// scss-docs-start container-max-widths
-$container-max-widths: (
- sm: 540px,
- md: 720px,
- lg: 960px,
- xl: 1140px,
- xxl: 1320px
-) !default;
-// scss-docs-end container-max-widths
-
-@include _assert-ascending($container-max-widths, "$container-max-widths");
-
-
-// Grid columns
-//
-// Set the number of columns and specify the width of the gutters.
-
-$grid-columns: 12 !default;
-$grid-gutter-width: 1.5rem !default;
-$grid-row-columns: 6 !default;
-
-$gutters: $spacers !default;
-
-// Container padding
-
-$container-padding-x: $grid-gutter-width / 2 !default;
-
-
-// Components
-//
-// Define common padding and border radius sizes and more.
-
-// scss-docs-start border-variables
-$border-width: 1px !default;
-$border-widths: (
- 1: 1px,
- 2: 2px,
- 3: 3px,
- 4: 4px,
- 5: 5px
-) !default;
-
-$border-color: $gray-300 !default;
-// scss-docs-end border-variables
-
-// scss-docs-start border-radius-variables
-$border-radius: .25rem !default;
-$border-radius-sm: .2rem !default;
-$border-radius-lg: .3rem !default;
-$border-radius-pill: 50rem !default;
-// scss-docs-end border-radius-variables
-
-// scss-docs-start box-shadow-variables
-$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;
-$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;
-$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;
-$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;
-// scss-docs-end box-shadow-variables
-
-$component-active-color: $white !default;
-$component-active-bg: $primary !default;
-
-// scss-docs-start caret-variables
-$caret-width: .3em !default;
-$caret-vertical-align: $caret-width * .85 !default;
-$caret-spacing: $caret-width * .85 !default;
-// scss-docs-end caret-variables
-
-$transition-base: all .2s ease-in-out !default;
-$transition-fade: opacity .15s linear !default;
-// scss-docs-start collapse-transition
-$transition-collapse: height .35s ease !default;
-// scss-docs-end collapse-transition
-
-// stylelint-disable function-disallowed-list
-// scss-docs-start aspect-ratios
-$aspect-ratios: (
- "1x1": 100%,
- "4x3": calc(3 / 4 * 100%),
- "16x9": calc(9 / 16 * 100%),
- "21x9": calc(9 / 21 * 100%)
-) !default;
-// scss-docs-end aspect-ratios
-// stylelint-enable function-disallowed-list
-
-// Typography
-//
-// Font, line-height, and color for body text, headings, and more.
-
-// scss-docs-start font-variables
-// stylelint-disable value-keyword-case
-$font-family-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default;
-$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !default;
-// stylelint-enable value-keyword-case
-$font-family-base: var(--#{$variable-prefix}font-sans-serif) !default;
-$font-family-code: var(--#{$variable-prefix}font-monospace) !default;
-
-// $font-size-root effects the value of `rem`, which is used for as well font sizes, paddings and margins
-// $font-size-base effects the font size of the body text
-$font-size-root: null !default;
-$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`
-$font-size-sm: $font-size-base * .875 !default;
-$font-size-lg: $font-size-base * 1.25 !default;
-
-$font-weight-lighter: lighter !default;
-$font-weight-light: 300 !default;
-$font-weight-normal: 400 !default;
-$font-weight-bold: 700 !default;
-$font-weight-bolder: bolder !default;
-
-$font-weight-base: $font-weight-normal !default;
-
-$line-height-base: 1.5 !default;
-$line-height-sm: 1.25 !default;
-$line-height-lg: 2 !default;
-
-$h1-font-size: $font-size-base * 2.5 !default;
-$h2-font-size: $font-size-base * 2 !default;
-$h3-font-size: $font-size-base * 1.75 !default;
-$h4-font-size: $font-size-base * 1.5 !default;
-$h5-font-size: $font-size-base * 1.25 !default;
-$h6-font-size: $font-size-base !default;
-// scss-docs-end font-variables
-
-// scss-docs-start font-sizes
-$font-sizes: (
- 1: $h1-font-size,
- 2: $h2-font-size,
- 3: $h3-font-size,
- 4: $h4-font-size,
- 5: $h5-font-size,
- 6: $h6-font-size
-) !default;
-// scss-docs-end font-sizes
-
-// scss-docs-start headings-variables
-$headings-margin-bottom: $spacer / 2 !default;
-$headings-font-family: null !default;
-$headings-font-style: null !default;
-$headings-font-weight: 500 !default;
-$headings-line-height: 1.2 !default;
-$headings-color: null !default;
-// scss-docs-end headings-variables
-
-// scss-docs-start display-headings
-$display-font-sizes: (
- 1: 5rem,
- 2: 4.5rem,
- 3: 4rem,
- 4: 3.5rem,
- 5: 3rem,
- 6: 2.5rem
-) !default;
-
-$display-font-weight: 300 !default;
-$display-line-height: $headings-line-height !default;
-// scss-docs-end display-headings
-
-// scss-docs-start type-variables
-$lead-font-size: $font-size-base * 1.25 !default;
-$lead-font-weight: 300 !default;
-
-$small-font-size: .875em !default;
-
-$sub-sup-font-size: .75em !default;
-
-$text-muted: $gray-600 !default;
-
-$initialism-font-size: $small-font-size !default;
-
-$blockquote-margin-y: $spacer !default;
-$blockquote-font-size: $font-size-base * 1.25 !default;
-$blockquote-footer-color: $gray-600 !default;
-$blockquote-footer-font-size: $small-font-size !default;
-
-$hr-margin-y: $spacer !default;
-$hr-color: inherit !default;
-$hr-height: $border-width !default;
-$hr-opacity: .25 !default;
-
-$legend-margin-bottom: .5rem !default;
-$legend-font-size: 1.5rem !default;
-$legend-font-weight: null !default;
-
-$mark-padding: .2em !default;
-
-$dt-font-weight: $font-weight-bold !default;
-
-$nested-kbd-font-weight: $font-weight-bold !default;
-
-$list-inline-padding: .5rem !default;
-
-$mark-bg: #fcf8e3 !default;
-// scss-docs-end type-variables
-
-
-// Tables
-//
-// Customizes the `.table` component with basic values, each used across all table variations.
-
-// scss-docs-start table-variables
-$table-cell-padding-y: .5rem !default;
-$table-cell-padding-x: .5rem !default;
-$table-cell-padding-y-sm: .25rem !default;
-$table-cell-padding-x-sm: .25rem !default;
-
-$table-cell-vertical-align: top !default;
-
-$table-color: $body-color !default;
-$table-bg: transparent !default;
-
-$table-th-font-weight: null !default;
-
-$table-striped-color: $table-color !default;
-$table-striped-bg-factor: .05 !default;
-$table-striped-bg: rgba($black, $table-striped-bg-factor) !default;
-
-$table-active-color: $table-color !default;
-$table-active-bg-factor: .1 !default;
-$table-active-bg: rgba($black, $table-active-bg-factor) !default;
-
-$table-hover-color: $table-color !default;
-$table-hover-bg-factor: .075 !default;
-$table-hover-bg: rgba($black, $table-hover-bg-factor) !default;
-
-$table-border-factor: .1 !default;
-$table-border-width: $border-width !default;
-$table-border-color: $border-color !default;
-
-$table-striped-order: odd !default;
-
-$table-group-separator-color: currentColor !default;
-
-$table-caption-color: $text-muted !default;
-
-$table-bg-scale: -80% !default;
-// scss-docs-end table-variables
-
-// scss-docs-start table-loop
-$table-variants: (
- "primary": shift-color($primary, $table-bg-scale),
- "secondary": shift-color($secondary, $table-bg-scale),
- "success": shift-color($success, $table-bg-scale),
- "info": shift-color($info, $table-bg-scale),
- "warning": shift-color($warning, $table-bg-scale),
- "danger": shift-color($danger, $table-bg-scale),
- "light": $light,
- "dark": $dark,
-) !default;
-// scss-docs-end table-loop
-
-
-// Buttons + Forms
-//
-// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.
-
-// scss-docs-start input-btn-variables
-$input-btn-padding-y: .375rem !default;
-$input-btn-padding-x: .75rem !default;
-$input-btn-font-family: null !default;
-$input-btn-font-size: $font-size-base !default;
-$input-btn-line-height: $line-height-base !default;
-
-$input-btn-focus-width: .25rem !default;
-$input-btn-focus-color-opacity: .25 !default;
-$input-btn-focus-color: rgba($component-active-bg, $input-btn-focus-color-opacity) !default;
-$input-btn-focus-blur: 0 !default;
-$input-btn-focus-box-shadow: 0 0 $input-btn-focus-blur $input-btn-focus-width $input-btn-focus-color !default;
-
-$input-btn-padding-y-sm: .25rem !default;
-$input-btn-padding-x-sm: .5rem !default;
-$input-btn-font-size-sm: $font-size-sm !default;
-
-$input-btn-padding-y-lg: .5rem !default;
-$input-btn-padding-x-lg: 1rem !default;
-$input-btn-font-size-lg: $font-size-lg !default;
-
-$input-btn-border-width: $border-width !default;
-// scss-docs-end input-btn-variables
-
-
-// Buttons
-//
-// For each of Bootstrap's buttons, define text, background, and border color.
-
-// scss-docs-start btn-variables
-$btn-padding-y: $input-btn-padding-y !default;
-$btn-padding-x: $input-btn-padding-x !default;
-$btn-font-family: $input-btn-font-family !default;
-$btn-font-size: $input-btn-font-size !default;
-$btn-line-height: $input-btn-line-height !default;
-$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping
-
-$btn-padding-y-sm: $input-btn-padding-y-sm !default;
-$btn-padding-x-sm: $input-btn-padding-x-sm !default;
-$btn-font-size-sm: $input-btn-font-size-sm !default;
-
-$btn-padding-y-lg: $input-btn-padding-y-lg !default;
-$btn-padding-x-lg: $input-btn-padding-x-lg !default;
-$btn-font-size-lg: $input-btn-font-size-lg !default;
-
-$btn-border-width: $input-btn-border-width !default;
-
-$btn-font-weight: $font-weight-normal !default;
-$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;
-$btn-focus-width: $input-btn-focus-width !default;
-$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;
-$btn-disabled-opacity: .65 !default;
-$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;
-
-$btn-link-color: $link-color !default;
-$btn-link-hover-color: $link-hover-color !default;
-$btn-link-disabled-color: $gray-600 !default;
-
-// Allows for customizing button radius independently from global border radius
-$btn-border-radius: $border-radius !default;
-$btn-border-radius-sm: $border-radius-sm !default;
-$btn-border-radius-lg: $border-radius-lg !default;
-
-$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
-
-$btn-hover-bg-shade-amount: 15% !default;
-$btn-hover-bg-tint-amount: 15% !default;
-$btn-hover-border-shade-amount: 20% !default;
-$btn-hover-border-tint-amount: 10% !default;
-$btn-active-bg-shade-amount: 20% !default;
-$btn-active-bg-tint-amount: 20% !default;
-$btn-active-border-shade-amount: 25% !default;
-$btn-active-border-tint-amount: 10% !default;
-// scss-docs-end btn-variables
-
-
-// Forms
-
-// scss-docs-start form-text-variables
-$form-text-margin-top: .25rem !default;
-$form-text-font-size: $small-font-size !default;
-$form-text-font-style: null !default;
-$form-text-font-weight: null !default;
-$form-text-color: $text-muted !default;
-// scss-docs-end form-text-variables
-
-// scss-docs-start form-label-variables
-$form-label-margin-bottom: .5rem !default;
-$form-label-font-size: null !default;
-$form-label-font-style: null !default;
-$form-label-font-weight: null !default;
-$form-label-color: null !default;
-// scss-docs-end form-label-variables
-
-// scss-docs-start form-input-variables
-$input-padding-y: $input-btn-padding-y !default;
-$input-padding-x: $input-btn-padding-x !default;
-$input-font-family: $input-btn-font-family !default;
-$input-font-size: $input-btn-font-size !default;
-$input-font-weight: $font-weight-base !default;
-$input-line-height: $input-btn-line-height !default;
-
-$input-padding-y-sm: $input-btn-padding-y-sm !default;
-$input-padding-x-sm: $input-btn-padding-x-sm !default;
-$input-font-size-sm: $input-btn-font-size-sm !default;
-
-$input-padding-y-lg: $input-btn-padding-y-lg !default;
-$input-padding-x-lg: $input-btn-padding-x-lg !default;
-$input-font-size-lg: $input-btn-font-size-lg !default;
-
-$input-bg: $white !default;
-$input-disabled-bg: $gray-200 !default;
-$input-disabled-border-color: null !default;
-
-$input-color: $body-color !default;
-$input-border-color: $gray-400 !default;
-$input-border-width: $input-btn-border-width !default;
-$input-box-shadow: $box-shadow-inset !default;
-
-$input-border-radius: $border-radius !default;
-$input-border-radius-sm: $border-radius-sm !default;
-$input-border-radius-lg: $border-radius-lg !default;
-
-$input-focus-bg: $input-bg !default;
-$input-focus-border-color: tint-color($component-active-bg, 50%) !default;
-$input-focus-color: $input-color !default;
-$input-focus-width: $input-btn-focus-width !default;
-$input-focus-box-shadow: $input-btn-focus-box-shadow !default;
-
-$input-placeholder-color: $gray-600 !default;
-$input-plaintext-color: $body-color !default;
-
-$input-height-border: $input-border-width * 2 !default;
-
-$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;
-$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;
-$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y / 2) !default;
-
-$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;
-$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;
-$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;
-
-$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
-// scss-docs-end form-input-variables
-
-// scss-docs-start form-check-variables
-$form-check-input-width: 1em !default;
-$form-check-min-height: $font-size-base * $line-height-base !default;
-$form-check-padding-start: $form-check-input-width + .5em !default;
-$form-check-margin-bottom: .125rem !default;
-$form-check-label-color: null !default;
-$form-check-label-cursor: null !default;
-$form-check-transition: null !default;
-
-$form-check-input-active-filter: brightness(90%) !default;
-
-$form-check-input-bg: $input-bg !default;
-$form-check-input-border: 1px solid rgba(0, 0, 0, .25) !default;
-$form-check-input-border-radius: .25em !default;
-$form-check-radio-border-radius: 50% !default;
-$form-check-input-focus-border: $input-focus-border-color !default;
-$form-check-input-focus-box-shadow: $input-btn-focus-box-shadow !default;
-
-$form-check-input-checked-color: $component-active-color !default;
-$form-check-input-checked-bg-color: $component-active-bg !default;
-$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;
-$form-check-input-checked-bg-image: url("data:image/svg+xml,
") !default;
-$form-check-radio-checked-bg-image: url("data:image/svg+xml,
") !default;
-
-$form-check-input-indeterminate-color: $component-active-color !default;
-$form-check-input-indeterminate-bg-color: $component-active-bg !default;
-$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;
-$form-check-input-indeterminate-bg-image: url("data:image/svg+xml,
") !default;
-
-$form-check-input-disabled-opacity: .5 !default;
-$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;
-$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;
-
-$form-check-inline-margin-end: 1rem !default;
-// scss-docs-end form-check-variables
-
-// scss-docs-start form-switch-variables
-$form-switch-color: rgba(0, 0, 0, .25) !default;
-$form-switch-width: 2em !default;
-$form-switch-padding-start: $form-switch-width + .5em !default;
-$form-switch-bg-image: url("data:image/svg+xml,
") !default;
-$form-switch-border-radius: $form-switch-width !default;
-$form-switch-transition: background-position .15s ease-in-out !default;
-
-$form-switch-focus-color: $input-focus-border-color !default;
-$form-switch-focus-bg-image: url("data:image/svg+xml,
") !default;
-
-$form-switch-checked-color: $component-active-color !default;
-$form-switch-checked-bg-image: url("data:image/svg+xml,
") !default;
-$form-switch-checked-bg-position: right center !default;
-// scss-docs-end form-switch-variables
-
-// scss-docs-start input-group-variables
-$input-group-addon-padding-y: $input-padding-y !default;
-$input-group-addon-padding-x: $input-padding-x !default;
-$input-group-addon-font-weight: $input-font-weight !default;
-$input-group-addon-color: $input-color !default;
-$input-group-addon-bg: $gray-200 !default;
-$input-group-addon-border-color: $input-border-color !default;
-// scss-docs-end input-group-variables
-
-// scss-docs-start form-select-variables
-$form-select-padding-y: $input-padding-y !default;
-$form-select-padding-x: $input-padding-x !default;
-$form-select-font-family: $input-font-family !default;
-$form-select-font-size: $input-font-size !default;
-$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image
-$form-select-font-weight: $input-font-weight !default;
-$form-select-line-height: $input-line-height !default;
-$form-select-color: $input-color !default;
-$form-select-bg: $input-bg !default;
-$form-select-disabled-color: null !default;
-$form-select-disabled-bg: $gray-200 !default;
-$form-select-disabled-border-color: $input-disabled-border-color !default;
-$form-select-bg-position: right $form-select-padding-x center !default;
-$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions
-$form-select-indicator-color: $gray-800 !default;
-$form-select-indicator: url("data:image/svg+xml,
") !default;
-
-$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;
-$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;
-$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;
-
-$form-select-border-width: $input-border-width !default;
-$form-select-border-color: $input-border-color !default;
-$form-select-border-radius: $border-radius !default;
-$form-select-box-shadow: $box-shadow-inset !default;
-
-$form-select-focus-border-color: $input-focus-border-color !default;
-$form-select-focus-width: $input-focus-width !default;
-$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;
-
-$form-select-padding-y-sm: $input-padding-y-sm !default;
-$form-select-padding-x-sm: $input-padding-x-sm !default;
-$form-select-font-size-sm: $input-font-size-sm !default;
-
-$form-select-padding-y-lg: $input-padding-y-lg !default;
-$form-select-padding-x-lg: $input-padding-x-lg !default;
-$form-select-font-size-lg: $input-font-size-lg !default;
-// scss-docs-end form-select-variables
-
-// scss-docs-start form-range-variables
-$form-range-track-width: 100% !default;
-$form-range-track-height: .5rem !default;
-$form-range-track-cursor: pointer !default;
-$form-range-track-bg: $gray-300 !default;
-$form-range-track-border-radius: 1rem !default;
-$form-range-track-box-shadow: $box-shadow-inset !default;
-
-$form-range-thumb-width: 1rem !default;
-$form-range-thumb-height: $form-range-thumb-width !default;
-$form-range-thumb-bg: $component-active-bg !default;
-$form-range-thumb-border: 0 !default;
-$form-range-thumb-border-radius: 1rem !default;
-$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;
-$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;
-$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge
-$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;
-$form-range-thumb-disabled-bg: $gray-500 !default;
-$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
-// scss-docs-end form-range-variables
-
-// scss-docs-start form-file-variables
-$form-file-button-color: $input-color !default;
-$form-file-button-bg: $input-group-addon-bg !default;
-$form-file-button-hover-bg: shade-color($form-file-button-bg, 5%) !default;
-// scss-docs-end form-file-variables
-
-// scss-docs-start form-floating-variables
-$form-floating-height: add(3.5rem, $input-height-border) !default;
-$form-floating-padding-x: $input-padding-x !default;
-$form-floating-padding-y: 1rem !default;
-$form-floating-input-padding-t: 1.625rem !default;
-$form-floating-input-padding-b: .625rem !default;
-$form-floating-label-opacity: .65 !default;
-$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;
-$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;
-// scss-docs-end form-floating-variables
-
-// Form validation
-
-// scss-docs-start form-feedback-variables
-$form-feedback-margin-top: $form-text-margin-top !default;
-$form-feedback-font-size: $form-text-font-size !default;
-$form-feedback-font-style: $form-text-font-style !default;
-$form-feedback-valid-color: $success !default;
-$form-feedback-invalid-color: $danger !default;
-
-$form-feedback-icon-valid-color: $form-feedback-valid-color !default;
-$form-feedback-icon-valid: url("data:image/svg+xml,
") !default;
-$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;
-$form-feedback-icon-invalid: url("data:image/svg+xml,
") !default;
-// scss-docs-end form-feedback-variables
-
-// scss-docs-start form-validation-states
-$form-validation-states: (
- "valid": (
- "color": $form-feedback-valid-color,
- "icon": $form-feedback-icon-valid
- ),
- "invalid": (
- "color": $form-feedback-invalid-color,
- "icon": $form-feedback-icon-invalid
- )
-) !default;
-// scss-docs-end form-validation-states
-
-// Z-index master list
-//
-// Warning: Avoid customizing these values. They're used for a bird's eye view
-// of components dependent on the z-axis and are designed to all work together.
-
-// scss-docs-start zindex-stack
-$zindex-dropdown: 1000 !default;
-$zindex-sticky: 1020 !default;
-$zindex-fixed: 1030 !default;
-$zindex-offcanvas: 1040 !default;
-$zindex-modal-backdrop: 1050 !default;
-$zindex-modal: 1060 !default;
-$zindex-popover: 1070 !default;
-$zindex-tooltip: 1080 !default;
-// scss-docs-end zindex-stack
-
-
-// Navs
-
-// scss-docs-start nav-variables
-$nav-link-padding-y: .5rem !default;
-$nav-link-padding-x: 1rem !default;
-$nav-link-font-size: null !default;
-$nav-link-font-weight: null !default;
-$nav-link-color: null !default;
-$nav-link-hover-color: null !default;
-$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;
-$nav-link-disabled-color: $gray-600 !default;
-
-$nav-tabs-border-color: $gray-300 !default;
-$nav-tabs-border-width: $border-width !default;
-$nav-tabs-border-radius: $border-radius !default;
-$nav-tabs-link-hover-border-color: $gray-200 $gray-200 $nav-tabs-border-color !default;
-$nav-tabs-link-active-color: $gray-700 !default;
-$nav-tabs-link-active-bg: $body-bg !default;
-$nav-tabs-link-active-border-color: $gray-300 $gray-300 $nav-tabs-link-active-bg !default;
-
-$nav-pills-border-radius: $border-radius !default;
-$nav-pills-link-active-color: $component-active-color !default;
-$nav-pills-link-active-bg: $component-active-bg !default;
-// scss-docs-end nav-variables
-
-
-// Navbar
-
-// scss-docs-start navbar-variables
-$navbar-padding-y: $spacer / 2 !default;
-$navbar-padding-x: null !default;
-
-$navbar-nav-link-padding-x: .5rem !default;
-
-$navbar-brand-font-size: $font-size-lg !default;
-// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link
-$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;
-$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;
-$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default;
-$navbar-brand-margin-end: 1rem !default;
-
-$navbar-toggler-padding-y: .25rem !default;
-$navbar-toggler-padding-x: .75rem !default;
-$navbar-toggler-font-size: $font-size-lg !default;
-$navbar-toggler-border-radius: $btn-border-radius !default;
-$navbar-toggler-focus-width: $btn-focus-width !default;
-$navbar-toggler-transition: box-shadow .15s ease-in-out !default;
-// scss-docs-end navbar-variables
-
-// scss-docs-start navbar-theme-variables
-$navbar-dark-color: rgba($white, .55) !default;
-$navbar-dark-hover-color: rgba($white, .75) !default;
-$navbar-dark-active-color: $white !default;
-$navbar-dark-disabled-color: rgba($white, .25) !default;
-$navbar-dark-toggler-icon-bg: url("data:image/svg+xml,
") !default;
-$navbar-dark-toggler-border-color: rgba($white, .1) !default;
-
-$navbar-light-color: rgba($black, .55) !default;
-$navbar-light-hover-color: rgba($black, .7) !default;
-$navbar-light-active-color: rgba($black, .9) !default;
-$navbar-light-disabled-color: rgba($black, .3) !default;
-$navbar-light-toggler-icon-bg: url("data:image/svg+xml,
") !default;
-$navbar-light-toggler-border-color: rgba($black, .1) !default;
-
-$navbar-light-brand-color: $navbar-light-active-color !default;
-$navbar-light-brand-hover-color: $navbar-light-active-color !default;
-$navbar-dark-brand-color: $navbar-dark-active-color !default;
-$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;
-// scss-docs-end navbar-theme-variables
-
-
-// Dropdowns
-//
-// Dropdown menu container and contents.
-
-// scss-docs-start dropdown-variables
-$dropdown-min-width: 10rem !default;
-$dropdown-padding-x: 0 !default;
-$dropdown-padding-y: .5rem !default;
-$dropdown-spacer: .125rem !default;
-$dropdown-font-size: $font-size-base !default;
-$dropdown-color: $body-color !default;
-$dropdown-bg: $white !default;
-$dropdown-border-color: rgba($black, .15) !default;
-$dropdown-border-radius: $border-radius !default;
-$dropdown-border-width: $border-width !default;
-$dropdown-inner-border-radius: subtract($dropdown-border-radius, $dropdown-border-width) !default;
-$dropdown-divider-bg: $dropdown-border-color !default;
-$dropdown-divider-margin-y: $spacer / 2 !default;
-$dropdown-box-shadow: $box-shadow !default;
-
-$dropdown-link-color: $gray-900 !default;
-$dropdown-link-hover-color: shade-color($gray-900, 10%) !default;
-$dropdown-link-hover-bg: $gray-200 !default;
-
-$dropdown-link-active-color: $component-active-color !default;
-$dropdown-link-active-bg: $component-active-bg !default;
-
-$dropdown-link-disabled-color: $gray-500 !default;
-
-$dropdown-item-padding-y: $spacer / 4 !default;
-$dropdown-item-padding-x: $spacer !default;
-
-$dropdown-header-color: $gray-600 !default;
-$dropdown-header-padding: $dropdown-padding-y $dropdown-item-padding-x !default;
-// scss-docs-end dropdown-variables
-
-// scss-docs-start dropdown-dark-variables
-$dropdown-dark-color: $gray-300 !default;
-$dropdown-dark-bg: $gray-800 !default;
-$dropdown-dark-border-color: $dropdown-border-color !default;
-$dropdown-dark-divider-bg: $dropdown-divider-bg !default;
-$dropdown-dark-box-shadow: null !default;
-$dropdown-dark-link-color: $dropdown-dark-color !default;
-$dropdown-dark-link-hover-color: $white !default;
-$dropdown-dark-link-hover-bg: rgba($white, .15) !default;
-$dropdown-dark-link-active-color: $dropdown-link-active-color !default;
-$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;
-$dropdown-dark-link-disabled-color: $gray-500 !default;
-$dropdown-dark-header-color: $gray-500 !default;
-// scss-docs-end dropdown-dark-variables
-
-
-// Pagination
-
-// scss-docs-start pagination-variables
-$pagination-padding-y: .375rem !default;
-$pagination-padding-x: .75rem !default;
-$pagination-padding-y-sm: .25rem !default;
-$pagination-padding-x-sm: .5rem !default;
-$pagination-padding-y-lg: .75rem !default;
-$pagination-padding-x-lg: 1.5rem !default;
-
-$pagination-color: $link-color !default;
-$pagination-bg: $white !default;
-$pagination-border-width: $border-width !default;
-$pagination-border-radius: $border-radius !default;
-$pagination-margin-start: -$pagination-border-width !default;
-$pagination-border-color: $gray-300 !default;
-
-$pagination-focus-color: $link-hover-color !default;
-$pagination-focus-bg: $gray-200 !default;
-$pagination-focus-box-shadow: $input-btn-focus-box-shadow !default;
-$pagination-focus-outline: 0 !default;
-
-$pagination-hover-color: $link-hover-color !default;
-$pagination-hover-bg: $gray-200 !default;
-$pagination-hover-border-color: $gray-300 !default;
-
-$pagination-active-color: $component-active-color !default;
-$pagination-active-bg: $component-active-bg !default;
-$pagination-active-border-color: $pagination-active-bg !default;
-
-$pagination-disabled-color: $gray-600 !default;
-$pagination-disabled-bg: $white !default;
-$pagination-disabled-border-color: $gray-300 !default;
-
-$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;
-
-$pagination-border-radius-sm: $border-radius-sm !default;
-$pagination-border-radius-lg: $border-radius-lg !default;
-// scss-docs-end pagination-variables
-
-
-// Cards
-
-// scss-docs-start card-variables
-$card-spacer-y: $spacer !default;
-$card-spacer-x: $spacer !default;
-$card-title-spacer-y: $spacer / 2 !default;
-$card-border-width: $border-width !default;
-$card-border-radius: $border-radius !default;
-$card-border-color: rgba($black, .125) !default;
-$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;
-$card-cap-padding-y: $card-spacer-y / 2 !default;
-$card-cap-padding-x: $card-spacer-x !default;
-$card-cap-bg: rgba($black, .03) !default;
-$card-cap-color: null !default;
-$card-height: null !default;
-$card-color: null !default;
-$card-bg: $white !default;
-$card-img-overlay-padding: $spacer !default;
-$card-group-margin: $grid-gutter-width / 2 !default;
-// scss-docs-end card-variables
-
-// Accordion
-
-// scss-docs-start accordion-variables
-$accordion-padding-y: 1rem !default;
-$accordion-padding-x: 1.25rem !default;
-$accordion-color: $body-color !default;
-$accordion-bg: $body-bg !default;
-$accordion-border-width: $border-width !default;
-$accordion-border-color: rgba($black, .125) !default;
-$accordion-border-radius: $border-radius !default;
-$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;
-
-$accordion-body-padding-y: $accordion-padding-y !default;
-$accordion-body-padding-x: $accordion-padding-x !default;
-
-$accordion-button-padding-y: $accordion-padding-y !default;
-$accordion-button-padding-x: $accordion-padding-x !default;
-$accordion-button-color: $accordion-color !default;
-$accordion-button-bg: $accordion-bg !default;
-$accordion-transition: $btn-transition, border-radius .15s ease !default;
-$accordion-button-active-bg: tint-color($component-active-bg, 90%) !default;
-$accordion-button-active-color: shade-color($primary, 10%) !default;
-
-$accordion-button-focus-border-color: $input-focus-border-color !default;
-$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;
-
-$accordion-icon-width: 1.25rem !default;
-$accordion-icon-color: $accordion-color !default;
-$accordion-icon-active-color: $accordion-button-active-color !default;
-$accordion-icon-transition: transform .2s ease-in-out !default;
-$accordion-icon-transform: rotate(180deg) !default;
-
-$accordion-button-icon: url("data:image/svg+xml,
") !default;
-$accordion-button-active-icon: url("data:image/svg+xml,
") !default;
-// scss-docs-end accordion-variables
-
-// Tooltips
-
-// scss-docs-start tooltip-variables
-$tooltip-font-size: $font-size-sm !default;
-$tooltip-max-width: 200px !default;
-$tooltip-color: $white !default;
-$tooltip-bg: $black !default;
-$tooltip-border-radius: $border-radius !default;
-$tooltip-opacity: .9 !default;
-$tooltip-padding-y: $spacer / 4 !default;
-$tooltip-padding-x: $spacer / 2 !default;
-$tooltip-margin: 0 !default;
-
-$tooltip-arrow-width: .8rem !default;
-$tooltip-arrow-height: .4rem !default;
-$tooltip-arrow-color: $tooltip-bg !default;
-// scss-docs-end tooltip-variables
-
-// Form tooltips must come after regular tooltips
-// scss-docs-start tooltip-feedback-variables
-$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;
-$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;
-$form-feedback-tooltip-font-size: $tooltip-font-size !default;
-$form-feedback-tooltip-line-height: null !default;
-$form-feedback-tooltip-opacity: $tooltip-opacity !default;
-$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;
-// scss-docs-start tooltip-feedback-variables
-
-
-// Popovers
-
-// scss-docs-start popover-variables
-$popover-font-size: $font-size-sm !default;
-$popover-bg: $white !default;
-$popover-max-width: 276px !default;
-$popover-border-width: $border-width !default;
-$popover-border-color: rgba($black, .2) !default;
-$popover-border-radius: $border-radius-lg !default;
-$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width) !default;
-$popover-box-shadow: $box-shadow !default;
-
-$popover-header-bg: shade-color($popover-bg, 6%) !default;
-$popover-header-color: $headings-color !default;
-$popover-header-padding-y: .5rem !default;
-$popover-header-padding-x: $spacer !default;
-
-$popover-body-color: $body-color !default;
-$popover-body-padding-y: $spacer !default;
-$popover-body-padding-x: $spacer !default;
-
-$popover-arrow-width: 1rem !default;
-$popover-arrow-height: .5rem !default;
-$popover-arrow-color: $popover-bg !default;
-
-$popover-arrow-outer-color: fade-in($popover-border-color, .05) !default;
-// scss-docs-end popover-variables
-
-
-// Toasts
-
-// scss-docs-start toast-variables
-$toast-max-width: 350px !default;
-$toast-padding-x: .75rem !default;
-$toast-padding-y: .5rem !default;
-$toast-font-size: .875rem !default;
-$toast-color: null !default;
-$toast-background-color: rgba($white, .85) !default;
-$toast-border-width: 1px !default;
-$toast-border-color: rgba(0, 0, 0, .1) !default;
-$toast-border-radius: $border-radius !default;
-$toast-box-shadow: $box-shadow !default;
-$toast-spacing: $container-padding-x !default;
-
-$toast-header-color: $gray-600 !default;
-$toast-header-background-color: rgba($white, .85) !default;
-$toast-header-border-color: rgba(0, 0, 0, .05) !default;
-// scss-docs-end toast-variables
-
-
-// Badges
-
-// scss-docs-start badge-variables
-$badge-font-size: .75em !default;
-$badge-font-weight: $font-weight-bold !default;
-$badge-color: $white !default;
-$badge-padding-y: .35em !default;
-$badge-padding-x: .65em !default;
-$badge-border-radius: $border-radius !default;
-// scss-docs-end badge-variables
-
-
-// Modals
-
-// scss-docs-start modal-variables
-$modal-inner-padding: $spacer !default;
-
-$modal-footer-margin-between: .5rem !default;
-
-$modal-dialog-margin: .5rem !default;
-$modal-dialog-margin-y-sm-up: 1.75rem !default;
-
-$modal-title-line-height: $line-height-base !default;
-
-$modal-content-color: null !default;
-$modal-content-bg: $white !default;
-$modal-content-border-color: rgba($black, .2) !default;
-$modal-content-border-width: $border-width !default;
-$modal-content-border-radius: $border-radius-lg !default;
-$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;
-$modal-content-box-shadow-xs: $box-shadow-sm !default;
-$modal-content-box-shadow-sm-up: $box-shadow !default;
-
-$modal-backdrop-bg: $black !default;
-$modal-backdrop-opacity: .5 !default;
-$modal-header-border-color: $border-color !default;
-$modal-footer-border-color: $modal-header-border-color !default;
-$modal-header-border-width: $modal-content-border-width !default;
-$modal-footer-border-width: $modal-header-border-width !default;
-$modal-header-padding-y: $modal-inner-padding !default;
-$modal-header-padding-x: $modal-inner-padding !default;
-$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility
-
-$modal-sm: 300px !default;
-$modal-md: 500px !default;
-$modal-lg: 800px !default;
-$modal-xl: 1140px !default;
-
-$modal-fade-transform: translate(0, -50px) !default;
-$modal-show-transform: none !default;
-$modal-transition: transform .3s ease-out !default;
-$modal-scale-transform: scale(1.02) !default;
-// scss-docs-end modal-variables
-
-
-// Alerts
-//
-// Define alert colors, border radius, and padding.
-
-// scss-docs-start alert-variables
-$alert-padding-y: $spacer !default;
-$alert-padding-x: $spacer !default;
-$alert-margin-bottom: 1rem !default;
-$alert-border-radius: $border-radius !default;
-$alert-link-font-weight: $font-weight-bold !default;
-$alert-border-width: $border-width !default;
-$alert-bg-scale: -80% !default;
-$alert-border-scale: -70% !default;
-$alert-color-scale: 40% !default;
-$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side
-// scss-docs-end alert-variables
-
-
-// Progress bars
-
-// scss-docs-start progress-variables
-$progress-height: 1rem !default;
-$progress-font-size: $font-size-base * .75 !default;
-$progress-bg: $gray-200 !default;
-$progress-border-radius: $border-radius !default;
-$progress-box-shadow: $box-shadow-inset !default;
-$progress-bar-color: $white !default;
-$progress-bar-bg: $primary !default;
-$progress-bar-animation-timing: 1s linear infinite !default;
-$progress-bar-transition: width .6s ease !default;
-// scss-docs-end progress-variables
-
-
-// List group
-
-// scss-docs-start list-group-variables
-$list-group-color: $gray-900 !default;
-$list-group-bg: $white !default;
-$list-group-border-color: rgba($black, .125) !default;
-$list-group-border-width: $border-width !default;
-$list-group-border-radius: $border-radius !default;
-
-$list-group-item-padding-y: $spacer / 2 !default;
-$list-group-item-padding-x: $spacer !default;
-$list-group-item-bg-scale: -80% !default;
-$list-group-item-color-scale: 40% !default;
-
-$list-group-hover-bg: $gray-100 !default;
-$list-group-active-color: $component-active-color !default;
-$list-group-active-bg: $component-active-bg !default;
-$list-group-active-border-color: $list-group-active-bg !default;
-
-$list-group-disabled-color: $gray-600 !default;
-$list-group-disabled-bg: $list-group-bg !default;
-
-$list-group-action-color: $gray-700 !default;
-$list-group-action-hover-color: $list-group-action-color !default;
-
-$list-group-action-active-color: $body-color !default;
-$list-group-action-active-bg: $gray-200 !default;
-// scss-docs-end list-group-variables
-
-
-// Image thumbnails
-
-// scss-docs-start thumbnail-variables
-$thumbnail-padding: .25rem !default;
-$thumbnail-bg: $body-bg !default;
-$thumbnail-border-width: $border-width !default;
-$thumbnail-border-color: $gray-300 !default;
-$thumbnail-border-radius: $border-radius !default;
-$thumbnail-box-shadow: $box-shadow-sm !default;
-// scss-docs-end thumbnail-variables
-
-
-// Figures
-
-// scss-docs-start figure-variables
-$figure-caption-font-size: $small-font-size !default;
-$figure-caption-color: $gray-600 !default;
-// scss-docs-end figure-variables
-
-
-// Breadcrumbs
-
-// scss-docs-start breadcrumb-variables
-$breadcrumb-font-size: null !default;
-$breadcrumb-padding-y: 0 !default;
-$breadcrumb-padding-x: 0 !default;
-$breadcrumb-item-padding-x: .5rem !default;
-$breadcrumb-margin-bottom: 1rem !default;
-$breadcrumb-bg: null !default;
-$breadcrumb-divider-color: $gray-600 !default;
-$breadcrumb-active-color: $gray-600 !default;
-$breadcrumb-divider: quote("/") !default;
-$breadcrumb-divider-flipped: $breadcrumb-divider !default;
-$breadcrumb-border-radius: null !default;
-// scss-docs-end breadcrumb-variables
-
-// Carousel
-
-// scss-docs-start carousel-variables
-$carousel-control-color: $white !default;
-$carousel-control-width: 15% !default;
-$carousel-control-opacity: .5 !default;
-$carousel-control-hover-opacity: .9 !default;
-$carousel-control-transition: opacity .15s ease !default;
-
-$carousel-indicator-width: 30px !default;
-$carousel-indicator-height: 3px !default;
-$carousel-indicator-hit-area-height: 10px !default;
-$carousel-indicator-spacer: 3px !default;
-$carousel-indicator-opacity: .5 !default;
-$carousel-indicator-active-bg: $white !default;
-$carousel-indicator-active-opacity: 1 !default;
-$carousel-indicator-transition: opacity .6s ease !default;
-
-$carousel-caption-width: 70% !default;
-$carousel-caption-color: $white !default;
-$carousel-caption-padding-y: 1.25rem !default;
-$carousel-caption-spacer: 1.25rem !default;
-
-$carousel-control-icon-width: 2rem !default;
-
-$carousel-control-prev-icon-bg: url("data:image/svg+xml,
") !default;
-$carousel-control-next-icon-bg: url("data:image/svg+xml,
") !default;
-
-$carousel-transition-duration: .6s !default;
-$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)
-
-$carousel-dark-indicator-active-bg: $black !default;
-$carousel-dark-caption-color: $black !default;
-$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;
-// scss-docs-end carousel-variables
-
-
-// Spinners
-
-// scss-docs-start spinner-variables
-$spinner-width: 2rem !default;
-$spinner-height: $spinner-width !default;
-$spinner-border-width: .25em !default;
-$spinner-animation-speed: .75s !default;
-
-$spinner-width-sm: 1rem !default;
-$spinner-height-sm: $spinner-width-sm !default;
-$spinner-border-width-sm: .2em !default;
-// scss-docs-end spinner-variables
-
-
-// Close
-
-// scss-docs-start close-variables
-$btn-close-width: 1em !default;
-$btn-close-height: $btn-close-width !default;
-$btn-close-padding-x: .25em !default;
-$btn-close-padding-y: $btn-close-padding-x !default;
-$btn-close-color: $black !default;
-$btn-close-bg: url("data:image/svg+xml,
") !default;
-$btn-close-focus-shadow: $input-btn-focus-box-shadow !default;
-$btn-close-opacity: .5 !default;
-$btn-close-hover-opacity: .75 !default;
-$btn-close-focus-opacity: 1 !default;
-$btn-close-disabled-opacity: .25 !default;
-$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;
-// scss-docs-end close-variables
-
-
-// Offcanvas
-
-// scss-docs-start offcanvas-variables
-$offcanvas-padding-y: $modal-inner-padding !default;
-$offcanvas-padding-x: $modal-inner-padding !default;
-$offcanvas-horizontal-width: 400px !default;
-$offcanvas-vertical-height: 30vh !default;
-$offcanvas-transition-duration: .3s !default;
-$offcanvas-border-color: $modal-content-border-color !default;
-$offcanvas-border-width: $modal-content-border-width !default;
-$offcanvas-title-line-height: $modal-title-line-height !default;
-$offcanvas-bg-color: $modal-content-bg !default;
-$offcanvas-color: $modal-content-color !default;
-$offcanvas-body-backdrop-color: rgba($modal-backdrop-bg, $modal-backdrop-opacity) !default;
-$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;
-// scss-docs-end offcanvas-variables
-
-// Code
-
-$code-font-size: $small-font-size !default;
-$code-color: $pink !default;
-
-$kbd-padding-y: .2rem !default;
-$kbd-padding-x: .4rem !default;
-$kbd-font-size: $code-font-size !default;
-$kbd-color: $white !default;
-$kbd-bg: $gray-900 !default;
-
-$pre-color: null !default;
diff --git a/sass/bootstrap/scss/bootstrap-grid.scss b/sass/bootstrap/scss/bootstrap-grid.scss
deleted file mode 100644
index 8116a0f..0000000
--- a/sass/bootstrap/scss/bootstrap-grid.scss
+++ /dev/null
@@ -1,65 +0,0 @@
-/*!
- * Bootstrap Grid v5.0.0-beta3 (https://getbootstrap.com/)
- * Copyright 2011-2021 The Bootstrap Authors
- * Copyright 2011-2021 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
- */
-
-$include-column-box-sizing: true !default;
-
-@import "http://github.com/functions";
-@import "http://github.com/variables";
-
-@import "http://github.com/mixins/lists";
-@import "http://github.com/mixins/breakpoints";
-@import "http://github.com/mixins/container";
-@import "http://github.com/mixins/grid";
-@import "http://github.com/mixins/utilities";
-
-@import "http://github.com/vendor/rfs";
-
-@import "http://github.com/containers";
-@import "http://github.com/grid";
-
-@import "http://github.com/utilities";
-// Only use the utilities we need
-// stylelint-disable-next-line scss/dollar-variable-default
-$utilities: map-get-multiple(
- $utilities,
- (
- "display",
- "order",
- "flex",
- "flex-direction",
- "flex-grow",
- "flex-shrink",
- "flex-wrap",
- "justify-content",
- "align-items",
- "align-content",
- "align-self",
- "margin",
- "margin-x",
- "margin-y",
- "margin-top",
- "margin-end",
- "margin-bottom",
- "margin-start",
- "negative-margin",
- "negative-margin-x",
- "negative-margin-y",
- "negative-margin-top",
- "negative-margin-end",
- "negative-margin-bottom",
- "negative-margin-start",
- "padding",
- "padding-x",
- "padding-y",
- "padding-top",
- "padding-end",
- "padding-bottom",
- "padding-start",
- )
-);
-
-@import "http://github.com/utilities/api";
diff --git a/sass/bootstrap/scss/bootstrap-reboot.scss b/sass/bootstrap/scss/bootstrap-reboot.scss
deleted file mode 100644
index 3eff882..0000000
--- a/sass/bootstrap/scss/bootstrap-reboot.scss
+++ /dev/null
@@ -1,15 +0,0 @@
-/*!
- * Bootstrap Reboot v5.0.0-beta3 (https://getbootstrap.com/)
- * Copyright 2011-2021 The Bootstrap Authors
- * Copyright 2011-2021 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
- * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
- */
-
-@import "http://github.com/functions";
-@import "http://github.com/variables";
-// Prevent the usage of custom properties since we don't add them to `:root` in reboot
-$font-family-base: $font-family-sans-serif; // stylelint-disable-line scss/dollar-variable-default
-$font-family-code: $font-family-monospace; // stylelint-disable-line scss/dollar-variable-default
-@import "http://github.com/mixins";
-@import "http://github.com/reboot";
diff --git a/sass/bootstrap/scss/bootstrap-utilities.scss b/sass/bootstrap/scss/bootstrap-utilities.scss
deleted file mode 100644
index 9331d80..0000000
--- a/sass/bootstrap/scss/bootstrap-utilities.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-/*!
- * Bootstrap Utilities v5.0.0-beta3 (https://getbootstrap.com/)
- * Copyright 2011-2021 The Bootstrap Authors
- * Copyright 2011-2021 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
- */
-
-// Configuration
-@import "http://github.com/functions";
-@import "http://github.com/variables";
-@import "http://github.com/mixins";
-@import "http://github.com/utilities";
-
-// Helpers
-@import "http://github.com/helpers";
-
-// Utilities
-@import "http://github.com/utilities/api";
diff --git a/sass/bootstrap/scss/bootstrap.scss b/sass/bootstrap/scss/bootstrap.scss
deleted file mode 100644
index 1a975a3..0000000
--- a/sass/bootstrap/scss/bootstrap.scss
+++ /dev/null
@@ -1,52 +0,0 @@
-/*!
- * Bootstrap v5.0.0-beta3 (https://getbootstrap.com/)
- * Copyright 2011-2021 The Bootstrap Authors
- * Copyright 2011-2021 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
- */
-
-// scss-docs-start import-stack
-// Configuration
-@import "http://github.com/functions";
-@import "http://github.com/variables";
-@import "http://github.com/mixins";
-@import "http://github.com/utilities";
-
-// Layout & components
-@import "http://github.com/root";
-@import "http://github.com/reboot";
-@import "http://github.com/type";
-@import "http://github.com/images";
-@import "http://github.com/containers";
-@import "http://github.com/grid";
-@import "http://github.com/tables";
-@import "http://github.com/forms";
-@import "http://github.com/buttons";
-@import "http://github.com/transitions";
-@import "http://github.com/dropdown";
-@import "http://github.com/button-group";
-@import "http://github.com/nav";
-@import "http://github.com/navbar";
-@import "http://github.com/card";
-@import "http://github.com/accordion";
-@import "http://github.com/breadcrumb";
-@import "http://github.com/pagination";
-@import "http://github.com/badge";
-@import "http://github.com/alert";
-@import "http://github.com/progress";
-@import "http://github.com/list-group";
-@import "http://github.com/close";
-@import "http://github.com/toasts";
-@import "http://github.com/modal";
-@import "http://github.com/tooltip";
-@import "http://github.com/popover";
-@import "http://github.com/carousel";
-@import "http://github.com/spinners";
-@import "http://github.com/offcanvas";
-
-// Helpers
-@import "http://github.com/helpers";
-
-// Utilities
-@import "http://github.com/utilities/api";
-// scss-docs-end import-stack
diff --git a/sass/bootstrap/scss/forms/_floating-labels.scss b/sass/bootstrap/scss/forms/_floating-labels.scss
deleted file mode 100644
index 8b2e2b8..0000000
--- a/sass/bootstrap/scss/forms/_floating-labels.scss
+++ /dev/null
@@ -1,61 +0,0 @@
-.form-floating {
- position: relative;
-
- > .form-control,
- > .form-select {
- height: $form-floating-height;
- padding: $form-floating-padding-y $form-floating-padding-x;
- }
-
- > label {
- position: absolute;
- top: 0;
- left: 0;
- height: 100%; // allow textareas
- padding: $form-floating-padding-y $form-floating-padding-x;
- pointer-events: none;
- border: $input-border-width solid transparent; // Required for aligning label's text with the input as it affects inner box model
- transform-origin: 0 0;
- @include transition($form-floating-transition);
- }
-
- // stylelint-disable no-duplicate-selectors
- > .form-control {
- &::placeholder {
- color: transparent;
- }
-
- &:focus,
- &:not(:placeholder-shown) {
- padding-top: $form-floating-input-padding-t;
- padding-bottom: $form-floating-input-padding-b;
- }
- // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped
- &:-webkit-autofill {
- padding-top: $form-floating-input-padding-t;
- padding-bottom: $form-floating-input-padding-b;
- }
- }
-
- > .form-select {
- padding-top: $form-floating-input-padding-t;
- padding-bottom: $form-floating-input-padding-b;
- }
-
- > .form-control:focus,
- > .form-control:not(:placeholder-shown),
- > .form-select {
- ~ label {
- opacity: $form-floating-label-opacity;
- transform: $form-floating-label-transform;
- }
- }
- // Duplicated because `:-webkit-autofill` invalidates other selectors when grouped
- > .form-control:-webkit-autofill {
- ~ label {
- opacity: $form-floating-label-opacity;
- transform: $form-floating-label-transform;
- }
- }
- // stylelint-enable no-duplicate-selectors
-}
diff --git a/sass/bootstrap/scss/forms/_form-check.scss b/sass/bootstrap/scss/forms/_form-check.scss
deleted file mode 100644
index b34250a..0000000
--- a/sass/bootstrap/scss/forms/_form-check.scss
+++ /dev/null
@@ -1,152 +0,0 @@
-//
-// Check/radio
-//
-
-.form-check {
- display: block;
- min-height: $form-check-min-height;
- padding-left: $form-check-padding-start;
- margin-bottom: $form-check-margin-bottom;
-
- .form-check-input {
- float: left;
- margin-left: $form-check-padding-start * -1;
- }
-}
-
-.form-check-input {
- width: $form-check-input-width;
- height: $form-check-input-width;
- margin-top: ($line-height-base - $form-check-input-width) / 2; // line-height minus check height
- vertical-align: top;
- background-color: $form-check-input-bg;
- background-repeat: no-repeat;
- background-position: center;
- background-size: contain;
- border: $form-check-input-border;
- appearance: none;
- color-adjust: exact; // Keep themed appearance for print
- @include transition($form-check-transition);
-
- &[type="checkbox"] {
- @include border-radius($form-check-input-border-radius);
- }
-
- &[type="radio"] {
- // stylelint-disable-next-line property-disallowed-list
- border-radius: $form-check-radio-border-radius;
- }
-
- &:active {
- filter: $form-check-input-active-filter;
- }
-
- &:focus {
- border-color: $form-check-input-focus-border;
- outline: 0;
- box-shadow: $form-check-input-focus-box-shadow;
- }
-
- &:checked {
- background-color: $form-check-input-checked-bg-color;
- border-color: $form-check-input-checked-border-color;
-
- &[type="checkbox"] {
- @if $enable-gradients {
- background-image: escape-svg($form-check-input-checked-bg-image), var(--#{$variable-prefix}gradient);
- } @else {
- background-image: escape-svg($form-check-input-checked-bg-image);
- }
- }
-
- &[type="radio"] {
- @if $enable-gradients {
- background-image: escape-svg($form-check-radio-checked-bg-image), var(--#{$variable-prefix}gradient);
- } @else {
- background-image: escape-svg($form-check-radio-checked-bg-image);
- }
- }
- }
-
- &[type="checkbox"]:indeterminate {
- background-color: $form-check-input-indeterminate-bg-color;
- border-color: $form-check-input-indeterminate-border-color;
-
- @if $enable-gradients {
- background-image: escape-svg($form-check-input-indeterminate-bg-image), var(--#{$variable-prefix}gradient);
- } @else {
- background-image: escape-svg($form-check-input-indeterminate-bg-image);
- }
- }
-
- &:disabled {
- pointer-events: none;
- filter: none;
- opacity: $form-check-input-disabled-opacity;
- }
-
- // Use disabled attribute in addition of :disabled pseudo-class
- // See: https://github.com/twbs/bootstrap/issues/28247
- &[disabled],
- &:disabled {
- ~ .form-check-label {
- opacity: $form-check-label-disabled-opacity;
- }
- }
-}
-
-.form-check-label {
- color: $form-check-label-color;
- cursor: $form-check-label-cursor;
-}
-
-//
-// Switch
-//
-
-.form-switch {
- padding-left: $form-switch-padding-start;
-
- .form-check-input {
- width: $form-switch-width;
- margin-left: $form-switch-padding-start * -1;
- background-image: escape-svg($form-switch-bg-image);
- background-position: left center;
- @include border-radius($form-switch-border-radius);
- @include transition($form-switch-transition);
-
- &:focus {
- background-image: escape-svg($form-switch-focus-bg-image);
- }
-
- &:checked {
- background-position: $form-switch-checked-bg-position;
-
- @if $enable-gradients {
- background-image: escape-svg($form-switch-checked-bg-image), var(--#{$variable-prefix}gradient);
- } @else {
- background-image: escape-svg($form-switch-checked-bg-image);
- }
- }
- }
-}
-
-.form-check-inline {
- display: inline-block;
- margin-right: $form-check-inline-margin-end;
-}
-
-.btn-check {
- position: absolute;
- clip: rect(0, 0, 0, 0);
- pointer-events: none;
-
- &[disabled],
- &:disabled {
- + .btn {
- pointer-events: none;
- filter: none;
- opacity: $form-check-btn-check-disabled-opacity;
- }
- }
-}
diff --git a/sass/bootstrap/scss/forms/_form-control.scss b/sass/bootstrap/scss/forms/_form-control.scss
deleted file mode 100644
index 9728b91..0000000
--- a/sass/bootstrap/scss/forms/_form-control.scss
+++ /dev/null
@@ -1,219 +0,0 @@
-//
-// General form controls (plus a few specific high-level interventions)
-//
-
-.form-control {
- display: block;
- width: 100%;
- padding: $input-padding-y $input-padding-x;
- font-family: $input-font-family;
- @include font-size($input-font-size);
- font-weight: $input-font-weight;
- line-height: $input-line-height;
- color: $input-color;
- background-color: $input-bg;
- background-clip: padding-box;
- border: $input-border-width solid $input-border-color;
- appearance: none; // Fix appearance for date inputs in Safari
-
- // Note: This has no effect on
s in some browsers, due to the limited stylability of ``s in CSS.
- @include border-radius($input-border-radius, 0);
-
- @include box-shadow($input-box-shadow);
- @include transition($input-transition);
-
- &[type="file"] {
- overflow: hidden; // prevent pseudo element button overlap
-
- &:not(:disabled):not([readonly]) {
- cursor: pointer;
- }
- }
-
- // Customize the `:focus` state to imitate native WebKit styles.
- &:focus {
- color: $input-focus-color;
- background-color: $input-focus-bg;
- border-color: $input-focus-border-color;
- outline: 0;
- @if $enable-shadows {
- @include box-shadow($input-box-shadow, $input-focus-box-shadow);
- } @else {
- // Avoid using mixin so we can pass custom focus shadow properly
- box-shadow: $input-focus-box-shadow;
- }
- }
-
- // Add some height to date inputs on iOS
- // https://github.com/twbs/bootstrap/issues/23307
- // TODO: we can remove this workaround once https://bugs.webkit.org/show_bug.cgi?id=198959 is resolved
- &::-webkit-date-and-time-value {
- // Multiply line-height by 1em if it has no unit
- height: if(unit($input-line-height) == "", $input-line-height * 1em, $input-line-height);
- }
-
- // Placeholder
- &::placeholder {
- color: $input-placeholder-color;
- // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.
- opacity: 1;
- }
-
- // Disabled and read-only inputs
- //
- // HTML5 says that controls under a fieldset > legend:first-child won't be
- // disabled if the fieldset is disabled. Due to implementation difficulty, we
- // don't honor that edge case; we style them as disabled anyway.
- &:disabled,
- &[readonly] {
- background-color: $input-disabled-bg;
- border-color: $input-disabled-border-color;
- // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.
- opacity: 1;
- }
-
- // File input buttons theming
- &::file-selector-button {
- padding: $input-padding-y $input-padding-x;
- margin: (-$input-padding-y) (-$input-padding-x);
- margin-inline-end: $input-padding-x;
- color: $form-file-button-color;
- @include gradient-bg($form-file-button-bg);
- pointer-events: none;
- border-color: inherit;
- border-style: solid;
- border-width: 0;
- border-inline-end-width: $input-border-width;
- border-radius: 0; // stylelint-disable-line property-disallowed-list
- @include transition($btn-transition);
- }
-
- &:hover:not(:disabled):not([readonly])::file-selector-button {
- background-color: $form-file-button-hover-bg;
- }
-
- &::-webkit-file-upload-button {
- padding: $input-padding-y $input-padding-x;
- margin: (-$input-padding-y) (-$input-padding-x);
- margin-inline-end: $input-padding-x;
- color: $form-file-button-color;
- @include gradient-bg($form-file-button-bg);
- pointer-events: none;
- border-color: inherit;
- border-style: solid;
- border-width: 0;
- border-inline-end-width: $input-border-width;
- border-radius: 0; // stylelint-disable-line property-disallowed-list
- @include transition($btn-transition);
- }
-
- &:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {
- background-color: $form-file-button-hover-bg;
- }
-}
-
-// Readonly controls as plain text
-//
-// Apply class to a readonly input to make it appear like regular plain
-// text (without any border, background color, focus indicator)
-
-.form-control-plaintext {
- display: block;
- width: 100%;
- padding: $input-padding-y 0;
- margin-bottom: 0; // match inputs if this class comes on inputs with default margins
- line-height: $input-line-height;
- color: $input-plaintext-color;
- background-color: transparent;
- border: solid transparent;
- border-width: $input-border-width 0;
-
- &.form-control-sm,
- &.form-control-lg {
- padding-right: 0;
- padding-left: 0;
- }
-}
-
-// Form control sizing
-//
-// Build on `.form-control` with modifier classes to decrease or increase the
-// height and font-size of form controls.
-//
-// Repeated in `_input_group.scss` to avoid Sass extend issues.
-
-.form-control-sm {
- min-height: $input-height-sm;
- padding: $input-padding-y-sm $input-padding-x-sm;
- @include font-size($input-font-size-sm);
- @include border-radius($input-border-radius-sm);
-
- &::file-selector-button {
- padding: $input-padding-y-sm $input-padding-x-sm;
- margin: (-$input-padding-y-sm) (-$input-padding-x-sm);
- margin-inline-end: $input-padding-x-sm;
- }
-
- &::-webkit-file-upload-button {
- padding: $input-padding-y-sm $input-padding-x-sm;
- margin: (-$input-padding-y-sm) (-$input-padding-x-sm);
- margin-inline-end: $input-padding-x-sm;
- }
-}
-
-.form-control-lg {
- min-height: $input-height-lg;
- padding: $input-padding-y-lg $input-padding-x-lg;
- @include font-size($input-font-size-lg);
- @include border-radius($input-border-radius-lg);
-
- &::file-selector-button {
- padding: $input-padding-y-lg $input-padding-x-lg;
- margin: (-$input-padding-y-lg) (-$input-padding-x-lg);
- margin-inline-end: $input-padding-x-lg;
- }
-
- &::-webkit-file-upload-button {
- padding: $input-padding-y-lg $input-padding-x-lg;
- margin: (-$input-padding-y-lg) (-$input-padding-x-lg);
- margin-inline-end: $input-padding-x-lg;
- }
-}
-
-// Make sure textareas don't shrink too much when resized
-// https://github.com/twbs/bootstrap/pull/29124
-// stylelint-disable selector-no-qualifying-type
-textarea {
- &.form-control {
- min-height: $input-height;
- }
-
- &.form-control-sm {
- min-height: $input-height-sm;
- }
-
- &.form-control-lg {
- min-height: $input-height-lg;
- }
-}
-// stylelint-enable selector-no-qualifying-type
-
-.form-control-color {
- max-width: 3rem;
- height: auto; // Override fixed browser height
- padding: $input-padding-y;
-
- &:not(:disabled):not([readonly]) {
- cursor: pointer;
- }
-
- &::-moz-color-swatch {
- height: if(unit($input-line-height) == "", $input-line-height * 1em, $input-line-height);
- @include border-radius($input-border-radius);
- }
-
- &::-webkit-color-swatch {
- height: if(unit($input-line-height) == "", $input-line-height * 1em, $input-line-height);
- @include border-radius($input-border-radius);
- }
-}
diff --git a/sass/bootstrap/scss/forms/_form-range.scss b/sass/bootstrap/scss/forms/_form-range.scss
deleted file mode 100644
index ae1d841..0000000
--- a/sass/bootstrap/scss/forms/_form-range.scss
+++ /dev/null
@@ -1,91 +0,0 @@
-// Range
-//
-// Style range inputs the same across browsers. Vendor-specific rules for pseudo
-// elements cannot be mixed. As such, there are no shared styles for focus or
-// active states on prefixed selectors.
-
-.form-range {
- width: 100%;
- height: add($form-range-thumb-height, $form-range-thumb-focus-box-shadow-width * 2);
- padding: 0; // Need to reset padding
- background-color: transparent;
- appearance: none;
-
- &:focus {
- outline: 0;
-
- // Pseudo-elements must be split across multiple rulesets to have an effect.
- // No box-shadow() mixin for focus accessibility.
- &::-webkit-slider-thumb { box-shadow: $form-range-thumb-focus-box-shadow; }
- &::-moz-range-thumb { box-shadow: $form-range-thumb-focus-box-shadow; }
- }
-
- &::-moz-focus-outer {
- border: 0;
- }
-
- &::-webkit-slider-thumb {
- width: $form-range-thumb-width;
- height: $form-range-thumb-height;
- margin-top: ($form-range-track-height - $form-range-thumb-height) / 2; // Webkit specific
- @include gradient-bg($form-range-thumb-bg);
- border: $form-range-thumb-border;
- @include border-radius($form-range-thumb-border-radius);
- @include box-shadow($form-range-thumb-box-shadow);
- @include transition($form-range-thumb-transition);
- appearance: none;
-
- &:active {
- @include gradient-bg($form-range-thumb-active-bg);
- }
- }
-
- &::-webkit-slider-runnable-track {
- width: $form-range-track-width;
- height: $form-range-track-height;
- color: transparent; // Why?
- cursor: $form-range-track-cursor;
- background-color: $form-range-track-bg;
- border-color: transparent;
- @include border-radius($form-range-track-border-radius);
- @include box-shadow($form-range-track-box-shadow);
- }
-
- &::-moz-range-thumb {
- width: $form-range-thumb-width;
- height: $form-range-thumb-height;
- @include gradient-bg($form-range-thumb-bg);
- border: $form-range-thumb-border;
- @include border-radius($form-range-thumb-border-radius);
- @include box-shadow($form-range-thumb-box-shadow);
- @include transition($form-range-thumb-transition);
- appearance: none;
-
- &:active {
- @include gradient-bg($form-range-thumb-active-bg);
- }
- }
-
- &::-moz-range-track {
- width: $form-range-track-width;
- height: $form-range-track-height;
- color: transparent;
- cursor: $form-range-track-cursor;
- background-color: $form-range-track-bg;
- border-color: transparent; // Firefox specific?
- @include border-radius($form-range-track-border-radius);
- @include box-shadow($form-range-track-box-shadow);
- }
-
- &:disabled {
- pointer-events: none;
-
- &::-webkit-slider-thumb {
- background-color: $form-range-thumb-disabled-bg;
- }
-
- &::-moz-range-thumb {
- background-color: $form-range-thumb-disabled-bg;
- }
- }
-}
diff --git a/sass/bootstrap/scss/forms/_form-select.scss b/sass/bootstrap/scss/forms/_form-select.scss
deleted file mode 100644
index 15d5061..0000000
--- a/sass/bootstrap/scss/forms/_form-select.scss
+++ /dev/null
@@ -1,67 +0,0 @@
-// Select
-//
-// Replaces the browser default select with a custom one, mostly pulled from
-// https://primer.github.io/.
-
-.form-select {
- display: block;
- width: 100%;
- padding: $form-select-padding-y $form-select-indicator-padding $form-select-padding-y $form-select-padding-x;
- font-family: $form-select-font-family;
- @include font-size($form-select-font-size);
- font-weight: $form-select-font-weight;
- line-height: $form-select-line-height;
- color: $form-select-color;
- background-color: $form-select-bg;
- background-image: escape-svg($form-select-indicator);
- background-repeat: no-repeat;
- background-position: $form-select-bg-position;
- background-size: $form-select-bg-size;
- border: $form-select-border-width solid $form-select-border-color;
- @include border-radius($form-select-border-radius, 0);
- @include box-shadow($form-select-box-shadow);
- appearance: none;
-
- &:focus {
- border-color: $form-select-focus-border-color;
- outline: 0;
- @if $enable-shadows {
- @include box-shadow($form-select-box-shadow, $form-select-focus-box-shadow);
- } @else {
- // Avoid using mixin so we can pass custom focus shadow properly
- box-shadow: $form-select-focus-box-shadow;
- }
- }
-
- &[multiple],
- &[size]:not([size="1"]) {
- padding-right: $form-select-padding-x;
- background-image: none;
- }
-
- &:disabled {
- color: $form-select-disabled-color;
- background-color: $form-select-disabled-bg;
- border-color: $form-select-disabled-border-color;
- }
-
- // Remove outline from select box in FF
- &:-moz-focusring {
- color: transparent;
- text-shadow: 0 0 0 $form-select-color;
- }
-}
-
-.form-select-sm {
- padding-top: $form-select-padding-y-sm;
- padding-bottom: $form-select-padding-y-sm;
- padding-left: $form-select-padding-x-sm;
- @include font-size($form-select-font-size-sm);
-}
-
-.form-select-lg {
- padding-top: $form-select-padding-y-lg;
- padding-bottom: $form-select-padding-y-lg;
- padding-left: $form-select-padding-x-lg;
- @include font-size($form-select-font-size-lg);
-}
diff --git a/sass/bootstrap/scss/forms/_form-text.scss b/sass/bootstrap/scss/forms/_form-text.scss
deleted file mode 100644
index f080d1a..0000000
--- a/sass/bootstrap/scss/forms/_form-text.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-//
-// Form text
-//
-
-.form-text {
- margin-top: $form-text-margin-top;
- @include font-size($form-text-font-size);
- font-style: $form-text-font-style;
- font-weight: $form-text-font-weight;
- color: $form-text-color;
-}
diff --git a/sass/bootstrap/scss/forms/_input-group.scss b/sass/bootstrap/scss/forms/_input-group.scss
deleted file mode 100644
index 1400529..0000000
--- a/sass/bootstrap/scss/forms/_input-group.scss
+++ /dev/null
@@ -1,121 +0,0 @@
-//
-// Base styles
-//
-
-.input-group {
- position: relative;
- display: flex;
- flex-wrap: wrap; // For form validation feedback
- align-items: stretch;
- width: 100%;
-
- > .form-control,
- > .form-select {
- position: relative; // For focus state's z-index
- flex: 1 1 auto;
- width: 1%;
- min-width: 0; // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size
- }
-
- // Bring the "active" form control to the top of surrounding elements
- > .form-control:focus,
- > .form-select:focus {
- z-index: 3;
- }
-
- // Ensure buttons are always above inputs for more visually pleasing borders.
- // This isn't needed for `.input-group-text` since it shares the same border-color
- // as our inputs.
- .btn {
- position: relative;
- z-index: 2;
-
- &:focus {
- z-index: 3;
- }
- }
-}
-
-
-// Textual addons
-//
-// Serves as a catch-all element for any text or radio/checkbox input you wish
-// to prepend or append to an input.
-
-.input-group-text {
- display: flex;
- align-items: center;
- padding: $input-group-addon-padding-y $input-group-addon-padding-x;
- @include font-size($input-font-size); // Match inputs
- font-weight: $input-group-addon-font-weight;
- line-height: $input-line-height;
- color: $input-group-addon-color;
- text-align: center;
- white-space: nowrap;
- background-color: $input-group-addon-bg;
- border: $input-border-width solid $input-group-addon-border-color;
- @include border-radius($input-border-radius);
-}
-
-
-// Sizing
-//
-// Remix the default form control sizing classes into new ones for easier
-// manipulation.
-
-.input-group-lg > .form-control,
-.input-group-lg > .form-select,
-.input-group-lg > .input-group-text,
-.input-group-lg > .btn {
- padding: $input-padding-y-lg $input-padding-x-lg;
- @include font-size($input-font-size-lg);
- @include border-radius($input-border-radius-lg);
-}
-
-.input-group-sm > .form-control,
-.input-group-sm > .form-select,
-.input-group-sm > .input-group-text,
-.input-group-sm > .btn {
- padding: $input-padding-y-sm $input-padding-x-sm;
- @include font-size($input-font-size-sm);
- @include border-radius($input-border-radius-sm);
-}
-
-.input-group-lg > .form-select,
-.input-group-sm > .form-select {
- padding-right: $form-select-padding-x + $form-select-indicator-padding;
-}
-
-
-// Rounded corners
-//
-// These rulesets must come after the sizing ones to properly override sm and lg
-// border-radius values when extending. They're more specific than we'd like
-// with the `.input-group >` part, but without it, we cannot override the sizing.
-
-// stylelint-disable-next-line no-duplicate-selectors
-.input-group {
- &:not(.has-validation) {
- > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),
- > .dropdown-toggle:nth-last-child(n + 3) {
- @include border-end-radius(0);
- }
- }
-
- &.has-validation {
- > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu),
- > .dropdown-toggle:nth-last-child(n + 4) {
- @include border-end-radius(0);
- }
- }
-
- $validation-messages: "";
- @each $state in map-keys($form-validation-states) {
- $validation-messages: $validation-messages + ":not(." + unquote($state) + "-tooltip)" + ":not(." + unquote($state) + "-feedback)";
- }
-
- > :not(:first-child):not(.dropdown-menu)#{$validation-messages} {
- margin-left: -$input-border-width;
- @include border-start-radius(0);
- }
-}
diff --git a/sass/bootstrap/scss/forms/_labels.scss b/sass/bootstrap/scss/forms/_labels.scss
deleted file mode 100644
index 39ecafc..0000000
--- a/sass/bootstrap/scss/forms/_labels.scss
+++ /dev/null
@@ -1,36 +0,0 @@
-//
-// Labels
-//
-
-.form-label {
- margin-bottom: $form-label-margin-bottom;
- @include font-size($form-label-font-size);
- font-style: $form-label-font-style;
- font-weight: $form-label-font-weight;
- color: $form-label-color;
-}
-
-// For use with horizontal and inline forms, when you need the label (or legend)
-// text to align with the form controls.
-.col-form-label {
- padding-top: add($input-padding-y, $input-border-width);
- padding-bottom: add($input-padding-y, $input-border-width);
- margin-bottom: 0; // Override the `` default
- @include font-size(inherit); // Override the `` default
- font-style: $form-label-font-style;
- font-weight: $form-label-font-weight;
- line-height: $input-line-height;
- color: $form-label-color;
-}
-
-.col-form-label-lg {
- padding-top: add($input-padding-y-lg, $input-border-width);
- padding-bottom: add($input-padding-y-lg, $input-border-width);
- @include font-size($input-font-size-lg);
-}
-
-.col-form-label-sm {
- padding-top: add($input-padding-y-sm, $input-border-width);
- padding-bottom: add($input-padding-y-sm, $input-border-width);
- @include font-size($input-font-size-sm);
-}
diff --git a/sass/bootstrap/scss/forms/_validation.scss b/sass/bootstrap/scss/forms/_validation.scss
deleted file mode 100644
index c48123a..0000000
--- a/sass/bootstrap/scss/forms/_validation.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-// Form validation
-//
-// Provide feedback to users when form field values are valid or invalid. Works
-// primarily for client-side validation via scoped `:invalid` and `:valid`
-// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for
-// server-side validation.
-
-// scss-docs-start form-validation-states-loop
-@each $state, $data in $form-validation-states {
- @include form-validation-state($state, $data...);
-}
-// scss-docs-end form-validation-states-loop
diff --git a/sass/bootstrap/scss/helpers/_clearfix.scss b/sass/bootstrap/scss/helpers/_clearfix.scss
deleted file mode 100644
index e92522a..0000000
--- a/sass/bootstrap/scss/helpers/_clearfix.scss
+++ /dev/null
@@ -1,3 +0,0 @@
-.clearfix {
- @include clearfix();
-}
diff --git a/sass/bootstrap/scss/helpers/_colored-links.scss b/sass/bootstrap/scss/helpers/_colored-links.scss
deleted file mode 100644
index 8c167de..0000000
--- a/sass/bootstrap/scss/helpers/_colored-links.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-@each $color, $value in $theme-colors {
- .link-#{$color} {
- color: $value;
-
- @if $link-shade-percentage != 0 {
- &:hover,
- &:focus {
- color: if(color-contrast($value) == $color-contrast-light, shade-color($value, $link-shade-percentage), tint-color($value, $link-shade-percentage));
- }
- }
- }
-}
diff --git a/sass/bootstrap/scss/helpers/_position.scss b/sass/bootstrap/scss/helpers/_position.scss
deleted file mode 100644
index 31851eb..0000000
--- a/sass/bootstrap/scss/helpers/_position.scss
+++ /dev/null
@@ -1,30 +0,0 @@
-// Shorthand
-
-.fixed-top {
- position: fixed;
- top: 0;
- right: 0;
- left: 0;
- z-index: $zindex-fixed;
-}
-
-.fixed-bottom {
- position: fixed;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: $zindex-fixed;
-}
-
-// Responsive sticky top
-@each $breakpoint in map-keys($grid-breakpoints) {
- @include media-breakpoint-up($breakpoint) {
- $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
-
- .sticky#{$infix}-top {
- position: sticky;
- top: 0;
- z-index: $zindex-sticky;
- }
- }
-}
diff --git a/sass/bootstrap/scss/helpers/_ratio.scss b/sass/bootstrap/scss/helpers/_ratio.scss
deleted file mode 100644
index 2390ee3..0000000
--- a/sass/bootstrap/scss/helpers/_ratio.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-// Credit: Nicolas Gallagher and SUIT CSS.
-
-.ratio {
- position: relative;
- width: 100%;
-
- &::before {
- display: block;
- padding-top: var(--#{$variable-prefix}aspect-ratio);
- content: "";
- }
-
- > * {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- }
-}
-
-@each $key, $ratio in $aspect-ratios {
- .ratio-#{$key} {
- --#{$variable-prefix}aspect-ratio: #{$ratio};
- }
-}
diff --git a/sass/bootstrap/scss/helpers/_stretched-link.scss b/sass/bootstrap/scss/helpers/_stretched-link.scss
deleted file mode 100644
index 71a1c75..0000000
--- a/sass/bootstrap/scss/helpers/_stretched-link.scss
+++ /dev/null
@@ -1,15 +0,0 @@
-//
-// Stretched link
-//
-
-.stretched-link {
- &::#{$stretched-link-pseudo-element} {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: $stretched-link-z-index;
- content: "";
- }
-}
diff --git a/sass/bootstrap/scss/helpers/_text-truncation.scss b/sass/bootstrap/scss/helpers/_text-truncation.scss
deleted file mode 100644
index 6421dac..0000000
--- a/sass/bootstrap/scss/helpers/_text-truncation.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-//
-// Text truncation
-//
-
-.text-truncate {
- @include text-truncate();
-}
diff --git a/sass/bootstrap/scss/helpers/_visually-hidden.scss b/sass/bootstrap/scss/helpers/_visually-hidden.scss
deleted file mode 100644
index 4760ff0..0000000
--- a/sass/bootstrap/scss/helpers/_visually-hidden.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-//
-// Visually hidden
-//
-
-.visually-hidden,
-.visually-hidden-focusable:not(:focus):not(:focus-within) {
- @include visually-hidden();
-}
diff --git a/sass/bootstrap/scss/mixins/_alert.scss b/sass/bootstrap/scss/mixins/_alert.scss
deleted file mode 100644
index f3eb595..0000000
--- a/sass/bootstrap/scss/mixins/_alert.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-// scss-docs-start alert-variant-mixin
-@mixin alert-variant($background, $border, $color) {
- color: $color;
- @include gradient-bg($background);
- border-color: $border;
-
- .alert-link {
- color: shade-color($color, 20%);
- }
-}
-// scss-docs-end alert-variant-mixin
diff --git a/sass/bootstrap/scss/mixins/_border-radius.scss b/sass/bootstrap/scss/mixins/_border-radius.scss
deleted file mode 100644
index 616decb..0000000
--- a/sass/bootstrap/scss/mixins/_border-radius.scss
+++ /dev/null
@@ -1,78 +0,0 @@
-// stylelint-disable property-disallowed-list
-// Single side border-radius
-
-// Helper function to replace negative values with 0
-@function valid-radius($radius) {
- $return: ();
- @each $value in $radius {
- @if type-of($value) == number {
- $return: append($return, max($value, 0));
- } @else {
- $return: append($return, $value);
- }
- }
- @return $return;
-}
-
-// scss-docs-start border-radius-mixins
-@mixin border-radius($radius: $border-radius, $fallback-border-radius: false) {
- @if $enable-rounded {
- border-radius: valid-radius($radius);
- }
- @else if $fallback-border-radius != false {
- border-radius: $fallback-border-radius;
- }
-}
-
-@mixin border-top-radius($radius: $border-radius) {
- @if $enable-rounded {
- border-top-left-radius: valid-radius($radius);
- border-top-right-radius: valid-radius($radius);
- }
-}
-
-@mixin border-end-radius($radius: $border-radius) {
- @if $enable-rounded {
- border-top-right-radius: valid-radius($radius);
- border-bottom-right-radius: valid-radius($radius);
- }
-}
-
-@mixin border-bottom-radius($radius: $border-radius) {
- @if $enable-rounded {
- border-bottom-right-radius: valid-radius($radius);
- border-bottom-left-radius: valid-radius($radius);
- }
-}
-
-@mixin border-start-radius($radius: $border-radius) {
- @if $enable-rounded {
- border-top-left-radius: valid-radius($radius);
- border-bottom-left-radius: valid-radius($radius);
- }
-}
-
-@mixin border-top-start-radius($radius: $border-radius) {
- @if $enable-rounded {
- border-top-left-radius: valid-radius($radius);
- }
-}
-
-@mixin border-top-end-radius($radius: $border-radius) {
- @if $enable-rounded {
- border-top-right-radius: valid-radius($radius);
- }
-}
-
-@mixin border-bottom-end-radius($radius: $border-radius) {
- @if $enable-rounded {
- border-bottom-right-radius: valid-radius($radius);
- }
-}
-
-@mixin border-bottom-start-radius($radius: $border-radius) {
- @if $enable-rounded {
- border-bottom-left-radius: valid-radius($radius);
- }
-}
-// scss-docs-end border-radius-mixins
diff --git a/sass/bootstrap/scss/mixins/_box-shadow.scss b/sass/bootstrap/scss/mixins/_box-shadow.scss
deleted file mode 100644
index 4172541..0000000
--- a/sass/bootstrap/scss/mixins/_box-shadow.scss
+++ /dev/null
@@ -1,18 +0,0 @@
-@mixin box-shadow($shadow...) {
- @if $enable-shadows {
- $result: ();
-
- @each $value in $shadow {
- @if $value != null {
- $result: append($result, $value, "comma");
- }
- @if $value == none and length($shadow) > 1 {
- @warn "The keyword 'none' must be used as a single argument.";
- }
- }
-
- @if (length($result) > 0) {
- box-shadow: $result;
- }
- }
-}
diff --git a/sass/bootstrap/scss/mixins/_breakpoints.scss b/sass/bootstrap/scss/mixins/_breakpoints.scss
deleted file mode 100644
index cdc8034..0000000
--- a/sass/bootstrap/scss/mixins/_breakpoints.scss
+++ /dev/null
@@ -1,127 +0,0 @@
-// Breakpoint viewport sizes and media queries.
-//
-// Breakpoints are defined as a map of (name: minimum width), order from small to large:
-//
-// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)
-//
-// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.
-
-// Name of the next breakpoint, or null for the last breakpoint.
-//
-// >> breakpoint-next(sm)
-// md
-// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
-// md
-// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))
-// md
-@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {
- $n: index($breakpoint-names, $name);
- @if not $n {
- @error "breakpoint `#{$name}` not found in `#{$breakpoints}`";
- }
- @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);
-}
-
-// Minimum breakpoint width. Null for the smallest (first) breakpoint.
-//
-// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
-// 576px
-@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {
- $min: map-get($breakpoints, $name);
- @return if($min != 0, $min, null);
-}
-
-// Maximum breakpoint width.
-// The maximum value is reduced by 0.02px to work around the limitations of
-// `min-` and `max-` prefixes and viewports with fractional widths.
-// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max
-// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.
-// See https://bugs.webkit.org/show_bug.cgi?id=178261
-//
-// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
-// 767.98px
-@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {
- $max: map-get($breakpoints, $name);
- @return if($max and $max > 0, $max - .02, null);
-}
-
-// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.
-// Useful for making responsive utilities.
-//
-// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
-// "" (Returns a blank string)
-// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
-// "-sm"
-@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {
- @return if(breakpoint-min($name, $breakpoints) == null, "", "-#{$name}");
-}
-
-// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.
-// Makes the @content apply to the given breakpoint and wider.
-@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {
- $min: breakpoint-min($name, $breakpoints);
- @if $min {
- @media (min-width: $min) {
- @content;
- }
- } @else {
- @content;
- }
-}
-
-// Media of at most the maximum breakpoint width. No query for the largest breakpoint.
-// Makes the @content apply to the given breakpoint and narrower.
-@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {
- $max: breakpoint-max($name, $breakpoints);
- @if $max {
- @media (max-width: $max) {
- @content;
- }
- } @else {
- @content;
- }
-}
-
-// Media that spans multiple breakpoint widths.
-// Makes the @content apply between the min and max breakpoints
-@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {
- $min: breakpoint-min($lower, $breakpoints);
- $max: breakpoint-max($upper, $breakpoints);
-
- @if $min != null and $max != null {
- @media (min-width: $min) and (max-width: $max) {
- @content;
- }
- } @else if $max == null {
- @include media-breakpoint-up($lower, $breakpoints) {
- @content;
- }
- } @else if $min == null {
- @include media-breakpoint-down($upper, $breakpoints) {
- @content;
- }
- }
-}
-
-// Media between the breakpoint's minimum and maximum widths.
-// No minimum for the smallest breakpoint, and no maximum for the largest one.
-// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.
-@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {
- $min: breakpoint-min($name, $breakpoints);
- $next: breakpoint-next($name, $breakpoints);
- $max: breakpoint-max($next);
-
- @if $min != null and $max != null {
- @media (min-width: $min) and (max-width: $max) {
- @content;
- }
- } @else if $max == null {
- @include media-breakpoint-up($name, $breakpoints) {
- @content;
- }
- } @else if $min == null {
- @include media-breakpoint-down($next, $breakpoints) {
- @content;
- }
- }
-}
diff --git a/sass/bootstrap/scss/mixins/_buttons.scss b/sass/bootstrap/scss/mixins/_buttons.scss
deleted file mode 100644
index c06fa4a..0000000
--- a/sass/bootstrap/scss/mixins/_buttons.scss
+++ /dev/null
@@ -1,133 +0,0 @@
-// Button variants
-//
-// Easily pump out default styles, as well as :hover, :focus, :active,
-// and disabled options for all buttons
-
-// scss-docs-start btn-variant-mixin
-@mixin button-variant(
- $background,
- $border,
- $color: color-contrast($background),
- $hover-background: if($color == $color-contrast-light, shade-color($background, $btn-hover-bg-shade-amount), tint-color($background, $btn-hover-bg-tint-amount)),
- $hover-border: if($color == $color-contrast-light, shade-color($border, $btn-hover-border-shade-amount), tint-color($border, $btn-hover-border-tint-amount)),
- $hover-color: color-contrast($hover-background),
- $active-background: if($color == $color-contrast-light, shade-color($background,$btn-active-bg-shade-amount), tint-color($background, $btn-active-bg-tint-amount)),
- $active-border: if($color == $color-contrast-light, shade-color($border, $btn-active-border-shade-amount), tint-color($border, $btn-active-border-tint-amount)),
- $active-color: color-contrast($active-background),
- $disabled-background: $background,
- $disabled-border: $border,
- $disabled-color: color-contrast($disabled-background)
-) {
- color: $color;
- @include gradient-bg($background);
- border-color: $border;
- @include box-shadow($btn-box-shadow);
-
- &:hover {
- color: $hover-color;
- @include gradient-bg($hover-background);
- border-color: $hover-border;
- }
-
- .btn-check:focus + &,
- &:focus {
- color: $hover-color;
- @include gradient-bg($hover-background);
- border-color: $hover-border;
- @if $enable-shadows {
- @include box-shadow($btn-box-shadow, 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5));
- } @else {
- // Avoid using mixin so we can pass custom focus shadow properly
- box-shadow: 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5);
- }
- }
-
- .btn-check:checked + &,
- .btn-check:active + &,
- &:active,
- &.active,
- .show > &.dropdown-toggle {
- color: $active-color;
- background-color: $active-background;
- // Remove CSS gradients if they're enabled
- background-image: if($enable-gradients, none, null);
- border-color: $active-border;
-
- &:focus {
- @if $enable-shadows {
- @include box-shadow($btn-active-box-shadow, 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5));
- } @else {
- // Avoid using mixin so we can pass custom focus shadow properly
- box-shadow: 0 0 0 $btn-focus-width rgba(mix($color, $border, 15%), .5);
- }
- }
- }
-
- &:disabled,
- &.disabled {
- color: $disabled-color;
- background-color: $disabled-background;
- // Remove CSS gradients if they're enabled
- background-image: if($enable-gradients, none, null);
- border-color: $disabled-border;
- }
-}
-// scss-docs-end btn-variant-mixin
-
-// scss-docs-start btn-outline-variant-mixin
-@mixin button-outline-variant(
- $color,
- $color-hover: color-contrast($color),
- $active-background: $color,
- $active-border: $color,
- $active-color: color-contrast($active-background)
-) {
- color: $color;
- border-color: $color;
-
- &:hover {
- color: $color-hover;
- background-color: $active-background;
- border-color: $active-border;
- }
-
- .btn-check:focus + &,
- &:focus {
- box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);
- }
-
- .btn-check:checked + &,
- .btn-check:active + &,
- &:active,
- &.active,
- &.dropdown-toggle.show {
- color: $active-color;
- background-color: $active-background;
- border-color: $active-border;
-
- &:focus {
- @if $enable-shadows {
- @include box-shadow($btn-active-box-shadow, 0 0 0 $btn-focus-width rgba($color, .5));
- } @else {
- // Avoid using mixin so we can pass custom focus shadow properly
- box-shadow: 0 0 0 $btn-focus-width rgba($color, .5);
- }
- }
- }
-
- &:disabled,
- &.disabled {
- color: $color;
- background-color: transparent;
- }
-}
-// scss-docs-end btn-outline-variant-mixin
-
-// scss-docs-start btn-size-mixin
-@mixin button-size($padding-y, $padding-x, $font-size, $border-radius) {
- padding: $padding-y $padding-x;
- @include font-size($font-size);
- // Manually declare to provide an override to the browser default
- @include border-radius($border-radius, 0);
-}
-// scss-docs-end btn-size-mixin
diff --git a/sass/bootstrap/scss/mixins/_caret.scss b/sass/bootstrap/scss/mixins/_caret.scss
deleted file mode 100644
index 4b0f036..0000000
--- a/sass/bootstrap/scss/mixins/_caret.scss
+++ /dev/null
@@ -1,64 +0,0 @@
-// scss-docs-start caret-mixins
-@mixin caret-down {
- border-top: $caret-width solid;
- border-right: $caret-width solid transparent;
- border-bottom: 0;
- border-left: $caret-width solid transparent;
-}
-
-@mixin caret-up {
- border-top: 0;
- border-right: $caret-width solid transparent;
- border-bottom: $caret-width solid;
- border-left: $caret-width solid transparent;
-}
-
-@mixin caret-end {
- border-top: $caret-width solid transparent;
- border-right: 0;
- border-bottom: $caret-width solid transparent;
- border-left: $caret-width solid;
-}
-
-@mixin caret-start {
- border-top: $caret-width solid transparent;
- border-right: $caret-width solid;
- border-bottom: $caret-width solid transparent;
-}
-
-@mixin caret($direction: down) {
- @if $enable-caret {
- &::after {
- display: inline-block;
- margin-left: $caret-spacing;
- vertical-align: $caret-vertical-align;
- content: "";
- @if $direction == down {
- @include caret-down();
- } @else if $direction == up {
- @include caret-up();
- } @else if $direction == end {
- @include caret-end();
- }
- }
-
- @if $direction == start {
- &::after {
- display: none;
- }
-
- &::before {
- display: inline-block;
- margin-right: $caret-spacing;
- vertical-align: $caret-vertical-align;
- content: "";
- @include caret-start();
- }
- }
-
- &:empty::after {
- margin-left: 0;
- }
- }
-}
-// scss-docs-end caret-mixins
diff --git a/sass/bootstrap/scss/mixins/_clearfix.scss b/sass/bootstrap/scss/mixins/_clearfix.scss
deleted file mode 100644
index ffc62bb..0000000
--- a/sass/bootstrap/scss/mixins/_clearfix.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-// scss-docs-start clearfix
-@mixin clearfix() {
- &::after {
- display: block;
- clear: both;
- content: "";
- }
-}
-// scss-docs-end clearfix
diff --git a/sass/bootstrap/scss/mixins/_container.scss b/sass/bootstrap/scss/mixins/_container.scss
deleted file mode 100644
index ee6044d..0000000
--- a/sass/bootstrap/scss/mixins/_container.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-// Container mixins
-
-@mixin make-container($gutter: $container-padding-x) {
- width: 100%;
- padding-right: var(--#{$variable-prefix}gutter-x, #{$gutter});
- padding-left: var(--#{$variable-prefix}gutter-x, #{$gutter});
- margin-right: auto;
- margin-left: auto;
-}
diff --git a/sass/bootstrap/scss/mixins/_deprecate.scss b/sass/bootstrap/scss/mixins/_deprecate.scss
deleted file mode 100644
index df070bc..0000000
--- a/sass/bootstrap/scss/mixins/_deprecate.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-// Deprecate mixin
-//
-// This mixin can be used to deprecate mixins or functions.
-// `$enable-deprecation-messages` is a global variable, `$ignore-warning` is a variable that can be passed to
-// some deprecated mixins to suppress the warning (for example if the mixin is still be used in the current version of Bootstrap)
-@mixin deprecate($name, $deprecate-version, $remove-version, $ignore-warning: false) {
- @if ($enable-deprecation-messages != false and $ignore-warning != true) {
- @warn "#{$name} has been deprecated as of #{$deprecate-version}. It will be removed entirely in #{$remove-version}.";
- }
-}
diff --git a/sass/bootstrap/scss/mixins/_forms.scss b/sass/bootstrap/scss/mixins/_forms.scss
deleted file mode 100644
index a1e0849..0000000
--- a/sass/bootstrap/scss/mixins/_forms.scss
+++ /dev/null
@@ -1,134 +0,0 @@
-// This mixin uses an `if()` technique to be compatible with Dart Sass
-// See https://github.com/sass/sass/issues/1873#issuecomment-152293725 for more details
-
-// scss-docs-start form-validation-mixins
-@mixin form-validation-state-selector($state) {
- @if ($state == "valid" or $state == "invalid") {
- .was-validated #{if(&, "&", "")}:#{$state},
- #{if(&, "&", "")}.is-#{$state} {
- @content;
- }
- } @else {
- #{if(&, "&", "")}.is-#{$state} {
- @content;
- }
- }
-}
-
-@mixin form-validation-state(
- $state,
- $color,
- $icon,
- $tooltip-color: color-contrast($color),
- $tooltip-bg-color: rgba($color, $form-feedback-tooltip-opacity),
- $focus-box-shadow: 0 0 $input-btn-focus-blur $input-focus-width rgba($color, $input-btn-focus-color-opacity)
-) {
- .#{$state}-feedback {
- display: none;
- width: 100%;
- margin-top: $form-feedback-margin-top;
- @include font-size($form-feedback-font-size);
- font-style: $form-feedback-font-style;
- color: $color;
- }
-
- .#{$state}-tooltip {
- position: absolute;
- top: 100%;
- z-index: 5;
- display: none;
- max-width: 100%; // Contain to parent when possible
- padding: $form-feedback-tooltip-padding-y $form-feedback-tooltip-padding-x;
- margin-top: .1rem;
- @include font-size($form-feedback-tooltip-font-size);
- line-height: $form-feedback-tooltip-line-height;
- color: $tooltip-color;
- background-color: $tooltip-bg-color;
- @include border-radius($form-feedback-tooltip-border-radius);
- }
-
- @include form-validation-state-selector($state) {
- ~ .#{$state}-feedback,
- ~ .#{$state}-tooltip {
- display: block;
- }
- }
-
- .form-control {
- @include form-validation-state-selector($state) {
- border-color: $color;
-
- @if $enable-validation-icons {
- padding-right: $input-height-inner;
- background-image: escape-svg($icon);
- background-repeat: no-repeat;
- background-position: right $input-height-inner-quarter center;
- background-size: $input-height-inner-half $input-height-inner-half;
- }
-
- &:focus {
- border-color: $color;
- box-shadow: $focus-box-shadow;
- }
- }
- }
-
- // stylelint-disable-next-line selector-no-qualifying-type
- textarea.form-control {
- @include form-validation-state-selector($state) {
- @if $enable-validation-icons {
- padding-right: $input-height-inner;
- background-position: top $input-height-inner-quarter right $input-height-inner-quarter;
- }
- }
- }
-
- .form-select {
- @include form-validation-state-selector($state) {
- border-color: $color;
-
- @if $enable-validation-icons {
- padding-right: $form-select-feedback-icon-padding-end;
- background-image: escape-svg($form-select-indicator), escape-svg($icon);
- background-position: $form-select-bg-position, $form-select-feedback-icon-position;
- background-size: $form-select-bg-size, $form-select-feedback-icon-size;
- }
-
- &:focus {
- border-color: $color;
- box-shadow: $focus-box-shadow;
- }
- }
- }
-
- .form-check-input {
- @include form-validation-state-selector($state) {
- border-color: $color;
-
- &:checked {
- background-color: $color;
- }
-
- &:focus {
- box-shadow: $focus-box-shadow;
- }
-
- ~ .form-check-label {
- color: $color;
- }
- }
- }
- .form-check-inline .form-check-input {
- ~ .#{$state}-feedback {
- margin-left: .5em;
- }
- }
-
- .input-group .form-control,
- .input-group .form-select {
- @include form-validation-state-selector($state) {
- z-index: 3;
- }
- }
-}
-// scss-docs-end form-validation-mixins
diff --git a/sass/bootstrap/scss/mixins/_gradients.scss b/sass/bootstrap/scss/mixins/_gradients.scss
deleted file mode 100644
index 44167d1..0000000
--- a/sass/bootstrap/scss/mixins/_gradients.scss
+++ /dev/null
@@ -1,47 +0,0 @@
-// Gradients
-
-// scss-docs-start gradient-bg-mixin
-@mixin gradient-bg($color: null) {
- background-color: $color;
-
- @if $enable-gradients {
- background-image: var(--#{$variable-prefix}gradient);
- }
-}
-// scss-docs-end gradient-bg-mixin
-
-// scss-docs-start gradient-mixins
-// Horizontal gradient, from left to right
-//
-// Creates two color stops, start and end, by specifying a color and position for each color stop.
-@mixin gradient-x($start-color: $gray-700, $end-color: $gray-800, $start-percent: 0%, $end-percent: 100%) {
- background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent);
-}
-
-// Vertical gradient, from top to bottom
-//
-// Creates two color stops, start and end, by specifying a color and position for each color stop.
-@mixin gradient-y($start-color: $gray-700, $end-color: $gray-800, $start-percent: null, $end-percent: null) {
- background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent);
-}
-
-@mixin gradient-directional($start-color: $gray-700, $end-color: $gray-800, $deg: 45deg) {
- background-image: linear-gradient($deg, $start-color, $end-color);
-}
-
-@mixin gradient-x-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {
- background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);
-}
-
-@mixin gradient-y-three-colors($start-color: $blue, $mid-color: $purple, $color-stop: 50%, $end-color: $red) {
- background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);
-}
-
-@mixin gradient-radial($inner-color: $gray-700, $outer-color: $gray-800) {
- background-image: radial-gradient(circle, $inner-color, $outer-color);
-}
-
-@mixin gradient-striped($color: rgba($white, .15), $angle: 45deg) {
- background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
-}
-// scss-docs-end gradient-mixins
diff --git a/sass/bootstrap/scss/mixins/_grid.scss b/sass/bootstrap/scss/mixins/_grid.scss
deleted file mode 100644
index 92bb88a..0000000
--- a/sass/bootstrap/scss/mixins/_grid.scss
+++ /dev/null
@@ -1,120 +0,0 @@
-/// Grid system
-//
-// Generate semantic grid columns with these mixins.
-
-@mixin make-row($gutter: $grid-gutter-width) {
- --#{$variable-prefix}gutter-x: #{$gutter};
- --#{$variable-prefix}gutter-y: 0;
- display: flex;
- flex-wrap: wrap;
- margin-top: calc(var(--#{$variable-prefix}gutter-y) * -1); // stylelint-disable-line function-disallowed-list
- margin-right: calc(var(--#{$variable-prefix}gutter-x) / -2); // stylelint-disable-line function-disallowed-list
- margin-left: calc(var(--#{$variable-prefix}gutter-x) / -2); // stylelint-disable-line function-disallowed-list
-}
-
-@mixin make-col-ready($gutter: $grid-gutter-width) {
- // Add box sizing if only the grid is loaded
- box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);
- // Prevent columns from becoming too narrow when at smaller grid tiers by
- // always setting `width: 100%;`. This works because we set the width
- // later on to override this initial width.
- flex-shrink: 0;
- width: 100%;
- max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid
- padding-right: calc(var(--#{$variable-prefix}gutter-x) / 2); // stylelint-disable-line function-disallowed-list
- padding-left: calc(var(--#{$variable-prefix}gutter-x) / 2); // stylelint-disable-line function-disallowed-list
- margin-top: var(--#{$variable-prefix}gutter-y);
-}
-
-@mixin make-col($size, $columns: $grid-columns) {
- flex: 0 0 auto;
- width: percentage($size / $columns);
-}
-
-@mixin make-col-auto() {
- flex: 0 0 auto;
- width: auto;
-}
-
-@mixin make-col-offset($size, $columns: $grid-columns) {
- $num: $size / $columns;
- margin-left: if($num == 0, 0, percentage($num));
-}
-
-// Row columns
-//
-// Specify on a parent element(e.g., .row) to force immediate children into NN
-// numberof columns. Supports wrapping to new lines, but does not do a Masonry
-// style grid.
-@mixin row-cols($count) {
- > * {
- flex: 0 0 auto;
- width: 100% / $count;
- }
-}
-
-// Framework grid generation
-//
-// Used only by Bootstrap to generate the correct number of grid classes given
-// any value of `$grid-columns`.
-
-@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {
- @each $breakpoint in map-keys($breakpoints) {
- $infix: breakpoint-infix($breakpoint, $breakpoints);
-
- @include media-breakpoint-up($breakpoint, $breakpoints) {
- // Provide basic `.col-{bp}` classes for equal-width flexbox columns
- .col#{$infix} {
- flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4
- }
-
- .row-cols#{$infix}-auto > * {
- @include make-col-auto();
- }
-
- @if $grid-row-columns > 0 {
- @for $i from 1 through $grid-row-columns {
- .row-cols#{$infix}-#{$i} {
- @include row-cols($i);
- }
- }
- }
-
- .col#{$infix}-auto {
- @include make-col-auto();
- }
-
- @if $columns > 0 {
- @for $i from 1 through $columns {
- .col#{$infix}-#{$i} {
- @include make-col($i, $columns);
- }
- }
-
- // `$columns - 1` because offsetting by the width of an entire row isn't possible
- @for $i from 0 through ($columns - 1) {
- @if not ($infix == "" and $i == 0) { // Avoid emitting useless .offset-0
- .offset#{$infix}-#{$i} {
- @include make-col-offset($i, $columns);
- }
- }
- }
- }
-
- // Gutters
- //
- // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.
- @each $key, $value in $gutters {
- .g#{$infix}-#{$key},
- .gx#{$infix}-#{$key} {
- --#{$variable-prefix}gutter-x: #{$value};
- }
-
- .g#{$infix}-#{$key},
- .gy#{$infix}-#{$key} {
- --#{$variable-prefix}gutter-y: #{$value};
- }
- }
- }
- }
-}
diff --git a/sass/bootstrap/scss/mixins/_image.scss b/sass/bootstrap/scss/mixins/_image.scss
deleted file mode 100644
index e1df779..0000000
--- a/sass/bootstrap/scss/mixins/_image.scss
+++ /dev/null
@@ -1,16 +0,0 @@
-// Image Mixins
-// - Responsive image
-// - Retina image
-
-
-// Responsive image
-//
-// Keep images from scaling beyond the width of their parents.
-
-@mixin img-fluid {
- // Part 1: Set a maximum relative to the parent
- max-width: 100%;
- // Part 2: Override the height to auto, otherwise images will be stretched
- // when setting a width and height attribute on the img element.
- height: auto;
-}
diff --git a/sass/bootstrap/scss/mixins/_list-group.scss b/sass/bootstrap/scss/mixins/_list-group.scss
deleted file mode 100644
index e55415f..0000000
--- a/sass/bootstrap/scss/mixins/_list-group.scss
+++ /dev/null
@@ -1,24 +0,0 @@
-// List Groups
-
-// scss-docs-start list-group-mixin
-@mixin list-group-item-variant($state, $background, $color) {
- .list-group-item-#{$state} {
- color: $color;
- background-color: $background;
-
- &.list-group-item-action {
- &:hover,
- &:focus {
- color: $color;
- background-color: shade-color($background, 10%);
- }
-
- &.active {
- color: $white;
- background-color: $color;
- border-color: $color;
- }
- }
- }
-}
-// scss-docs-end list-group-mixin
diff --git a/sass/bootstrap/scss/mixins/_lists.scss b/sass/bootstrap/scss/mixins/_lists.scss
deleted file mode 100644
index 2518562..0000000
--- a/sass/bootstrap/scss/mixins/_lists.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-// Lists
-
-// Unstyled keeps list items block level, just removes default browser padding and list-style
-@mixin list-unstyled {
- padding-left: 0;
- list-style: none;
-}
diff --git a/sass/bootstrap/scss/mixins/_pagination.scss b/sass/bootstrap/scss/mixins/_pagination.scss
deleted file mode 100644
index 3101b38..0000000
--- a/sass/bootstrap/scss/mixins/_pagination.scss
+++ /dev/null
@@ -1,31 +0,0 @@
-// Pagination
-
-// scss-docs-start pagination-mixin
-@mixin pagination-size($padding-y, $padding-x, $font-size, $border-radius) {
- .page-link {
- padding: $padding-y $padding-x;
- @include font-size($font-size);
- }
-
- .page-item {
- @if $pagination-margin-start == (-$pagination-border-width) {
- &:first-child {
- .page-link {
- @include border-start-radius($border-radius);
- }
- }
-
- &:last-child {
- .page-link {
- @include border-end-radius($border-radius);
- }
- }
- } @else {
- //Add border-radius to all pageLinks in case they have left margin
- .page-link {
- @include border-radius($border-radius);
- }
- }
- }
-}
-// scss-docs-end pagination-mixin
diff --git a/sass/bootstrap/scss/mixins/_reset-text.scss b/sass/bootstrap/scss/mixins/_reset-text.scss
deleted file mode 100644
index 354f564..0000000
--- a/sass/bootstrap/scss/mixins/_reset-text.scss
+++ /dev/null
@@ -1,17 +0,0 @@
-@mixin reset-text {
- font-family: $font-family-base;
- // We deliberately do NOT reset font-size or overflow-wrap / word-wrap.
- font-style: normal;
- font-weight: $font-weight-normal;
- line-height: $line-height-base;
- text-align: left; // Fallback for where `start` is not supported
- text-align: start;
- text-decoration: none;
- text-shadow: none;
- text-transform: none;
- letter-spacing: normal;
- word-break: normal;
- word-spacing: normal;
- white-space: normal;
- line-break: auto;
-}
diff --git a/sass/bootstrap/scss/mixins/_resize.scss b/sass/bootstrap/scss/mixins/_resize.scss
deleted file mode 100644
index 66f233a..0000000
--- a/sass/bootstrap/scss/mixins/_resize.scss
+++ /dev/null
@@ -1,6 +0,0 @@
-// Resize anything
-
-@mixin resizable($direction) {
- overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`
- resize: $direction; // Options: horizontal, vertical, both
-}
diff --git a/sass/bootstrap/scss/mixins/_table-variants.scss b/sass/bootstrap/scss/mixins/_table-variants.scss
deleted file mode 100644
index 9fd0fb0..0000000
--- a/sass/bootstrap/scss/mixins/_table-variants.scss
+++ /dev/null
@@ -1,21 +0,0 @@
-// scss-docs-start table-variant
-@mixin table-variant($state, $background) {
- .table-#{$state} {
- $color: color-contrast(opaque($body-bg, $background));
- $hover-bg: mix($color, $background, percentage($table-hover-bg-factor));
- $striped-bg: mix($color, $background, percentage($table-striped-bg-factor));
- $active-bg: mix($color, $background, percentage($table-active-bg-factor));
-
- --#{$variable-prefix}table-bg: #{$background};
- --#{$variable-prefix}table-striped-bg: #{$striped-bg};
- --#{$variable-prefix}table-striped-color: #{color-contrast($striped-bg)};
- --#{$variable-prefix}table-active-bg: #{$active-bg};
- --#{$variable-prefix}table-active-color: #{color-contrast($active-bg)};
- --#{$variable-prefix}table-hover-bg: #{$hover-bg};
- --#{$variable-prefix}table-hover-color: #{color-contrast($hover-bg)};
-
- color: $color;
- border-color: mix($color, $background, percentage($table-border-factor));
- }
-}
-// scss-docs-end table-variant
diff --git a/sass/bootstrap/scss/mixins/_text-truncate.scss b/sass/bootstrap/scss/mixins/_text-truncate.scss
deleted file mode 100644
index 3504bb1..0000000
--- a/sass/bootstrap/scss/mixins/_text-truncate.scss
+++ /dev/null
@@ -1,8 +0,0 @@
-// Text truncate
-// Requires inline-block or block for proper styling
-
-@mixin text-truncate() {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
diff --git a/sass/bootstrap/scss/mixins/_transition.scss b/sass/bootstrap/scss/mixins/_transition.scss
deleted file mode 100644
index d437f6d..0000000
--- a/sass/bootstrap/scss/mixins/_transition.scss
+++ /dev/null
@@ -1,26 +0,0 @@
-// stylelint-disable property-disallowed-list
-@mixin transition($transition...) {
- @if length($transition) == 0 {
- $transition: $transition-base;
- }
-
- @if length($transition) > 1 {
- @each $value in $transition {
- @if $value == null or $value == none {
- @warn "The keyword 'none' or 'null' must be used as a single argument.";
- }
- }
- }
-
- @if $enable-transitions {
- @if nth($transition, 1) != null {
- transition: $transition;
- }
-
- @if $enable-reduced-motion and nth($transition, 1) != null and nth($transition, 1) != none {
- @media (prefers-reduced-motion: reduce) {
- transition: none;
- }
- }
- }
-}
diff --git a/sass/bootstrap/scss/mixins/_utilities.scss b/sass/bootstrap/scss/mixins/_utilities.scss
deleted file mode 100644
index 4d2370a..0000000
--- a/sass/bootstrap/scss/mixins/_utilities.scss
+++ /dev/null
@@ -1,68 +0,0 @@
-// Utility generator
-// Used to generate utilities & print utilities
-@mixin generate-utility($utility, $infix, $is-rfs-media-query: false) {
- $values: map-get($utility, values);
-
- // If the values are a list or string, convert it into a map
- @if type-of($values) == "string" or type-of(nth($values, 1)) != "list" {
- $values: zip($values, $values);
- }
-
- @each $key, $value in $values {
- $properties: map-get($utility, property);
-
- // Multiple properties are possible, for example with vertical or horizontal margins or paddings
- @if type-of($properties) == "string" {
- $properties: append((), $properties);
- }
-
- // Use custom class if present
- $property-class: if(map-has-key($utility, class), map-get($utility, class), nth($properties, 1));
- $property-class: if($property-class == null, "", $property-class);
-
- // State params to generate pseudo-classes
- $state: if(map-has-key($utility, state), map-get($utility, state), ());
-
- $infix: if($property-class == "" and str-slice($infix, 1, 1) == "-", str-slice($infix, 2), $infix);
-
- // Don't prefix if value key is null (eg. with shadow class)
- $property-class-modifier: if($key, if($property-class == "" and $infix == "", "", "-") + $key, "");
-
- @if map-get($utility, rfs) {
- // Inside the media query
- @if $is-rfs-media-query {
- $val: rfs-value($value);
-
- // Do not render anything if fluid and non fluid values are the same
- $value: if($val == rfs-fluid-value($value), null, $val);
- }
- @else {
- $value: rfs-fluid-value($value);
- }
- }
-
- $is-rtl: map-get($utility, rtl);
-
- @if $value != null {
- @if $is-rtl == false {
- /* rtl:begin:remove */
- }
- .#{$property-class + $infix + $property-class-modifier} {
- @each $property in $properties {
- #{$property}: $value if($enable-important-utilities, !important, null);
- }
- }
-
- @each $pseudo in $state {
- .#{$property-class + $infix + $property-class-modifier}-#{$pseudo}:#{$pseudo} {
- @each $property in $properties {
- #{$property}: $value if($enable-important-utilities, !important, null);
- }
- }
- }
- @if $is-rtl == false {
- /* rtl:end:remove */
- }
- }
- }
-}
diff --git a/sass/bootstrap/scss/mixins/_visually-hidden.scss b/sass/bootstrap/scss/mixins/_visually-hidden.scss
deleted file mode 100644
index ed7bc9c..0000000
--- a/sass/bootstrap/scss/mixins/_visually-hidden.scss
+++ /dev/null
@@ -1,29 +0,0 @@
-// stylelint-disable declaration-no-important
-
-// Hide content visually while keeping it accessible to assistive technologies
-//
-// See: https://www.a11yproject.com/posts/2013-01-11-how-to-hide-content/
-// See: https://hugogiraudel.com/2016/10/13/css-hide-and-seek/
-
-@mixin visually-hidden() {
- position: absolute !important;
- width: 1px !important;
- height: 1px !important;
- padding: 0 !important;
- margin: -1px !important; // Fix for https://github.com/twbs/bootstrap/issues/25686
- overflow: hidden !important;
- clip: rect(0, 0, 0, 0) !important;
- white-space: nowrap !important;
- border: 0 !important;
-}
-
-// Use to only display content when it's focused, or one of its child elements is focused
-// (i.e. when focus is within the element/container that the class was applied to)
-//
-// Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
-
-@mixin visually-hidden-focusable() {
- &:not(:focus):not(:focus-within) {
- @include visually-hidden();
- }
-}
diff --git a/sass/bootstrap/scss/utilities/_api.scss b/sass/bootstrap/scss/utilities/_api.scss
deleted file mode 100644
index 62e1d39..0000000
--- a/sass/bootstrap/scss/utilities/_api.scss
+++ /dev/null
@@ -1,47 +0,0 @@
-// Loop over each breakpoint
-@each $breakpoint in map-keys($grid-breakpoints) {
-
- // Generate media query if needed
- @include media-breakpoint-up($breakpoint) {
- $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
-
- // Loop over each utility property
- @each $key, $utility in $utilities {
- // The utility can be disabled with `false`, thus check if the utility is a map first
- // Only proceed if responsive media queries are enabled or if it's the base media query
- @if type-of($utility) == "map" and (map-get($utility, responsive) or $infix == "") {
- @include generate-utility($utility, $infix);
- }
- }
- }
-}
-
-// RFS rescaling
-@media (min-width: $rfs-mq-value) {
- @each $breakpoint in map-keys($grid-breakpoints) {
- $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
-
- @if (map-get($grid-breakpoints, $breakpoint) < $rfs-breakpoint) {
- // Loop over each utility property
- @each $key, $utility in $utilities {
- // The utility can be disabled with `false`, thus check if the utility is a map first
- // Only proceed if responsive media queries are enabled or if it's the base media query
- @if type-of($utility) == "map" and map-get($utility, rfs) and (map-get($utility, responsive) or $infix == "") {
- @include generate-utility($utility, $infix, true);
- }
- }
- }
- }
-}
-
-
-// Print utilities
-@media print {
- @each $key, $utility in $utilities {
- // The utility can be disabled with `false`, thus check if the utility is a map first
- // Then check if the utility needs print styles
- @if type-of($utility) == "map" and map-get($utility, print) == true {
- @include generate-utility($utility, "-print");
- }
- }
-}
diff --git a/sass/bootstrap/scss/vendor/_rfs.scss b/sass/bootstrap/scss/vendor/_rfs.scss
deleted file mode 100644
index 798753e..0000000
--- a/sass/bootstrap/scss/vendor/_rfs.scss
+++ /dev/null
@@ -1,312 +0,0 @@
-// stylelint-disable property-blacklist, scss/dollar-variable-default
-
-// SCSS RFS mixin
-//
-// Automated responsive values for font sizes, paddings, margins and much more
-//
-// Licensed under MIT (https://github.com/twbs/rfs/blob/master/LICENSE)
-
-// Configuration
-
-// Base value
-$rfs-base-value: 1.25rem !default;
-$rfs-unit: rem !default;
-
-@if $rfs-unit != rem and $rfs-unit != px {
- @error "`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.";
-}
-
-// Breakpoint at where values start decreasing if screen width is smaller
-$rfs-breakpoint: 1200px !default;
-$rfs-breakpoint-unit: px !default;
-
-@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {
- @error "`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.";
-}
-
-// Resize values based on screen height and width
-$rfs-two-dimensional: false !default;
-
-// Factor of decrease
-$rfs-factor: 10 !default;
-
-@if type-of($rfs-factor) != number or $rfs-factor <= 1 {
- @error "`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.";
-}
-
-// Mode. Possibilities: "min-media-query", "max-media-query"
-$rfs-mode: min-media-query !default;
-
-// Generate enable or disable classes. Possibilities: false, "enable" or "disable"
-$rfs-class: false !default;
-
-// 1 rem = $rfs-rem-value px
-$rfs-rem-value: 16 !default;
-
-// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14
-$rfs-safari-iframe-resize-bug-fix: false !default;
-
-// Disable RFS by setting $enable-rfs to false
-$enable-rfs: true !default;
-
-// Cache $rfs-base-value unit
-$rfs-base-value-unit: unit($rfs-base-value);
-
-// Remove px-unit from $rfs-base-value for calculations
-@if $rfs-base-value-unit == px {
- $rfs-base-value: $rfs-base-value / ($rfs-base-value * 0 + 1);
-}
-@else if $rfs-base-value-unit == rem {
- $rfs-base-value: $rfs-base-value / ($rfs-base-value * 0 + 1 / $rfs-rem-value);
-}
-
-// Cache $rfs-breakpoint unit to prevent multiple calls
-$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);
-
-// Remove unit from $rfs-breakpoint for calculations
-@if $rfs-breakpoint-unit-cache == px {
- $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1);
-}
-@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == "em" {
- $rfs-breakpoint: $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value);
-}
-
-// Calculate the media query value
-$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{$rfs-breakpoint / $rfs-rem-value}#{$rfs-breakpoint-unit});
-$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);
-$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);
-
-// Internal mixin used to determine which media query needs to be used
-@mixin _rfs-media-query {
- @if $rfs-two-dimensional {
- @if $rfs-mode == max-media-query {
- @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {
- @content;
- }
- }
- @else {
- @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {
- @content;
- }
- }
- }
- @else {
- @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {
- @content;
- }
- }
-}
-
-// Internal mixin that adds disable classes to the selector if needed.
-@mixin _rfs-rule {
- @if $rfs-class == disable and $rfs-mode == max-media-query {
- // Adding an extra class increases specificity, which prevents the media query to override the property
- &,
- .disable-rfs &,
- &.disable-rfs {
- @content;
- }
- }
- @else if $rfs-class == enable and $rfs-mode == min-media-query {
- .enable-rfs &,
- &.enable-rfs {
- @content;
- }
- }
- @else {
- @content;
- }
-}
-
-// Internal mixin that adds enable classes to the selector if needed.
-@mixin _rfs-media-query-rule {
-
- @if $rfs-class == enable {
- @if $rfs-mode == min-media-query {
- @content;
- }
-
- @include _rfs-media-query {
- .enable-rfs &,
- &.enable-rfs {
- @content;
- }
- }
- }
- @else {
- @if $rfs-class == disable and $rfs-mode == min-media-query {
- .disable-rfs &,
- &.disable-rfs {
- @content;
- }
- }
- @include _rfs-media-query {
- @content;
- }
- }
-}
-
-// Helper function to get the formatted non-responsive value
-@function rfs-value($values) {
- // Convert to list
- $values: if(type-of($values) != list, ($values,), $values);
-
- $val: '';
-
- // Loop over each value and calculate value
- @each $value in $values {
- @if $value == 0 {
- $val: $val + ' 0';
- }
- @else {
- // Cache $value unit
- $unit: if(type-of($value) == "number", unit($value), false);
-
- @if $unit == px {
- // Convert to rem if needed
- $val: $val + ' ' + if($rfs-unit == rem, #{$value / ($value * 0 + $rfs-rem-value)}rem, $value);
- }
- @else if $unit == rem {
- // Convert to px if needed
- $val: $val + ' ' + if($rfs-unit == px, #{$value / ($value * 0 + 1) * $rfs-rem-value}px, $value);
- }
- @else {
- // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value
- $val: $val + ' ' + $value;
- }
- }
- }
-
- // Remove first space
- @return unquote(str-slice($val, 2));
-}
-
-// Helper function to get the responsive value calculated by RFS
-@function rfs-fluid-value($values) {
- // Convert to list
- $values: if(type-of($values) != list, ($values,), $values);
-
- $val: '';
-
- // Loop over each value and calculate value
- @each $value in $values {
- @if $value == 0 {
- $val: $val + ' 0';
- }
-
- @else {
- // Cache $value unit
- $unit: if(type-of($value) == "number", unit($value), false);
-
- // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value
- @if not $unit or $unit != px and $unit != rem {
- $val: $val + ' ' + $value;
- }
-
- @else {
- // Remove unit from $value for calculations
- $value: $value / ($value * 0 + if($unit == px, 1, 1 / $rfs-rem-value));
-
- // Only add the media query if the value is greater than the minimum value
- @if abs($value) <= $rfs-base-value or not $enable-rfs {
- $val: $val + ' ' + if($rfs-unit == rem, #{$value / $rfs-rem-value}rem, #{$value}px);
- }
- @else {
- // Calculate the minimum value
- $value-min: $rfs-base-value + (abs($value) - $rfs-base-value) / $rfs-factor;
-
- // Calculate difference between $value and the minimum value
- $value-diff: abs($value) - $value-min;
-
- // Base value formatting
- $min-width: if($rfs-unit == rem, #{$value-min / $rfs-rem-value}rem, #{$value-min}px);
-
- // Use negative value if needed
- $min-width: if($value < 0, -$min-width, $min-width);
-
- // Use `vmin` if two-dimensional is enabled
- $variable-unit: if($rfs-two-dimensional, vmin, vw);
-
- // Calculate the variable width between 0 and $rfs-breakpoint
- $variable-width: #{$value-diff * 100 / $rfs-breakpoint}#{$variable-unit};
-
- // Return the calculated value
- $val: $val + ' calc(' + $min-width + if($value < 0, ' - ', ' + ') + $variable-width + ')';
- }
- }
- }
- }
-
- // Remove first space
- @return unquote(str-slice($val, 2));
-}
-
-// RFS mixin
-@mixin rfs($values, $property: font-size) {
- @if $values != null {
- $val: rfs-value($values);
- $fluidVal: rfs-fluid-value($values);
-
- // Do not print the media query if responsive & non-responsive values are the same
- @if $val == $fluidVal {
- #{$property}: $val;
- }
- @else {
- @include _rfs-rule {
- #{$property}: if($rfs-mode == max-media-query, $val, $fluidVal);
-
- // Include safari iframe resize fix if needed
- min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);
- }
-
- @include _rfs-media-query-rule {
- #{$property}: if($rfs-mode == max-media-query, $fluidVal, $val);
- }
- }
- }
-}
-
-// Shorthand helper mixins
-@mixin font-size($value) {
- @include rfs($value);
-}
-
-@mixin padding($value) {
- @include rfs($value, padding);
-}
-
-@mixin padding-top($value) {
- @include rfs($value, padding-top);
-}
-
-@mixin padding-right($value) {
- @include rfs($value, padding-right);
-}
-
-@mixin padding-bottom($value) {
- @include rfs($value, padding-bottom);
-}
-
-@mixin padding-left($value) {
- @include rfs($value, padding-left);
-}
-
-@mixin margin($value) {
- @include rfs($value, margin);
-}
-
-@mixin margin-top($value) {
- @include rfs($value, margin-top);
-}
-
-@mixin margin-right($value) {
- @include rfs($value, margin-right);
-}
-
-@mixin margin-bottom($value) {
- @include rfs($value, margin-bottom);
-}
-
-@mixin margin-left($value) {
- @include rfs($value, margin-left);
-}
diff --git a/sass/common/_dark.scss b/sass/common/_dark.scss
deleted file mode 100644
index 0789939..0000000
--- a/sass/common/_dark.scss
+++ /dev/null
@@ -1,333 +0,0 @@
-/** Theme variables */
-
-// Source: https://material.io/design/color/dark-theme.html
-
-$body-bg-dark: $gray-900;
-$body-overlay-dark: darken($body-bg-dark, 2.5%);
-$border-dark: darken($body-bg-dark, 2.5%);
-$body-color-dark: $gray-300;
-$dots-dark: darken($body-color-dark, 50%);
-
-$link-color-dark: $blue-300;
-$button-color-dark: $link-color-dark;
-$focus-color-dark: lighten($link-color-dark, 2.5%);
-
-$navbar-dark-color: $body-color-dark;
-$navbar-dark-hover-color: $link-color-dark;
-$navbar-dark-active-color: $link-color-dark;
-
-/** Theme styles */
-
-body.dark {
- background: $body-bg-dark;
- color: $body-color-dark;
-}
-
-body.dark a {
- color: $link-color-dark;
-}
-
-body.dark a.text-body {
- color: $body-color-dark !important;
-}
-
-body.dark .btn-primary {
- @include button-variant($button-color-dark, $button-color-dark);
-
- color: $body-bg-dark !important;
-}
-
-body.dark .btn-outline-primary {
- @include button-outline-variant($button-color-dark, $button-color-dark);
-
- color: $link-color-dark;
-}
-
-body.dark .btn-outline-primary:hover {
- color: $body-bg-dark;
-}
-
-body.dark .navbar {
- background: $body-bg-dark;
- opacity: 0.975;
- border-bottom: 1px solid $border-dark;
-}
-
-body.dark.home .navbar {
- border-bottom: 0;
-}
-
-body.dark .navbar-light .navbar-brand {
- color: $navbar-dark-color !important;
-}
-
-body.dark .navbar-light .navbar-nav .nav-link {
- color: $navbar-dark-color;
-}
-
-body.dark .navbar-light .navbar-nav .nav-link:hover,
-body.dark .navbar-light .navbar-nav .nav-link:focus {
- color: $navbar-dark-hover-color;
-}
-
-body.dark .navbar-light .navbar-nav .nav-link.disabled {
- color: $navbar-dark-disabled-color;
-}
-
-body.dark .navbar-light .navbar-nav .show > .nav-link,
-body.dark .navbar-light .navbar-nav .active > .nav-link,
-body.dark .navbar-light .navbar-nav .nav-link.show,
-body.dark .navbar-light .navbar-nav .nav-link.active {
- color: $navbar-dark-active-color;
-}
-
-body.dark .navbar-light .navbar-text {
- color: $navbar-dark-color;
-}
-
-body.dark .alert-primary a {
- color: $body-bg-dark;
-}
-
-body.dark .alert-warning {
- background: $body-overlay-dark;
- color: $body-color-dark;
-}
-
-body.dark .page-links a {
- color: $body-color-dark;
-}
-
-body.dark .showcase-meta a {
- color: $body-color-dark;
-}
-
-body.dark .showcase-meta a:hover,
-body.dark .showcase-meta a:focus {
- color: $link-color-dark;
-}
-
-body.dark .docs-link:hover,
-body.dark .docs-link.active,
-body.dark .page-links a:hover {
- text-decoration: none;
- color: $link-color-dark;
-}
-
-body.dark .navbar-light .navbar-text a {
- color: $navbar-dark-active-color;
-}
-
-body.dark .docs-links h3.sidebar-link a,
-body.dark .page-links h3.sidebar-link a {
- color: $body-color-dark;
-}
-
-body.dark .navbar-light .navbar-text a:hover,
-body.dark .navbar-light .navbar-text a:focus {
- color: $navbar-dark-active-color;
-}
-
-body.dark .navbar .btn-link {
- color: $navbar-dark-color;
-}
-
-body.dark .content .btn-link {
- color: $link-color-dark;
-}
-
-body.dark .content .btn-link:hover {
- color: $link-color-dark;
-}
-
-body.dark .navbar .btn-link:hover {
- color: $navbar-dark-hover-color;
-}
-
-body.dark .navbar .btn-link:active {
- color: $navbar-dark-active-color;
-}
-
-body.dark .form-control.is-search {
- background: $body-overlay-dark;
-
- /*
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%236c757d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-search'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");
- background-repeat: no-repeat;
- background-position: right calc(0.375em + 0.1875rem) center;
- background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
- */
-}
-
-body.dark .navbar-form::after {
- color: $gray-600;
- border: 1px solid $gray-800;
-}
-
-body.dark .form-control {
- color: $gray-500;
-}
-
-body.dark .form-control:focus {
- box-shadow: 0 0 0 0.2rem $focus-color-dark;
-}
-
-body.dark .border-top {
- border-top: 1px solid $border-dark !important;
-}
-
-@include media-breakpoint-up(lg) {
- body.dark .docs-sidebar {
- order: 0;
- border-right: 1px solid $border-dark;
- }
-}
-
-body.dark .docs-navigation {
- border-top: 1px solid $border-dark;
-}
-
-body.dark pre code::-webkit-scrollbar-thumb {
- background: $border-dark;
-}
-
-body.dark code:not(.hljs) {
- background: $body-overlay-dark;
- color: $body-color-dark;
-}
-
-body.dark pre code:hover {
- scrollbar-width: thin;
- scrollbar-color: $border-dark transparent;
-}
-
-body.dark pre code::-webkit-scrollbar-thumb:hover {
- background: $border-dark;
-}
-
-body.dark blockquote {
- border-left: 3px solid $border-dark;
-}
-
-body.dark .footer {
- border-top: 1px solid $border-dark;
-}
-
-body.dark .docs-links,
-body.dark .docs-toc {
- scrollbar-width: thin;
- scrollbar-color: $body-bg-dark $body-bg-dark;
-}
-
-body.dark .docs-links::-webkit-scrollbar,
-body.dark .docs-toc::-webkit-scrollbar {
- width: 5px;
-}
-
-body.dark .docs-links::-webkit-scrollbar-track,
-body.dark .docs-toc::-webkit-scrollbar-track {
- background: $body-bg-dark;
-}
-
-body.dark .docs-links::-webkit-scrollbar-thumb,
-body.dark .docs-toc::-webkit-scrollbar-thumb {
- background: $body-bg-dark;
-}
-
-body.dark .docs-links:hover,
-body.dark .docs-toc:hover {
- scrollbar-width: thin;
- scrollbar-color: $border-dark $body-bg-dark;
-}
-
-body.dark .docs-links:hover::-webkit-scrollbar-thumb,
-body.dark .docs-toc:hover::-webkit-scrollbar-thumb {
- background: $border-dark;
-}
-
-body.dark .docs-links::-webkit-scrollbar-thumb:hover,
-body.dark .docs-toc::-webkit-scrollbar-thumb:hover {
- background: $border-dark;
-}
-
-body.dark .docs-links h3:not(:first-child) {
- border-top: 1px solid $border-dark;
-}
-
-body.dark a.docs-link {
- color: $body-color-dark;
-}
-
-body.dark .page-links li:not(:first-child) {
- border-top: 1px dashed $border-dark;
-}
-
-body.dark .card {
- background: $body-bg-dark;
- border: 1px solid $border-dark;
-}
-
-body.dark .card.bg-light {
- background: $body-overlay-dark !important;
-}
-
-body.dark .navbar .menu-icon .navicon {
- background: $navbar-dark-color;
-}
-
-body.dark .navbar .menu-icon .navicon::before,
-body.dark .navbar .menu-icon .navicon::after {
- background: $navbar-dark-color;
-}
-
-body.dark .logo-light {
- display: none !important;
-}
-
-body.dark .logo-dark {
- display: inline-block !important;
-}
-
-body.dark .bg-light {
- background: darken($body-bg-dark, 1.5%) !important;
-}
-
-body.dark .bg-dots {
- background-image: radial-gradient($dots-dark 15%, transparent 15%);
-}
-
-body.dark .text-muted {
- color: darken($body-color-dark, 7.5%) !important;
-}
-
-body.dark .alert-primary {
- background: $link-color-dark;
- color: $body-bg-dark;
-}
-
-body.dark .figure-caption {
- color: $body-color-dark;
-}
-
-body.dark table {
- @extend .table-dark;
-}
-
-body.dark .copy-status::after {
- content: "Copy";
- display: block;
- color: $body-color-dark;
-}
-
-body.dark .copy-status:hover::after {
- content: "Copy";
- display: block;
- color: $link-color-dark;
-}
-
-body.dark .copy-status:focus::after,
-body.dark .copy-status:active::after {
- content: "Copied";
- display: block;
- color: $link-color-dark;
-}
diff --git a/sass/common/_fonts.scss b/sass/common/_fonts.scss
deleted file mode 100644
index d2b7725..0000000
--- a/sass/common/_fonts.scss
+++ /dev/null
@@ -1,71 +0,0 @@
-/* jost-regular - latin */
-@font-face {
- font-family: "Jost";
- font-style: normal;
- font-weight: 400;
- font-display: swap;
- src:
- local("Jost"),
- url("http://github.com/fonts/vendor/jost/jost-v4-latin-regular.woff2") format("woff2"),
- url("http://github.com/fonts/vendor/jost/jost-v4-latin-regular.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
-}
-
-/* jost-500 - latin */
-@font-face {
- font-family: "Jost";
- font-style: normal;
- font-weight: 500;
- font-display: swap;
- src:
- local("Jost"),
- url("http://github.com/fonts/vendor/jost/jost-v4-latin-500.woff2") format("woff2"),
- url("http://github.com/fonts/vendor/jost/jost-v4-latin-500.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
-}
-
-/* jost-700 - latin */
-@font-face {
- font-family: "Jost";
- font-style: normal;
- font-weight: 700;
- font-display: swap;
- src:
- local("Jost"),
- url("http://github.com/fonts/vendor/jost/jost-v4-latin-700.woff2") format("woff2"),
- url("http://github.com/fonts/vendor/jost/jost-v4-latin-700.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
-}
-
-/* jost-italic - latin */
-@font-face {
- font-family: "Jost";
- font-style: italic;
- font-weight: 400;
- font-display: swap;
- src:
- local("Jost"),
- url("http://github.com/fonts/vendor/jost/jost-v4-latin-italic.woff2") format("woff2"),
- url("http://github.com/fonts/vendor/jost/jost-v4-latin-italic.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
-}
-
-/* jost-500italic - latin */
-@font-face {
- font-family: "Jost";
- font-style: italic;
- font-weight: 500;
- font-display: swap;
- src:
- local("Jost"),
- url("http://github.com/fonts/vendor/jost/jost-v4-latin-500italic.woff2") format("woff2"),
- url("http://github.com/fonts/vendor/jost/jost-v4-latin-500italic.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
-}
-
-/* jost-700italic - latin */
-@font-face {
- font-family: "Jost";
- font-style: italic;
- font-weight: 700;
- font-display: swap;
- src:
- local("Jost"),
- url("http://github.com/fonts/vendor/jost/jost-v4-latin-700italic.woff2") format("woff2"),
- url("http://github.com/fonts/vendor/jost/jost-v4-latin-700italic.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
-}
diff --git a/sass/common/_global.scss b/sass/common/_global.scss
deleted file mode 100644
index 0d94663..0000000
--- a/sass/common/_global.scss
+++ /dev/null
@@ -1,238 +0,0 @@
-.contributors .content,
-.blog .content,
-.page .content,
-.error404 .content,
-.docs.list .content,
-.tutorial.list .content,
-.showcase.list .content {
- padding-top: 1rem;
- padding-bottom: 3rem;
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-.h1,
-.h2,
-.h3,
-.h4,
-.h5,
-.h6 {
- margin: 2rem 0 1rem;
-}
-
-@include media-breakpoint-up(md) {
- body {
- font-size: $font-size-md;
- padding-top: 4rem !important;
- }
-
- h1,
- h2,
- h3,
- h4,
- h5,
- h6,
- .h1,
- .h2,
- .h3,
- .h4,
- .h5,
- .h6 {
- margin-bottom: 1.125rem;
- }
-}
-
-.home h1 {
- /* font-size: calc(1.375rem + 1.5vw); */
- font-size: calc(1.875rem + 1.5vw);
-}
-
-a:hover,
-a:focus {
- text-decoration: underline;
-}
-
-a.btn:hover,
-a.btn:focus {
- text-decoration: none;
-}
-
-.section {
- padding-top: 5rem;
- padding-bottom: 5rem;
-}
-
-.section-md {
- padding-top: 3rem;
- padding-bottom: 3rem;
-}
-
-.section-sm {
- padding-top: 1rem;
- padding-bottom: 1rem;
-}
-
-/*
-.section svg {
- display: inline-block;
- width: 2rem;
- height: 2rem;
- vertical-align: text-top;
-}
-*/
-
-body {
- padding-top: 3.5625rem;
-}
-
-.docs-sidebar {
- order: 2;
-}
-
-@include media-breakpoint-up(lg) {
- .docs-sidebar {
- order: 0;
- border-right: 1px solid $gray-200;
- }
-
- @supports ((position:-webkit-sticky) or (position:sticky)) {
- .docs-sidebar {
- position: -webkit-sticky;
- position: sticky;
- top: 4rem;
- z-index: 1000;
- height: calc(100vh - 4rem);
- }
- }
-}
-
-@include media-breakpoint-up(xl) {
- .docs-sidebar {
- flex: 0 1 320px;
- }
-}
-
-.docs-links {
- padding-bottom: 5rem;
-}
-
-@include media-breakpoint-up(lg) {
- @supports ((position: -webkit-sticky) or (position: sticky)) {
- .docs-links {
- max-height: calc(100vh - 4rem);
- overflow-y: scroll;
- }
- }
-}
-
-@include media-breakpoint-up(lg) {
- .docs-links {
- display: block;
- width: auto;
- margin-right: -1.5rem;
- padding-bottom: 4rem;
- }
-}
-
-.docs-toc {
- order: 2;
-}
-
-@supports ((position:-webkit-sticky) or (position:sticky)) {
- .docs-toc {
- position: -webkit-sticky;
- position: sticky;
- top: 4rem;
- height: calc(100vh - 4rem);
- overflow-y: auto;
- }
-}
-
-.docs-content {
- padding-bottom: 3rem;
- order: 1;
-}
-
-.docs-navigation, .blog-navigation {
- margin-top: 2rem;
- margin-bottom: 0;
- padding-top: 2rem;
-
- a {
- font-size: $font-size-base * 0.9;
- }
-}
-
-.docs-navigation {
- border-top: 1px solid $gray-200;
-}
-
-@include media-breakpoint-up(lg) {
- .docs-navigation, .blog-navigation {
- margin-bottom: -1rem;
-
- a {
- font-size: $font-size-base;
- }
- }
-}
-
-.navbar a:hover,
-.navbar a:focus {
- text-decoration: none;
-}
-
-#TableOfContents ul {
- padding-left: 0;
- list-style: none;
-}
-
-::selection {
- background: rgba(212, 53, 159, 0.2);
-}
-
-.bg-dots {
- background-image: radial-gradient($gray-300 15%, transparent 15%);
- background-position: 0 0;
- background-size: 1rem 1rem;
- -webkit-mask: linear-gradient(to top, #fff, transparent);
- mask: linear-gradient(to top, #fff, transparent);
- width: 100%;
- height: 9rem;
- margin-top: -10rem;
- z-index: -1;
-}
-
-.bg-dots-md {
- margin-top: -11rem;
-}
-
-.bg-dots-lg {
- margin-top: -12rem;
-}
-
-// https://fossheim.io/writing/posts/css-text-gradient/
-.gradient-text {
- background-color: $primary;
- background-image: linear-gradient(90deg, $primary, $blue-300 50%, $pink-500);
- background-size: 100%;
- background-repeat: repeat;
- -webkit-background-clip: text;
- -moz-background-clip: text;
- -webkit-text-fill-color: transparent;
- -moz-text-fill-color: transparent;
-}
-
-.katex {
- font-size: $font-size-md;
-}
-
-article {
- hr {
- margin: 3rem 0;
- }
-}
\ No newline at end of file
diff --git a/sass/common/_variables.scss b/sass/common/_variables.scss
deleted file mode 100644
index 4bb8fc4..0000000
--- a/sass/common/_variables.scss
+++ /dev/null
@@ -1,157 +0,0 @@
-// Color system
-
-$white: #fff;
-$gray-100: #f8f9fa;
-$gray-200: #e9ecef;
-$gray-300: #dee2e6;
-$gray-400: #ced4da;
-$gray-500: #adb5bd;
-$gray-600: #6c757d;
-$gray-700: #495057;
-$gray-800: #343a40;
-$gray-900: #212529;
-$black: #000;
-
-$yellow: #ffe000;
-$black: #1d2d35;
-$beige: #fbf7f0;
-// $red: #e55235;
-$purple: #5d2f86;
-$brown: #aa9c84;
-
-$blue-300: #8ed6fb;
-$pink-500: #d32e9d;
-
-$primary: $purple;
-
-// Options
-//
-// Quickly modify global styling by enabling or disabling optional features.
-
-$enable-caret: true;
-$enable-rounded: true;
-$enable-shadows: false;
-$enable-gradients: false;
-$enable-transitions: true;
-$enable-reduced-motion: true;
-$enable-smooth-scroll: true;
-$enable-grid-classes: true;
-$enable-button-pointers: true;
-$enable-rfs: true;
-$enable-validation-icons: true;
-$enable-negative-margins: true;
-$enable-deprecation-messages: true;
-$enable-important-utilities: true;
-
-/** Bootstrap navbar fix (https://git.io/fADqW) */
-$navbar-dark-toggler-icon-bg: none;
-$navbar-light-toggler-icon-bg: none;
-
-// Options
-//
-// Quickly modify global styling by enabling or disabling optional features.
-
-// $enable-responsive-font-sizes: true;
-
-// Body
-//
-// Settings for the `` element.
-
-$body-bg: $white;
-$body-color: $black;
-
-// Links
-//
-// Style anchor elements.
-
-$link-color: $primary;
-$link-decoration: none;
-
-// Grid containers
-//
-// Define the maximum width of `.container` for different screen sizes.
-
-$container-max-widths: (
- sm: 540px,
- md: 720px,
- lg: 960px,
- xl: 1240px,
- xxl: 1320px
-);
-
-@include _assert-ascending($container-max-widths, "$container-max-widths");
-
-// Grid columns
-//
-// Set the number of columns and specify the width of the gutters.
-
-$grid-columns: 16;
-$grid-gutter-width: 48px;
-$grid-row-columns: 6;
-
-// Components
-//
-// Define common padding and border radius sizes and more.
-
-$border-color: $gray-200;
-
-// Typography
-//
-// Font, line-height, and color for body text, headings, and more.
-
-// stylelint-disable value-keyword-case
-$font-family-sans-serif: "Jost", -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
-$font-family-monospace: sfmono-regular, menlo, monaco, consolas, "Liberation Mono", "Courier New", monospace;
-$font-family-base: $font-family-sans-serif;
-// stylelint-enable value-keyword-case
-
-$font-size-base: 1rem; // Assumes the browser default, typically `16px`
-$font-size-xl: $font-size-base * 1.375;
-$font-size-lg: $font-size-base * 1.25;
-$font-size-md: $font-size-base * 1.125;
-$font-size-sm: $font-size-base * 0.875;
-
-$line-height-base: 1.5;
-
-$headings-font-family: null;
-$headings-font-weight: 700;
-
-$lead-font-weight: 400;
-
-// Spacing
-//
-// Control the default styling of most Bootstrap elements by modifying these
-// variables. Mostly focused on spacing.
-// You can add more entries to the $spacers map, should you need more variation.
-
-$spacer: 1rem;
-
-// Navbar
-
-$navbar-padding-y: $spacer / 2;
-$navbar-padding-x: null;
-
-$navbar-nav-link-padding-x: 0.5rem;
-
-$navbar-light-color: $black;
-$navbar-light-hover-color: $primary;
-$navbar-light-active-color: $primary;
-
-// Cards
-
-$card-border-color: $gray-200;
-
-// Alerts
-//
-// Define alert colors, border radius, and padding.
-
-$alert-padding-y: $spacer;
-$alert-padding-x: $spacer * 1.5;
-$alert-margin-bottom: 0;
-$alert-border-radius: 0;
-$alert-link-font-weight: $headings-font-weight;
-$alert-border-width: 0;
-
-$alert-bg-scale: 0;
-$alert-border-scale: 0;
-$alert-color-scale: 0;
diff --git a/sass/components/_alerts.scss b/sass/components/_alerts.scss
deleted file mode 100644
index b40c571..0000000
--- a/sass/components/_alerts.scss
+++ /dev/null
@@ -1,63 +0,0 @@
-.alert {
- font-family: $font-family-monospace;
- font-size: $font-size-sm;
-}
-
-.alert-icon {
- margin-right: 0.75rem;
-}
-
-.docs .alert {
- margin: 2rem -1.5rem;
-}
-
-.alert .alert-link {
- text-decoration: underline;
-}
-
-.alert-dark {
- color: $white;
- background-color: $black;
-}
-
-.alert-dark .alert-link {
- color: $white;
-}
-
-.alert-light {
- color: $black;
-}
-
-.alert-warning {
- background: $beige;
- color: $black;
-}
-
-/*
-.alert-light {
- color: #215888;
- background: linear-gradient(-45deg, rgb(212, 245, 255), rgb(234, 250, 255), rgb(234, 250, 255), #d3f6ef);
-}
-
-.alert-light .alert-link {
- color: #215888;
-}
-*/
-
-.alert-white {
- background-color: rgba(255, 255, 255, 0.95);
-}
-
-.alert-primary {
- color: $white;
- background-color: $primary;
-}
-
-.alert-primary .alert-link {
- color: $white;
-}
-
-.alert .alert-link:hover,
-.alert .alert-link:focus {
- text-decoration: none;
-}
diff --git a/sass/components/_buttons.scss b/sass/components/_buttons.scss
deleted file mode 100644
index f20a0d2..0000000
--- a/sass/components/_buttons.scss
+++ /dev/null
@@ -1,91 +0,0 @@
-.navbar .btn-link {
- color: $navbar-light-color;
- padding: 0.4375rem 0;
-}
-
-#mode {
- margin-right: 1.25rem;
-}
-
-.btn-link:focus {
- outline: 0;
- box-shadow: none;
-}
-
-#navigation {
- margin-left: 1.25rem;
-}
-
-@include media-breakpoint-up(md) {
- #mode {
- margin-right: 0.5rem;
- }
-
- .navbar .btn-link {
- padding: 0.5625em 0.25rem 0.5rem 0.125rem;
- }
-}
-
-.navbar .btn-link:hover {
- color: $navbar-light-hover-color;
-}
-
-.navbar .btn-link:active {
- color: $navbar-light-active-color;
-}
-
-body .toggle-dark {
- display: block;
-}
-
-body .toggle-light {
- display: none;
-}
-
-body.dark .toggle-light {
- display: block;
-}
-
-body.dark .toggle-dark {
- display: none;
-}
-
-.btn-clipboard {
- display: none;
-}
-
-@include media-breakpoint-up(md) {
- .doks-clipboard {
- position: relative;
- float: right;
- }
-
- .btn-clipboard {
- position: absolute;
- top: 1rem;
- right: 0.25rem;
- z-index: 10;
- display: block;
- padding: 0.25rem 0.5rem;
- font-size: $font-size-sm;
- }
-}
-
-.copy-status::after {
- content: "Copy";
- display: block;
- color: $body-color;
-}
-
-.copy-status:hover::after {
- content: "Copy";
- display: block;
- color: $pink-500;
-}
-
-.copy-status:focus::after,
-.copy-status:active::after {
- content: "Copied";
- display: block;
- color: $pink-500;
-}
diff --git a/sass/components/_code.scss b/sass/components/_code.scss
deleted file mode 100644
index 9ad855b..0000000
--- a/sass/components/_code.scss
+++ /dev/null
@@ -1,62 +0,0 @@
-pre,
-code,
-kbd,
-samp {
- font-family: $font-family-monospace;
- font-size: $font-size-sm;
- border-radius: $border-radius;
-}
-
-code {
- background: $beige;
- color: $black;
- padding: 0.25rem 0.5rem;
-}
-
-pre {
- margin: 2rem 0;
-}
-
-pre code {
- display: block;
- overflow-x: auto;
- line-height: $line-height-base;
- padding: 1.25rem 1.5rem;
- tab-size: 4;
- scrollbar-width: thin;
- scrollbar-color: transparent transparent;
-}
-
-.hljs {
- padding: 1.25rem 1.5rem;
-}
-
-@include media-breakpoint-down(sm) {
- pre,
- code,
- kbd,
- samp {
- border-radius: 0;
- }
-
- pre {
- margin: 2rem -1.5rem;
- }
-}
-
-pre code::-webkit-scrollbar {
- height: 5px;
-}
-
-pre code::-webkit-scrollbar-thumb {
- background: $gray-200;
-}
-
-pre code:hover {
- scrollbar-width: thin;
- scrollbar-color: $gray-200 transparent;
-}
-
-pre code::-webkit-scrollbar-thumb:hover {
- background: $gray-200;
-}
diff --git a/sass/components/_comments.scss b/sass/components/_comments.scss
deleted file mode 100644
index 18f610c..0000000
--- a/sass/components/_comments.scss
+++ /dev/null
@@ -1,30 +0,0 @@
-.comment-list {
- @extend .list-unstyled;
-}
-
-.comment-list ol {
- list-style: none;
-}
-
-.comment-form p {
- @extend .form-group !optional;
-}
-
-.comment-form input[type="text"],
-.comment-form input[type="email"],
-.comment-form input[type="url"],
-.comment-form textarea {
- @extend .form-control;
-}
-
-.comment-form input[type="submit"] {
- @extend .btn;
- @extend .btn-secondary;
-}
-
-blockquote {
- margin-bottom: 1rem;
- font-size: 1.25rem;
- border-left: 3px solid $gray-300;
- padding-left: 1rem;
-}
diff --git a/sass/components/_doks.scss b/sass/components/_doks.scss
deleted file mode 100644
index 4c8bfc7..0000000
--- a/sass/components/_doks.scss
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
-
-Doks — based on Ascetic by (c) Ivan Sagalaev
-
-*/
-
-.hljs {
- display: block;
- overflow-x: auto;
- padding: 0.5em;
- background: $beige;
- color: $body-color;
-}
-
-.hljs-string,
-.hljs-variable,
-.hljs-template-variable,
-.hljs-symbol,
-.hljs-bullet,
-.hljs-section,
-.hljs-addition,
-.hljs-attribute,
-.hljs-link {
- color: $pink-500;
-}
-
-.hljs-comment,
-.hljs-quote,
-.hljs-meta,
-.hljs-deletion {
- color: #888;
-}
-
-.hljs-keyword,
-.hljs-selector-tag,
-.hljs-section,
-.hljs-name,
-.hljs-type,
-.hljs-strong {
- font-weight: bold;
-}
-
-.hljs-emphasis {
- font-style: italic;
-}
-
-body.dark .hljs {
- background: $body-overlay-dark;
- color: $body-color-dark;
-}
-
-body.dark .hljs-string,
-body.dark .hljs-variable,
-body.dark .hljs-template-variable,
-body.dark .hljs-symbol,
-body.dark .hljs-bullet,
-body.dark .hljs-section,
-body.dark .hljs-addition,
-body.dark .hljs-attribute,
-body.dark .hljs-link {
- color: $blue-300;
-}
diff --git a/sass/components/_footnote.scss b/sass/components/_footnote.scss
deleted file mode 100644
index a858bde..0000000
--- a/sass/components/_footnote.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-.footnote-definition {
- sup {
- top: -.2.5em;
- font-size: 0.75em;
- display: inline;
- }
- p {
- display: inline;
- }
-}
diff --git a/sass/components/_forms.scss b/sass/components/_forms.scss
deleted file mode 100644
index 9732838..0000000
--- a/sass/components/_forms.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-/** Search form */
-.search-form {
- @extend .form-inline !optional;
-}
-
-.search-form label {
- @extend .form-group;
-
- font-weight: normal;
-}
-
-.search-form .search-field {
- @extend .form-control;
-}
-
-.search-form .search-submit {
- @extend .btn;
- @extend .btn-secondary;
-}
diff --git a/sass/components/_images.scss b/sass/components/_images.scss
deleted file mode 100644
index 254eefa..0000000
--- a/sass/components/_images.scss
+++ /dev/null
@@ -1,48 +0,0 @@
-figure {
- margin: 2rem 0;
-}
-
-.figure-caption {
- margin: 0.25rem 0 0.75rem;
-}
-
-figure.wide {
- margin: 2rem -1.5rem;
-}
-
-figure.wide .figure-caption {
- margin: 0.25rem 1.5rem 0.75rem;
-}
-
-@include media-breakpoint-up(md) {
- figure.wide {
- margin: 2rem -2.5rem;
- }
-
- figure.wide .figure-caption {
- margin: 0.25rem 2.5rem 0.75rem;
- }
-}
-
-@include media-breakpoint-up(lg) {
- figure.wide {
- margin: 2rem -5rem;
- }
-
- figure.wide .figure-caption {
- margin: 0.25rem 5rem 0.75rem;
- }
-}
-
-.blur-up {
- filter: blur(5px);
-}
-
-.blur-up.lazyloaded {
- filter: unset;
-}
-
-.img-simple {
- margin-top: 0.375rem;
- margin-bottom: 1.25rem;
-}
diff --git a/sass/components/_search.scss b/sass/components/_search.scss
deleted file mode 100644
index 4073fb6..0000000
--- a/sass/components/_search.scss
+++ /dev/null
@@ -1,77 +0,0 @@
-.navbar-form {
- position: relative;
-}
-
-#suggestions {
- position: absolute;
- right: 0;
- margin-top: 0.5rem;
- width: calc(100vw - 3rem);
- max-height: 500px;
- overflow: auto;
-}
-
-#suggestions a {
- display: block;
- text-decoration: none;
- padding: 0.75rem;
- margin: 0 0.5rem;
-}
-
-#suggestions a:focus {
- background: $gray-100;
- outline: 0;
-}
-
-#suggestions div:not(:first-child) {
- border-top: 1px dashed $gray-200;
-}
-
-#suggestions div:first-child {
- margin-top: 0.5rem;
-}
-
-#suggestions div:last-child {
- margin-bottom: 0.5rem;
-}
-
-#suggestions a:hover {
- background: $gray-100;
-}
-
-#suggestions span {
- // display: flex;
- font-size: $font-size-base;
-}
-
-#suggestions span:first-child {
- font-weight: $headings-font-weight;
- color: $black;
-}
-
-#suggestions span:nth-child(2) {
- color: $gray-700;
-}
-
-@include media-breakpoint-up(sm) {
- #suggestions {
- width: 30rem;
- }
-
- #suggestions a {
- display: flex;
- }
-
- #suggestions span:first-child {
- width: 9rem;
- padding-right: 1rem;
- border-right: 1px solid $gray-200;
- display: inline-block;
- text-align: right;
- }
-
- #suggestions span:nth-child(2) {
- width: 19rem;
- padding-left: 1rem;
- }
-}
diff --git a/sass/components/_syntax.scss b/sass/components/_syntax.scss
deleted file mode 100644
index d9a1c02..0000000
--- a/sass/components/_syntax.scss
+++ /dev/null
@@ -1,131 +0,0 @@
-/*!
- * GitHub Light v0.5.0
- * Copyright (c) 2012 - 2017 GitHub, Inc.
- * Licensed under MIT (https://github.com/primer/github-syntax-theme-generator/blob/master/LICENSE)
- */
-
- .c1,
- .c /* comment, punctuation.definition.comment, string.comment */ {
- color: #6a737d;
- }
-
- .v /* variable */,
- .smw /* sublimelinter.mark.warning */ {
- color: #e36209;
- }
-
- // .c1 /* constant, entity.name.constant, variable.other.constant, variable.language, support, meta.property-name, support.constant, support.variable, meta.module-reference, markup.raw, meta.diff.header, meta.output */,
- .s .v /* string variable */ {
- color: #005cc5;
- }
-
- .e /* entity */,
- .en /* entity.name */ {
- color: #6f42c1;
- }
-
- .smi /* variable.parameter.function, storage.modifier.package, storage.modifier.import, storage.type.java, variable.other */,
- .s .s1 /* string source */ {
- color: #24292e;
- }
-
- .ent /* entity.name.tag, markup.quote */ {
- color: #22863a;
- }
-
- .k /* keyword, storage, storage.type */ {
- color: #d73a49;
- }
-
- .s /* string */,
- .pds /* punctuation.definition.string, source.regexp, string.regexp.character-class */,
- .s .pse .s1 /* string punctuation.section.embedded source */,
- .sr /* string.regexp */,
- .sr .cce /* string.regexp constant.character.escape */,
- .sr .sre /* string.regexp source.ruby.embedded */,
- .sr .sra /* string.regexp string.regexp.arbitrary-repitition */ {
- color: #032f62;
- }
-
- .bu /* invalid.broken, invalid.deprecated, invalid.unimplemented, message.error, brackethighlighter.unmatched, sublimelinter.mark.error */ {
- color: #b31d28;
- }
-
- .ii /* invalid.illegal */ {
- color: #fafbfc;
- background-color: #b31d28;
- }
-
- .c2 /* carriage-return */ {
- color: #fafbfc;
- background-color: #d73a49;
- }
-
- .c2::before /* carriage-return */ {
- content: "^M";
- }
-
- .sr .cce /* string.regexp constant.character.escape */ {
- font-weight: bold;
- color: #22863a;
- }
-
- .ml /* markup.list */ {
- color: #735c0f;
- }
-
- .mh /* markup.heading */,
- .mh .en /* markup.heading entity.name */,
- .ms /* meta.separator */ {
- font-weight: bold;
- color: #005cc5;
- }
-
- .mi /* markup.italic */ {
- font-style: italic;
- color: #24292e;
- }
-
- .mb /* markup.bold */ {
- font-weight: bold;
- color: #24292e;
- }
-
- .md /* markup.deleted, meta.diff.header.from-file, punctuation.definition.deleted */ {
- color: #b31d28;
- background-color: #ffeef0;
- }
-
- .mi1 /* markup.inserted, meta.diff.header.to-file, punctuation.definition.inserted */ {
- color: #22863a;
- background-color: #f0fff4;
- }
-
- .mc /* markup.changed, punctuation.definition.changed */ {
- color: #e36209;
- background-color: #ffebda;
- }
-
- .mi2 /* markup.ignored, markup.untracked */ {
- color: #f6f8fa;
- background-color: #005cc5;
- }
-
- .mdr /* meta.diff.range */ {
- font-weight: bold;
- color: #6f42c1;
- }
-
- .ba /* brackethighlighter.tag, brackethighlighter.curly, brackethighlighter.round, brackethighlighter.square, brackethighlighter.angle, brackethighlighter.quote */ {
- color: #586069;
- }
-
- .sg /* sublimelinter.gutter-mark */ {
- color: #959da5;
- }
-
- .corl /* constant.other.reference.link, string.other.link */ {
- text-decoration: underline;
- color: #032f62;
- }
-
\ No newline at end of file
diff --git a/sass/components/_tables.scss b/sass/components/_tables.scss
deleted file mode 100644
index b1f8c2e..0000000
--- a/sass/components/_tables.scss
+++ /dev/null
@@ -1,5 +0,0 @@
-table {
- @extend .table;
-
- margin: 3rem 0;
-}
diff --git a/sass/layouts/_footer.scss b/sass/layouts/_footer.scss
deleted file mode 100644
index 7d21811..0000000
--- a/sass/layouts/_footer.scss
+++ /dev/null
@@ -1,20 +0,0 @@
-.footer {
- border-top: 1px solid $gray-200;
- padding-top: 1.125rem;
- padding-bottom: 1.125rem;
-}
-
-.footer ul {
- margin-bottom: 0;
-}
-
-.footer li {
- font-size: $font-size-sm;
- margin-bottom: 0;
-}
-
-@include media-breakpoint-up(md) {
- .footer li {
- font-size: $font-size-base;
- }
-}
diff --git a/sass/layouts/_header.scss b/sass/layouts/_header.scss
deleted file mode 100644
index 8814402..0000000
--- a/sass/layouts/_header.scss
+++ /dev/null
@@ -1,268 +0,0 @@
-.banner .nav li {
- @extend .nav-item;
-}
-
-.banner .nav a {
- @extend .nav-link;
-}
-
-.navbar-text {
- margin-left: 1rem;
-}
-
-.navbar-brand {
- font-weight: $headings-font-weight;
-}
-
-.navbar-light .navbar-brand,
-.navbar-light .navbar-brand:hover,
-.navbar-light .navbar-brand:active {
- color: $body-color;
-}
-
-.navbar-light .navbar-nav .active .nav-link {
- color: $primary;
-}
-
-@include media-breakpoint-up(md) {
- .navbar-brand {
- font-size: $font-size-xl;
- }
-
- .navbar-text {
- margin-left: 1.25rem;
- }
-}
-
-.navbar-nav {
- flex-direction: row;
-}
-
-.nav-item {
- margin-left: 1.25rem;
-}
-
-@include media-breakpoint-up(md) {
- .nav-item {
- margin-left: 0.5rem;
- }
-}
-
-@include media-breakpoint-down(sm) {
- .nav-item:first-child {
- margin-left: 0;
- }
-}
-
-@include media-breakpoint-down(md) {
- .navbar .container {
- padding-left: 1.5rem;
- padding-right: 1.5rem;
- }
-}
-
-.break {
- flex-basis: 100%;
- height: 0;
-}
-
-.navbar {
- background-color: rgba(255, 255, 255, 0.95);
- border-bottom: 1px solid $gray-200;
- margin-top: 4px;
-}
-
-.header-bar {
- border-top: 4px solid;
- border-image-source: linear-gradient(90deg, $primary, #8ed6fb 50%, #d32e9d);
- border-image-slice: 1;
-}
-
-.home .navbar {
- border-bottom: 0;
-}
-
-.navbar-form {
- position: relative;
- margin-top: 0.25rem;
-}
-
-@include media-breakpoint-up(md) {
- .navbar-brand {
- margin-right: 1rem !important;
- }
-
- .main-nav .nav-item:first-child .nav-link,
- .fork-me .nav-item:first-child .nav-link {
- padding-left: 0;
- }
-
- .main-nav .nav-item:last-child .nav-link,
- .fork-me .nav-item:last-child .nav-link {
- padding-right: 0;
- }
-
- .navbar-form {
- margin-top: 0;
- margin-left: 6rem;
- margin-right: 1.5rem;
- }
-}
-
-@include media-breakpoint-up(lg) {
- .navbar-form {
- margin-left: 15rem;
- }
-}
-
-@include media-breakpoint-up(xl) {
- .navbar-form {
- margin-left: 30rem;
- }
-}
-
-.form-control.is-search {
- /*
- padding-right: calc(1.5em + 0.75rem);
- */
- padding-right: 2.5rem;
- background: $gray-100;
- border: 0;
-
- /*
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%236c757d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' class='feather feather-search'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");
- background-repeat: no-repeat;
- background-position: right calc(0.375em + 0.1875rem) center;
- background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
- */
-}
-
-.navbar-form::after {
- position: absolute;
- top: 0.4625rem;
- right: 0.5375rem;
- display: flex;
- align-items: center;
- justify-content: center;
- height: 1.5rem;
- padding-right: 0.4375rem;
- padding-left: 0.4375rem;
- font-size: $font-size-base * 0.75;
- color: $gray-700;
- content: "/";
- border: 1px solid $gray-300;
- border-radius: 0.25rem;
-}
-
-/*! purgecss start ignore */
-.algolia-autocomplete {
- display: flex !important;
-}
-
-.algolia-autocomplete .ds-dropdown-menu {
- box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
-}
-
-@include media-breakpoint-down(sm) {
- .algolia-autocomplete .ds-dropdown-menu {
- max-width: 512px !important;
- min-width: 312px !important;
- width: auto !important;
- }
-
- .algolia-autocomplete .algolia-docsearch-suggestion .algolia-docsearch-suggestion--subcategory-column::after {
- content: "|";
- margin-right: 0.25rem;
- }
-}
-
-.algolia-autocomplete .algolia-docsearch-suggestion--title {
- margin-bottom: 0;
-}
-
-.algolia-autocomplete .algolia-docsearch-suggestion--highlight {
- padding: 0 0.05em;
-}
-
-.algolia-autocomplete .algolia-docsearch-footer {
- margin-top: 1rem;
- margin-right: 0.5rem;
- margin-bottom: 0.5rem;
-}
-
-/*! purgecss end ignore */
-
-/*
- * Source: https://medium.com/creative-technology-concepts-code/responsive-mobile-dropdown-navigation-using-css-only-7218e4498a99
-*/
-
-/* Style the menu icon for the dropdown */
-
-.navbar .menu-icon {
- cursor: pointer;
-
- /* display: inline-block; */
-
- /* float: right; */
- padding: 1.125rem 0.625rem;
- margin: 0 0 0 -0.625rem;
-
- /* position: relative; */
- user-select: none;
-}
-
-.navbar .menu-icon .navicon {
- background: $navbar-light-color;
- display: block;
- height: 2px;
- position: relative;
- transition: background 0.2s ease-out;
- width: 18px;
-}
-
-.navbar .menu-icon .navicon::before,
-.navbar .menu-icon .navicon::after {
- background: $navbar-light-color;
- content: "";
- display: block;
- height: 100%;
- position: absolute;
- transition: all 0.2s ease-out;
- width: 100%;
-}
-
-.navbar .menu-icon .navicon::before {
- top: 5px;
-}
-
-.navbar .menu-icon .navicon::after {
- top: -5px;
-}
-
-/* Add the icon and menu animations when the checkbox is clicked */
-
-.navbar .menu-btn {
- display: none;
-}
-
-.navbar .menu-btn:checked ~ .navbar-collapse {
- display: block;
- max-height: 100vh;
-}
-
-.navbar .menu-btn:checked ~ .menu-icon .navicon {
- background: transparent;
-}
-
-.navbar .menu-btn:checked ~ .menu-icon .navicon::before {
- transform: rotate(-45deg);
-}
-
-.navbar .menu-btn:checked ~ .menu-icon .navicon::after {
- transform: rotate(45deg);
-}
-
-.navbar .menu-btn:checked ~ .menu-icon:not(.steps) .navicon::before,
-.navbar .menu-btn:checked ~ .menu-icon:not(.steps) .navicon::after {
- top: 0;
-}
diff --git a/sass/layouts/_pages.scss b/sass/layouts/_pages.scss
deleted file mode 100644
index c77b16a..0000000
--- a/sass/layouts/_pages.scss
+++ /dev/null
@@ -1,50 +0,0 @@
-.docs-content > h2[id]::before,
-.docs-content > h3[id]::before,
-.docs-content > h4[id]::before {
- display: block;
- height: 6rem;
- margin-top: -6rem;
- content: "";
-}
-
-.anchor {
- visibility: hidden;
- padding-left: 0.5rem;
-}
-
-h1:hover a,
-h2:hover a,
-h3:hover a,
-h4:hover a {
- visibility: visible;
- text-decoration: none;
-}
-
-.card-list {
- margin-top: 2.25rem;
-}
-
-.edit-page {
- margin-top: 3rem;
- font-size: $font-size-base;
-}
-
-.edit-page svg {
- margin-right: 0.5rem;
- margin-bottom: 0.25rem;
-}
-
-p.meta {
- margin-top: 0.5rem;
- font-size: $font-size-base;
-}
-
-.breadcrumb {
- margin-top: 2.25rem;
- font-size: $font-size-base;
-}
-
-.page-header {
- text-align: center;
- margin-bottom: 2rem;
-}
\ No newline at end of file
diff --git a/sass/layouts/_posts.scss b/sass/layouts/_posts.scss
deleted file mode 100644
index da27660..0000000
--- a/sass/layouts/_posts.scss
+++ /dev/null
@@ -1,28 +0,0 @@
-.home .card,
-.contributors.list .card,
-.blog.list .card {
- margin-top: 2rem;
- margin-bottom: 2rem;
- transition: transform 0.3s;
-}
-
-.home .card:hover,
-.contributors.list .card:hover,
-.blog.list .card:hover {
- transform: scale(1.025);
-}
-
-.home .card-body,
-.contributors.list .card-body,
-.blog.list .card-body {
- padding: 0 2rem 1rem;
-}
-
-.blog-header {
- text-align: center;
- margin-bottom: 2rem;
-}
-
-.blog-footer {
- text-align: center;
-}
diff --git a/sass/layouts/_sidebar.scss b/sass/layouts/_sidebar.scss
deleted file mode 100644
index 46881bd..0000000
--- a/sass/layouts/_sidebar.scss
+++ /dev/null
@@ -1,110 +0,0 @@
-.docs-links,
-.docs-toc {
- scrollbar-width: thin;
- scrollbar-color: $white $white;
-}
-
-.docs-links::-webkit-scrollbar,
-.docs-toc::-webkit-scrollbar {
- width: 5px;
-}
-
-.docs-links::-webkit-scrollbar-track,
-.docs-toc::-webkit-scrollbar-track {
- background: $white;
-}
-
-.docs-links::-webkit-scrollbar-thumb,
-.docs-toc::-webkit-scrollbar-thumb {
- background: $white;
-}
-
-.docs-links:hover,
-.docs-toc:hover {
- scrollbar-width: thin;
- scrollbar-color: $gray-200 $white;
-}
-
-.docs-links:hover::-webkit-scrollbar-thumb,
-.docs-toc:hover::-webkit-scrollbar-thumb {
- background: $gray-200;
-}
-
-.docs-links::-webkit-scrollbar-thumb:hover,
-.docs-toc::-webkit-scrollbar-thumb:hover {
- background: $gray-200;
-}
-
-.docs-links h3,
-.page-links h3 {
- text-transform: uppercase;
- font-size: $font-size-base;
- margin: 1.25rem 0 0.5rem 0;
- padding: 1.5rem 0 0 0;
-}
-
-@include media-breakpoint-up(lg) {
- .docs-links h3,
- .page-links h3 {
- margin: 1.125rem 1.5rem 0.75rem 0;
- padding: 1.375rem 0 0 0;
- }
-}
-
-.docs-links h3:not(:first-child) {
- border-top: 1px solid $gray-200;
-}
-
-a.docs-link {
- color: $body-color;
- display: block;
- padding: 0.125rem 0;
- font-size: $font-size-base;
-}
-
-.page-links li {
- margin-top: 0.375rem;
- padding-top: 0.375rem;
-}
-
-.page-links li ul li {
- border-top: none;
- padding-left: 1rem;
- margin-top: 0.125rem;
- padding-top: 0.125rem;
-}
-
-.page-links li:not(:first-child) {
- border-top: 1px dashed $gray-200;
-}
-
-.page-links a {
- color: $body-color;
- display: block;
- padding: 0.125rem 0;
- font-size: $font-size-base * 0.9375;
-}
-
-.docs-link:hover,
-.docs-link.active,
-.page-links a:hover {
- text-decoration: none;
- color: $link-color;
-}
-
-.docs-links h3.sidebar-link,
-.page-links h3.sidebar-link {
- text-transform: none;
- font-size: $font-size-md;
- font-weight: normal;
-}
-
-.docs-links h3.sidebar-link a,
-.page-links h3.sidebar-link a {
- color: $body-color;
-}
-
-.docs-links h3.sidebar-link a:hover,
-.page-links h3.sidebar-link a:hover {
- text-decoration: underline;
-}
diff --git a/sass/main.scss b/sass/main.scss
deleted file mode 100644
index 1ce3f05..0000000
--- a/sass/main.scss
+++ /dev/null
@@ -1,33 +0,0 @@
-/** Import Bootstrap functions */
-@import "http://github.com/bootstrap/scss/functions";
-
-/** Import theme variables */
-@import "http://github.com/common/variables";
-
-/** Import Bootstrap */
-@import "http://github.com/bootstrap/scss/bootstrap";
-
-/** Import theme styles */
-@import "http://github.com/common/fonts";
-@import "http://github.com/common/global";
-@import "http://github.com/common/dark";
-@import "http://github.com/components/doks";
-
-// @import "http://github.com/components/syntax";
-@import "http://github.com/components/code";
-@import "http://github.com/components/alerts";
-@import "http://github.com/components/buttons";
-@import "http://github.com/components/comments";
-@import "http://github.com/components/footnote";
-@import "http://github.com/components/forms";
-@import "http://github.com/components/images";
-@import "http://github.com/components/search";
-@import "http://github.com/components/tables";
-@import "http://github.com/layouts/footer";
-@import "http://github.com/layouts/header";
-@import "http://github.com/layouts/pages";
-@import "http://github.com/layouts/posts";
-@import "http://github.com/layouts/sidebar";
-
-/* @import custom styles */
-@import "http://github.com/custom.scss";
diff --git a/shell.nix b/shell.nix
new file mode 100644
index 0000000..d0c6e91
--- /dev/null
+++ b/shell.nix
@@ -0,0 +1,18 @@
+{ pkgs ? import {} }:
+ pkgs.mkShell {
+ nativeBuildInputs = with pkgs.buildPackages; [
+ # Run Astro
+ nodejs_23
+
+ # For generating favicon.ico (to support old browsers?)
+ # nix-shell
+ # cp src/icons/banner.svg public/favicon.svg
+ # magick public/favicon.svg -resize 32 /tmp/favicon_32x32.png
+ # magick public/favicon.svg -resize 64 /tmp/favicon_64x64.png
+ # icotool -c -o public/favicon.ico /tmp/favicon_32x32.png /tmp/favicon_64x64.png
+ icoutils
+ imagemagick
+
+ python3
+ ];
+}
\ No newline at end of file
diff --git a/src/components/CodeBlock.tsx b/src/components/CodeBlock.tsx
new file mode 100644
index 0000000..4b428f4
--- /dev/null
+++ b/src/components/CodeBlock.tsx
@@ -0,0 +1,34 @@
+
+import { toJsxRuntime } from "hast-util-to-jsx-runtime";
+import { useLayoutEffect, useState } from "preact/hooks";
+import { Fragment, jsx, jsxs, type JSX } from "preact/jsx-runtime";
+import { codeToHast, type BundledLanguage, type BundledTheme, type StringLiteralUnion, type ThemeRegistrationAny } from "shiki/bundle/full";
+
+type Theme = ThemeRegistrationAny | StringLiteralUnion | undefined;
+
+export function CodeBlock({ code, lang }: { code: string, lang: BundledLanguage, theme?: Theme }) {
+ const [nodes, setNodes] = useState(undefined as JSX.Element | undefined)
+
+ useLayoutEffect(() => {
+ void highlight(code, lang).then(setNodes)
+ }, [code, lang])
+
+ return nodes ?? Loading...
+}
+
+export async function highlight(code: string, lang: BundledLanguage, theme?: Theme) {
+ const out = await codeToHast(code, {
+ lang,
+ themes: {
+ light: theme ?? 'vitesse-light',
+ dark: theme ?? 'vitesse-dark',
+ },
+ defaultColor: 'light'
+ })
+
+ return toJsxRuntime(out, {
+ Fragment,
+ jsx,
+ jsxs,
+ }) as JSX.Element
+}
\ No newline at end of file
diff --git a/src/components/CodeSnippet.tsx b/src/components/CodeSnippet.tsx
new file mode 100644
index 0000000..e620a57
--- /dev/null
+++ b/src/components/CodeSnippet.tsx
@@ -0,0 +1,49 @@
+import clsx from "clsx";
+import { useState } from "preact/hooks";
+import { type BundledLanguage } from "shiki/bundle/full";
+import { CodeBlock } from "./CodeBlock";
+
+type Props = {
+ snippets: { code: string; lang: BundledLanguage; title: string }[];
+};
+
+export default function CodeSnippet({ snippets }: Props) {
+ const [selectedSnippet, setSelectedSnippet] = useState(0);
+ const snippet = snippets[selectedSnippet];
+ return (
+
+
+
+
+
+ );
+}
diff --git a/src/components/FormattedDate.astro b/src/components/FormattedDate.astro
new file mode 100644
index 0000000..dcd1488
--- /dev/null
+++ b/src/components/FormattedDate.astro
@@ -0,0 +1,13 @@
+---
+const { date, class: className } = Astro.props;
+---
+
+
+ {
+ date.toLocaleDateString('en-us', {
+ year: 'numeric',
+ month: 'short',
+ day: 'numeric',
+ })
+ }
+
diff --git a/src/components/Head.astro b/src/components/Head.astro
new file mode 100644
index 0000000..d78cd55
--- /dev/null
+++ b/src/components/Head.astro
@@ -0,0 +1,93 @@
+---
+// Import the global.css file here so that it is included on
+// all pages through the use of the component.
+import "../styles/global.css";
+import { SITE_TITLE, FONTS } from "../consts";
+
+interface Props {
+ title: string;
+ description: string;
+ image?: string;
+}
+
+const canonicalURL = new URL(Astro.url.pathname, Astro.site);
+
+import duckImage from "/src/images/ducks.jpg";
+const { title, description, image = duckImage.src } = Astro.props;
+
+const fontCss = FONTS.map(
+ (font) => `
+@font-face {
+ font-family: ${font.name};
+ src: url('http://github.com/$%7Bimport.meta.env.BASE_URL%20+%20%22fonts/%22%20+%20font.file%7D') format("truetype");
+}
+`,
+).join("\n");
+---
+
+
+
+
+
+
+
+
+
+
+
+ {
+ FONTS.map((font) => (
+
+ ))
+ }
+
+
+
+
+
+
+
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/HeaderLink.astro b/src/components/HeaderLink.astro
new file mode 100644
index 0000000..976c21f
--- /dev/null
+++ b/src/components/HeaderLink.astro
@@ -0,0 +1,33 @@
+---
+import type { HTMLAttributes } from "astro/types";
+import { Icon } from "astro-icon/components";
+
+type Props = HTMLAttributes<"a">;
+
+const { href, class: className, ...props } = Astro.props;
+const pathname = Astro.url.pathname.replace(import.meta.env.BASE_URL, "");
+const subpath = pathname.match(/[^\/]+/g);
+const isActive =
+ pathname.startsWith(href as string) || href === "/" + (subpath?.[0] || "");
+const finalHref = href?.toString().startsWith("http")
+ ? href
+ : import.meta.env.BASE_URL + href;
+const isExternal = href?.toString().startsWith("http");
+---
+
+
+ {isExternal && }
+
+
diff --git a/src/components/Link.astro b/src/components/Link.astro
new file mode 100644
index 0000000..0be6dd6
--- /dev/null
+++ b/src/components/Link.astro
@@ -0,0 +1,17 @@
+---
+let { href } = Astro.props;
+const domain = import.meta.env.SITE;
+let attr = { target: "", rel: "" };
+
+if (!href.includes(domain) && !href.startsWith("/") && !href.startsWith("#")) {
+ attr.target = "_blank";
+ attr.rel = "noopener";
+}
+
+// Rewrite path links
+if (href.startsWith("/")) {
+ href = import.meta.env.BASE_URL.replace(/\/$/, "") + href;
+}
+---
+
+
diff --git a/src/components/Socials.astro b/src/components/Socials.astro
new file mode 100644
index 0000000..626aaec
--- /dev/null
+++ b/src/components/Socials.astro
@@ -0,0 +1,50 @@
+---
+import { Icon } from "astro-icon/components";
+
+const { class: className, ...props } = Astro.props;
+
+const socials = [
+ {
+ title: "Matrix Chat",
+ icon: "chat",
+ href: "https://matrix.to/#/#probe-rs:matrix.org",
+ },
+ {
+ title: "GitHub",
+ icon: "line-md--github",
+ href: "https://github.com/probe-rs/probe-rs",
+ },
+ {
+ title: "Open Collective",
+ icon: "bi--opencollective",
+ href: "https://opencollective.com/probe-rs",
+ },
+ {
+ title: "GitHub Sponsors",
+ icon: "gh-sponsors",
+ href: "https://github.com/sponsors/probe-rs",
+ },
+ {
+ title: "RSS",
+ icon: "line-md--rss",
+ href: "/rss.xml",
+ },
+];
+---
+
+
diff --git a/src/components/TargetsView.tsx b/src/components/TargetsView.tsx
new file mode 100644
index 0000000..33cb5a2
--- /dev/null
+++ b/src/components/TargetsView.tsx
@@ -0,0 +1,351 @@
+import { useEffect, useState } from "preact/hooks";
+import type { CollectionEntry } from "astro:content";
+import type { TargetedEvent } from "preact/compat";
+import Fuse, { type FuseResult } from "fuse.js";
+
+type Props = {
+ targets: CollectionEntry<"targets">[];
+ manufacturers: string[];
+};
+
+type Entry = {
+ manufacturer: string;
+ family: string;
+ variant: string;
+ cores: string;
+ nvm: string[];
+ ram: string[];
+};
+
+export default function TargetsView({ targets, manufacturers }: Props) {
+ function getJep106({ data }: CollectionEntry<"targets">) {
+ if (data.manufacturer) {
+ const manufacturer =
+ manufacturers[
+ Number(data.manufacturer.cc) * 256 + Number(data.manufacturer.id)
+ ];
+ if (!manufacturer)
+ return `Unlisted: id=${data.manufacturer.id}, cc=${data.manufacturer.cc}`;
+ return manufacturers[
+ Number(data.manufacturer.cc) * 256 + Number(data.manufacturer.id)
+ ];
+ } else {
+ return "Unknown";
+ }
+ }
+
+ const urlSearchParams = new URLSearchParams(window.location.search);
+ const pageParam = Object.fromEntries(urlSearchParams.entries()).p;
+ let initialPage = pageParam ? +pageParam : 0;
+
+ const [search, setSearch] = useState("");
+ const [currentPage, setCurrentPage] = useState(initialPage);
+
+ useEffect(() => {
+ const urlSearchParams = new URLSearchParams(window.location.search);
+ urlSearchParams.set("q", search);
+ window.history.replaceState(
+ null,
+ "",
+ `${window.location.pathname}?${urlSearchParams.toString()}`
+ );
+ }, [search]);
+
+ useEffect(() => {
+ const urlSearchParams = new URLSearchParams(window.location.search);
+ urlSearchParams.set("p", "" + currentPage);
+ window.history.replaceState(
+ null,
+ "",
+ `${window.location.pathname}?${urlSearchParams.toString()}`
+ );
+ }, [currentPage]);
+
+ const items = targets.flatMap((t) =>
+ t.data.variants.map((v) => ({
+ manufacturer: getJep106(t),
+ family: t.data.name,
+ variant: v.name,
+ cores: v.cores.map((c) => c.type).join(", "),
+ nvm: v.memory_map
+ .filter((m) => m.nvm)
+ .map((m) => m.nvm!)
+ .map(
+ (m) =>
+ `${m.name ? m.name + "" : ""} 0x${m.range.start
+ .toString(16)
+ .toUpperCase()} - 0x${m.range.end.toString(16).toUpperCase()}`
+ ),
+ ram: v.memory_map
+ .filter((m) => m.ram)
+ .map((m) => m.ram!)
+ .map(
+ (m) =>
+ `${m.name ? m.name + " " : ""} 0x${m.range.start
+ .toString(16)
+ .toUpperCase()} - 0x${m.range.end.toString(16).toUpperCase()}`
+ ),
+ }))
+ );
+
+ const fuse = new Fuse(items, {
+ keys: ["manufacturer", "family", "variant", "cores"],
+ useExtendedSearch: true,
+ ignoreDiacritics: true,
+ includeScore: true,
+ includeMatches: true,
+ threshold: 0.2,
+ });
+
+ const results = search
+ ? fuse.search(search)
+ : fuse.search({ cores: "!1234567890" });
+
+ return (
+ <>
+
+
+
+ setSearch((e.target as HTMLSelectElement).value)}
+ class="w-full bg-slate-100 dark:bg-slate-700 p-2 py-1 border-slate-300 dark:border-slate-400 border-2 rounded-md"
+ placeholder="Search"
+ />
+
+
+
+ Showing{" "}
+
+ {results.length} / {items.length}
+ {" "}
+ targets
+
+
+
+
+
+ >
+ );
+}
+
+function PaginatedItems({
+ items,
+ results,
+ itemsPerPage,
+ search,
+ currentPage,
+ setCurrentPage,
+}: {
+ items: Entry[];
+ results: FuseResult[];
+ itemsPerPage: number;
+ search: string;
+ currentPage: number;
+ setCurrentPage: (v: number) => void;
+}) {
+ const pageCount = Math.ceil(results.length / itemsPerPage);
+ if (currentPage >= pageCount) {
+ setCurrentPage(0);
+ }
+
+ return (
+
+ );
+}
+
+function Paginate({
+ pageCount,
+ currentPage,
+ setCurrentPage,
+}: {
+ pageCount: number;
+ currentPage: number;
+ setCurrentPage: (v: number) => void;
+}) {
+ const { current, pages } = paginate({
+ current: currentPage,
+ max: pageCount,
+ });
+
+ return (
+
+ {pages.map((page) => {
+ if (page === current + 1) {
+ return (
+
+ {page}
+
+ );
+ } else if (page === "…") {
+ return (
+
+ {page}
+
+ );
+ } else {
+ return (
+
+ {
+ setCurrentPage(+page - 1);
+ }}
+ class="cursor-pointer"
+ >
+ {page}
+
+
+ );
+ }
+ })}
+
+ );
+}
+
+function Items({
+ items,
+ results,
+ itemsPerPage,
+ currentPage,
+ search,
+}: {
+ items: Entry[];
+ results: FuseResult[];
+ itemsPerPage: number;
+ currentPage: number;
+ pageCount: number;
+ search: string;
+}) {
+ return (
+
+ );
+}
+
+function span(
+ result: FuseResult,
+ data: Entry[],
+ search: string,
+ key: string
+) {
+ if (search === "") {
+ return (data[result.refIndex] as any)[key];
+ }
+ for (const match of result.matches!) {
+ if (match.key == key) {
+ const item = match.value!.substring(
+ match.indices[0][0],
+ match.indices[0][1] + 1
+ );
+ return match.value!.replace(
+ item,
+ "" + item + " "
+ );
+ }
+ }
+
+ return (data[result.refIndex] as any)[key];
+}
+
+/// Taken from https://zacfukuda.com/blog/pagination-algorithm
+function paginate({ current, max }: { current: number; max: number }) {
+ const prev = current === 1 ? null : current - 1;
+ const next = current === max ? null : current + 1;
+ const pages = [1 as number | string];
+
+ if (current === 1 && max === 1) {
+ return { current, prev, next, pages };
+ }
+ if (current > 4) {
+ pages.push("…");
+ }
+
+ const r = 2;
+ const r1 = current - r;
+ const r2 = current + r;
+
+ for (let i = r1 > 2 ? r1 : 2; i <= Math.min(max, r2); i++) {
+ pages.push(i);
+ }
+
+ if (r2 + 1 < max) {
+ pages.push("…");
+ }
+ if (r2 < max) {
+ pages.push(max);
+ }
+
+ return { current, prev, next, pages };
+}
diff --git a/src/components/index/Install.tsx b/src/components/index/Install.tsx
new file mode 100644
index 0000000..0d03d70
--- /dev/null
+++ b/src/components/index/Install.tsx
@@ -0,0 +1,61 @@
+import type { BundledLanguage } from "shiki/bundle/full";
+import { CodeBlock } from "../CodeBlock";
+import { useEffect, useState } from "preact/hooks";
+
+type Props = {};
+
+const latestBase = `https://github.com/probe-rs/probe-rs/releases/latest/download`;
+const shell = `curl -LsSf ${latestBase}/probe-rs-tools-installer.sh | sh`;
+
+export default function TargetsView({}: Props) {
+ const [instructions, setInstructions] = useState([shell, "shell"] as [
+ string,
+ BundledLanguage
+ ]);
+ useEffect(() => {
+ const [command, lang] = installInstructions();
+ setInstructions([command, lang]);
+ });
+
+ const [command, lang] = instructions;
+ return (
+
+ );
+}
+
+export function installInstructions(): [string, BundledLanguage] {
+ const userAgent = window.navigator.userAgent;
+ const platform = window?.navigator?.platform ?? "Linux";
+ const macosPlatforms = ["Macintosh", "MacIntel", "MacPPC", "Mac68K"];
+ const windowsPlatforms = ["Win32", "Win64", "Windows", "WinCE"];
+ const iosPlatforms = ["iPhone", "iPad", "iPod"];
+
+ if (macosPlatforms.indexOf(platform) !== -1) {
+ return [`brew install probe-rs/probe-rs/probe-rs`, "shell"];
+ } else if (iosPlatforms.indexOf(platform) !== -1) {
+ return [shell, "shell"];
+ } else if (windowsPlatforms.indexOf(platform) !== -1) {
+ return [
+ `powershell -ExecutionPolicy Bypass -c "irm ${latestBase}/probe-rs-tools-installer.ps1 | iex"`,
+ "powershell",
+ ];
+ } else if (/Android/.test(userAgent)) {
+ return [shell, "shell"];
+ } else if (/Linux/.test(platform)) {
+ return [shell, "shell"];
+ }
+
+ return [shell, "shell"];
+}
diff --git a/src/consts.ts b/src/consts.ts
new file mode 100644
index 0000000..4572808
--- /dev/null
+++ b/src/consts.ts
@@ -0,0 +1,9 @@
+// Place any global data in this file.
+// You can import this data from anywhere in your site by using the `import` keyword.
+
+export const SITE_TITLE = "probe-rs";
+export const SITE_DESCRIPTION = "probe-rs - the embedded toolkit";
+export const FONTS = [
+ { name: "Inter", file: "inter.ttf" },
+ { name: "Epilogue", file: "epilogue.ttf" },
+];
diff --git a/src/content.config.ts b/src/content.config.ts
new file mode 100644
index 0000000..f7ac2f8
--- /dev/null
+++ b/src/content.config.ts
@@ -0,0 +1,254 @@
+import { glob } from "astro/loaders";
+import { defineCollection, z } from "astro:content";
+import yaml from "js-yaml";
+
+const blog = defineCollection({
+ // Load Markdown and MDX files in the `src/content/blog/` directory.
+ loader: glob({ base: "./src/content/blog", pattern: "**/*.{md,mdx}" }),
+ // Type-check frontmatter using a schema
+ schema: z.object({
+ title: z.string(),
+ description: z.string(),
+ // Transform string to Date object
+ date: z.coerce.date(),
+ authors: z.array(z.string()),
+ }),
+});
+
+const docs = defineCollection({
+ loader: glob({ base: "./src/content/docs", pattern: "**/*.{md,mdx}" }),
+ schema: z.object({
+ title: z.string(),
+ description: z.string(),
+ order: z.coerce.number(),
+ }),
+});
+
+const docsFolderYaml = defineCollection({
+ loader: glob({
+ base: "./src/content/docs",
+ pattern: "**/_data.yaml",
+ generateId: ({ entry }) => entry.replace("/_data.yaml", ""),
+ }),
+ schema: z.object({
+ title: z.coerce.string(),
+ sectionOrder: z.coerce.number(),
+ }),
+});
+
+import type { Loader } from "astro/loaders";
+import { readdirSync, readFileSync } from "node:fs";
+
+// Format: https://probe.rs/docs/knowledge-base/cmsis-packs/#yaml-format
+
+// prettier-ignore
+const targetYamlSchema = yaml.DEFAULT_SCHEMA.extend([
+ new yaml.Type("!Arm", { kind: "mapping", construct: d => ({ arm: d }) }),
+ new yaml.Type("!AtsamDsu", { kind: "mapping", construct: d => ({ atsamDsu: d }) }),
+ new yaml.Type("!Espressif", { kind: "mapping", construct: d => ({ espressif: d }) }),
+ new yaml.Type("!Flash", { kind: "mapping", construct: d => ({ flash: d }) }),
+ new yaml.Type("!Generic", { kind: "mapping", construct: d => ({ generic: d }) }),
+ new yaml.Type("!InfineonScu", { kind: "mapping", construct: d => ({ infineonScu: d }) }),
+ new yaml.Type("!InfineonXmcScu", { kind: "mapping", construct: d => ({ infineonXmcScu: d }) }),
+ new yaml.Type("!InfineonPsocSiid", { kind: "mapping", construct: d => ({ infineonPsocSiid: d }) }),
+ new yaml.Type("!NordicConfigId", { kind: "mapping", construct: d => ({ nordicConfigId: d }) }),
+ new yaml.Type("!NordicFicrInfo", { kind: "mapping", construct: d => ({ nordicFicrInfo: d }) }),
+ new yaml.Type("!Nvm", { kind: "mapping", construct: d => ({ nvm: d }) }),
+ new yaml.Type("!Ram", { kind: "mapping", construct: d => ({ ram: d }) }),
+ new yaml.Type("!Riscv", { kind: 'mapping', construct: d => ({ riscv: d }) }),
+ new yaml.Type("!v1", { kind: "scalar", construct: d => ({ v1: d }) }),
+ new yaml.Type("!v2", { kind: "scalar", construct: d => ({ v2: d }) }),
+ new yaml.Type("!Xtensa", { kind: "mapping", construct: d => ({ xtensa: d }) }),
+]);
+
+const targetSchema = z.object({
+ name: z.string(),
+ manufacturer: z
+ .object({
+ id: z.number(),
+ cc: z.number(),
+ })
+ .optional(),
+ variants: z.array(
+ z.object({
+ name: z.string(),
+ flash_algorithms: z.array(z.string()).optional(),
+ cores: z.array(
+ z.object({
+ name: z.string(),
+ type: z.string(),
+ core_access_options: z
+ .object({
+ arm: z
+ .object({
+ ap: z
+ .object({
+ v1: z.string().optional(),
+ v2: z.string().optional(),
+ })
+ .optional(),
+ targetsel: z.number().optional(),
+ debug_base: z.number().optional(),
+ cti_base: z.number().optional(),
+ jtag_tap: z
+ .object({
+ v1: z.string().optional(),
+ v2: z.string().optional(),
+ })
+ .optional(),
+ })
+ .optional()
+ .nullable(),
+ riscv: z
+ .object({
+ hart_id: z.number().optional(),
+ jtag_tap: z
+ .object({
+ v1: z.string().optional(),
+ v2: z.string().optional(),
+ })
+ .optional(),
+ })
+ .optional()
+ .nullable(),
+ xtensa: z
+ .object({
+ jtag_tap: z
+ .object({
+ v1: z.string().optional(),
+ v2: z.string().optional(),
+ })
+ .optional(),
+ })
+ .optional()
+ .nullable(),
+ })
+ .optional(),
+ })
+ ),
+ memory_map: z.array(
+ z.object({
+ nvm: z
+ .object({
+ name: z.string().optional(),
+ range: z.object({ start: z.number(), end: z.number() }),
+ cores: z.array(z.string()),
+ access: z
+ .object({
+ read: z.boolean().optional().default(true),
+ write: z.boolean().optional().default(true),
+ execute: z.boolean().optional().default(true),
+ boot: z.boolean().optional().default(false),
+ })
+ .optional(),
+ is_alias: z.boolean().optional().default(false),
+ })
+ .optional(),
+ ram: z
+ .object({
+ name: z.string().optional(),
+ range: z.object({ start: z.number(), end: z.number() }),
+ cores: z.array(z.string()),
+ access: z
+ .object({
+ read: z.boolean().optional().default(true),
+ write: z.boolean().optional().default(true),
+ execute: z.boolean().optional().default(true),
+ boot: z.boolean().optional().default(false),
+ })
+ .optional(),
+ })
+ .optional(),
+ generic: z
+ .object({
+ name: z.string().optional(),
+ range: z.object({ start: z.number(), end: z.number() }),
+ cores: z.array(z.string()),
+ access: z
+ .object({
+ read: z.boolean().optional().default(true),
+ write: z.boolean().optional().default(true),
+ execute: z.boolean().optional().default(true),
+ boot: z.boolean().optional().default(false),
+ })
+ .optional(),
+ })
+ .optional(),
+ })
+ ),
+ })
+ ),
+ flash_algorithms: z
+ .array(
+ z.object({
+ name: z.string(),
+ description: z.string(),
+ default: z.boolean().optional(),
+ instructions: z.string(),
+ pc_init: z.number().optional(),
+ pc_uninit: z.number().optional(),
+ pc_program_page: z.number(),
+ pc_erase_sector: z.number(),
+ pc_erase_all: z.number().optional(),
+ data_section_offset: z.number(),
+ transfer_encoding: z.enum(["raw", "miniz"]).optional(),
+ flash_properties: z.object({
+ address_range: z.object({
+ start: z.number(),
+ end: z.number(),
+ }),
+ page_size: z.number(),
+ erased_byte_value: z.number(),
+ program_page_timeout: z.number(),
+ erase_sector_timeout: z.number(),
+ sectors: z.array(
+ z.object({
+ size: z.number(),
+ address: z.number(),
+ })
+ ),
+ cores: z.array(z.string()).optional(),
+ }),
+ })
+ )
+ .optional(),
+});
+
+const targetLoader: Loader = {
+ name: "target-loader",
+ load: async ({ store, logger, parseData, meta, generateDigest }) => {
+ store.clear();
+
+ // Vite's recommended import.meta.glob doesn't seem
+ // to work in content.config.ts :/
+ // const FOLDER = "src/content/probe-rs-repo/probe-rs/targets/";
+ const FOLDER = "node_modules/probe-rs-targets/probe-rs/targets/"; // pull from git repo
+ for (const file of readdirSync(FOLDER)) {
+ const raw = readFileSync(FOLDER + file).toString();
+ const parsed = yaml.load(raw, {
+ schema: targetYamlSchema,
+ filename: FOLDER + file,
+ });
+ const id = file.replace(".yaml", "");
+ // try {
+ const data = await parseData({
+ id,
+ data: parsed as Record,
+ filePath: FOLDER + file,
+ });
+ store.set({ id, data });
+ // } catch (e) {
+ // console.log("failed:", parsed.variants[0].cores);
+ // // throw e;
+ // }
+ }
+ },
+ schema: targetSchema,
+};
+
+const targets = defineCollection({
+ loader: targetLoader,
+ schema: targetSchema,
+});
+
+export const collections = { blog, docs, docsFolderYaml, targets };
diff --git a/src/content/blog/0.11.0-release.mdx b/src/content/blog/0.11.0-release.mdx
new file mode 100644
index 0000000..243f57d
--- /dev/null
+++ b/src/content/blog/0.11.0-release.mdx
@@ -0,0 +1,233 @@
+---
+title: "0.11.0 Released! 🎉"
+description: "0.11.0 Released! 🎉"
+
+date: 2021-06-23
+authors: ["Yatekii", "Tiwalun"]
+
+---
+import { Image } from 'astro:assets';
+
+We are happy to announce the huge release of probe-rs 0.11.0 today. It has been
+a long time coming and is possibly our biggest release so far with over 7 months
+of development since the last one in November 2020!
+
+This release sports a lot of internal improvements, bugfixes and quality of life
+additions.
+
+{/* */}
+
+## probe-rs
+
+Most notable for probe-rs are:
+
+- Our flash layout algorithm got a huge overhaul and fixed some issues with ihex
+ files and small data chunks.
+- A lot of SWD improvements for J-Link to work better and faster!
+- Secure access on chips with TrustZone™ is now possible.
+- probe-rs now makes use of double buffering in the flash process which gives it
+ a decent speed improvement.
+- Many papercut fixes and RISC-V support for the GDB server.
+- probe-rs can now perform flash verification after flashing!
+- A lot of bugfixes for the ARM Debug Interface.
+
+On top of that we added support for a multitude of targets! Many SAMD, STM32,
+nRF5x and LPC devices were added or got improvements.
+
+For a full list, checkout the changelog on the
+[release page](https://github.com/probe-rs/probe-rs/releases/tag/v0.11.0).
+
+## cargo-flash
+
+For cargo-flash we improved the error reporting a lot. Before we would display
+the plain error probe-rs gave us which was not very actionable for the user. Now
+we try to give the user an actionable hint like in the picture below.
+
+import cargo_flash_hints from '../../images/release-0.11.0/cargo-flash-hints.png';
+
+
+
+ The newly added cargo flash hints for errors
+
+
+We have a whole error/hint catalogue and try to expand this. This feature can
+easily be ported to other tools such as cargo-embed and probe-run too to ease
+the development.
+
+## cargo-embed
+
+cargo-embed got two big quality of life improvements:
+
+- RTT and the GDB server can now run concurrently. Previously this was not
+ possible at all. Now you can enable RTT and GDB at the same time. Make sure to
+ put `RUST_LOG=off` such that the GDB server does not print into the RTT UI.
+ This is of course a bit suboptimal and we are working better ways to use RTT
+ unhindered.
+- Typos or non-existant config flags are now spotted and reported to the user,
+ such that things like `enable` vs `enabled` do not cost you hours of debugging
+ anymore.
+
+## Ongoing Work & Behind the Scenes
+
+### VSCode Plugin
+
+For a long time our VSCode plugin has been the little loved child on the
+sidelines. Recently, [@noppej](https://github.com/noppej) has put in serious
+work to make it properly useable! Unfortunately the additions barely didn't make
+it into this release, but will most likely be in one of the next ones around the
+corner.
+
+import probe_rs_debugger from '../../images/release-0.11.0/probe-rs-debugger.gif';
+
+
+
+ The completely overhauled VSCode plugin for probe-rs
+
+
+You can check out the current state in the
+[repo](https://github.com/probe-rs/vscode) to take a sneak peek. While running,
+halting, breaking and stepping works already, stepping only steps single
+instructions at the moment, which can be tedious. This is being worked on as
+well as RTT support in the VSCode terminal section! This will be extended in the
+near future to be a full plugin that also supports RTT down channels as well as
+an SVD viewer and ITM tracing!
+
+A proof of concept of the SVD viewer can be seen below.
+
+import svd_viewer from '../../images/release-0.11.0/svd-viewer.jpeg';
+
+
+
+ A POC for an SVD viewer based on probe-rs
+
+
+### Debug Sequences
+
+Debug sequences are ARM's intended way of performing special procedures on
+targets which deviate from standards (within reason or even violating the spec)
+to unlock features of different targets which go beyond simple flashing.
+
+As many of you might have experienced while using probe-rs, some chips do not
+work as well as others. Furthermore, some chips do not work at all or lack
+certain features. Sequences will improve this a lot! To illustrate what
+sequences will bring to probe-rs, here are a few examples:
+
+- Special reset needs of SAMD devices will be enabled by sequences, meaning
+ those chips are less troublesome.
+- Flashing secure or otherwise special memory portions such as the network core
+ memory of the nRF5340 will be possible with sequences as it allows us to
+ perform special unlock procedures.
+- Erasing and unlocking protected chips such as the nRF52xxx series is possible
+ with sequences.
+- ITM tracing and other advanced features can be unlocked and enabled with
+ sequences.
+
+In short, sequences will enable many new possibilities around different targets
+that have been difficult until now!
+
+And another cool thing sequences will enable is automatic target detection! No
+more passing `--chip xyz`, possible hints of target/architecture mismatch when
+flashing a miscompiled binary, etc!
+
+### Multicore Support
+
+[@dirbaio](https://github.com/Dirbaio) and
+[@diondokter](https://github.com/diondokter) have been hard at work to make the
+handling of multicore MCUs possible. This is entangled somewhat with debug
+sequences and will most likely hit together. Unlocking and flashing of a nRF5340
+(two M33 cores) already works, but we are missing a few changes to the core
+library which will have to be made to finalize this addition.
+
+Not part of this PR, but closely related and under development as well is SWD v2
+Multidrop support. This will enable us to flash chips like the RaspberryPI Pico.
+~~While a useable fork already exists, some work is still left to integrate this
+properly into the probe-rs core.~~
+
+Update: The changes for the Raspberry Pi Pico have been merged to probe-rs, and
+the fork is not needed anymore.
+
+### Hardware Based Testing
+
+We have recently merged a great addition by
+[@Tiwalun](https://github.com/Tiwalun) to improve testing of our PRs in the form
+of a smoke testing tool in the main repository. You can set it up to test each
+PR against the devkits you own. This will catch many regressions and errors
+before we can merge them into master.
+
+To step this one up, we have worked on a
+[custom hardware rig](https://github.com/probe-rs/hive) which will allow us to
+do large scale automated testing of each PR on a set of N targets multiplexed
+against M debug probes. A sneak peek of the rig's design can be seen below ;)
+
+import hive from '../../images/release-0.11.0/hive.jpg';
+
+
+
+ a concept for a HIL (hardware in the loop) test rack for probe-rs
+
+
+To push this project a little further, we have put up a posting for a BSc thesis
+with a local technical university (Switzerland). If you are a BSc student and
+would like to work on this, feel free to reach out to
+[@Yatekii](https://github.com/Yatekii) no matter of locality. We cannot promise
+anything but we will try to figure something out to make this work!
+
+## Various
+
+### hs-probe
+
+We announced the [hs-probe](https://github.com/probe-rs/hs-probe) quite a while
+ago. Many of you have ordered one already. Unfortunately the manufacturing was
+hit by the global chip shortages as well. The good news is that manufacturing
+has concluded today and the probes now go into programming. This means we can
+start the shipping of the probes soon! [Emil](https://github.com/korken89) has
+been working really hard to make this a possibility and get the probe
+manufactured even during chip shortages! ~~If you have not ordered a probe yet,
+and would like to get ahold one, you can do so on our shop~~.
+
+Note: The hs-probe is not available for sale anymore, as all produced units have
+been sold. We might produce an updated version in the future.
+
+### Automatic Releases
+
+We now have a pipeline set up to automate releases of the probe-rs core library
+and related crates. This should allow us to release way more often so your own
+tools do not have to pull from master constantly. At the start we are aiming for
+approximately one release every two weeks. This is an experiment and we will see
+how it goes. We believe that we should bring new functionality and especially
+fixes to you as soon as possible.
+
+Alongside more releases I'd like to try to blog a little more about the ongoing
+development and curiosities we encounter. Though, to focus more on development
+and user support we will keep this promise as small as possible for now ;)
+
+### Sponsoring
+
+We put a lot of work into probe-rs, because we believe in it being an important
+cornerstone to the embedded development ecosystem. All of this is voluntary work
+and we continue to work on it voluntarily, but during times when life at our
+day-job is a little more stressful it can become hard to spend the evening
+putting in extra work hours, which is why we set up a sponsorship option.
+
+At this point, thanks a lot to all of our sponsors that already contribute a
+great deal to probe-rs' continued development and support!
+
+If you love probe-rs and want to see it grow and prosper, we would love if you
+considered [sponsoring] probe-rs development. Some of us would love to at least
+work part time on the project to speed up its development and improve the
+quality of our tooling. Additionally, as explained above, we have big plans for
+hardware based testing to ensure the highest possible quality software, which
+will impose some monetary cost of course. You can do so through
+[Github](https://github.com/sponsors/probe-rs) or
+[OpenCollective](https://opencollective.com/probe-rs).
+
+### probe-rs in Production
+
+We have heard of a handful of companies that are using or going to use probe-rs
+in production to provision their devices. This excites us very much and
+reassures that we are actually making a change in the embedded ecosystem!
+
+# Thank you!
+
+Thanks a lot to all of our users & sponsors that show us that our work is
+appreciated.
diff --git a/src/content/blog/0.12.0-release.mdx b/src/content/blog/0.12.0-release.mdx
new file mode 100644
index 0000000..571fd6e
--- /dev/null
+++ b/src/content/blog/0.12.0-release.mdx
@@ -0,0 +1,127 @@
+---
+title: "0.12.0 Released! 🎉"
+description: "0.12.0 Released! 🎉"
+
+date: 2021-11-25
+authors: ["Yatekii"]
+
+---
+
+Hi everyone!
+
+After [two long weeks](/blog/release-0-11-0/#automatic-releases) we are back
+with the release of 0.12.0.
+
+We have had a lot of development on various fronts on which I intend to give an
+overview down below.
+
+{/* */}
+
+## probe-rs
+
+We have two huge new features in probe-rs which do not seem like much from a
+regular user perspective but actually enable us to implement a lot of additional
+functionality down the road.
+
+First of all we finally merged
+[Sequence support](/blog/release-0-11-0/#debug-sequences). There is only one
+target (namely the LPC55S69) which has custom sequences, but there are a lot
+more chips which can profit from this to do chip-unlock, multicore, special
+reset sequences and much more.
+
+The second bigger thing is multicore support and DPv2 support. While multicore
+is pretty much self explanatory, DPv2 support enables us to select a DebugPort,
+which enables us to do Multidrop SWD. This is a not so much used functionality,
+but while it's cool to have anyways, it is required to support the RPi2040,
+which has one DebugPort for each core instead of one for both, which regular
+multicore targets do. Also, for proper multicore support on all targets, many of
+them will need to implement sequences to unlock additional cores, which is not
+implemented for most of them yet. A big thank you for this goes to
+[Dirbaio](https://github.com/Dirbaio) and
+[diondokter](https://github.com/diondokter).
+
+Apart from that we added various smaller things that make developer life easier;
+to see what changed, please have a look at the
+[CHANGELOG.md](https://github.com/probe-rs/probe-rs/blob/master/CHANGELOG.md).
+
+## VSCode
+
+Our [VSCode plugin](https://github.com/probe-rs/vscode) is included in this
+release. While it surely still is rough around the edges, it is definitely
+useable and I encourage all of you to give it a shot so that we can identify all
+the issues and make it even better. [@noppej](https://github.com/noppej) and
+recently [@Tiwalun](https://github.com/Tiwalun) too have been hard at work to
+provide you with a good debugging experience. Thank you!
+
+You can find more info around using the plugin in the Repo and on our Guide.
+
+## Hardware Based Testing
+
+Behind the scenes, our newest crewmember, [@TeyKey1](https://github.com/TeyKey1)
+has been very hard at work for his BSc thesis to make large scale HW testing for
+probe-rs a reality.
+
+You can find all the info around the designs in the
+[repo](https://github.com/probe-rs/hive).
+
+The design has been revamped from last blog's
+[sneakpeek](/blog/release-0-11-0/#hardware-based-testing) and is now oriented a
+bit differently. Previously I tried to make the design to fit as many possible
+targets and probes as possible and due to hardware and monetary constraints, the
+design disregarded runtime. So in the old design if we actually tested a lot of
+targets it would result in immense testing times because the design could not
+multiplex well. Additionally, the old design was not suitable to be built for
+every dev so they could test at home - even if they'd put less targets on the
+test.
+
+So the new design takes all of this into consideration. It features a compact
+build with a bit less possible targets and probes: 4 probes and 32 targets can
+be tested with 4 tests at once being possible - one on each probe. The design
+features a RaspberryPi 4 as a base and stacks shields with chip daughterboards
+on top. This enables everyone to design a daugtherboard which can be
+manufactured and included in the test-rig. If we need more than 4 probes or more
+than 32 targets, we can assemble a second rig - all at a very low cost of
+manufacturing with a very modular design.
+
+The project itself is split into two parts. The first (this autumn semester)
+aims at making a testrig with a basic firmware to have the hardware working and
+tested. At the moment it looks like this will be done in time. The next semester
+will be the second part, where Thierry will work on doing nice integration of
+the testrig with Github, automate everything to run on new PRs, write tests for
+the targets and test out all the daughterboards he designed.
+
+If you have any wishes or ideas for the daughterboards or the tests to be
+performed, please voice them and we'll see if they can be included.
+
+I am very stoked for this especially, as it enables us to make changes more
+fearlessly and test things very well!
+
+## Automatic Releases
+
+While this time the release was less than 2 hours work and thus more pleasant,
+we still did not manage to cut an earlier release. We will try on in the future
+to improve this ;)
+
+## hs-probe
+
+We have shipped many hs-probes - 166 to be precise - over the last few months.
+Very exciting!
+
+For me personally, this has been a very unpleasant experience due to
+difficulties with shipping things to various locations on the planet. I put in
+many many more hours than I ever planned and in the end it would have been
+easier to do all the shipping myself. Most likely I wont be doing this again.
+
+I hope all the hs-probe owners are happy with their probes :)
+
+If you are still waiting on a stuck order, please contact me. Unfortunately my
+possibilities here are limited. Most shipping providers apparently do not report
+shipping status back properly and have very different requirements and delivery
+times based on country and shipping provider.
+
+Also, we have a little stock left still and I am happy to send those out.
+
+# Thank you!
+
+Thanks a lot to all of our developers, sponsors & users that made this a reality
+and appreciate the work put in.
diff --git a/src/content/docs/faq/_data.yaml b/src/content/docs/faq/_data.yaml
new file mode 100644
index 0000000..b991a4d
--- /dev/null
+++ b/src/content/docs/faq/_data.yaml
@@ -0,0 +1,2 @@
+sectionOrder: 6
+title: F.A.Q.
\ No newline at end of file
diff --git a/src/content/docs/faq/faq.mdx b/src/content/docs/faq/faq.mdx
new file mode 100644
index 0000000..5e60225
--- /dev/null
+++ b/src/content/docs/faq/faq.mdx
@@ -0,0 +1,55 @@
+---
+title: "FAQ"
+description: "A collection of FAQ"
+order: 00
+---
+
+## I cannot flash my target
+
+Make sure you try with and without the `connect-under-reset` argument. Some chips need it and others don't support it at all.
+
+## My stm32 target does not flash or boot, what to do?
+
+Try to connect BOOT0 to ground and flash the firmware while doing that to unbrick your target.
+
+## Why you can't use probe-rs with arduino/adafruit/micropython/u2f bootloaders?
+
+These devkits don't contain a debug probe and are only flashed over USB/a serial interface.
+Thus it is not possible for us to debug those targets.
+
+## I get some weird probe error, how do I debug it?
+
+## How to debug the debugger?
+
+## probe-rs does fails to connect to RTT, what to do?
+
+Make sure your firmware does not crash very early. This is a very common reason we actually never get to run RTT which makes probe-rs fail to find the necessary information to connect.
+
+## How do I add a new target?
+
+Please see the documentation on [CMSIS-Packs](/docs/knowledge-base/cmsis-packs)
+
+## probe-rs gives me an error, what should I do?
+
+If you encounter an error that you think is a bug in probe-rs, you should report it to us!
+
+In case your issue reproduces in a reliable way (i.e., when running the same command you get the same error), you can generate a report that includes some important information in a zip file!
+You can generate a report by appending `--report` to the failing command.
+
+For example, if you encounter an error running `probe-rs run --chip atsamd51p19a path_to_elf`, you can generate a report by running the following:
+
+`probe-rs run --chip atsamd51p19a path_to_elf --report`
+
+The command will create `report.zip` in your current folder, and it will also print a link to open a GitHub issue pre-filled with a summary of the report.
+
+> If you feel uncomfortable clicking weird links, you don't have to! It's just a shortcut to a new issue in the probe-rs GitHub repository!
+
+Please add anything you might find relevant to the issue description! Additionally, please upload it along with your issue ticket!
+
+### What does the zip contain?
+
+The generated `report.zip` contains the following files:
+
+- If applicable, the firmware image you're working with. Be aware that this might contain personal or otherwise sensitive information.
+- Logs generated during execution.
+- probe-rs version information.
diff --git a/src/content/docs/getting-started/_data.yaml b/src/content/docs/getting-started/_data.yaml
new file mode 100644
index 0000000..bf460c0
--- /dev/null
+++ b/src/content/docs/getting-started/_data.yaml
@@ -0,0 +1,2 @@
+sectionOrder: 1
+title: Getting Started
\ No newline at end of file
diff --git a/src/content/docs/getting-started/installation.mdx b/src/content/docs/getting-started/installation.mdx
new file mode 100644
index 0000000..185f1e3
--- /dev/null
+++ b/src/content/docs/getting-started/installation.mdx
@@ -0,0 +1,84 @@
+---
+title: "Installation"
+description: "How to install probe-rs."
+order: 20
+---
+
+## Using install scripts
+
+### Linux, macOS
+
+```bash
+curl --proto '=https' --tlsv1.2 -LsSf https://github.com/probe-rs/probe-rs/releases/latest/download/probe-rs-tools-installer.sh | sh
+```
+
+### Windows
+
+```ps
+irm https://github.com/probe-rs/probe-rs/releases/latest/download/probe-rs-tools-installer.ps1 | iex
+```
+
+## From package managers
+
+### [homebrew](https://brew.sh/)
+
+```bash
+brew tap probe-rs/probe-rs
+brew install probe-rs
+```
+
+### [cargo binstall](https://crates.io/crates/cargo-binstall)
+
+```bash
+cargo binstall probe-rs-tools
+```
+
+## Installing from source (`cargo install`)
+
+### Prerequisites
+
+To build probe-rs from source, you will need a working Rust toolchain. The easiest way is to follow the [rustup installation instructions](https://rustup.rs).
+
+#### Debian-based Linux
+
+On Debian and derived distros (e.g. Ubuntu), the following packages need to be installed:
+
+```bash
+sudo apt install -y pkg-config libudev-dev cmake git
+```
+
+#### RPM-based Linux (Fedora, CentOS)
+
+```bash
+dnf install libusbx-devel libudev-devel cmake git
+```
+
+#### macOS
+
+No additional setup is required.
+
+#### Windows
+
+No additional setup is required.
+
+### Installation
+
+`cargo install` will download, compile and install `probe-rs`, `cargo-flash` and `cargo-embed` for you.
+
+You have multiple options, the two most interesting are:
+
+- To install the latest release, run `cargo install probe-rs-tools --locked`
+- To try the latest development version (a.k.a the `master` branch) with experimental and unreleased changes, run `cargo install probe-rs-tools --git https://github.com/probe-rs/probe-rs --locked`
+
+See the [Cargo book](https://doc.rust-lang.org/cargo/commands/cargo-install.html) for details.
+
+
+## Shell completion
+
+You likely want to install shell completion support along with the probe-rs binaries. Just run:
+
+```bash
+probe-rs complete install
+```
+
+If your shell is not supported out of the box, please follow the instructions given by this command.
diff --git a/src/content/docs/getting-started/probe-setup.mdx b/src/content/docs/getting-started/probe-setup.mdx
new file mode 100644
index 0000000..203db56
--- /dev/null
+++ b/src/content/docs/getting-started/probe-setup.mdx
@@ -0,0 +1,210 @@
+---
+title: "Probe Setup"
+description: "How to set up your debug probe to work with probe-rs."
+order: 20
+---
+
+## Platform specifics
+
+probe-rs supports multiple probes out of the box.
+
+Most of them require little to no setup. For linux, [udev](#linux-udev-rules) rules
+are required for non admin access.
+
+### Linux: udev rules
+
+By default, the debug probes are only accessible by users with root privileges
+on Linux based systems. It is recommend to use appropriate udev rules to allow
+users without root privileges access to the debug probes as well.
+
+1. Download the rules file and place
+ it in /etc/udev/rules.d.
+2. Run `udevadm control --reload` to ensure the new rules are used.
+3. Run `udevadm trigger` to ensure the new rules are applied to already added
+ devices.
+
+If you're still unable to access the debug probes after following these steps,
+try adding your user to the plugdev group. This group needs to be a system group
+if you use systemd version higher than v258. In this case you can try the following
+commands to fix the udev rules :
+
+```bash
+sudo groupadd --system plugdev
+sudo usermod -a -G plugdev $USER
+```
+
+[^1]: The file needs to have an initial number lower than 73, otherwise the udev
+rules do not get applied properly. See
+[this Github discussion](https://github.com/systemd/systemd/issues/4288#issuecomment-348166161)
+for more information.
+
+> If you are using WSL, you may need to enable the `udev` service. To check if the service is
+> running, run `service udev status`. If the service is not started, edit `/etc/wsl.conf`
+> (with sudo) and make sure the following is included:
+
+```
+[boot]
+command="service udev start"
+```
+
+### Windows: WinUSB drivers
+
+Some of the probe implementations are implemented using [nusb](https://crates.io/crates/nusb) which
+uses the WinUSB drivers on Windows. For these devices you will need to download
+[Zadig](https://zadig.akeo.ie/) and select WinUSB as the driver for your probe. This will uninstall
+any official drivers, which means that the official tools will most likely not work anymore after
+this.
+
+## CMSIS-DAP
+
+CMSIS-DAP is a standard for debug probes which is managed by ARM. All probes
+implementing this standard are supported by probe-rs.
+
+### Setup
+
+#### Linux
+
+No additional drivers are required to use CMSIS-DAP based probes on Linux
+systems. To ensure that users without root privileges can use the debug probe,
+it is recommended to configure udev as described in [udev rules](#linux-udev-rules).
+
+#### Windows, macOS
+
+No driver installation required.
+
+## ST-Link
+
+The ST-Link is a debug probe from ST Microelectronics. It is commonly found on
+their evaluation boards, such as the Discovery and Nucleo boards.
+
+### Supported Versions
+
+The following versions of the ST-Link are supported:
+
+- ST-Link V2, Firmware version 2.26 or higher
+- ST-Link V3, Firmware version 3.2 or higher
+
+If you get an error message indicating that the firmware is outdated, please use
+the official ST tools to update the firmware. The update tool can be found on
+the [ST website](https://www.st.com/en/development-tools/stsw-link007.html).
+
+### Setup
+
+#### Linux
+
+No additional drivers are required to use a ST-Link debug probe on Linux
+systems. To ensure that users without root privileges can use the debug probe,
+it is recommended to configure udev as described in [udev rules](#linux-udev-rules).
+
+#### Windows
+
+To use the ST-Link on Windows, you need to install the official drivers, which
+can be found on the
+[ST website](https://www.st.com/en/development-tools/stsw-link009.html).
+
+#### macOS
+
+No driver installation required.
+
+## SEGGER J-Link
+
+The J-Link is a debug probe from [Segger](https://www.segger.com/). It is
+available as a stand-alone product, but also integrated into some evaluation boards
+directly.
+
+Due to the proprietary nature of the J-Link, probe-rs will not achieve the same
+speed as the official J-Link tools.
+
+### Setup
+
+#### Linux
+
+No additional drivers are required to use a J-Link debug probe on Linux systems.
+To ensure that users without root privileges can use the debug probe, it is
+recommended to configure udev as described in [udev rules](#linux-udev-rules).
+
+#### Windows
+
+Unfortunately, probe-rs doesn't work with the official drivers on Windows. To
+use probe-rs it is necessary to install a generic WinUSB driver. The recommended
+way of doing this is by using the
+[J-Link Configurator](https://www.segger.com/products/debug-probes/j-link/tools/j-link-configurator/)
+tool. To install the generic WinUSB driver with the J-Link Configurator tool:
+
+- Download the J-Link Configurator tool
+- Connect the J-Link probe you wish to update
+- Start the J-Link Configurator tool
+- Right click the entry in the overview where your probe is listed, and select
+**Configure**
+- Under **USB Driver (Windows)** select **WinUSB**
+- Click **OK**
+
+Some J-Link probes will have the option to select WinUSB in the configuration
+dialog disabled. In this case, use [Zadig](#windows-winusb-drivers) to
+install the generic WinUSB driver for your probe.
+
+#### macOS
+
+No driver installation required.
+
+## FTDI
+
+FTDI refers to a family of debug probes built using USB-JTAG bridges from
+[FTDI](https://ftdichip.com/). probe-rs supports the following chips:
+
+- FT232H
+- FT2232C, FT2232D, FT2232H
+- FT4232H
+
+Due to the configurable nature of these chips, not every probe may be picked up by probe-rs. If you
+have a probe that you know contains an FTDI chip, but probe-rs does not recognise it, please open
+a ticket on [GitHub](https://github.com/probe-rs/probe-rs/issues/new?assignees=&labels=enhancement&projects=&template=feature_request.md&title=)!
+
+The following devices are known to work with probe-rs:
+
+- [esp-prog](https://docs.espressif.com/projects/espressif-esp-dev-kits/en/latest/other/esp-prog/user_guide.html)
+- The debug interface of [ESP32-Ethernet-Kit V1.2](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/hw-reference/esp32/get-started-ethernet-kit.html)
+- [Adafruit FT232H Breakout](https://learn.adafruit.com/adafruit-ft232h-breakout)
+- Olimex ARM-USB devices:
+ - [ARM-USB-OCD](https://www.olimex.com/Products/ARM/JTAG/ARM-USB-OCD/)
+ - [ARM-USB-OCD-H](https://www.olimex.com/Products/ARM/JTAG/ARM-USB-OCD-H/)
+ - [ARM-USB-TINY](https://www.olimex.com/Products/ARM/JTAG/ARM-USB-TINY/)
+ - [ARM-USB-TINY-H](https://www.olimex.com/Products/ARM/JTAG/ARM-USB-TINY-H/)
+
+### Setup
+
+#### Linux
+
+No additional drivers are required to use a FTDI-based debug probe on Linux systems.
+To ensure that users without root privileges can use the debug probe, it is
+recommended to configure udev as described in [udev rules](#linux-udev-rules).
+
+#### Windows
+
+Unfortunately, probe-rs doesn't work with the official (VCP or D2xx) drivers on Windows. To
+use probe-rs it is necessary to install a generic WinUSB driver. The recommended
+way of doing this is by using [Zadig](#windows-winusb-drivers).
+
+#### macOS
+
+No driver installation required.
+
+## ESP32 devices with built-in USB-JTAG interface
+
+Some ESP32 devices come with built-in debug probes. The availability of this interface varies,
+but usually, if your device includes two USB ports, one labelled `USB`, the other `UART`, then
+there's a good chance the one marked as `USB` can act as a debug probe.
+
+### Setup
+
+#### Linux
+
+No additional drivers are required to use an ESP32 built-in debug interface on Linux systems.
+To ensure that users without root privileges can use the debug probe, it is
+recommended to configure udev as described in [udev rules](#linux-udev-rules).
+
+#### Windows, macOS
+
+No driver installation required.
+
+Some ESP32 devices have an incorrect WinUSB Descriptor. If ``probe-rs list`` shows your device, but ``probe-rs info`` fails with ``Could not find DeviceInterfaceGUIDs in registry``, you may need to reinstall the driver using Zadig. You can find more information in this GitHub discussion: https://github.com/probe-rs/probe-rs/discussions/3193
diff --git a/src/content/docs/knowledge-base/_data.yaml b/src/content/docs/knowledge-base/_data.yaml
new file mode 100644
index 0000000..7c4108f
--- /dev/null
+++ b/src/content/docs/knowledge-base/_data.yaml
@@ -0,0 +1,2 @@
+sectionOrder: 5
+title: Knowledge Base
\ No newline at end of file
diff --git a/content/docs/knowledge-base/cmsis-packs.md b/src/content/docs/knowledge-base/cmsis-packs.mdx
similarity index 72%
rename from content/docs/knowledge-base/cmsis-packs.md
rename to src/content/docs/knowledge-base/cmsis-packs.mdx
index 7394bd1..133006d 100644
--- a/content/docs/knowledge-base/cmsis-packs.md
+++ b/src/content/docs/knowledge-base/cmsis-packs.mdx
@@ -1,17 +1,8 @@
-+++
-title = "CMSIS Packs"
-description = "The CMSIS Pack standard and how probe-rs uses it."
-date = 2021-05-01T08:00:00+00:00
-updated = 2021-05-01T08:00:00+00:00
-draft = false
-weight = 20
-sort_by = "weight"
-template = "docs/page.html"
-
-[extra]
-toc = true
-top = false
-+++
+---
+title: "CMSIS Packs"
+description: "The CMSIS Pack standard and how probe-rs uses it."
+order: 20
+---
## Basics
@@ -46,7 +37,7 @@ The functions follow standard ARM EABI calling convention.
Since the Packs are full of bloat we don't need, we have introduced a slimmed down format for target
description.
We chose YAML to represent the target as it is a well known format and allows comments.
-Every YAML file adresses an entire family of chips equivalent to the CMSIS-Packs.
+Every YAML file addresses an entire family of chips equivalent to the CMSIS-Packs.
The yaml format follows the following structure:
@@ -58,28 +49,59 @@ name: string
variants:
# The name of the chip.
- name: string
+ # Descriptions of the CPU cores.
+ cores:
+ # The name of the core.
+ - name: string
+ # Architecture
+ type: armv6m | armv7a | armv7m | armv7em | armv8a | armv8m | riscv | xtensa
+ # Core-specific options. Can be one of: `!Arm {}`, `!Riscv {}`, `!Xtensa {}`
+ core_access_options: object
# A list of all the available memories and their properties.
memory_map:
- # The type of the memory. Possible are [Ram, Flash].
- # There needs to be at least one of each present.
- - Ram:
+ # The type of the memory. Possible are [!Ram, !Nvm, !Generic].
+ # There needs to be at least one of !Ram and !Nvm present.
+ - !Ram:
+ range:
+ # The start address of the memory (inclusive).
+ start: number
+ # The end address of the memory (exclusive).
+ end: number
+ # Marks the memory as the memory which the chip boots from.
+ access:
+ boot: boolean
+ # List of cores that can access this region
+ cores:
+ - core name
+ - !Nvm:
range:
# The start address of the memory (inclusive).
start: number
- # The end address of the memory (inclusive).
+ # The end address of the memory (exclusive).
end: number
# Marks the memory as the memory which the chip boots from.
- is_boot_memory: boolean
+ access:
+ boot: boolean
+ # List of cores that can access this region
+ cores:
+ - core name
+ - !Generic:
+ range:
+ # The start address of the memory (inclusive).
+ start: number
+ # The end address of the memory (exclusive).
+ end: number
+ # List of cores that can access this region
+ cores:
+ - core name
# A list of all the used flash algorithms.
flash_algorithms:
# The name of the flash algorithm.
- string
-# A hashmap of all the available flash algorithms.
+# A list of all the available flash algorithms.
flash_algorithms:
- # The name of the flash algorithm.
- name:
# The name of the flash algorithm.
- name: string
+ - name: string
# A description of the flash algorithm.
description: string
# Marks the algorithm to be used as the default algorithm.
@@ -99,12 +121,14 @@ flash_algorithms:
pc_erase_all: number
# The offset where the data section of the ELF binary starts.
data_section_offset: number
+ # Encoding (and compression algorithm) supported by the flash algorithm.
+ transfer_encoding: raw | miniz
flash_properties:
# The address range for which this flash algorithm is to be used.
address_range:
# The start address (inclusive).
start: number
- # The start address (inclusive).
+ # The end address (exclusive).
end: number
# The programmable block size. This is the unit size that can be written to flash.
page_size: number
@@ -114,14 +138,15 @@ flash_algorithms:
program_page_timeout: number
# How long a sector erase procedure can take.
erase_sector_timeout: number
- # The sectors this piece of flash consists of. A sector is the eraseable unit.
+ # The sectors this piece of flash consists of. A sector is the erasable unit.
sectors:
# The size of the sectors starting form the address below.
- size: number
# The address from on which the new sector size is applicable.
address: number
-# The core type. Currently valid are [M4, M3, M33, M0, RISCV]
-core: string
+ # List of cores that can use this algorithm
+ cores:
+ - core name
```
## Target extraction
diff --git a/src/content/docs/knowledge-base/creating-a-coredump.mdx b/src/content/docs/knowledge-base/creating-a-coredump.mdx
new file mode 100644
index 0000000..c7b4019
--- /dev/null
+++ b/src/content/docs/knowledge-base/creating-a-coredump.mdx
@@ -0,0 +1,52 @@
+---
+title: "Creating a coredump"
+description: "How to create coredumps?"
+order: 40
+---
+
+Coredumps are snapshots of your device's memory at a particular point in time. They, along with the
+firmware `.elf` enable us to reproduce and debug issues you may experience with variable resolution
+during a debugging session.
+
+## When should I consider creating a coredump?
+
+Every time you see something off in the variable list, e.g. where probe-rs prints an error
+instead of a value. The following image illustrates one such case:
+
+
+import { Image } from 'astro:assets';
+import variable_resolution_issue from '../../../images/coredump/variable_resolution_issue.png';
+
+
+
+## How can I create a coredump?
+
+First up, stop your program at a point that illustrates your issue. Next, you should open the
+`DEBUG CONSOLE` and type the following:
+
+`dump `
+
+For example, to dump memory in the range `0x20000000..0x20001000` you can type:
+
+`dump 0x20000000 0x1000 out.dump`
+
+You can also list multiple memory regions that will be saved in the same file. The following will
+store the memory region `0x00000..0x10000` and `0x20000000..0x20004000`
+
+`dump 0 65536 0x20000000 16384 out.dump`
+
+
+import coredump from '../../../images/coredump/coredump.png';
+
+
+
+## What should I include in the coredump?
+
+Please include both the whole RAM region of your device, as well as the used flash space.
+
+## How can I send you my coredump?
+
+If your coredump and `.elf` do not contain sensitive information, you can just post them to GitHub,
+as part of a new [Bug Report](https://github.com/probe-rs/probe-rs/issues/new?assignees=&labels=bug&projects=&template=bug_report.md&title=).
+
+If you would like to keep your files private, ask around on our [Matrix chat](https://matrix.to/#/#probe-rs:matrix.org) first!
diff --git a/content/docs/knowledge-base/raspberry-pi.md b/src/content/docs/knowledge-base/raspberry-pi.mdx
similarity index 81%
rename from content/docs/knowledge-base/raspberry-pi.md
rename to src/content/docs/knowledge-base/raspberry-pi.mdx
index 800266d..28a27ab 100644
--- a/content/docs/knowledge-base/raspberry-pi.md
+++ b/src/content/docs/knowledge-base/raspberry-pi.mdx
@@ -1,23 +1,14 @@
-+++
-title = "Raspberry Pi"
-description = "How to use probe-rs to debug a Raspberry Pi."
-date = 2022-06-05T08:00:00+00:00
-updated = 2022-06-05T08:00:00+00:00
-draft = false
-weight = 30
-sort_by = "weight"
-template = "docs/page.html"
-
-[extra]
-toc = true
-top = false
-+++
+---
+title: "Raspberry Pi"
+description: "How to use probe-rs to debug a Raspberry Pi."
+order: 30
+---
## Overview
**probe-rs** supports JTAG debugging with the [Raspberry Pi 4B](https://www.raspberrypi.com/products/raspberry-pi-4-model-b/). This can be used to debug a custom OS or bootloader, the Linux kernel, or a hypervisor running on the board.
-A debug probe that supports JTAG is required. SWD is not supported on the Raspberry Pi. The J-Link probe has been extensively tested by any ARM & JTAG capable probe that **probe-rs** supports should work.
+A debug probe that supports JTAG is required. SWD is not supported on the Raspberry Pi. The J-Link probe has been extensively tested but any ARM & JTAG capable probe that **probe-rs** supports should work.
Both 32 and 64-bit CPU modes are supported. **probe-rs** will automatically detect the mode the CPU is operating in and adjust accordingly.
@@ -50,5 +41,5 @@ At a minimum TDO, TCK, TDI, TMS, and a ground pin must be connected to your prob
The chip name to use with **probe-rs** is `RaspberryPi4B`. When connecting make sure the protocol is explicitly specified as JTAG or connection errors may occur. For example, to use the gdb server:
-`probe-rs-cli gdb --protocol jtag --chip RaspberryPi4B`
+`probe-rs gdb --protocol jtag --chip RaspberryPi4B`
diff --git a/src/content/docs/knowledge-base/troubleshooting.mdx b/src/content/docs/knowledge-base/troubleshooting.mdx
new file mode 100644
index 0000000..78f1e00
--- /dev/null
+++ b/src/content/docs/knowledge-base/troubleshooting.mdx
@@ -0,0 +1,79 @@
+---
+title: "Troubleshooting"
+description: "Troubleshooting problems that may arrise during use"
+order: 100
+---
+
+## No DEFMT output
+
+**Check `DEFMT_LOG` filter:**
+
+Filter levels in order from lowest to highest severity are: `TRACE`, `DEBUG`, `INFO`, `WARN`, `ERROR`
+
+More info on DEFMT filtering levels [here](https://defmt.ferrous-systems.com/filtering.html)
+
+This can be set multiple ways:
+- If using `cargo run` on a probe-rs based runner:
+ - `ENV VAR` at build time: `DEFMT_LOG=trace cargo build ...`
+ - In `.cargo/config.toml` **Note:** there is a bug in cargo that does not automatically recognize changes when rebuilding.
+ ```toml
+ [env]
+ DEFMT_LOG = "trace"
+ ```
+- If using [VSCode plugin](https://probe.rs/docs/tools/debugger/),
+ - Make sure `rttEnabled` is `true` and `consoleLogLevel` is set to appropriate filter level:
+ ```json
+ {
+ "version": "0.2.0",
+ "configurations": [{
+ // SNIP...
+ "coreConfigs": [{
+ // SNIP ...,
+ "rttEnabled": true
+ }],
+ "consoleLogLevel": "Console", //Console, Info, Debug
+ }],
+ }
+ ```
+
+
+**Check `memory.x` file is correct:**
+
+- Make sure origin offsets are correct according to datasheet/ application
+- Make sure lengths are correct according to datasheet/application
+- Note: Lower values for RAM are OK, but values that exceed the chip's spec will cause a crash and not allow RTT to connect.
+
+
+**Check correct Chip selected:**
+
+- `.cargo/config.toml` under runner. Example:
+ ``` toml
+ runner = "probe-rs run --chip STM32L451RCTx"
+ ```
+- If using VSCode plugin in `launch.json` configurations/chip
+ ```json
+ {
+ "version": "0.2.0",
+ "configurations": [{
+ // SNIP...
+ "chip": "STM32L451RCTx",
+ // SNIP...
+ }],
+ }
+ ```
+
+**Check `defmt_rtt` is being "used" in code:**
+
+If not, it will not be linked during compile. Example:
+```rust
+use defmt_rtt as _;
+```
+
+**On STM32 series chips, check the state of the `BOOT0` pin:**
+
+- If BOOT0 is HIGH or floating, the core will run from internal bootloader instead of flashed firmware.
+- BOOT0 should be pulled LOW for SWD programming, however even if it is HIGH or floating, programming may appear to succeed but firmware will not properly run.
+
+**Make sure tooling is up to date:**
+
+As with any set of tools being actively developed and improved, sometimes if one part is updated and there is a breaking change, the other tools must be updated as well in order to function.
diff --git a/src/content/docs/library/_data.yaml b/src/content/docs/library/_data.yaml
new file mode 100644
index 0000000..4352166
--- /dev/null
+++ b/src/content/docs/library/_data.yaml
@@ -0,0 +1,2 @@
+sectionOrder: 3
+title: Library Guide
\ No newline at end of file
diff --git a/content/docs/library/basics.md b/src/content/docs/library/basics.mdx
similarity index 70%
rename from content/docs/library/basics.md
rename to src/content/docs/library/basics.mdx
index 9799b1f..8acce1b 100644
--- a/content/docs/library/basics.md
+++ b/src/content/docs/library/basics.mdx
@@ -1,33 +1,26 @@
-+++
-title = "Basic Usage"
-description = "The very basics of using probe-rs."
-date = 2021-05-01T08:00:00+00:00
-updated = 2021-05-01T08:00:00+00:00
-draft = false
-weight = 20
-sort_by = "weight"
-template = "docs/page.html"
-
-[extra]
-toc = true
-top = false
-+++
+---
+title: "Basic Usage"
+description: "The very basics of using the probe-rs library."
+order: 20
+---
## The Probe struct
-The [Probe](https://docs.rs/probe-rs/*/probe_rs/struct.Probe.html) struct represents the physical probe in code form.
-It is used to do probe discovery, setting phyiscal parameters of the probe, spawning sessions and last but
+The [Probe](https://docs.rs/probe-rs/*/probe_rs/probe/struct.Probe.html) struct represents the physical probe in code form. To list available probes, use the [Lister](https://docs.rs/probe-rs/latest/probe_rs/probe/list/struct.Lister.html) struct.
+It is used to set physical parameters of the probe, spawn sessions and last but
not least use special probe specific features such as SWV tracing, hard reset, etc.
So if you are looking for non-core-architecture-specific functionality, the `Probe` struct is most likely the
right place to look.
-While it is possible to open a probe from a boxed trait this is most likely not really helpful for a user. As a dev this is needed if you implement your own probe. More about this in the [chapter about implementing your own probe](/guide/basics#probe).
+While it is possible to open a probe from a boxed trait this is most likely not really helpful for a user. As a dev this is needed if you implement your own probe.
Best is to list the connected probes and open the one you like. Most likely there is one only anyways.
```rs
// Get a list of all available debug probes.
-let probes = Probe::list_all();
+let lister = Lister::new();
+
+let probes = lister.list_all();
// Use the first probe found.
let probe = probes[0].open()?;
@@ -36,6 +29,7 @@ let probe = probes[0].open()?;
Now you can access all the functionality a probe can offer. Not all probes offer the same functionality, which is why some calls may return a negative `Result`.
```rs
+
// Perform a hard reset of the connected target via the probe.
probe.target_reset()?;
@@ -47,7 +41,7 @@ let session = probes[0].attach("nRF52")?;
```
Now we have got our [Session](https://docs.rs/probe-rs/*/probe_rs/struct.Session.html) ready to conduct further business.
-Take a closer look at the [::attach()](https://docs.rs/probe-rs/*/probe_rs/struct.Probe.html#method.attach) call. Appart from passing a chip name, you can also pass various other arguments for selecting the chip.
+Take a closer look at the [::attach()](https://docs.rs/probe-rs/*/probe_rs/probe/struct.Probe.html#method.attach) call. Apart from passing a chip name, you can also pass various other arguments for selecting the chip.
## The Session struct
@@ -70,32 +64,30 @@ let core = session.core(0);
The [Core](https://docs.rs/probe-rs/*/probe_rs/struct.Core.html) is probably the struct you will interact most with.
With the core struct you can manipulate the CPU and it's accessible memories.
-In the previous sections we have learned how we attach to a core.
-Someties you want to access the core operations in quick fashion.
-This is what [Session::auto_attach()](https://docs.rs/probe-rs/*/probe_rs/struct.Session.html#method.auto_attach) is for.
-It lets you attach to the Core without first opening a Probe.
-It will try to open a connected prbe, and select the Core as best as it can
+In the previous sections we have learned how we attach to a core.
+Sometimes you want to access the core operations in quick fashion.
+This is what [Session::auto_attach()](https://docs.rs/probe-rs/*/probe_rs/struct.Session.html#method.auto_attach) is for.
+It lets you attach to the Core without first opening a Probe.
+It will try to open a connected probe, and select the Core as best as it can
```rs
let session = Session::auto_attach("chip_name")?;
let core = session.core(0)?;
```
-Once you have attached to the Core, you are able to halt the Core at any point in time.
+Once you have attached to the Core, you are able to halt the Core at any point in time. The
+[Core::halt()](https://docs.rs/probe-rs/*/probe_rs/struct.Core.html#method.halt) function
+will wait for the core to halt, and you will need to provide the maximum allowed waiting time.
```rs
-core.halt()?;
+core.halt(Duration::from_ms(100))?;
```
-The [Core::halt()](https://docs.rs/probe-rs/*/probe_rs/struct.Core.html#method.halt) call does not ensure the Core will actually halt.
-So you might want to ask the core whether it has halted
+You can also manually check whether the core is halted. This is useful because `halt` and `run` may
+not be safe to call in the unexpected state. So you might want to ask the core whether it has halted
```rs
-while let Ok(halted) = core.core_halted()? {
- if halted {
- break;
- }
-}
+let is_halted = core.core_halted()?;
```
We can single step the CPU on a per instruction basis
@@ -137,7 +129,7 @@ core.set_hw_breakpoint(address)?;
core.clear_hw_breakpoint(address)?;
```
-Of course manipulating the CPU alone is not enough. Therefore it's also possible to access the memories that are phyiscally accessible by the CPU.
+Of course manipulating the CPU alone is not enough. Therefore it's also possible to access the memories that are physically accessible by the CPU.
```rs
// We can read a single word for the convenience of reading registers.
@@ -156,4 +148,4 @@ let buffer = [0; 42];
core.write_32(address, &buffer)?;
```
-probe-rs handles batching for bigger memory requests and should optimize for maximum speed.
\ No newline at end of file
+probe-rs handles batching for bigger memory requests and should optimize for maximum speed.
diff --git a/content/docs/library/crosscompiling.md b/src/content/docs/library/crosscompiling.mdx
similarity index 53%
rename from content/docs/library/crosscompiling.md
rename to src/content/docs/library/crosscompiling.mdx
index f763c12..bfd66b1 100644
--- a/content/docs/library/crosscompiling.md
+++ b/src/content/docs/library/crosscompiling.mdx
@@ -1,29 +1,20 @@
-+++
-title = "Crosscompiling"
-description = "Cross-compiling probe-rs"
-date = 2021-05-01T08:00:00+00:00
-updated = 2021-05-01T08:00:00+00:00
-draft = false
-weight = 100
-sort_by = "weight"
-template = "docs/page.html"
-
-[extra]
-toc = true
-top = false
-+++
+---
+title: "Crosscompiling"
+description: "Cross-compiling probe-rs"
+order: 100
+---
Even though **probe-rs** can run on most systems, there can be cases where using `cargo install` is not possible due to system permissions or resource limitations.
-In such cases you can Crosscompile **probe-rs** for use in **cargo-flash** or **cargo-embed** on a different architecture, and move the resulting static binary to the target system.
+In such cases you can cross-compile **probe-rs** for use in **cargo-flash** or **cargo-embed** on a different architecture, and move the resulting static binary to the target system.
-We will use a [**Raspberry pi 400**](https://www.raspberrypi.org/products/raspberry-pi-400/) as the target system as an example, where `cargo install cargo-flash` on a default **Raspberry PI OS** installation is not possible to pass the `rustc` final Linking step for `probe-rs` due to system memory limitations.
+We will use a [**Raspberry pi 400**](https://www.raspberrypi.org/products/raspberry-pi-400/) as the target system as an example, where `cargo install` on a default **Raspberry PI OS** installation can not pass the `rustc` final Linking step due to system memory limitations.
After defining the target system architecture, in this example being `armv7-unknown-linux-gnueabihf`, here are two different ways to Crosscompile, each with their pros and cons.
## Using Cross
-[Cross](https://github.com/rust-embedded/cross) self defines as:
+[Cross](https://github.com/cross-rs/cross) self defines as:
> “Zero setup” cross compilation and “cross testing” of Rust crates
@@ -31,18 +22,18 @@ Its main advantage is to **not be susceptible** on the usual cross compilation i
The downside of this approach is that **you will have to rely on the Cross Project** and **supply the build environment Dockerfile**, making sure that it resembles the system you are building for with **a cross C toolchain installed** as much as possible.
-Building `cargo-flash` for the Raspberry Pi 400, on an `x86_64` Linux System happens as follows:
+Building the tools such as `cargo-flash` for the Raspberry Pi 400, on an `x86_64` Linux System, happens as follows:
```sh
-# Cloning cargo-flash on the system we will build the binary on.
-git clone https://github.com/probe-rs/cargo-flash
+# Cloning probe-rs on the system we will build the binary on.
+git clone https://github.com/probe-rs/probe-rs
# Installing cross
cargo install cross
-# `cd` into the cargo-flash repository
+# `cd` into the probe-rs repository
# And create a `crossimage` folder
-cd cargo-flash && mkdir crossimage
+cd probe-rs && mkdir crossimage
# Create a Dockerfile resembling the target system,
# and put it inside the `crossimage` folder.
@@ -50,9 +41,9 @@ cd cargo-flash && mkdir crossimage
We can take an `armv7-unknown-linux-gnueabihf` base system from the `rust-embedded/cross` Docker Hub container registry.
-After that, follow the instructions from the `probe-rs`, `cargo-flash` [prerequisites](https://github.com/probe-rs/cargo-flash#prerequisites) to prepare the image for the building steps.
+After that, follow the instructions from the `probe-rs` [prerequisites](/docs/getting-started/installation#prerequisites) to prepare the image for the building steps.
-You can download the Dockerfile for this example from [here](/files/cross-dockerfile.txt).
+You can download the Dockerfile for this example from here .
```sh
# Create and edit a Cross.toml file in the root of the cloned repo.
@@ -61,17 +52,21 @@ vim Cross.toml
Add the following to the `Cross.toml`. Which will define to `cross` which container should be used for the target architecture:
- ```toml
- [target.armv7-unknown-linux-gnueabihf]
- image = "crossimage"
- ```
+```toml
+[target.armv7-unknown-linux-gnueabihf]
+image = "crossimage"
+```
```sh
-# Build and tag the container image, specifying the name as defined in the `Cross.toml`.
+# Build and tag the container image,
+# specifying the name as defined in the `Cross.toml`.
docker build -t crossimage crossimage/
# Run cross to compile, cross arguments are the same as the `cargo` ones
-cross build --release --target=armv7-unknown-linux-gnueabihf
+cross build \
+ -p probe-rs-tools \
+ --release \
+ --target=armv7-unknown-linux-gnueabihf
# Done
```
@@ -80,4 +75,4 @@ You now have a statically built `cargo-flash` binary inside the `target/
+
+ A debug probe - a very handy utensil in embedded debugging.
+
+
+Some newer targets have DFU (device firmware upgrade) support via USB, but
+cannot be debugged via such. DFU is handy for just flashing targets, but due to
+its severe limitations is not suitable for debugging and writing said software.
+
+## probe-rs
+
+probe-rs is a library that implements the protocols of debug probes from various
+manufacturers and the protocols of different chip architectures. It furthermore
+is able to flash many targets and download software onto them.
+
+While probe-rs was originally targeted at the Rust community, it can freely be
+used for programming in C as well.
diff --git a/src/content/docs/tools/_data.yaml b/src/content/docs/tools/_data.yaml
new file mode 100644
index 0000000..d735bff
--- /dev/null
+++ b/src/content/docs/tools/_data.yaml
@@ -0,0 +1,2 @@
+sectionOrder: 2
+title: Tools
\ No newline at end of file
diff --git a/src/content/docs/tools/cargo-embed.mdx b/src/content/docs/tools/cargo-embed.mdx
new file mode 100644
index 0000000..ca604e7
--- /dev/null
+++ b/src/content/docs/tools/cargo-embed.mdx
@@ -0,0 +1,357 @@
+---
+title: "cargo-embed"
+description: "The cargo-embed utility explained."
+order: 40
+---
+
+**cargo-embed** is the big brother of cargo-flash.
+
+It can also flash a target just like cargo-flash, but it can also open an RTT
+terminal as well as a GDB server.
+
+And there is much more to come in the future!
+
+## Installation
+
+**cargo-embed** is installed as part of the **probe-rs** group of tools, see the
+[Installation](/docs/getting-started/installation) page.
+
+## Usage
+
+You can use it like any cargo command would be used
+
+```bash
+cargo embed
+```
+
+This will do following in sequence:
+
+1. build your binary
+2. detect a probe
+3. (if enabled) upload the contents onto the connected target
+4. (if enabled) reset the target
+5. (if enabled) start RTT host side
+6. (if enabled) start gdb debugging
+
+## Configuration
+
+You can configure `cargo-embed` with a file called `Embed.toml` (or
+`.embed.toml`) in your project directory.
+
+Config file precedence:
+
+1. `Embed.local.*`
+2. `.embed.local.*`
+3. `Embed.*`
+4. `.embed.*`
+5. Default configuration
+
+Instead of a TOML file, you can also use a JSON or YAML file. Choose what suits
+you best!
+
+Here's a simple example:
+
+```toml
+[default.general]
+chip = "STM32F401CCUx"
+
+[default.rtt]
+enabled = true
+```
+
+All available options can be found in the
+[default.toml](https://github.com/probe-rs/probe-rs/blob/master/probe-rs-tools/src/bin/probe-rs/cmd/cargo_embed/config/default.toml).
+This example uses toml syntax to set each option under the `default` top-level
+profile key.
+
+The `Embed.toml` should be part of the project, i.e. added to Git history. For
+local-only configuration overrides, you can create an `Embed.local.toml` (or
+`.embed.local.toml`) file and add that to your .gitignore. The local files take
+precedence.
+
+### Profiles
+
+The data in the `Embed.toml` is structured in two levels: The outer layer is a
+configuration profile name, inside each profile there are then a series of
+sections with different options. The default profile is called "default" ;) When
+invoking cargo-embed, a different profile name can be passed as an argument with
+`--config `, which will load the settings under that profile instead of
+`default`.
+
+For example, in your `Embed.toml`:
+
+```toml
+[default.general]
+chip = "STM32F401CCUx"
+
+# No need to set this again, other profiles inherit from the "default" profile
+#[with_rtt.general]
+#chip = "STM32F401CCUx"
+
+[with_rtt.rtt]
+enabled = true
+```
+
+Now you can run `cargo embed --config with_rtt` to have RTT enabled, while
+`cargo embed` will use the default config "default" without RTT.
+
+## RTT
+
+RTT stands for **real time transfers** and is a mechanism to transfer data
+between the debug host and the debuggee.
+
+In its essence it provides a configurable amount of ringbuffers, which are
+read/written by the target and the debug host. The protocol initially was
+published by
+[Segger](https://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer/)
+but there is really no magic to it other than ringbuffers being used. This
+mechanism allows us to transfer data from the target to the host and vice versa
+really fast.
+
+RTT features:
+
+- Fast duplex data transfers
+- A configurable amount of channels(buffers)
+- Channels can be blocking and non blocking - your choice
+
+This guide should get you going in no time to speed up your development with
+probe-rs.
+
+### Target
+
+For the target side, we offer [rtt-target](https://crates.io/crates/rtt-target),
+a small lib to set up the RTT structures in the target memory and read/write
+data from/to them.
+
+A minimal example of a host firmware would be
+
+```rs
+#![no_std]
+#![no_main]
+
+use microbit as _;
+use panic_halt as _;
+use rtt_target::{rprintln, rtt_init_print};
+
+#[cortex_m_rt::entry]
+fn main() -> ! {
+ rtt_init_print!();
+ loop {
+ rprintln!("Hello, world!");
+ }
+}
+```
+
+### Host
+
+On the host, just run
+
+ cargo embed
+
+with RTT enabled in the `Embed.toml` file.
+
+Now you should be able to see all the 'Hello World!'s in a default channel
+called "Terminal"!
+
+import simple from '../../../images/cargo-embed-simple.png';
+
+
+
+#### Keyboard shortcuts
+
+| Command | Action |
+| ------------- | ---------------------------------------------- |
+| `^c` | Quit |
+| `Fn{n}` | Switch to tab `n` |
+| `^{n}` | Switch to tab `n` |
+| `Tab` | Switch to the next tab |
+| `Shift+Tab` | Switch to the previous tab |
+| Any character | Add the character to the pending input |
+| `Backspace` | Delete the last character of the pending input |
+| `Enter` | Send the pending input |
+| `PgUp` | Scroll up half a screen |
+| `UpArrow` | Scroll up |
+| `PgDn` | Scroll down half a screen |
+| `DownArrow` | Scroll down |
+| `^l` | Clear current tab |
+
+### Don't panic!
+
+Of course it is easy to log all panics via RTT! Here is a most simple example of
+a panic handler:
+
+```rs
+#![no_std]
+#![no_main]
+
+use core::panic::PanicInfo;
+use microbit as _;
+use rtt_target::{rprintln, rtt_init_print};
+
+#[cortex_m_rt::entry]
+fn main() -> ! {
+ rtt_init_print!();
+ loop {
+ rprintln!("Hello, world!");
+
+ for _ in 0..1_000_000 {
+ cortex_m::asm::nop();
+ }
+
+ panic!("This is an intentional panic.");
+ }
+}
+
+#[inline(never)]
+#[panic_handler]
+fn panic(info: &PanicInfo) -> ! {
+ rprintln!("{}", info);
+ loop {} // You might need a compiler fence in here.
+}
+```
+
+And in the open rttui view you should see the panic.
+
+import panic from '../../../images/cargo-embed-panic.png';
+
+
+
+We intentionally ship no default panic handler, so that you may choose the
+channel of your choice to log the panic to.
+
+So how do I get more channels, you might ask. Read on!
+
+### All the channels!
+
+You can define multiple channels via a provided macro as seen in this snippet
+
+```rs
+#![no_main]
+#![no_std]
+
+use microbit as _;
+use panic_halt as _;
+
+use core::fmt::Write;
+use cortex_m_rt::entry;
+
+use rtt_target::rtt_init;
+
+#[entry]
+fn main() -> ! {
+ let channels = rtt_init! {
+ up: {
+ 0: {
+ size: 512
+ mode: BlockIfFull
+ name: "Up zero"
+ }
+ 1: {
+ size: 128
+ name: "Up one"
+ }
+ 2: {
+ size: 128
+ name: "Up two"
+ }
+ }
+ down: {
+ 0: {
+ size: 512
+ mode: BlockIfFull
+ name: "Down zero"
+ }
+ }
+ };
+
+ let mut output2 = channels.up.1;
+ writeln!(
+ output2,
+ "Hi! I will turn anything you type on channel 0 into upper case."
+ )
+ .ok();
+
+ let mut output = channels.up.0;
+ let mut log = channels.up.2;
+ let mut input = channels.down.0;
+ let mut buf = [0u8; 512];
+ let mut count: u8 = 0;
+
+ loop {
+ let bytes = input.read(&mut buf[..]);
+ if bytes > 0 {
+ for c in buf.iter_mut() {
+ c.make_ascii_uppercase();
+ }
+
+ let mut p = 0;
+ while p < bytes {
+ p += output.write(&buf[p..bytes]);
+ }
+ }
+
+ writeln!(log, "Messsge no. {}/{}", count, bytes).ok();
+
+ count += 1;
+
+ for _ in 0..1_000_000 {
+ cortex_m::asm::nop();
+ }
+ }
+}
+```
+
+In this example we define three up channels and one down channel. The third up
+channel continuously logs, the second prints just a single info message and what
+the first one does, you'll figure it when you examine channel two ;)
+
+On the host side it looks like
+
+import cargoEmbed from '../../../images/cargo-embed.png';
+
+
+
+As you can observe, we see all three up channels. You can switch to and from
+them with the F-keys. The down channel will automatically be associated with the
+corresponding up channel and an input field will automatically be displayed for
+channels with a corresponding down channel. This is done via the channel number,
+which must be the same for the up and down channels. This is the default rttui
+behavior and can be configured. RTT itself can handle any up/down numbers
+combination.
+
+### External front-end via tcp socket
+
+You can configure a TCP socket per channel to easily get the data available outside of Cargo Embed.
+This is done via the `rtt.channels` configuration.
+
+For example we can configure regular logs via Defmt on `channel 0` while we stream sensordata from `channel 1` via TCP to a real time plotting app. And maybe we can send the battery voltage on `channel 2` as well (to a different socket). Of course you need to match these channels in your firmware as shown in the previous section.
+
+```toml
+[default.rtt]
+# Whether or not an RTTUI should be opened after flashing.
+enabled = true
+up_channels = [
+ { channel = 0, mode = "BlockIfFull", format = "Defmt" },
+ { channel = 1, mode = "BlockIfFull", format = "String", socket = "127.0.0.1:12345" },
+ { channel = 2, mode = "BlockIfFull", format = "String", socket = "127.0.0.1:12346" },
+]
+# The UI configuration:
+tabs = [
+ { up_channel = 0, name = "Log" },
+ { up_channel = 1, name = "sensor-data", hide = true },
+ { up_channel = 2, name = "battery-level", hide = true },
+]
+```
+
+This screenshot shows how it can be used with a single socket. The logger is configured to redirect `log::trace!()` to channel 1, which is then sent to the real time plotting app.
+
+import { Image } from 'astro:assets';
+import socket from '../../../images/cargo-embed-tcp-socket.png';
+
+
+
+Note that the raw bytes are send over the socket, so no timestamps are added, nor any parsing or line splitting is done. You have all the flexibility to do this yourself in the tcp endpoint.
+
+---
+
+Now you should be able to debug conveniently. Happy coding!
diff --git a/src/content/docs/tools/cargo-flash.mdx b/src/content/docs/tools/cargo-flash.mdx
new file mode 100644
index 0000000..be3dfc5
--- /dev/null
+++ b/src/content/docs/tools/cargo-flash.mdx
@@ -0,0 +1,45 @@
+---
+title: "cargo-flash"
+description: "The cargo-flash utility explained."
+order: 30
+---
+
+**cargo-flash** is a cargo extension and drop in replacement for `cargo run`.
+
+## Installation
+
+**cargo-flash** is installed as part of the **probe-rs** group of tools, see the
+[Installation](/docs/getting-started/installation) page.
+
+## Usage
+
+You can use **cargo-flash** just like 'cargo run', but instead of running on the host,
+**cargo-flash** will download your binary to the target and run.
+
+Here are the basics
+
+**cargo-flash** is installed as part of the **probe-rs** group of tools, see the
+[Installation](/docs/getting-started/installation) page.
+
+```sh
+# In your cargo project directory, call
+cargo flash --release --chip
+
+# Don't know if your target is supported
+# by cargo flash and what it's name is?
+probe-rs chip list
+
+# You can run your examples as usual with
+cargo flash --example
+
+# Specifying manually what options should be used
+cargo flash --release --chip nRF52840_xxAA --target thumbv6m-none-eabi --example gpio_hal_blinky
+
+# Using a custom chip definition from a non-builtin file
+cargo flash --release --chip-description-path nRF52840_xxAA.yaml --target thumbv6m-none-eabi --example gpio_hal_blinky
+```
+
+Any config flags that are accepted by 'cargo run' are accepted by **cargo-flash** too.
+If not, hit us with an [issue](https://github.com/probe-rs/probe-rs/issues/new?assignees=&labels=bug,component:cargo-flash&projects=&template=bug_report.md&title=).
+
+Happy coding!
diff --git a/src/content/docs/tools/debugger.mdx b/src/content/docs/tools/debugger.mdx
new file mode 100644
index 0000000..9f7778e
--- /dev/null
+++ b/src/content/docs/tools/debugger.mdx
@@ -0,0 +1,1007 @@
+---
+title: "Debugger"
+description: "Easy debugging in your code editor."
+order: 20
+---
+
+The **probe-rs VS Code extension** uses the Microsoft Debug Adapter Protocol to
+implement an interactive debugging experience between VS Code and a probe-rs
+target.
+
+The extension is currently in pre-production/Alpha stage, with limited
+functionality. For details of current status and functionality please read this
+[section](#current-working-functionality-and-known-limitations).
+
+### Installation
+
+Install the **probe-rs** extension in VS Code, by installing the _latest available_
+from the Visual Studio [Extension Marketplace](https://marketplace.visualstudio.com/items?itemName=probe-rs.probe-rs-debugger).
+The extension will ask to install the **probe-rs** tools for you if it can't find them on your
+system.
+
+### Usage and Configuration
+
+[Visual Tour](#a-visual-guide-of-implemented-features)
+
+To use the `probe-rs` extension for VS Code, you will need to configure a
+`launch.json` entry for your target project.
+
+We recommend that you familiarize yourself with the
+[VSCode debug process](https://code.visualstudio.com/docs/editor/debugging), and
+specifically the section that discusses
+[the differences](https://code.visualstudio.com/docs/editor/debugging#_launch-versus-attach-configurations)
+between launch and attach request types.
+
+The configuration choices may differ based on your use case, as demonstrated in
+the following examples:
+
+- Start a debug session, by [launching a new](#using-the-launch-request-type)
+ process on your target device.
+- Start a debug session, by
+ [attaching to an existing](#using-the-attach-request-type) process on your
+ target device.
+- Start a debug session (either form above) against a
+ [remote debug server](#connecting-to-a-standalone-probe-rs-dap-server-server)
+ process running on a server on a specific TCP/IP address and port.
+- [Using RTT](#configuring-rtt-to-transfer-data) to transfer data (e.g. logs,
+ and println) between VSCode and your target application
+
+Many of the entries in `launch.json` are optional, and the values for each are
+described in the hover tips - alternatively, you can find the full list of
+available options in the
+[Appendix](#appendix-all-supported-configuration-options). When values are
+restricted, the allowable values are available through VS Code intellisense.
+
+A minimum configuration would look something like this (required customizations
+are indicated with //!MODIFY tags )
+
+#### Start a debug session with minimum configuration
+
+```json
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "preLaunchTask": "${defaultBuildTask}",
+ "type": "probe-rs-debug",
+ "request": "launch",
+ "name": "probe_rs Executable Test",
+ "flashingConfig": {
+ "flashingEnabled": true,
+ },
+ //!MODIFY
+ "chip": "STM32H745ZITx",
+ "coreConfigs": [
+ {
+ //!MODIFY
+ "programBinary": "Relative or fully qualified path to your programBinary"
+ }
+ ]
+ }
+ ]
+}
+```
+
+The following fully configured examples can be used (with customizations to
+reflect your own project and chip) to help you get started.
+
+#### Using the `launch` request type
+
+```json
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "probe-rs-debug",
+ "request": "launch",
+ "name": "probe_rs Executable launch example",
+ "cwd": "${workspaceFolder}",
+ //!MODIFY (or remove)
+ "speed": 24000,
+ //!MODIFY (or remove)
+ "probe": "VID:PID:",
+ "runtimeExecutable": "probe-rs",
+ "runtimeArgs": ["dap-server"],
+ //!MODIFY
+ "chip": "STM32H745ZITx",
+ "flashingConfig": {
+ "flashingEnabled": true,
+ "haltAfterReset": false,
+ "formatOptions": {
+ //!MODIFY (or remove). Valid values are: 'bin', 'hex', 'elf'(default), 'idf'
+ "binaryFormat": "elf"
+ }
+ },
+ "coreConfigs": [
+ {
+ "coreIndex": 0,
+ //!MODIFY
+ "programBinary": "Relative or fully qualified path to your programBinary",
+ //!MODIFY
+ "svdFile": "Relative or fully qualified path to the CMSIS-SVD file for your target core"
+ }
+ ],
+ "env": {
+ //!MODIFY (or remove)
+ // If you set this variable, check the VSCode console log window for the location of the log file.
+ "RUST_LOG": "info"
+ },
+ // Info, Debug
+ "consoleLogLevel": "Console"
+ }
+ ]
+}
+```
+
+#### Using the `attach` request type
+
+```json
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "probe-rs-debug",
+ "request": "attach",
+ "name": "probe_rs Executable launch example",
+ "cwd": "${workspaceFolder}",
+ //!MODIFY (or remove)
+ "speed": 24000,
+ //!MODIFY
+ "chip": "STM32H745ZITx",
+ //!MODIFY (or remove)
+ "probe": "VID:PID:",
+ "coreConfigs": [
+ {
+ "coreIndex": 0,
+ //!MODIFY
+ "programBinary": "Relative or fully qualified path to your programBinary",
+ //!MODIFY
+ "svdFile": "Relative or fully qualified path to the CMSIS-SVD file for your target core"
+ }
+ ],
+ "env": {
+ //!MODIFY (or remove)
+ // If you set this variable, check the VSCode console log window for the location of the log file.
+ "RUST_LOG": "info"
+ },
+ // Info, Debug
+ "consoleLogLevel": "Console"
+ }
+ ]
+}
+```
+
+#### Connecting to a standalone `probe-rs dap-server` server
+
+To start `probe-rs` as a standalone server:
+
+```
+probe-rs dap-server --port 50000 # Replace the value 50000 with any available TCP port number
+```
+
+Then use the following `launch.json` to connect to it:
+
+```json
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ // Configure a default build task for 'cargo build'
+ "preLaunchTask": "${defaultBuildTask}",
+ "type": "probe-rs-debug",
+ "request": "launch",
+ "name": "probe_rs Server attach example",
+ //!MODIFY ... can be a server that is remote from the VSCode session, but local to the probe
+ "server": "127.0.0.1:50001",
+ "cwd": "${workspaceFolder}",
+ //!MODIFY (or remove)
+ "speed": 24000,
+ //!MODIFY
+ "chip": "STM32H745ZITx",
+ //!MODIFY (or remove)
+ "probe": "VID:PID:",
+ "coreConfigs": [
+ {
+ "coreIndex": 0,
+ //!MODIFY
+ "programBinary": "Relative or fully qualified path to your programBinary",
+ //!MODIFY
+ "svdFile": "Relative or fully qualified path to the CMSIS-SVD file for your target core"
+ }
+ ],
+ //!This won't take effect. Please set environment variables before launching `probe-rs dap-server`.
+ "env": {},
+ // Info, Debug
+ "consoleLogLevel": "Console"
+ }
+ ]
+}
+```
+
+### Configuring RTT to transfer data
+
+`probe-rs` and the VS Code extension supports using RTT in your target
+application.
+
+For more information on how to configure your target application to use RTT,
+please refer to the instructions under the [cargo-embed](../cargo-embed#rtt)
+section of this guide.
+
+In order to capture the RTT output in the VSCode extension, you will need to
+supply additional entries to your applications `launch.json` entry. You can use
+the following example and modify the channel information to match the
+`rtt-target` channel configurations in your application.
+
+```json
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "probe-rs-debug",
+ "request": "launch",
+ "name": "probe_rs rtt-target example",
+ // ... ...
+ "coreConfigs": [
+ {
+ "coreIndex": 0,
+ // ... ...
+ "rttEnabled": true,
+ "rttChannelFormats": [
+ {
+ "channelNumber": 0,
+ // Format RTT data as String data
+ "dataFormat": "String",
+ // Include host-side timestamps for every line of data transferred from the target RTT output
+ "showTimestamps": true
+ },
+ {
+ "channelNumber": 1,
+ // Treat data as raw binary data, and do not format in any way
+ "dataFormat": "BinaryLE"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
+```
+
+In addition to supporting RTT channels with
+[rtt-target](https://crates.io/crates/rtt-target), we also support using the
+[defmt](https://defmt.ferrous-systems.com) (a highly efficient logging framework
+that targets resource-constrained devices, and supports complex formatting and
+RUST_LOG-like logging.)
+
+When using `defmt`, we can configure the client side based on what is captured
+in your application, and the `launch.json` only requires minimal additional
+configuration.
+
+```json
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "probe-rs-debug",
+ "request": "launch",
+ "name": "probe_rs rtt-target example",
+ // ... ...
+ "coreConfigs": [
+ {
+ "coreIndex": 0,
+ "rttEnabled": true
+ }
+ ]
+ }
+ ]
+}
+```
+
+**NOTE:** Using RTT along with low power modes has
+[some limitations](https://wiki.segger.com/RTT#Low-power_modes). Frameworks such
+as [embassy](https://github.com/embassy-rs/embassy) and
+[rtic](https://github.com/rtic-rs/cortex-m-rtic) uses low power by default and
+this can cause RTT to not produce any output on some devices. In some cases,
+this can be overcome by configuring your device to enable the RCC DMA clock
+before entering low power.
+
+**NOTE:** When using `defmt` RTT, please keep the following limitations in mind.
+
+- Due to the way the `defmt` crate works, it is currently not possible to mix
+ `defmt` and `rtt-target` channels in a single application.
+- The `defmt` crate always uses channel number 0 for its output.
+- The `defmt` crate introduced a new log filter that filters out log statements
+ at **build time**. To ensure your defmt logging is not default filtered to
+ `error` level, you can either add the environment variable in your
+ `.cargo/config` file, or add the `options` setting of your `tasks.json` (see
+ below), to match your desired logging level on the target.
+
+Adding `DEFMT_LOG` to `.cargo/config.toml`
+
+```toml
+[env]
+DEFMT_LOG = "info"
+```
+
+Adding `DEFMT_LOG` to `tasks.json`
+
+```json
+// ... ...
+ "options": {
+ "env": {
+ //!MODIFY: Remove or use any of the supported DEFMT_LOG options.
+ "DEFMT_LOG": "info"
+ }
+ },
+ "tasks": [
+// ... ...
+```
+
+**TIP:** When using RTT, the data is streamed into a terminal window on a per
+channel basis. If your application uses multiple RTT channels, you may want to
+consider using the new
+[VSCode Terminal tabs](https://code.visualstudio.com/updates/v1_57#_integrated-terminal)
+setting.
+
+### Current working functionality and known limitations
+
+- **Launch**: Start a debug session on the target by (optionally) flashing the
+ target firmware.
+- **Attach**: By default, VSCode will manage (start/stop) the
+ `probe-rs dap-server` process to facilite a debug session against a target
+ process. It is also possible for the user to manage the `probe-rs dap-server`
+ as a standalone process, and then use TCIP/IP port to connect to from VSCode.
+- **Connect** to the target with `probe-rs`
+ - Supports `connect-under-reset` for select targets.
+ - Tested against the following architectures:
+ - Cortex-M7 using STM32H745
+ - Cortex-M4 using nRF52833_xxAA
+ - Cortex-M0 using Raspberry PICO
+ - RISC-V using ESP32-C3
+- **Flash** the chip with your own binary.
+ - Supports `full-chip-erase`, and `restore-unwritten-bytes`
+ - Supports `halt-after-reset`. This will allow you to set breakpoints in your
+ main() function.
+ - Supports flashing the following binary types:
+ - `bin` - "The target binary file contains the contents of the flash 1:1".
+ - `hex` - "The target binary file conforms with the
+ [Intel HEX](https://en.wikipedia.org/wiki/Intel_HEX) format."
+ - `elf` - "The target binary file conforms with the
+ [ELF](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format)
+ format."
+ - `idf` - "The target binary file conforms with the
+ [ESP-IDF bootloader](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/app_image_format.html#app-image-structures)
+ format."
+- Set, clear, disable, enable hardware **Breakpoints**.
+ - In VSCode `Source view`, breakpoint locations will automatically be adjusted
+ to code boundaries that lie safely between function prologues and epilogues.
+ - In VSCode `Disassembly view`, breakpoints are set at, and stepping works at,
+ 'instruction level'
+- **UPDATED: Stepping** through executing code during debug:
+ - Supports stepping at 'statement' level with `Step Over`, `Step Into`,
+ `Step Out`. Stepping desitnations will automatically be adjusted to code
+ boundaries that lie safely between function prologues and epilogues.
+ - While VSCode 'Disassembly view` is open, all stepping automatically happens
+ at 'instruction' granularity, and will allow the user to step to any target
+ location, including instructions in a function prologue or epilogue.
+- **Variables View**
+ - View values of core **Registers**, and changes during code execution
+ - View values of **Locals** and **Statics** variables, and update values
+ during code execution.
+ - Shows datatypes and values for the following Rust datatypes.
+ - Base types, including &str
+ - Enumerations
+ - Structures
+ - Pointers
+ - Variants
+ - Arrays
+ - Unions
+ - Options & Results
+ - Unit types
+ - Formal parameters to functions.
+ - TODO: Add support for additional types, such as Generics, etc.
+ - Use the `Set Variable` command in VSCode to update variable values.
+ - Use the `View Binary Data` command in VSCode to perform binary memory
+ edits on the target device.
+- **Call Stack View**
+ - Supports a single thread, for a single core of the chip, but will **allow
+ selection of any frames** that are in the current thread
+ - Supports the VSCode `Dissambly` view, and `SetInstructionBreakpoints`
+ - TODO: Support multiple threads
+ - TODO: Support chips with multiple cores
+- **Watch View** Monitor values of selected variables.
+- **RTT** - Configure RTT Channels and capture their output in the
+ `VSCode Integrated Terminal`
+ - RTT Channels that support logging data to VSCode Terminal windows
+- Use the REPL command line in the Debug Console evaluate variables
+- Navigate and monitor SVD Peripheral registers
+
+### Building and Testing the debug extension in VS Code
+
+Please refer to the
+[repository README.md file](https://github.com/probe-rs/vscode) for the latest
+instructions on how to build and deploy the extension.
+
+## A visual guide of implemented features
+
+### The Basics, and viewing RTT data
+
+import { Image } from 'astro:assets';
+import intro_and_rtt from '../../../images/vscode/intro_and_rtt.gif';
+
+{/* Too large for optimized by Sharp with ? 🙄 */}
+
+
+### Use the `Set Variable` command to update variable values during debugging
+
+import variable_set_value from '../../../images/vscode/variable_set_value.gif';
+
+
+
+### Use the `View Binary Data` to view and perform binary edits of target memory
+
+import variable_edit_and_watch from '../../../images/vscode/variable_edit_and_watch.gif';
+
+{/* Too large for optimized by Sharp with ? 🙄 */}
+
+
+### Use the `Disassembly` to see the assembly code executed on the target, and set instruction breakpoints in this view
+
+import disassemble_and_instruction_breakpoint from '../../../images/vscode/disassemble_and_instruction_breakpoint.gif';
+
+
+
+### Use CMSIS-SVD definitions to navigate and monitor device peripheral registers
+
+import SVD from '../../../images/vscode/SVD Peripheral Registers.gif';
+
+{/* Too large for optimized by Sharp with ? 🙄 */}
+
+
+## Appendix: All supported configuration options.
+
+This options available in `launch.json` are based on the configuration options
+of the
+[probe-rs library](https://docs.rs/probe-rs/latest/probe_rs/config/index.html),
+with names that are converted to camelCase, in order to be compatible with
+VSCode requirements. There are slight variations in supported options for
+`launch` or `attach` configurations, and these can be seen below. Please refer
+to the section "Launching and Attaching" in
+[the official MS DAP documentation](https://microsoft.github.io/debug-adapter-protocol/overview)
+for more details.
+
+### Launch: Supported configuration options.
+
+```json
+"launch": {
+ "required": [
+ "chip",
+ "coreConfigs"
+ ],
+ "properties": {
+ "server": {
+ "type": "string",
+ "description": "Optionally connect to an existing `probe-rs dap-server` session on IP and Port, e.g. '127.0.0.1:50000'",
+ "default": "127.0.0.1:50000"
+ },
+ "logFile": {
+ "type": "string",
+ "description": "The path to the log file. This option is ignored if either the `server` or `runtimeArgs` is specified. If no location is specified, the behaviour depends on `--log-to-folder"
+ },
+ "logToFolder": {
+ "type": "boolean",
+ "description": "Enable logging to the default folder. This option is ignored if either the `logFile` or `runtimeArgs` is specified.`"
+ },
+ "consoleLogLevel": {
+ "type": "string",
+ "description": "The level of log info printed to the console. This does NOT affect the RUST_LOG defined in the `env` property.",
+ "enum": [
+ "Console",
+ "Info",
+ "Debug"
+ ],
+ "enumDescriptions": [
+ "The console will only contain error messages and process status messages.",
+ "The console log will also contain high level information about interactions between the extension and the debug adapter.",
+ "The console log will also contain detailed information about interactions between the extension and the debug adapter."
+ ],
+ "default": "Console"
+ },
+ "runtimeExecutable": {
+ "type": "string",
+ "description": "An OS resolvable path to the Probe-rs debugger executable.",
+ "default": "probe-rs"
+ },
+ "runtimeArgs": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "String array of arguments to provide the startup arguments for the Probe-rs debugger executable.",
+ "default": [
+ "dap-server"
+ ]
+ },
+ "env": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "default": {},
+ "description": "Environment variables defined as a key value pair. The 'key' is the name of the environment variable, and the 'value' is value of the environment variable.",
+ "type": "object"
+ },
+ "cwd": {
+ "type": "string",
+ "description": "The working directory of the debugger, typically the RUST crate root",
+ "default": "${workspaceFolder}"
+ },
+ "probe": {
+ "type": "string",
+ "description": "Use this flag to select a specific probe in the list. Use '--probe VID:PID' or '--probe VID:PID:Serial' if you have more than one probe with the same VID:PID."
+ },
+ "chip": {
+ "type": "string",
+ "description": "Please specify the appropriate chip from the list of supported chips reported by running `probe-rs chip list`."
+ },
+ "chipDescriptionPath": {
+ "type": "string",
+ "description": "Use this option to add custom target chips from a file."
+ },
+ "connectUnderReset": {
+ "type": "boolean",
+ "description": "This option will result in the target reset pin being held high during the attach operation.",
+ "default": false
+ },
+ "speed": {
+ "type": "number",
+ "description": "Specify the protocol speed in kHz."
+ },
+ "wireProtocol": {
+ "type": "string",
+ "description": "The correct wire protocol to use.",
+ "enum": [
+ "Swd",
+ "Jtag"
+ ],
+ "enumDescriptions": [
+ "Use the Serial Wire Debug (SWD) protocol.",
+ "Use the Joint Test Action Group (JTAG) protocol."
+ ]
+ },
+ "allowEraseAll": {
+ "type": "boolean",
+ "description": "Allow the session to erase all memory of the chip or reset it to factory default.",
+ "default": false
+ },
+ "flashingConfig": {
+ "type": "object",
+ "additionalProperties": false,
+ "description": "These options are applied when flashing one or more `program_binary` files to the target memory.",
+ "properties": {
+ "flashingEnabled": {
+ "type": "boolean",
+ "description": "Flash the target before debugging.",
+ "default": false
+ },
+ "haltAfterReset": {
+ "type": "boolean",
+ "description": "Halt all cores on the target after reset.",
+ "default": false
+ },
+ "fullChipErase": {
+ "type": "boolean",
+ "description": "Do a full chip erase, versus page-by-page erase.",
+ "default": false
+ },
+ "restoreUnwrittenBytes": {
+ "type": "boolean",
+ "description": "Restore erased bytes that will not be rewritten from ELF.",
+ "default": false
+ },
+ "formatOptions": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "binaryFormat": {
+ "type": "string",
+ "description": "One of the supported binary formats probe-rs uses for flashing the target binary.",
+ "enum": [
+ "bin",
+ "hex",
+ "elf",
+ "idf"
+ ],
+ "enumDescriptions": [
+ "The target binary file contains the verbatim contents of the flash.",
+ "The target binary file conforms with the [Intel HEX](https://en.wikipedia.org/wiki/Intel_HEX) format.",
+ "The target binary file conforms with the [ELF](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format) format.",
+ "The target binary file conforms with the [ESP-IDF bootloader](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/app_image_format.html#app-image-structures) format"
+ ],
+ "default": "elf"
+ },
+ "baseAddress": {
+ "type": "number",
+ "description": "The address in memory where the binary will be flashed to."
+ },
+ "skip": {
+ "type": "number",
+ "description": "The number of bytes to skip at the start of the binary file."
+ },
+ "idf_bootloader": {
+ "type": "string",
+ "description": "The path (relative to `cwd` or absolute) to the ESP-IDF bootloader."
+ },
+ "idf_partition_table": {
+ "type": "string",
+ "description": "The path (relative to `cwd` or absolute) to the ESP-IDF partition table."
+ }
+ }
+ }
+ }
+ },
+ "coreConfigs": {
+ "type": "array",
+ "description": "Each MCU core has a mandatory `programBinary` as well as several other optional properties.",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "programBinary"
+ ],
+ "properties": {
+ "coreIndex": {
+ "type": "number",
+ "description": "The zero based index of the MCU core for this session",
+ "default": 0
+ },
+ "programBinary": {
+ "type": "string",
+ "description": "The path (relative to `cwd` or absolute) to the binary for your target firmware"
+ },
+ "svdFile": {
+ "type": "string",
+ "description": "The path (relative to `cwd` or absolute) to the CMSIS-SVD file for your target core"
+ },
+ "rttEnabled": {
+ "type": "boolean",
+ "description": "If true, the debugger will open an RTT Terminal tab for each of the active channels on the target.",
+ "default": false
+ },
+ "rttChannelFormats": {
+ "type": "array",
+ "description": "RTT channel configuration. Unlisted active channels will be configured with `dataFormat=String', and 'showTimestamps=true'.",
+ "items": {
+ "type": "object",
+ "required": [
+ "channelNumber"
+ ],
+ "properties": {
+ "channelNumber": {
+ "type": "number",
+ "description": "The channel number to which this data format applies."
+ },
+ "dataFormat": {
+ "type": "string",
+ "description": "One of the supported data formats for RTT channels.",
+ "enum": [
+ "String",
+ "BinaryLE",
+ "Defmt"
+ ],
+ "enumDescriptions": [
+ "String (text) format.",
+ "Binary Little Endian format.",
+ "defmt (see: https://defmt.ferrous-systems.com)."
+ ],
+ "default": "String"
+ },
+ "mode": {
+ "type": "string",
+ "description": "RTT operating mode.",
+ "enum": [
+ "NoBlockSkip",
+ "NoBlockTrim",
+ "BlockIfFull"
+ ],
+ "enumDescriptions": [
+ "The target will add data to the channel only if it fits completely, otherwise it will skip the data.",
+ "The target will add as much data to the channel as possible, without blocking.",
+ "The target will block until there is enough space in the channel to add the data."
+ ]
+ },
+ "showTimestamps": {
+ "type": "boolean",
+ "description": "Enable the inclusion of timestamps in the RTT output for `dataFormat=String`."
+ },
+ "showLocation": {
+ "type": "boolean",
+ "description": "Enable the inclusion of defmt location information in the RTT output for `dataFormat=Defmt`."
+ },
+ "logFormat": {
+ "type": "string",
+ "description": "The default format string to use for decoding defmt logs."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+### Attach: Supported configuration options.
+
+```json
+"attach": {
+ "required": [
+ "chip",
+ "coreConfigs"
+ ],
+ "properties": {
+ "server": {
+ "type": "string",
+ "description": "Optionally connect to an existing `probe-rs dap-server` session on IP and Port, e.g. '127.0.0.1:50000'",
+ "default": "127.0.0.1:50000"
+ },
+ "logFile": {
+ "type": "string",
+ "description": "The path to the log file. This option is ignored if either the `server` or `runtimeArgs` is specified. If no location is specified, the behaviour depends on `--log-to-folder"
+ },
+ "logToFolder": {
+ "type": "boolean",
+ "description": "Enable logging to the default folder. This option is ignored if either the `logFile` or `runtimeArgs` is specified.`"
+ },
+ "consoleLogLevel": {
+ "type": "string",
+ "description": "The level of log info printed to the console. This does NOT affect the RUST_LOG defined in the `env` property.",
+ "enum": [
+ "Console",
+ "Info",
+ "Debug"
+ ],
+ "enumDescriptions": [
+ "The console will only contain error messages and process status messages.",
+ "The console log will also contain high level information about interactions between the extension and the debug adapter.",
+ "The console log will also contain detailed information about interactions between the extension and the debug adapter."
+ ],
+ "default": "Console"
+ },
+ "runtimeExecutable": {
+ "type": "string",
+ "description": "An OS resolvable path to the Probe-rs debugger executable.",
+ "default": "probe-rs"
+ },
+ "runtimeArgs": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "String array of arguments to provide the startup arguments for the Probe-rs debugger executable.",
+ "default": [
+ "dap-server"
+ ]
+ },
+ "env": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "default": {},
+ "description": "Environment variables defined as a key value pair. The 'key' is the name of the environment variable, and the 'value' is value of the environment variable.",
+ "type": "object"
+ },
+ "cwd": {
+ "type": "string",
+ "description": "The working directory of the debugger, typically the RUST crate root",
+ "default": "${workspaceFolder}"
+ },
+ "probe": {
+ "type": "string",
+ "description": "Use this flag to select a specific probe in the list. Use '--probe VID:PID' or '--probe VID:PID:Serial' if you have more than one probe with the same VID:PID."
+ },
+ "chip": {
+ "type": "string",
+ "description": "Please specify the appropriate chip from the list of supported chips reported by running `probe-rs chip list`."
+ },
+ "chipDescriptionPath": {
+ "type": "string",
+ "description": "Use this option to add custom target chips from a file."
+ },
+ "connectUnderReset": {
+ "type": "boolean",
+ "description": "This option will result in the target reset pin being held high during the attach operation.",
+ "default": false
+ },
+ "speed": {
+ "type": "number",
+ "description": "Specify the protocol speed in kHz."
+ },
+ "wireProtocol": {
+ "type": "string",
+ "description": "The correct wire protocol to use.",
+ "enum": [
+ "Swd",
+ "Jtag"
+ ],
+ "enumDescriptions": [
+ "Use the Serial Wire Debug (SWD) protocol.",
+ "Use the Joint Test Action Group (JTAG) protocol."
+ ]
+ },
+ "allowEraseAll": {
+ "type": "boolean",
+ "description": "Allow the session to erase all memory of the chip or reset it to factory default.",
+ "default": false
+ },
+ "coreConfigs": {
+ "type": "array",
+ "description": "Each MCU core has a mandatory `programBinary` as well as several other optional properties.",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "required": [
+ "programBinary"
+ ],
+ "coreIndex": {
+ "type": "number",
+ "description": "The zero based index of the MCU core for this session",
+ "default": 0
+ },
+ "programBinary": {
+ "type": "string",
+ "description": "The path (relative to `cwd` or absolute) to the binary for your target firmware"
+ },
+ "svdFile": {
+ "type": "string",
+ "description": "The path (relative to `cwd` or absolute) to the CMSIS-SVD file for your target core"
+ },
+ "rttEnabled": {
+ "type": "boolean",
+ "description": "If true, the debugger will open an RTT Terminal tab for each of the active channels on the target.",
+ "default": false
+ },
+ "rttChannelFormats": {
+ "type": "array",
+ "description": "RTT channel configuration. Unlisted active channels will be configured with `dataFormat=String', and 'showTimestamps=true'.",
+ "items": {
+ "type": "object",
+ "additionalProperties": false,
+ "required": [
+ "channelNumber"
+ ],
+ "properties": {
+ "channelNumber": {
+ "type": "number",
+ "description": "The channel number to which this data format applies."
+ },
+ "dataFormat": {
+ "type": "string",
+ "description": "One of the supported data formats for RTT channels.",
+ "enum": [
+ "String",
+ "BinaryLE",
+ "Defmt"
+ ],
+ "enumDescriptions": [
+ "String (text) format.",
+ "Binary Little Endian format.",
+ "defmt (see: https://defmt.ferrous-systems.com)."
+ ],
+ "default": "String"
+ },
+ "mode": {
+ "type": "string",
+ "description": "RTT operating mode.",
+ "enum": [
+ "NoBlockSkip",
+ "NoBlockTrim",
+ "BlockIfFull"
+ ],
+ "enumDescriptions": [
+ "The target will add data to the channel only if it fits completely, otherwise it will skip the data.",
+ "The target will add as much data to the channel as possible, without blocking.",
+ "The target will block until there is enough space in the channel to add the data."
+ ]
+ },
+ "showTimestamps": {
+ "type": "boolean",
+ "description": "Enable the inclusion of timestamps in the RTT output for `dataFormat=String`."
+ },
+ "showLocation": {
+ "type": "boolean",
+ "description": "Enable the inclusion of defmt location information in the RTT output for `dataFormat=Defmt`."
+ },
+ "logFormat": {
+ "type": "string",
+ "description": "The default format string to use for decoding defmt logs."
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+```
+
+# Other editors
+
+VSCode not your cup of tea? No problem!
+
+probe-rs implements the [Debug Adapter Protocol](https://microsoft.github.io/debug-adapter-protocol/overview), so you can use other [editors, IDEs, and visual debuggers](https://microsoft.github.io/debug-adapter-protocol/implementors/tools/), such as [Vimspector](https://github.com/puremourning/vimspector#readme)...
+
+## NVIM via nvim-dap
+nvim-dap is a popular nvim plugin to work with dap debuggers. Setting up nvim-dap for probe-rs is in principle straight forward, and many things work with minimal config. RTT messages and other messages from probe-rs are implemented over DAP events like "probe-rs-show-messages", "probe-rs-rtt-data", and "probe-rs-rtt-channel-config". The last one is requiring a response to enable the RTT data.
+
+You can find a config snippet in the nvim-dap [wiki](https://github.com/mfussenegger/nvim-dap/wiki/Debug-Adapter-installation#probe-rs) which supports the handshake to get those messages, print them in the dap-repl, and additionally log them to a file in the cwd. You can change this to your liking. If you found better solutions, like printing to the dapui-console, please expand the wiki.
+
+nvim-dap supports reading of .vscode/launch.json. Since the configuration will strongly vary from project to project the config snippet does not contain a configuration. You need to import the launch.json in your project. If you use a nvim distribution like astronvim automatic import of launch.json is preconfigured. Otherwise you need to configure it yourself or run `:lua require('dap.ext.vscode').load_launchjs()`. The linkage of the adapter to rust is already setup in the config snippet.
+
+If you are using lazy.nvim as plugin manager, setup can be done by adding the following lua module:
+
+/path/to/your/lua/plugins/nvim-dap-probe-rs.lua
+```lua
+return {
+ "mfussenegger/nvim-dap",
+ opts = function()
+ local dap = require "dap"
+ if not dap.adapters then dap.adapters = {} end
+ dap.adapters["probe-rs-debug"] = {
+ type = "server",
+ port = "${port}",
+ executable = {
+ command = vim.fn.expand "$HOME/.cargo/bin/probe-rs",
+ args = { "dap-server", "--port", "${port}" },
+ },
+ }
+ -- Connect the probe-rs-debug with rust files. Configuration of the debugger is done via project_folder/.vscode/launch.json
+ require("dap.ext.vscode").type_to_filetypes["probe-rs-debug"] = { "rust" }
+ -- Set up of handlers for RTT and probe-rs messages.
+ -- In addition to nvim-dap-ui I write messages to a probe-rs.log in project folder
+ -- If RTT is enabled, probe-rs sends an event after init of a channel. This has to be confirmed or otherwise probe-rs wont sent the rtt data.
+ dap.listeners.before["event_probe-rs-rtt-channel-config"]["plugins.nvim-dap-probe-rs"] = function(session, body)
+ local utils = require "dap.utils"
+ utils.notify(
+ string.format('probe-rs: Opening RTT channel %d with name "%s"!', body.channelNumber, body.channelName)
+ )
+ local file = io.open("probe-rs.log", "a")
+ if file then
+ file:write(
+ string.format(
+ '%s: Opening RTT channel %d with name "%s"!\n',
+ os.date "%Y-%m-%d-T%H:%M:%S",
+ body.channelNumber,
+ body.channelName
+ )
+ )
+ end
+ if file then file:close() end
+ session:request("rttWindowOpened", { body.channelNumber, true })
+ end
+ -- After confirming RTT window is open, we will get rtt-data-events.
+ -- I print them to the dap-repl, which is one way and not separated.
+ -- If you have better ideas, let me know.
+ dap.listeners.before["event_probe-rs-rtt-data"]["plugins.nvim-dap-probe-rs"] = function(_, body)
+ local message =
+ string.format("%s: RTT-Channel %d - Message: %s", os.date "%Y-%m-%d-T%H:%M:%S", body.channelNumber, body.data)
+ local repl = require "dap.repl"
+ repl.append(message)
+ local file = io.open("probe-rs.log", "a")
+ if file then file:write(message) end
+ if file then file:close() end
+ end
+ -- Probe-rs can send messages, which are handled with this listener.
+ dap.listeners.before["event_probe-rs-show-message"]["plugins.nvim-dap-probe-rs"] = function(_, body)
+ local message = string.format("%s: probe-rs message: %s", os.date "%Y-%m-%d-T%H:%M:%S", body.message)
+ local repl = require "dap.repl"
+ repl.append(message)
+ local file = io.open("probe-rs.log", "a")
+ if file then file:write(message) end
+ if file then file:close() end
+ end
+ end,
+}
+```
diff --git a/src/content/docs/tools/probe-rs.mdx b/src/content/docs/tools/probe-rs.mdx
new file mode 100644
index 0000000..3c0696b
--- /dev/null
+++ b/src/content/docs/tools/probe-rs.mdx
@@ -0,0 +1,42 @@
+---
+title: "probe-rs"
+description: "The probe-rs utility explained."
+order: 10
+---
+
+The `probe-rs` CLI utility features many subcommands which are explained in the sections in this document.
+
+The most commonly used one is the `probe-rs run` subcommand.
+
+It should be the preferred way to do embedded development where applicable.
+
+It should be noted that this works with any embedded binary. Be it ADA, C, C++, Rust or any other language that can be compiled into a native ARM binary.
+
+## run
+
+The `run` subcommand is a cargo target runner. It makes it possible to flash, start and print logs from your target with a simple `cargo run`.
+
+To use the runner in your project, add it to your `.cargo/config.toml`
+
+
+
+```rust { title=".cargo/config.toml" }
+[target.]
+runner = 'probe-rs run --chip '
+```
+
+Now you can execute `cargo run` in your project as you would for any native binaries and you will receive **RTT** and **defmt** logs in that very same console as if you wrote to standard out.
+
+To use [RTT](https://docs.rs/rtt-target/latest/rtt_target/) or [defmt](https://docs.rs/defmt/0.3.5/defmt/), follow the instructions in the respective crates to integrate them into your firmware.
+
+## attach
+
+`probe-rs attach` works exactly like `probe-rs run` except that it does not issue a reset and does not flash the target on connecting to preserve the currently running state.
+
+This is great for inspecting a target - where you might not even have knowledge of the firmware - without altering its state.
+
+## Additional commands
+
+To learn more about additional commands, use the `probe-rs help` or `probe-rs --help` commands.
+
+
diff --git a/src/icons/banner.svg b/src/icons/banner.svg
new file mode 100644
index 0000000..be28748
--- /dev/null
+++ b/src/icons/banner.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/bi--opencollective.svg b/src/icons/bi--opencollective.svg
new file mode 100644
index 0000000..e5b0caa
--- /dev/null
+++ b/src/icons/bi--opencollective.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/carbon--table-of-contents.svg b/src/icons/carbon--table-of-contents.svg
new file mode 100644
index 0000000..87f6116
--- /dev/null
+++ b/src/icons/carbon--table-of-contents.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/chat.svg b/src/icons/chat.svg
new file mode 100644
index 0000000..b4e3e14
--- /dev/null
+++ b/src/icons/chat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/file-icons--mdx.svg b/src/icons/file-icons--mdx.svg
new file mode 100644
index 0000000..3db6010
--- /dev/null
+++ b/src/icons/file-icons--mdx.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/gh-sponsors.svg b/src/icons/gh-sponsors.svg
new file mode 100644
index 0000000..fbf65ca
--- /dev/null
+++ b/src/icons/gh-sponsors.svg
@@ -0,0 +1,6 @@
+
+
+
\ No newline at end of file
diff --git a/src/icons/gh-star.svg b/src/icons/gh-star.svg
new file mode 100644
index 0000000..5f8e48f
--- /dev/null
+++ b/src/icons/gh-star.svg
@@ -0,0 +1,5 @@
+
+
+
\ No newline at end of file
diff --git a/src/icons/hamburger-menu.svg b/src/icons/hamburger-menu.svg
new file mode 100644
index 0000000..eea178f
--- /dev/null
+++ b/src/icons/hamburger-menu.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/icons/icon-park-outline--fork.svg b/src/icons/icon-park-outline--fork.svg
new file mode 100644
index 0000000..155ece7
--- /dev/null
+++ b/src/icons/icon-park-outline--fork.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/icons/line-md--emoji-smile-filled.svg b/src/icons/line-md--emoji-smile-filled.svg
new file mode 100644
index 0000000..335d0b0
--- /dev/null
+++ b/src/icons/line-md--emoji-smile-filled.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/line-md--emoji-smile.svg b/src/icons/line-md--emoji-smile.svg
new file mode 100644
index 0000000..02a0618
--- /dev/null
+++ b/src/icons/line-md--emoji-smile.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/line-md--external-link.svg b/src/icons/line-md--external-link.svg
new file mode 100644
index 0000000..0e4f303
--- /dev/null
+++ b/src/icons/line-md--external-link.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/line-md--github-loop.svg b/src/icons/line-md--github-loop.svg
new file mode 100644
index 0000000..84a78ac
--- /dev/null
+++ b/src/icons/line-md--github-loop.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/line-md--github.svg b/src/icons/line-md--github.svg
new file mode 100644
index 0000000..1013780
--- /dev/null
+++ b/src/icons/line-md--github.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/line-md--iconify2-static.svg b/src/icons/line-md--iconify2-static.svg
new file mode 100644
index 0000000..d7e913d
--- /dev/null
+++ b/src/icons/line-md--iconify2-static.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/line-md--rss.svg b/src/icons/line-md--rss.svg
new file mode 100644
index 0000000..f53bc29
--- /dev/null
+++ b/src/icons/line-md--rss.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/lineicons--astro.svg b/src/icons/lineicons--astro.svg
new file mode 100644
index 0000000..de532ca
--- /dev/null
+++ b/src/icons/lineicons--astro.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/material-symbols--docs-outline.svg b/src/icons/material-symbols--docs-outline.svg
new file mode 100644
index 0000000..3e3fc8b
--- /dev/null
+++ b/src/icons/material-symbols--docs-outline.svg
@@ -0,0 +1,4 @@
+
+
+
\ No newline at end of file
diff --git a/src/icons/mdi--tailwind.svg b/src/icons/mdi--tailwind.svg
new file mode 100644
index 0000000..5663335
--- /dev/null
+++ b/src/icons/mdi--tailwind.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/noto--pancakes.svg b/src/icons/noto--pancakes.svg
new file mode 100644
index 0000000..698a1d7
--- /dev/null
+++ b/src/icons/noto--pancakes.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/ph--matrix-logo-bold.svg b/src/icons/ph--matrix-logo-bold.svg
new file mode 100644
index 0000000..89d8a68
--- /dev/null
+++ b/src/icons/ph--matrix-logo-bold.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/simple-icons--rust.svg b/src/icons/simple-icons--rust.svg
new file mode 100644
index 0000000..944225b
--- /dev/null
+++ b/src/icons/simple-icons--rust.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/icons/twemoji--flag-switzerland.svg b/src/icons/twemoji--flag-switzerland.svg
new file mode 100644
index 0000000..f8f4413
--- /dev/null
+++ b/src/icons/twemoji--flag-switzerland.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/images/about-probe-rs/jlink.png b/src/images/about-probe-rs/jlink.png
new file mode 100644
index 0000000..cb3a2ae
Binary files /dev/null and b/src/images/about-probe-rs/jlink.png differ
diff --git a/src/images/banner.svg b/src/images/banner.svg
new file mode 100644
index 0000000..5db6623
--- /dev/null
+++ b/src/images/banner.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/static/img/cargo-embed-panic.png b/src/images/cargo-embed-panic.png
similarity index 100%
rename from static/img/cargo-embed-panic.png
rename to src/images/cargo-embed-panic.png
diff --git a/static/img/cargo-embed-simple.png b/src/images/cargo-embed-simple.png
similarity index 100%
rename from static/img/cargo-embed-simple.png
rename to src/images/cargo-embed-simple.png
diff --git a/src/images/cargo-embed-tcp-socket.png b/src/images/cargo-embed-tcp-socket.png
new file mode 100644
index 0000000..b412f2d
Binary files /dev/null and b/src/images/cargo-embed-tcp-socket.png differ
diff --git a/static/img/cargo-embed.png b/src/images/cargo-embed.png
similarity index 100%
rename from static/img/cargo-embed.png
rename to src/images/cargo-embed.png
diff --git a/static/img/release-0.11.0/cargo-flash-hints.png b/src/images/cargo-flash-hints.png
similarity index 100%
rename from static/img/release-0.11.0/cargo-flash-hints.png
rename to src/images/cargo-flash-hints.png
diff --git a/static/img/cargo.png b/src/images/cargo.png
similarity index 100%
rename from static/img/cargo.png
rename to src/images/cargo.png
diff --git a/src/images/coredump/coredump.png b/src/images/coredump/coredump.png
new file mode 100644
index 0000000..20efaf2
Binary files /dev/null and b/src/images/coredump/coredump.png differ
diff --git a/src/images/coredump/variable_resolution_issue.png b/src/images/coredump/variable_resolution_issue.png
new file mode 100644
index 0000000..3334914
Binary files /dev/null and b/src/images/coredump/variable_resolution_issue.png differ
diff --git a/src/images/ducks.jpg b/src/images/ducks.jpg
new file mode 100644
index 0000000..c9a2a3f
Binary files /dev/null and b/src/images/ducks.jpg differ
diff --git a/static/img/extensible.svg b/src/images/extensible.svg
similarity index 100%
rename from static/img/extensible.svg
rename to src/images/extensible.svg
diff --git a/static/img/flash.svg b/src/images/flash.svg
similarity index 100%
rename from static/img/flash.svg
rename to src/images/flash.svg
diff --git a/static/img/gdb.svg b/src/images/gdb.svg
similarity index 100%
rename from static/img/gdb.svg
rename to src/images/gdb.svg
diff --git a/static/img/release-0.11.0/hive.jpg b/src/images/hive.jpg
similarity index 100%
rename from static/img/release-0.11.0/hive.jpg
rename to src/images/hive.jpg
diff --git a/src/images/landing/manufacturers/arm.webp b/src/images/landing/manufacturers/arm.webp
new file mode 100644
index 0000000..a93ccfe
Binary files /dev/null and b/src/images/landing/manufacturers/arm.webp differ
diff --git a/src/images/landing/manufacturers/espressif.svg b/src/images/landing/manufacturers/espressif.svg
new file mode 100644
index 0000000..638148a
--- /dev/null
+++ b/src/images/landing/manufacturers/espressif.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/images/landing/manufacturers/nordic.svg b/src/images/landing/manufacturers/nordic.svg
new file mode 100644
index 0000000..ccfe61f
--- /dev/null
+++ b/src/images/landing/manufacturers/nordic.svg
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/images/landing/manufacturers/nordic3.svg b/src/images/landing/manufacturers/nordic3.svg
new file mode 100644
index 0000000..e85b909
--- /dev/null
+++ b/src/images/landing/manufacturers/nordic3.svg
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/images/landing/manufacturers/nxp.svg b/src/images/landing/manufacturers/nxp.svg
new file mode 100644
index 0000000..76de322
--- /dev/null
+++ b/src/images/landing/manufacturers/nxp.svg
@@ -0,0 +1,16 @@
+
+ NXP
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/images/landing/manufacturers/raspberrypi.png b/src/images/landing/manufacturers/raspberrypi.png
new file mode 100644
index 0000000..ad87b3f
Binary files /dev/null and b/src/images/landing/manufacturers/raspberrypi.png differ
diff --git a/src/images/landing/manufacturers/risc-v.png b/src/images/landing/manufacturers/risc-v.png
new file mode 100644
index 0000000..5df1998
Binary files /dev/null and b/src/images/landing/manufacturers/risc-v.png differ
diff --git a/src/images/landing/manufacturers/st.png b/src/images/landing/manufacturers/st.png
new file mode 100644
index 0000000..e73b18e
Binary files /dev/null and b/src/images/landing/manufacturers/st.png differ
diff --git a/src/images/landing/probe-rs-debugger.png b/src/images/landing/probe-rs-debugger.png
new file mode 100644
index 0000000..877874b
Binary files /dev/null and b/src/images/landing/probe-rs-debugger.png differ
diff --git a/src/images/landing/probes/cmsis-dap.webp b/src/images/landing/probes/cmsis-dap.webp
new file mode 100644
index 0000000..a93ccfe
Binary files /dev/null and b/src/images/landing/probes/cmsis-dap.webp differ
diff --git a/src/images/landing/probes/ftdi.png b/src/images/landing/probes/ftdi.png
new file mode 100644
index 0000000..bee343e
Binary files /dev/null and b/src/images/landing/probes/ftdi.png differ
diff --git a/src/images/landing/probes/jlink.svg b/src/images/landing/probes/jlink.svg
new file mode 100644
index 0000000..5cda8e0
--- /dev/null
+++ b/src/images/landing/probes/jlink.svg
@@ -0,0 +1,8 @@
+
\ No newline at end of file
diff --git a/src/images/landing/probes/stlink.png b/src/images/landing/probes/stlink.png
new file mode 100644
index 0000000..e73b18e
Binary files /dev/null and b/src/images/landing/probes/stlink.png differ
diff --git a/src/images/landing/probes/stlink.svg b/src/images/landing/probes/stlink.svg
new file mode 100644
index 0000000..edcc5d1
--- /dev/null
+++ b/src/images/landing/probes/stlink.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/images/landing/vimspector.png b/src/images/landing/vimspector.png
new file mode 100644
index 0000000..533a0e7
Binary files /dev/null and b/src/images/landing/vimspector.png differ
diff --git a/src/images/landing/vscode.jpg b/src/images/landing/vscode.jpg
new file mode 100644
index 0000000..05455b9
Binary files /dev/null and b/src/images/landing/vscode.jpg differ
diff --git a/static/img/multilingual.svg b/src/images/multilingual.svg
similarity index 100%
rename from static/img/multilingual.svg
rename to src/images/multilingual.svg
diff --git a/static/img/release-0.11.0/probe-rs-debugger.gif b/src/images/probe-rs-debugger.gif
similarity index 100%
rename from static/img/release-0.11.0/probe-rs-debugger.gif
rename to src/images/probe-rs-debugger.gif
diff --git a/src/images/release-0.11.0/cargo-flash-hints.png b/src/images/release-0.11.0/cargo-flash-hints.png
new file mode 100644
index 0000000..b1e0ecf
Binary files /dev/null and b/src/images/release-0.11.0/cargo-flash-hints.png differ
diff --git a/src/images/release-0.11.0/hive.jpg b/src/images/release-0.11.0/hive.jpg
new file mode 100644
index 0000000..5151334
Binary files /dev/null and b/src/images/release-0.11.0/hive.jpg differ
diff --git a/src/images/release-0.11.0/probe-rs-debugger.gif b/src/images/release-0.11.0/probe-rs-debugger.gif
new file mode 100644
index 0000000..12f3d78
Binary files /dev/null and b/src/images/release-0.11.0/probe-rs-debugger.gif differ
diff --git a/static/img/release-0.11.0/svd-viewer.jpeg b/src/images/release-0.11.0/svd-viewer.jpeg
similarity index 100%
rename from static/img/release-0.11.0/svd-viewer.jpeg
rename to src/images/release-0.11.0/svd-viewer.jpeg
diff --git a/src/images/svd-viewer.jpeg b/src/images/svd-viewer.jpeg
new file mode 100644
index 0000000..3b354f9
Binary files /dev/null and b/src/images/svd-viewer.jpeg differ
diff --git a/src/images/vscode.gif b/src/images/vscode.gif
new file mode 100644
index 0000000..7eb13b3
Binary files /dev/null and b/src/images/vscode.gif differ
diff --git a/src/images/vscode.jpg b/src/images/vscode.jpg
new file mode 100644
index 0000000..05455b9
Binary files /dev/null and b/src/images/vscode.jpg differ
diff --git a/static/img/vscode.svg b/src/images/vscode.svg
similarity index 100%
rename from static/img/vscode.svg
rename to src/images/vscode.svg
diff --git a/static/img/vscode/SVD Peripheral Registers.gif b/src/images/vscode/SVD Peripheral Registers.gif
similarity index 100%
rename from static/img/vscode/SVD Peripheral Registers.gif
rename to src/images/vscode/SVD Peripheral Registers.gif
diff --git a/static/img/vscode/disassemble_and_instruction_breakpoint.gif b/src/images/vscode/disassemble_and_instruction_breakpoint.gif
similarity index 100%
rename from static/img/vscode/disassemble_and_instruction_breakpoint.gif
rename to src/images/vscode/disassemble_and_instruction_breakpoint.gif
diff --git a/static/img/vscode/intro_and_rtt.gif b/src/images/vscode/intro_and_rtt.gif
similarity index 100%
rename from static/img/vscode/intro_and_rtt.gif
rename to src/images/vscode/intro_and_rtt.gif
diff --git a/src/images/vscode/probe-rs-debugger.gif b/src/images/vscode/probe-rs-debugger.gif
new file mode 100644
index 0000000..23ee1dc
Binary files /dev/null and b/src/images/vscode/probe-rs-debugger.gif differ
diff --git a/static/img/vscode/variable_edit_and_watch.gif b/src/images/vscode/variable_edit_and_watch.gif
similarity index 100%
rename from static/img/vscode/variable_edit_and_watch.gif
rename to src/images/vscode/variable_edit_and_watch.gif
diff --git a/static/img/vscode/variable_set_value.gif b/src/images/vscode/variable_set_value.gif
similarity index 100%
rename from static/img/vscode/variable_set_value.gif
rename to src/images/vscode/variable_set_value.gif
diff --git a/src/layouts/BlogPost.astro b/src/layouts/BlogPost.astro
new file mode 100644
index 0000000..fd9ccee
--- /dev/null
+++ b/src/layouts/BlogPost.astro
@@ -0,0 +1,24 @@
+---
+import type { CollectionEntry } from "astro:content";
+import Html from "./Html.astro";
+import FormattedDate from "../components/FormattedDate.astro";
+import { Icon } from "astro-icon/components";
+import { SITE_TITLE } from "../consts";
+
+type Props = CollectionEntry<"blog">["data"];
+
+const { title, description, date, authors } = Astro.props;
+---
+
+
+
+
+ {title}
+
+ by {authors.join(", ")} |
+
+
+
+
+
+
diff --git a/src/layouts/Doc.astro b/src/layouts/Doc.astro
new file mode 100644
index 0000000..476afdd
--- /dev/null
+++ b/src/layouts/Doc.astro
@@ -0,0 +1,67 @@
+---
+import Html from "./Html.astro";
+import { SITE_TITLE } from "../consts";
+import { type CollectionEntry, getCollection } from "astro:content";
+import { docs, docFolders } from "../utils";
+import { Icon } from "astro-icon/components";
+
+type Props = CollectionEntry<"docs">;
+const {
+ data: { title, description },
+ id,
+} = Astro.props;
+---
+
+
+
+
+
+
+
+
+
+
+ {
+ docFolders.map((folder) => (
+
+ ))
+ }
+
+
+
+
diff --git a/src/layouts/Html.astro b/src/layouts/Html.astro
new file mode 100644
index 0000000..e03a102
--- /dev/null
+++ b/src/layouts/Html.astro
@@ -0,0 +1,126 @@
+---
+import Head from "../components/Head.astro";
+import HeaderLink from "../components/HeaderLink.astro";
+import Socials from "../components/Socials.astro";
+import { SITE_TITLE } from "../consts";
+import { Icon } from "astro-icon/components";
+import Search from "astro-pagefind/components/Search";
+
+const { title, description, image, fluid } = Astro.props;
+---
+
+
+
+
+
+
+
+
+
+
+
+
+ {SITE_TITLE}
+
+
+
+
+
+
+
+
+ Targets
+ Documentation
+ Blog
+ Shop
+ GitHub
+
+
+
+
+
+
+
+
+
+
+ Targets
+ Documentation
+ Blog
+ Shop
+ GitHub
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/404.mdx b/src/pages/404.mdx
new file mode 100644
index 0000000..8d7a0ae
--- /dev/null
+++ b/src/pages/404.mdx
@@ -0,0 +1,7 @@
+---
+layout: ../layouts/Html.astro
+---
+
+# Hmm, nothing here.
+
+How'd you get here?
\ No newline at end of file
diff --git a/src/pages/blog/[...slug].astro b/src/pages/blog/[...slug].astro
new file mode 100644
index 0000000..67d0cfe
--- /dev/null
+++ b/src/pages/blog/[...slug].astro
@@ -0,0 +1,22 @@
+---
+import { type CollectionEntry, getCollection } from 'astro:content';
+import BlogPost from '../../layouts/BlogPost.astro';
+import { render } from 'astro:content';
+import Link from '../../components/Link.astro';
+import { posts } from '../../utils';
+
+export async function getStaticPaths() {
+ return posts.map((post) => ({
+ params: { slug: post.id },
+ props: post,
+ }));
+}
+type Props = CollectionEntry<'blog'>;
+
+const post = Astro.props;
+const { Content } = await render(post);
+---
+
+
+
+
diff --git a/src/pages/blog/index.astro b/src/pages/blog/index.astro
new file mode 100644
index 0000000..573c6ac
--- /dev/null
+++ b/src/pages/blog/index.astro
@@ -0,0 +1,27 @@
+---
+import Html from "../../layouts/Html.astro";
+import { SITE_TITLE, SITE_DESCRIPTION } from "../../consts";
+import FormattedDate from "../../components/FormattedDate.astro";
+import { posts } from "../../utils";
+---
+
+
+
+
diff --git a/src/pages/docs/[...slug].astro b/src/pages/docs/[...slug].astro
new file mode 100644
index 0000000..c61354d
--- /dev/null
+++ b/src/pages/docs/[...slug].astro
@@ -0,0 +1,57 @@
+---
+import { type CollectionEntry, getCollection } from "astro:content";
+import Doc from "../../layouts/Doc.astro";
+import { render } from "astro:content";
+import Link from "../../components/Link.astro";
+
+import { docs, docFolders } from "../../utils";
+
+export async function getStaticPaths() {
+ const paths = [];
+
+ for (const docsInFolder of Object.values(docs)) {
+ for (const doc of docsInFolder) {
+ paths.push({
+ params: {slug: doc.id},
+ props: doc,
+ });
+ }
+ }
+
+
+ // Add root docs path (/docs/) as first doc of first folder.
+ paths.push({
+ params: {slug: '/'},
+ props: {
+ redirect: docs[docFolders[0].id][0].id
+ },
+ })
+
+ // Add folder paths (e.g. /docs/library/) with the first doc in each folder.
+ for (const folder of docFolders) {
+ paths.push({
+ params: {slug: folder.id},
+ props: {
+ redirect: docs[folder.id][0].id,
+ },
+ })
+ }
+
+ return paths;
+}
+
+
+type Props = CollectionEntry<"docs"> & {redirect: string};
+const doc = Astro.props;
+
+// Handle naked folder paths.
+if (doc.redirect) {
+ return Astro.rewrite('/docs/' + doc.redirect);
+}
+
+const { Content } = await render(doc);
+---
+
+
+
+
diff --git a/src/pages/index.astro b/src/pages/index.astro
new file mode 100644
index 0000000..c8b884d
--- /dev/null
+++ b/src/pages/index.astro
@@ -0,0 +1,346 @@
+---
+import Html from "../layouts/Html.astro";
+import { SITE_TITLE, SITE_DESCRIPTION } from "../consts";
+
+import banner from "../images/banner.svg";
+import { Code } from "astro:components";
+
+import { Image } from "astro:assets";
+import arm from "../images/landing/manufacturers/arm.webp";
+import st from "../images/landing/manufacturers/st.png";
+import nxp from "../images/landing/manufacturers/nxp.svg";
+import espressif from "../images/landing/manufacturers/espressif.svg";
+import raspberrypi from "../images/landing/manufacturers/raspberrypi.png";
+import riscv from "../images/landing/manufacturers/risc-v.png";
+import nordic from "../images/landing/manufacturers/nordic3.svg";
+import cmsis from "../images/landing/probes/cmsis-dap.webp";
+import jlink from "../images/landing/probes/jlink.svg";
+import stlink from "../images/landing/probes/stlink.png";
+import ftdi from "../images/landing/probes/ftdi.png";
+import probe_rs_debugger from "../images/landing/probe-rs-debugger.png";
+import CodeSnippet from "../components/CodeSnippet.tsx";
+import { Icon } from "astro-icon/components";
+import Install from "../components/index/Install";
+---
+
+
+
+
+ The
+ user-friendly &
+ flexible embedded toolkit
+ that just works
+
+
+
+
+
+
+
+
+
+
Embedded programming made easy
+
+ Run a program on your microchip with the ease of a native application.
+
+
+ Easily print to STDOUT via RTT and defmt encoding when
+ using probe-rs run.
+
+ cargo-flash can be used to just
+ flash a target and cargo-embed
+ can be used to get a full RTT terminal to also send commands to the target
+ and view multiple channels at one.
+
+
+
+
+
+
+
+
Easy debugging in VSCode
+
+ Use VSCode's awesome debug capabilities
+ with our native debug plugin.
+
+
+ Run the target, set breakpoints, halt on break point, inspect the
+ stackframe and manipulate variables.
+
+
+ RTT is fully integrated
+ and GDB-like expressions can be evaluated in the built in REPL .
+
+
+ VSCode not your cup of tea? No problem! probe-rs implements the Debug Adapter Protocol , so you can use other editors, IDEs, and visual debuggers , such as Vimspector ...
+
+
+
+
+
+
+
A clean and intuitive API
+
+ Manipulate your target from the host - read and write memory, set
+ breakpoints, run, halt.
+
+
+ Build production utilities or awesome HITL setups. The sky is the limit!
+
+
+
+
+
+
+
Every ARM or RISC-V target
+
+ Hundreds of targets are shipped with probe-rs. You found a missing one?
+
+
+ Generate your own target description from an existing CMSIS-Pack in 2 minutes.
+
+
+ No CMSIS-Pack? Write your own flash algorithm in 2 hours with the help of our templates with automatic tests.
+
+
+
+
+
Supports many debug probes
+
+ Debug targets via CMSIS-DAP, JLink, ST-Link and FTDI or add your own
+ probe easily.
+
+
+ We even have our own open-source probe to build or buy (coming soon)
+
+
+
+
+
+
How to contribute
+
+ {
+ [
+ {
+ i: "gh-star",
+ n: (
+ <>
+ Star the{" "}
+
+ repo on GitHub
+
+ .
+ >
+ ),
+ },
+ {
+ i: "gh-sponsors",
+ n: (
+ <>
+ Support this project by
+
+ sponsoring it
+
+ .
+ >
+ ),
+ },
+ {
+ i: "icon-park-outline--fork",
+ n: (
+ <>
+ Fork the repo and{" "}
+ contribute {" "}
+ fixing bugs, adding docs or tackling new features.
+ >
+ ),
+ },
+ {
+ i: "material-symbols--docs-outline",
+ n: (
+ <>
+ Help to{" "}
+ improve the docs .
+ >
+ ),
+ },
+ {
+ i: "chat",
+ n: (
+ <>
+ Get help and discuss
+
+ on Matrix
+
+ .
+ >
+ ),
+ },
+ ].map(({ i, n }) => (
+
+ {n}
+
+ ))
+ }
+
+
+
+
diff --git a/src/pages/robots.txt.ts b/src/pages/robots.txt.ts
new file mode 100644
index 0000000..a60c028
--- /dev/null
+++ b/src/pages/robots.txt.ts
@@ -0,0 +1,28 @@
+import type { APIRoute } from "astro";
+
+const disallowedAgents = [
+ // OpenAI training generative AI foundation models
+ // https://platform.openai.com/docs/bots
+ "GPTBot",
+
+ // FB training AI models
+ // https://developers.facebook.com/docs/sharing/webmasters/web-crawlers
+ "meta-externalagent",
+
+ // Google Gemini generative APIs
+ // https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers
+ "Google-Extended",
+];
+
+export const GET: APIRoute = ({ site }) => {
+ // prettier-ignore
+ return new Response(
+`User-agent: *
+Allow: /
+
+${disallowedAgents.map(a =>
+`User-agent: ${a}
+Disallow: /`).join('\n\n')}
+
+Sitemap: ${new URL("sitemap-index.xml", site).href}`);
+};
diff --git a/src/pages/rss.xml.js b/src/pages/rss.xml.js
new file mode 100644
index 0000000..493f917
--- /dev/null
+++ b/src/pages/rss.xml.js
@@ -0,0 +1,16 @@
+import rss from '@astrojs/rss';
+import { getCollection } from 'astro:content';
+import { SITE_TITLE, SITE_DESCRIPTION } from '../consts';
+
+export async function GET(context) {
+ const posts = await getCollection('blog', ({data}) => import.meta.env.DEV || !data.draft);
+ return rss({
+ title: SITE_TITLE,
+ description: SITE_DESCRIPTION,
+ site: context.site,
+ items: posts.map((post) => ({
+ ...post.data,
+ link: `/${post.id}/`,
+ })),
+ });
+}
diff --git a/src/pages/targets.astro b/src/pages/targets.astro
new file mode 100644
index 0000000..048cf81
--- /dev/null
+++ b/src/pages/targets.astro
@@ -0,0 +1,25 @@
+---
+import Html from "../layouts/Html.astro";
+import { SITE_TITLE, SITE_DESCRIPTION } from "../consts";
+import { targets } from "../utils";
+import TargetsView from "../components/TargetsView";
+import { manufacturers } from "../utils";
+---
+
+
+
+
Targets
+
probe-rs ships many built-in targets.
+
+ If a target is not listed, you have the option to extract it from a CMSIS-Pack or if that does not exist either, write a flash algorithm from scratch with our templates.
+
+
+
+
+
diff --git a/src/styles/global.css b/src/styles/global.css
new file mode 100644
index 0000000..7c9260e
--- /dev/null
+++ b/src/styles/global.css
@@ -0,0 +1,121 @@
+@import "http://github.com/tailwindcss";
+@plugin '@tailwindcss/typography';
+
+@theme {
+ --font-sans: "Inter", sans-serif;
+ --color-green: #15846f;
+ --color-lightgreen: #15846f22;
+ --color-lightergreen: #15846f11;
+ --color-graytransparent: #55555555;
+}
+
+a {
+ @apply text-green no-underline;
+}
+
+@layer components {
+ *:not(.prose) a {
+ @apply text-green no-underline;
+ }
+
+ a:hover,
+ a:active {
+ @apply text-green transition ease-out;
+ }
+}
+
+tr {
+ @apply even:bg-lightgreen;
+}
+
+td {
+ @apply px-2 even:bg-lightergreen;
+}
+
+th {
+ @apply text-center;
+}
+
+/* Prose styling */
+div.expressive-code {
+ @apply mb-10;
+}
+
+pre.astro-code,
+pre.shiki {
+ @apply mt-0 mb-0;
+}
+
+.code-snippet > pre.shiki {
+ @apply rounded-t-none;
+}
+
+.format-code code {
+ @apply before:!content-none after:!content-none;
+ @apply bg-slate-100 border-slate-300;
+ @apply dark:bg-slate-500/50 dark:border-slate-500/50;
+ @apply border-[1px] px-1 py-0.5 rounded-sm w-full max-w-3xl mx-auto;
+}
+
+.format-code pre code {
+ @apply before:!content-none after:!content-none bg-slate-100 dark:bg-slate-900 border-[0px] border-slate-500/50 px-1 py-0.5 rounded-sm w-full max-w-3xl mx-auto;
+}
+
+figure {
+ @apply flex flex-col items-center;
+}
+
+@media (prefers-color-scheme: dark) {
+ .shiki,
+ .shiki span {
+ @apply dark:!bg-slate-900;
+ }
+}
+
+@media (prefers-color-scheme: light) {
+ .shiki,
+ .shiki span {
+ @apply !bg-slate-100;
+ }
+}
+
+.pagefind-ui .pagefind-ui__form {
+ @apply dark:before:!bg-slate-200;
+}
+
+.pagefind-ui .pagefind-ui__search-input {
+ @apply !border-slate-200;
+ @apply dark:!bg-slate-900 dark:!text-slate-200 dark:!border-slate-600;
+ @apply not-placeholder-shown:w-full !border-[1px];
+ @apply focus-visible:!border-none focus-visible:!ring-0;
+}
+
+.pagefind-ui .pagefind-ui__search-clear {
+ @apply !pl-3;
+ @apply dark:before:!bg-slate-200 dark:!bg-slate-900 dark:!text-white;
+}
+
+.pagefind-ui .pagefind-ui__drawer:not(.pagefind-ui__hidden) {
+ @apply absolute top-14 md:top-16 right-0 left-0 mx-auto px-6 pb-6 rounded-md mt-0 z-50 overflow-y-auto;
+ @apply bg-slate-100 text-black;
+ @apply dark:bg-slate-900 dark:!text-slate-200;
+
+ box-shadow: 0 10px 10px -5px rgba(0, 0, 0, 0.2),
+ 0 2px 2px 0 rgba(0, 0, 0, 0.1);
+}
+
+.pagefind-ui .pagefind-ui__result {
+ @apply !py-3;
+}
+
+.pagefind-ui .pagefind-ui__result-link {
+ @apply !text-black dark:!text-slate-200;
+}
+
+.pagefind-ui .pagefind-ui__result-title {
+ @apply text-black dark:text-slate-200;
+}
+
+.pagefind-ui .pagefind-ui__result-excerpt {
+ @apply text-black dark:text-slate-200;
+}
diff --git a/src/utils.ts b/src/utils.ts
new file mode 100644
index 0000000..550068e
--- /dev/null
+++ b/src/utils.ts
@@ -0,0 +1,37 @@
+import { getCollection, type CollectionEntry } from "astro:content";
+import type { ImageMetadata } from "astro";
+import { readFileSync } from "node:fs";
+import jep106 from "jep106/src/codes.json";
+
+export const posts = (await getCollection("blog")).sort(
+ (a, b) => b.data.date.valueOf() - a.data.date.valueOf()
+);
+
+export const images = import.meta.glob<{ default: ImageMetadata }>(
+ "/src/images/*.{jpeg,jpg,png,gif,svg}"
+);
+
+// Just the folders, ordered.
+export const docFolders = (await getCollection("docsFolderYaml")).sort((a, b) =>
+ (a.data.sectionOrder || 0) < (b.data.sectionOrder || 0) ? -1 : 1
+);
+
+// Docs, grouped by their containing folder.
+export const docs = (await getCollection("docs")).reduce(
+ (folderMap: { [key: string]: CollectionEntry<"docs">[] }, doc) => {
+ const folder = doc.id.split("/").slice(0, -1).join("/");
+ if (!folderMap[folder]) folderMap[folder] = [];
+ folderMap[folder].push(doc);
+ return folderMap;
+ },
+ {}
+);
+
+// Sort docs within each folder.
+for (const [folder, docsInFolder] of Object.entries(docs)) {
+ docsInFolder.sort((a, b) => (a.data.order < b.data.order ? -1 : 1));
+}
+
+export const targets = await getCollection("targets");
+
+export const manufacturers = jep106.manufacturers;
diff --git a/static/CNAME b/static/CNAME
deleted file mode 100644
index 69f9dbb..0000000
--- a/static/CNAME
+++ /dev/null
@@ -1 +0,0 @@
-probe.rs
diff --git a/static/_headers b/static/_headers
deleted file mode 100644
index c269214..0000000
--- a/static/_headers
+++ /dev/null
@@ -1,2 +0,0 @@
-/*
- Access-Control-Allow-Origin: *
\ No newline at end of file
diff --git a/static/android-chrome-192x192.png b/static/android-chrome-192x192.png
deleted file mode 100644
index 03a0e70..0000000
Binary files a/static/android-chrome-192x192.png and /dev/null differ
diff --git a/static/android-chrome-512x512.png b/static/android-chrome-512x512.png
deleted file mode 100644
index 74bdfb9..0000000
Binary files a/static/android-chrome-512x512.png and /dev/null differ
diff --git a/static/apple-touch-icon.png b/static/apple-touch-icon.png
deleted file mode 100644
index 225acef..0000000
Binary files a/static/apple-touch-icon.png and /dev/null differ
diff --git a/static/doks.png b/static/doks.png
deleted file mode 100644
index 70d8c78..0000000
Binary files a/static/doks.png and /dev/null differ
diff --git a/static/doks.svg b/static/doks.svg
deleted file mode 100644
index 4631bc5..0000000
--- a/static/doks.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/static/favicon-16x16.png b/static/favicon-16x16.png
deleted file mode 100644
index 8fcd422..0000000
Binary files a/static/favicon-16x16.png and /dev/null differ
diff --git a/static/favicon-32x32.png b/static/favicon-32x32.png
deleted file mode 100644
index 21378a4..0000000
Binary files a/static/favicon-32x32.png and /dev/null differ
diff --git a/static/favicon.ico b/static/favicon.ico
deleted file mode 100644
index 9e2fc8d..0000000
Binary files a/static/favicon.ico and /dev/null differ
diff --git a/static/files/69-probe-rs.rules b/static/files/69-probe-rs.rules
deleted file mode 100644
index a843041..0000000
--- a/static/files/69-probe-rs.rules
+++ /dev/null
@@ -1,59 +0,0 @@
-# Copy this file to /etc/udev/rules.d/
-# If rules fail to reload automatically, you can refresh udev rules
-# with the command "udevadm control --reload"
-
-# This rules are based on the udev rules from the OpenOCD project, with unsupported probes removed.
-# See http://openocd.org/ for more details.
-#
-# This file is available under the GNU General Public License v2.0
-
-ACTION!="add|change", GOTO="probe_rs_rules_end"
-
-SUBSYSTEM=="gpio", MODE="0660", GROUP="plugdev", TAG+="uaccess"
-
-SUBSYSTEM!="usb|tty|hidraw", GOTO="probe_rs_rules_end"
-
-# Please keep this list sorted by VID:PID
-
-# STMicroelectronics ST-LINK V1
-ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3744", MODE="660", GROUP="plugdev", TAG+="uaccess"
-
-# STMicroelectronics ST-LINK/V2
-ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="660", GROUP="plugdev", TAG+="uaccess"
-
-# STMicroelectronics ST-LINK/V2.1
-ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374b", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3752", MODE="660", GROUP="plugdev", TAG+="uaccess"
-
-# STMicroelectronics STLINK-V3
-ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374d", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374e", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374f", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3753", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3754", MODE="660", GROUP="plugdev", TAG+="uaccess"
-
-# SEGGER J-Link
-ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0101", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0102", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0103", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0104", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0105", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0107", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0108", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1010", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1011", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1012", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1013", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1014", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1015", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1016", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1017", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1018", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1051", MODE="660", GROUP="plugdev", TAG+="uaccess"
-ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1061", MODE="660", GROUP="plugdev", TAG+="uaccess"
-
-
-# CMSIS-DAP compatible adapters
-ATTRS{product}=="*CMSIS-DAP*", MODE="660", GROUP="plugdev", TAG+="uaccess"
-
-LABEL="probe_rs_rules_end"
diff --git a/static/fonts/vendor/jost/jost-v4-latin-500.woff b/static/fonts/vendor/jost/jost-v4-latin-500.woff
deleted file mode 100644
index eab8d1b..0000000
Binary files a/static/fonts/vendor/jost/jost-v4-latin-500.woff and /dev/null differ
diff --git a/static/fonts/vendor/jost/jost-v4-latin-500.woff2 b/static/fonts/vendor/jost/jost-v4-latin-500.woff2
deleted file mode 100644
index 92349d1..0000000
Binary files a/static/fonts/vendor/jost/jost-v4-latin-500.woff2 and /dev/null differ
diff --git a/static/fonts/vendor/jost/jost-v4-latin-500italic.woff b/static/fonts/vendor/jost/jost-v4-latin-500italic.woff
deleted file mode 100644
index 7a8ed95..0000000
Binary files a/static/fonts/vendor/jost/jost-v4-latin-500italic.woff and /dev/null differ
diff --git a/static/fonts/vendor/jost/jost-v4-latin-500italic.woff2 b/static/fonts/vendor/jost/jost-v4-latin-500italic.woff2
deleted file mode 100644
index c6b9d56..0000000
Binary files a/static/fonts/vendor/jost/jost-v4-latin-500italic.woff2 and /dev/null differ
diff --git a/static/fonts/vendor/jost/jost-v4-latin-700.woff b/static/fonts/vendor/jost/jost-v4-latin-700.woff
deleted file mode 100644
index 57390f5..0000000
Binary files a/static/fonts/vendor/jost/jost-v4-latin-700.woff and /dev/null differ
diff --git a/static/fonts/vendor/jost/jost-v4-latin-700.woff2 b/static/fonts/vendor/jost/jost-v4-latin-700.woff2
deleted file mode 100644
index 584073a..0000000
Binary files a/static/fonts/vendor/jost/jost-v4-latin-700.woff2 and /dev/null differ
diff --git a/static/fonts/vendor/jost/jost-v4-latin-700italic.woff b/static/fonts/vendor/jost/jost-v4-latin-700italic.woff
deleted file mode 100644
index e23eedf..0000000
Binary files a/static/fonts/vendor/jost/jost-v4-latin-700italic.woff and /dev/null differ
diff --git a/static/fonts/vendor/jost/jost-v4-latin-700italic.woff2 b/static/fonts/vendor/jost/jost-v4-latin-700italic.woff2
deleted file mode 100644
index e56d892..0000000
Binary files a/static/fonts/vendor/jost/jost-v4-latin-700italic.woff2 and /dev/null differ
diff --git a/static/fonts/vendor/jost/jost-v4-latin-italic.woff b/static/fonts/vendor/jost/jost-v4-latin-italic.woff
deleted file mode 100644
index 5dcd111..0000000
Binary files a/static/fonts/vendor/jost/jost-v4-latin-italic.woff and /dev/null differ
diff --git a/static/fonts/vendor/jost/jost-v4-latin-italic.woff2 b/static/fonts/vendor/jost/jost-v4-latin-italic.woff2
deleted file mode 100644
index 9346c1d..0000000
Binary files a/static/fonts/vendor/jost/jost-v4-latin-italic.woff2 and /dev/null differ
diff --git a/static/fonts/vendor/jost/jost-v4-latin-regular.woff b/static/fonts/vendor/jost/jost-v4-latin-regular.woff
deleted file mode 100644
index 4f24758..0000000
Binary files a/static/fonts/vendor/jost/jost-v4-latin-regular.woff and /dev/null differ
diff --git a/static/fonts/vendor/jost/jost-v4-latin-regular.woff2 b/static/fonts/vendor/jost/jost-v4-latin-regular.woff2
deleted file mode 100644
index 7f0bf75..0000000
Binary files a/static/fonts/vendor/jost/jost-v4-latin-regular.woff2 and /dev/null differ
diff --git a/static/index.js b/static/index.js
deleted file mode 100644
index 8c87d5f..0000000
--- a/static/index.js
+++ /dev/null
@@ -1,146 +0,0 @@
-var suggestions = document.getElementById('suggestions');
-var userinput = document.getElementById('userinput');
-
-document.addEventListener('keydown', inputFocus);
-
-function inputFocus(e) {
-
- if (e.keyCode === 191 ) {
- e.preventDefault();
- userinput.focus();
- }
-
- if (e.keyCode === 27 ) {
- userinput.blur();
- suggestions.classList.add('d-none');
- }
-
-}
-
-document.addEventListener('click', function(event) {
-
- var isClickInsideElement = suggestions.contains(event.target);
-
- if (!isClickInsideElement) {
- suggestions.classList.add('d-none');
- }
-
-});
-
-/*
-Source:
- - https://dev.to/shubhamprakash/trap-focus-using-javascript-6a3
-*/
-
-document.addEventListener('keydown',suggestionFocus);
-
-function suggestionFocus(e){
-
- const focusableSuggestions= suggestions.querySelectorAll('a');
- const focusable= [...focusableSuggestions];
- const index = focusable.indexOf(document.activeElement);
-
- let nextIndex = 0;
-
- if (e.keyCode === 38) {
- e.preventDefault();
- nextIndex= index > 0 ? index-1 : 0;
- focusableSuggestions[nextIndex].focus();
- }
- else if (e.keyCode === 40) {
- e.preventDefault();
- nextIndex= index+1 < focusable.length ? index+1 : index;
- focusableSuggestions[nextIndex].focus();
- }
-
-}
-
-
-/*
-Source:
- - https://github.com/nextapps-de/flexsearch#index-documents-field-search
- - https://raw.githack.com/nextapps-de/flexsearch/master/demo/autocomplete.html
-*/
-
-(function(){
-
- var index = new FlexSearch({
- preset: 'score',
- cache: true,
- doc: {
- id: 'id',
- field: [
- 'title',
- 'description',
- 'content',
- ],
- store: [
- 'href',
- 'title',
- 'description',
- ],
- },
- });
-
- var docs = [
- {{ range $index, $page := (where .Site.Pages "Section" "docs") -}}
- {
- id: {{ $index }},
- href: "{{ .RelPermalink | relURL }}",
- title: {{ .Title | jsonify }},
- description: {{ .Params.description | jsonify }},
- content: {{ .Content | jsonify }}
- },
- {{ end -}}
- ];
-
- index.add(docs);
-
- userinput.addEventListener('input', show_results, true);
- suggestions.addEventListener('click', accept_suggestion, true);
-
- function show_results(){
-
- var value = this.value;
- var results = index.search(value, 5);
- var entry, childs = suggestions.childNodes;
- var i = 0, len = results.length;
-
- suggestions.classList.remove('d-none');
-
- results.forEach(function(page) {
-
- entry = document.createElement('div');
-
- entry.innerHTML = ' ';
-
- a = entry.querySelector('a'),
- t = entry.querySelector('span:first-child'),
- d = entry.querySelector('span:nth-child(2)');
-
- a.href = page.href;
- t.textContent = page.title;
- d.textContent = page.description;
-
- suggestions.appendChild(entry);
-
- });
-
- while(childs.length > len){
-
- suggestions.removeChild(childs[i])
- }
-
- }
-
- function accept_suggestion(){
-
- while(suggestions.lastChild){
-
- suggestions.removeChild(suggestions.lastChild);
- }
-
- return false;
- }
-
-}());
diff --git a/static/js/main.js b/static/js/main.js
deleted file mode 100644
index 6ea6194..0000000
--- a/static/js/main.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// Set darkmode
-document.getElementById('mode').addEventListener('click', () => {
-
- document.body.classList.toggle('dark');
- localStorage.setItem('theme', document.body.classList.contains('dark') ? 'dark' : 'light');
-
-});
-
-if (localStorage.getItem('theme') === 'dark') {
-
- document.body.classList.add('dark');
-
-}
diff --git a/static/js/search.js b/static/js/search.js
deleted file mode 100644
index bf0dd74..0000000
--- a/static/js/search.js
+++ /dev/null
@@ -1,312 +0,0 @@
-var suggestions = document.getElementById('suggestions');
-var userinput = document.getElementById('userinput');
-
-document.addEventListener('keydown', inputFocus);
-
-function inputFocus(e) {
-
- if (e.keyCode === 191 ) {
- e.preventDefault();
- userinput.focus();
- }
-
- if (e.keyCode === 27 ) {
- userinput.blur();
- suggestions.classList.add('d-none');
- }
-
-}
-
-document.addEventListener('click', function(event) {
-
- var isClickInsideElement = suggestions.contains(event.target);
-
- if (!isClickInsideElement) {
- suggestions.classList.add('d-none');
- }
-
-});
-
-/*
-Source:
- - https://dev.to/shubhamprakash/trap-focus-using-javascript-6a3
-*/
-
-document.addEventListener('keydown',suggestionFocus);
-
-function suggestionFocus(e){
-
- const focusableSuggestions= suggestions.querySelectorAll('a');
- const focusable= [...focusableSuggestions];
- const index = focusable.indexOf(document.activeElement);
-
- let nextIndex = 0;
-
- if (e.keyCode === 38) {
- e.preventDefault();
- nextIndex= index > 0 ? index-1 : 0;
- focusableSuggestions[nextIndex].focus();
- }
- else if (e.keyCode === 40) {
- e.preventDefault();
- nextIndex= index+1 < focusable.length ? index+1 : index;
- focusableSuggestions[nextIndex].focus();
- }
-
-}
-
-/*
-Source:
- - https://github.com/nextapps-de/flexsearch#index-documents-field-search
- - https://raw.githack.com/nextapps-de/flexsearch/master/demo/autocomplete.html
- - http://elasticlunr.com/
- - https://github.com/getzola/zola/blob/master/docs/static/search.js
-*/
-(function(){
- var index = elasticlunr.Index.load(window.searchIndex);
- userinput.addEventListener('input', show_results, true);
- suggestions.addEventListener('click', accept_suggestion, true);
-
- function show_results(){
- var value = this.value.trim();
- var options = {
- bool: "OR",
- fields: {
- title: {boost: 2},
- body: {boost: 1},
- }
- };
- var results = index.search(value, options);
-
- var entry, childs = suggestions.childNodes;
- var i = 0, len = results.length;
- var items = value.split(/\s+/);
- suggestions.classList.remove('d-none');
-
- results.forEach(function(page) {
- if (page.doc.body !== '') {
- entry = document.createElement('div');
-
- entry.innerHTML = ' ';
-
- a = entry.querySelector('a'),
- t = entry.querySelector('span:first-child'),
- d = entry.querySelector('span:nth-child(2)');
- a.href = page.ref;
- t.textContent = page.doc.title;
- d.innerHTML = makeTeaser(page.doc.body, items);
-
- suggestions.appendChild(entry);
- }
- });
-
- while(childs.length > len){
- suggestions.removeChild(childs[i])
- }
-
- }
-
- function accept_suggestion(){
-
- while(suggestions.lastChild){
-
- suggestions.removeChild(suggestions.lastChild);
- }
-
- return false;
- }
-
- // Taken from mdbook
- // The strategy is as follows:
- // First, assign a value to each word in the document:
- // Words that correspond to search terms (stemmer aware): 40
- // Normal words: 2
- // First word in a sentence: 8
- // Then use a sliding window with a constant number of words and count the
- // sum of the values of the words within the window. Then use the window that got the
- // maximum sum. If there are multiple maximas, then get the last one.
- // Enclose the terms in .
- function makeTeaser(body, terms) {
- var TERM_WEIGHT = 40;
- var NORMAL_WORD_WEIGHT = 2;
- var FIRST_WORD_WEIGHT = 8;
- var TEASER_MAX_WORDS = 30;
-
- var stemmedTerms = terms.map(function (w) {
- return elasticlunr.stemmer(w.toLowerCase());
- });
- var termFound = false;
- var index = 0;
- var weighted = []; // contains elements of ["word", weight, index_in_document]
-
- // split in sentences, then words
- var sentences = body.toLowerCase().split(". ");
- for (var i in sentences) {
- var words = sentences[i].split(/[\s\n]/);
- var value = FIRST_WORD_WEIGHT;
- for (var j in words) {
-
- var word = words[j];
-
- if (word.length > 0) {
- for (var k in stemmedTerms) {
- if (elasticlunr.stemmer(word).startsWith(stemmedTerms[k])) {
- value = TERM_WEIGHT;
- termFound = true;
- }
- }
- weighted.push([word, value, index]);
- value = NORMAL_WORD_WEIGHT;
- }
-
- index += word.length;
- index += 1; // ' ' or '.' if last word in sentence
- }
-
- index += 1; // because we split at a two-char boundary '. '
- }
-
- if (weighted.length === 0) {
- if (body.length !== undefined && body.length > TEASER_MAX_WORDS * 10) {
- return body.substring(0, TEASER_MAX_WORDS * 10) + '...';
- } else {
- return body;
- }
- }
-
- var windowWeights = [];
- var windowSize = Math.min(weighted.length, TEASER_MAX_WORDS);
- // We add a window with all the weights first
- var curSum = 0;
- for (var i = 0; i < windowSize; i++) {
- curSum += weighted[i][1];
- }
- windowWeights.push(curSum);
-
- for (var i = 0; i < weighted.length - windowSize; i++) {
- curSum -= weighted[i][1];
- curSum += weighted[i + windowSize][1];
- windowWeights.push(curSum);
- }
-
- // If we didn't find the term, just pick the first window
- var maxSumIndex = 0;
- if (termFound) {
- var maxFound = 0;
- // backwards
- for (var i = windowWeights.length - 1; i >= 0; i--) {
- if (windowWeights[i] > maxFound) {
- maxFound = windowWeights[i];
- maxSumIndex = i;
- }
- }
- }
-
- var teaser = [];
- var startIndex = weighted[maxSumIndex][2];
- for (var i = maxSumIndex; i < maxSumIndex + windowSize; i++) {
- var word = weighted[i];
- if (startIndex < word[2]) {
- // missing text from index to start of `word`
- teaser.push(body.substring(startIndex, word[2]));
- startIndex = word[2];
- }
-
- // add around search terms
- if (word[1] === TERM_WEIGHT) {
- teaser.push("");
- }
-
- startIndex = word[2] + word[0].length;
- // Check the string is ascii characters or not
- var re = /^[\x00-\xff]+$/
- if (word[1] !== TERM_WEIGHT && word[0].length >= 12 && !re.test(word[0])) {
- // If the string's length is too long, it maybe a Chinese/Japance/Korean article
- // if using substring method directly, it may occur error codes on emoji chars
- var strBefor = body.substring(word[2], startIndex);
- var strAfter = substringByByte(strBefor, 12);
- teaser.push(strAfter);
- } else {
- teaser.push(body.substring(word[2], startIndex));
- }
-
- if (word[1] === TERM_WEIGHT) {
- teaser.push(" ");
- }
- }
- teaser.push("…");
- return teaser.join("");
- }
-}());
-
-
-// Get substring by bytes
-// If using JavaScript inline substring method, it will return error codes
-// Source: https://www.52pojie.cn/thread-1059814-1-1.html
-function substringByByte(str, maxLength) {
- var result = "";
- var flag = false;
- var len = 0;
- var length = 0;
- var length2 = 0;
- for (var i = 0; i < str.length; i++) {
- var code = str.codePointAt(i).toString(16);
- if (code.length > 4) {
- i++;
- if ((i + 1) < str.length) {
- flag = str.codePointAt(i + 1).toString(16) == "200d";
- }
- }
- if (flag) {
- len += getByteByHex(code);
- if (i == str.length - 1) {
- length += len;
- if (length <= maxLength) {
- result += str.substr(length2, i - length2 + 1);
- } else {
- break
- }
- }
- } else {
- if (len != 0) {
- length += len;
- length += getByteByHex(code);
- if (length <= maxLength) {
- result += str.substr(length2, i - length2 + 1);
- length2 = i + 1;
- } else {
- break
- }
- len = 0;
- continue;
- }
- length += getByteByHex(code);
- if (length <= maxLength) {
- if (code.length <= 4) {
- result += str[i]
- } else {
- result += str[i - 1] + str[i]
- }
- length2 = i + 1;
- } else {
- break
- }
- }
- }
- return result;
-}
-
-// Get the string bytes from binary
-function getByteByBinary(binaryCode) {
- // Binary system, starts with `0b` in ES6
- // Octal number system, starts with `0` in ES5 and starts with `0o` in ES6
- // Hexadecimal, starts with `0x` in both ES5 and ES6
- var byteLengthDatas = [0, 1, 2, 3, 4];
- var len = byteLengthDatas[Math.ceil(binaryCode.length / 8)];
- return len;
-}
-
-// Get the string bytes from hexadecimal
-function getByteByHex(hexCode) {
- return getByteByBinary(parseInt(hexCode, 16).toString(2));
-}
diff --git a/static/logo-doks.png b/static/logo-doks.png
deleted file mode 100644
index 74bdfb9..0000000
Binary files a/static/logo-doks.png and /dev/null differ
diff --git a/static/plugins/elasticlunr.min.js b/static/plugins/elasticlunr.min.js
deleted file mode 100644
index 94b20dd..0000000
--- a/static/plugins/elasticlunr.min.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * elasticlunr - http://weixsong.github.io
- * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.5
- *
- * Copyright (C) 2017 Oliver Nightingale
- * Copyright (C) 2017 Wei Song
- * MIT Licensed
- * @license
- */
-!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o
-